diff --git a/openstackclient/identity/v2_0/service.py b/openstackclient/identity/v2_0/service.py
index 24ead92810..fd1d7bf9b2 100644
--- a/openstackclient/identity/v2_0/service.py
+++ b/openstackclient/identity/v2_0/service.py
@@ -21,11 +21,57 @@ Service action implementations
 
 import logging
 
+from cliff import lister
+from cliff import show
+
 from openstackclient.common import command
 from openstackclient.common import utils
 
 
-class List_Service(command.OpenStackCommand):
+def get_service_properties(service, fields, formatters={}):
+    """Return a tuple containing the service properties.
+
+    :param server: a single Service resource
+    :param fields: tuple of strings with the desired field names
+    :param formatters: dictionary mapping field names to callables
+       to format the values
+    """
+    row = []
+    mixed_case_fields = []
+
+    for field in fields:
+        if field in formatters:
+            row.append(formatters[field](service))
+        else:
+            if field in mixed_case_fields:
+                field_name = field.replace(' ', '_')
+            else:
+                field_name = field.lower().replace(' ', '_')
+            data = getattr(service, field_name, '')
+            row.append(data)
+    return tuple(row)
+
+
+class Create_Service(command.OpenStackCommand):
+    "Create service command."
+
+    api = 'identity'
+    log = logging.getLogger(__name__)
+
+    def get_parser(self, prog_name):
+        parser = super(Create_Service, self).get_parser(prog_name)
+        parser.add_argument(
+            '--long',
+            action='store_true',
+            default=False,
+            help='Additional fields are listed in output')
+        return parser
+
+    def run(self, parsed_args):
+        self.log.info('v2.Create_Service.run(%s)' % parsed_args)
+
+
+class List_Service(command.OpenStackCommand, lister.Lister):
     "List service command."
 
     api = 'identity'
@@ -40,5 +86,39 @@ class List_Service(command.OpenStackCommand):
             help='Additional fields are listed in output')
         return parser
 
+    def get_data(self, parsed_args):
+        self.log.debug('v2.List_Service.run(%s)' % parsed_args)
+        if parsed_args.long:
+            columns = ('ID', 'Name', 'Type', 'Description')
+        else:
+            columns = ('ID', 'Name')
+        data = self.app.client_manager.identity.services.list()
+        print "data: %s" % data
+        return (columns,
+                (get_service_properties(
+                    s, columns,
+                    formatters={},
+                    ) for s in data),
+                )
+
+    #def run(self, parsed_args):
+    #    self.log.info('v2.List_Service.run(%s)' % parsed_args)
+
+
+class Show_Service(command.OpenStackCommand):
+    "Show service command."
+
+    api = 'identity'
+    log = logging.getLogger(__name__)
+
+    def get_parser(self, prog_name):
+        parser = super(Show_Service, self).get_parser(prog_name)
+        parser.add_argument(
+            '--long',
+            action='store_true',
+            default=False,
+            help='Additional fields are listed in output')
+        return parser
+
     def run(self, parsed_args):
-        self.log.info('v2.List_Service.run(%s)' % parsed_args)
+        self.log.info('v2.Show_Service.run(%s)' % parsed_args)
diff --git a/openstackclient/identity/v2_0/tenant.py b/openstackclient/identity/v2_0/tenant.py
new file mode 100644
index 0000000000..0d12cf265e
--- /dev/null
+++ b/openstackclient/identity/v2_0/tenant.py
@@ -0,0 +1,101 @@
+# Copyright 2012 OpenStack LLC.
+# All Rights Reserved.
+#
+#    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.
+#
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+"""
+Tenant action implementations
+"""
+
+import logging
+
+from cliff import lister
+from cliff import show
+
+from openstackclient.common import command
+from openstackclient.common import utils
+
+
+def get_tenant_properties(tenant, fields, formatters={}):
+    """Return a tuple containing the server properties.
+
+    :param server: a single Server resource
+    :param fields: tuple of strings with the desired field names
+    :param formatters: dictionary mapping field names to callables
+       to format the values
+    """
+    row = []
+    mixed_case_fields = []
+
+    for field in fields:
+        if field in formatters:
+            row.append(formatters[field](tenant))
+        else:
+            if field in mixed_case_fields:
+                field_name = field.replace(' ', '_')
+            else:
+                field_name = field.lower().replace(' ', '_')
+            data = getattr(tenant, field_name, '')
+            row.append(data)
+    return tuple(row)
+
+
+class List_Tenant(command.OpenStackCommand, lister.Lister):
+    "List tenant command."
+
+    api = 'identity'
+    log = logging.getLogger(__name__)
+
+    def get_data(self, parsed_args):
+        self.log.debug('v2.List_Service.run(%s)' % parsed_args)
+        columns = ('ID', 'Name', 'Enabled')
+        data = self.app.client_manager.identity.tenants.list()
+        return (columns,
+                (get_tenant_properties(
+                    s, columns,
+                    formatters={},
+                    ) for s in data),
+                )
+
+
+class Show_Tenant(command.OpenStackCommand, show.ShowOne):
+    "Show server command."
+
+    api = 'identity'
+    log = logging.getLogger(__name__)
+
+    def get_parser(self, prog_name):
+        parser = super(Show_Tenant, self).get_parser(prog_name)
+        parser.add_argument(
+            'tenant',
+            metavar='<tenant>',
+            help='Name or ID of tenant to display')
+        return parser
+
+    def get_data(self, parsed_args):
+        self.log.debug('v2.Show_Tenant.run(%s)' % parsed_args)
+        identity_client = self.app.client_manager.identity
+        tenant = utils.find_resource(
+            identity_client.tenants, parsed_args.tenant)
+
+        info = {}
+        info.update(tenant._info)
+
+        # Remove a couple of values that are long and not too useful
+        #info.pop('links', None)
+
+        columns = sorted(info.keys())
+        values = [info[c] for c in columns]
+        return (columns, values)
diff --git a/setup.py b/setup.py
index 265920b30c..6f3ac644e8 100644
--- a/setup.py
+++ b/setup.py
@@ -61,7 +61,12 @@ setuptools.setup(
         'openstack.cli': [
             'list_server=openstackclient.compute.v2.server:List_Server',
             'show_server=openstackclient.compute.v2.server:Show_Server',
+            'create_service=' +
+                'openstackclient.identity.v2_0.service:Create_Service',
             'list_service=openstackclient.identity.v2_0.service:List_Service',
+            'show_service=openstackclient.identity.v2_0.service:Show_Service',
+            'list_tenant=openstackclient.identity.v2_0.tenant:List_Tenant',
+            'show_tenant=openstackclient.identity.v2_0.tenant:Show_Tenant',
         ]
     }
 )