diff --git a/openstackclient/common/utils.py b/openstackclient/common/utils.py
index b37ff80607..475efeca61 100644
--- a/openstackclient/common/utils.py
+++ b/openstackclient/common/utils.py
@@ -47,10 +47,17 @@ def find_resource(manager, name_or_id):
     # finally try to find entity by name
     try:
         return manager.find(name=name_or_id)
-    except exceptions.NotFound:
-        msg = "No %s with a name or ID of '%s' exists." % \
-              (manager.resource_class.__name__.lower(), name_or_id)
-        raise exceptions.CommandError(msg)
+    # FIXME(dtroyer): The exception to catch here is dependent on which
+    #                 client library the manager passed in belongs to.
+    #                 Eventually this should be pulled from a common set
+    #                 of client exceptions.
+    except Exception as ex:
+        if '.NotFound' in type(ex).__name__:
+            msg = "No %s with a name or ID of '%s' exists." % \
+                (manager.resource_class.__name__.lower(), name_or_id)
+            raise exceptions.CommandError(msg)
+        else:
+            raise
 
 
 def get_item_properties(item, fields, mixed_case_fields=[], formatters={}):
diff --git a/openstackclient/identity/v2_0/service.py b/openstackclient/identity/v2_0/service.py
index be0e7020da..08f04b75e2 100644
--- a/openstackclient/identity/v2_0/service.py
+++ b/openstackclient/identity/v2_0/service.py
@@ -24,37 +24,81 @@ import logging
 from cliff import lister
 from cliff import show
 
+from keystoneclient import exceptions as identity_exc
 from openstackclient.common import command
+from openstackclient.common import exceptions
 from openstackclient.common import utils
 
 
-class Create_Service(command.OpenStackCommand):
+class CreateService(command.OpenStackCommand, show.ShowOne):
     """Create service command"""
 
-    # FIXME(dtroyer): Service commands are still WIP
     api = 'identity'
-    log = logging.getLogger(__name__)
+    log = logging.getLogger(__name__ + '.CreateService')
 
     def get_parser(self, prog_name):
-        parser = super(Create_Service, self).get_parser(prog_name)
+        parser = super(CreateService, self).get_parser(prog_name)
         parser.add_argument(
-            'service_name',
+            'name',
             metavar='<service-name>',
             help='New service name')
+        parser.add_argument(
+            '--type',
+            metavar='<service-type>',
+            required=True,
+            help='New service type',
+        )
+        parser.add_argument(
+            '--description',
+            metavar='<service-description>',
+            help='New service description',
+        )
         return parser
 
     def get_data(self, parsed_args):
-        self.log.info('v2.Create_Service.get_data(%s)' % parsed_args)
+        self.log.debug('get_data(%s)' % parsed_args)
+        identity_client = self.app.client_manager.identity
+        service = identity_client.services.create(
+            parsed_args.name,
+            parsed_args.type,
+            parsed_args.description,
+        )
+
+        info = {}
+        info.update(service._info)
+        return zip(*sorted(info.iteritems()))
 
 
-class List_Service(command.OpenStackCommand, lister.Lister):
+class DeleteService(command.OpenStackCommand):
+    """Delete service command"""
+
+    api = 'identity'
+    log = logging.getLogger(__name__ + '.DeleteService')
+
+    def get_parser(self, prog_name):
+        parser = super(DeleteService, self).get_parser(prog_name)
+        parser.add_argument(
+            'service',
+            metavar='<service-id>',
+            help='ID of service to delete',
+        )
+        return parser
+
+    def run(self, parsed_args):
+        self.log.debug('run(%s)' % parsed_args)
+        identity_client = self.app.client_manager.identity
+        identity_client.services.delete(parsed_args.service)
+        return
+
+
+class ListService(command.OpenStackCommand, lister.Lister):
     """List service command"""
 
     api = 'identity'
-    log = logging.getLogger(__name__)
+    log = logging.getLogger(__name__ + '.ListService')
 
     def get_parser(self, prog_name):
-        parser = super(List_Service, self).get_parser(prog_name)
+        parser = super(ListService, self).get_parser(prog_name)
         parser.add_argument(
             '--long',
             action='store_true',
@@ -63,7 +107,7 @@ class List_Service(command.OpenStackCommand, lister.Lister):
         return parser
 
     def get_data(self, parsed_args):
-        self.log.debug('v2.List_Service.get_data(%s)' % parsed_args)
+        self.log.debug('get_data(%s)' % parsed_args)
         if parsed_args.long:
             columns = ('ID', 'Name', 'Type', 'Description')
         else:
@@ -73,33 +117,43 @@ class List_Service(command.OpenStackCommand, lister.Lister):
                 (utils.get_item_properties(
                     s, columns,
                     formatters={},
-                    ) for s in data),
-                )
+                ) for s in data),
+               )
 
 
-class Show_Service(command.OpenStackCommand, show.ShowOne):
+class ShowService(command.OpenStackCommand, show.ShowOne):
     """Show service command"""
 
     api = 'identity'
-    log = logging.getLogger(__name__)
+    log = logging.getLogger(__name__ + '.ShowService')
 
     def get_parser(self, prog_name):
-        parser = super(Show_Service, self).get_parser(prog_name)
+        parser = super(ShowService, self).get_parser(prog_name)
         parser.add_argument(
             'service',
             metavar='<service>',
-            help='Name or ID of service to display')
+            help='Type, name or ID of service to display')
         return parser
 
     def get_data(self, parsed_args):
-        self.log.info('v2.Show_Service.get_data(%s)' % parsed_args)
+        self.log.debug('get_data(%s)' % parsed_args)
         identity_client = self.app.client_manager.identity
-        service = utils.find_resource(
-            identity_client.services, parsed_args.service)
+        try:
+            # search for the usual ID or name
+            service = utils.find_resource(
+                identity_client.services, parsed_args.service)
+        except exceptions.CommandError:
+            try:
+                # search for service type
+                service = identity_client.services.find(
+                    type=parsed_args.service)
+            # FIXME(dtroyer): This exception should eventually come from
+            #                 common client exceptions
+            except identity_exc.NotFound:
+                msg = "No service with a type, name or ID of '%s' exists." % \
+                    name_or_id
+                raise exceptions.CommandError(msg)
 
         info = {}
-        info.update(user._info)
-
-        columns = sorted(info.keys())
-        values = [info[c] for c in columns]
-        return (columns, values)
+        info.update(service._info)
+        return zip(*sorted(info.iteritems()))
diff --git a/setup.py b/setup.py
index ddca8b553a..13d7d76203 100644
--- a/setup.py
+++ b/setup.py
@@ -62,9 +62,11 @@ setuptools.setup(
             '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',
+                'openstackclient.identity.v2_0.service:CreateService',
+            'delete_service=' +
+                'openstackclient.identity.v2_0.service:DeleteService',
+            'list_service=openstackclient.identity.v2_0.service:ListService',
+            'show_service=openstackclient.identity.v2_0.service:ShowService',
             'create_tenant=' +
                 'openstackclient.identity.v2_0.tenant:Create_Tenant',
             'delete_tenant=' +