diff --git a/openstackclient/common/command.py b/openstackclient/common/command.py
new file mode 100644
index 0000000000..b8d9fc6f1b
--- /dev/null
+++ b/openstackclient/common/command.py
@@ -0,0 +1,42 @@
+#   Copyright 2016 NEC Corporation
+#
+#   Licensed under the Apache License, Version 2.0 (the "License"); you may
+#   not use this file except in compliance with the License. You may obtain
+#   a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#   License for the specific language governing permissions and limitations
+#   under the License.
+
+import abc
+import logging
+
+from cliff import command
+from cliff import lister
+from cliff import show
+import six
+
+
+class CommandMeta(abc.ABCMeta):
+    def __new__(mcs, name, bases, cls_dict):
+        if 'log' not in cls_dict:
+            cls_dict['log'] = logging.getLogger(
+                cls_dict['__module__'] + '.' + name)
+        return super(CommandMeta, mcs).__new__(mcs, name, bases, cls_dict)
+
+
+@six.add_metaclass(CommandMeta)
+class Command(command.Command):
+    pass
+
+
+class Lister(Command, lister.Lister):
+    pass
+
+
+class ShowOne(Command, show.ShowOne):
+    pass
diff --git a/openstackclient/compute/v2/flavor.py b/openstackclient/compute/v2/flavor.py
index b34197e049..1af5fe7002 100644
--- a/openstackclient/compute/v2/flavor.py
+++ b/openstackclient/compute/v2/flavor.py
@@ -15,22 +15,16 @@
 
 """Flavor action implementations"""
 
-import logging
 import six
 
-from cliff import command
-from cliff import lister
-from cliff import show
-
+from openstackclient.common import command
 from openstackclient.common import parseractions
 from openstackclient.common import utils
 
 
-class CreateFlavor(show.ShowOne):
+class CreateFlavor(command.ShowOne):
     """Create new flavor"""
 
-    log = logging.getLogger(__name__ + ".CreateFlavor")
-
     def get_parser(self, prog_name):
         parser = super(CreateFlavor, self).get_parser(prog_name)
         parser.add_argument(
@@ -128,8 +122,6 @@ class CreateFlavor(show.ShowOne):
 class DeleteFlavor(command.Command):
     """Delete flavor"""
 
-    log = logging.getLogger(__name__ + ".DeleteFlavor")
-
     def get_parser(self, prog_name):
         parser = super(DeleteFlavor, self).get_parser(prog_name)
         parser.add_argument(
@@ -147,11 +139,9 @@ class DeleteFlavor(command.Command):
         compute_client.flavors.delete(flavor.id)
 
 
-class ListFlavor(lister.Lister):
+class ListFlavor(command.Lister):
     """List flavors"""
 
-    log = logging.getLogger(__name__ + ".ListFlavor")
-
     def get_parser(self, prog_name):
         parser = super(ListFlavor, self).get_parser(prog_name)
         public_group = parser.add_mutually_exclusive_group()
@@ -231,11 +221,9 @@ class ListFlavor(lister.Lister):
                 ) for s in data))
 
 
-class ShowFlavor(show.ShowOne):
+class ShowFlavor(command.ShowOne):
     """Display flavor details"""
 
-    log = logging.getLogger(__name__ + ".ShowFlavor")
-
     def get_parser(self, prog_name):
         parser = super(ShowFlavor, self).get_parser(prog_name)
         parser.add_argument(
@@ -258,11 +246,9 @@ class ShowFlavor(show.ShowOne):
         return zip(*sorted(six.iteritems(flavor)))
 
 
-class SetFlavor(show.ShowOne):
+class SetFlavor(command.ShowOne):
     """Set flavor properties"""
 
-    log = logging.getLogger(__name__ + ".SetFlavor")
-
     def get_parser(self, prog_name):
         parser = super(SetFlavor, self).get_parser(prog_name)
         parser.add_argument(
@@ -292,11 +278,9 @@ class SetFlavor(show.ShowOne):
         return zip(*sorted(six.iteritems(flavor)))
 
 
-class UnsetFlavor(show.ShowOne):
+class UnsetFlavor(command.ShowOne):
     """Unset flavor properties"""
 
-    log = logging.getLogger(__name__ + ".UnsetFlavor")
-
     def get_parser(self, prog_name):
         parser = super(UnsetFlavor, self).get_parser(prog_name)
         parser.add_argument(
diff --git a/openstackclient/tests/common/test_command.py b/openstackclient/tests/common/test_command.py
new file mode 100644
index 0000000000..1b2584bdde
--- /dev/null
+++ b/openstackclient/tests/common/test_command.py
@@ -0,0 +1,32 @@
+#   Copyright 2016 NEC Corporation
+#
+#   Licensed under the Apache License, Version 2.0 (the "License"); you may
+#   not use this file except in compliance with the License. You may obtain
+#   a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#   License for the specific language governing permissions and limitations
+#   under the License.
+
+import mock
+
+from openstackclient.common import command
+from openstackclient.tests import utils as test_utils
+
+
+class FakeCommand(command.Command):
+    def take_action(self, parsed_args):
+        pass
+
+
+class TestCommand(test_utils.TestCase):
+
+    def test_command_has_logger(self):
+        cmd = FakeCommand(mock.Mock(), mock.Mock())
+        self.assertTrue(hasattr(cmd, 'log'))
+        self.assertEqual('openstackclient.tests.common.test_command.'
+                         'FakeCommand', cmd.log.name)