diff --git a/tackerclient/shell.py b/tackerclient/shell.py
index bfc29ca7..647289be 100644
--- a/tackerclient/shell.py
+++ b/tackerclient/shell.py
@@ -48,6 +48,7 @@ from tackerclient.i18n import _
 from tackerclient.tacker.v1_0 import extension
 from tackerclient.tacker.v1_0.vm import device
 from tackerclient.tacker.v1_0.vm import device_template
+from tackerclient.tacker.v1_0.vm import service_instance
 from tackerclient.version import __version__
 
 
@@ -106,6 +107,11 @@ COMMAND_V1 = {
     'device-template-show': device_template.ShowDeviceTemplate,
     'device-template-update': device_template.UpdateDeviceTemplate,
     'device-template-delete': device_template.DeleteDeviceTemplate,
+    'service-instance-create': service_instance.CreateServiceInstance,
+    'service-instance-list': service_instance.ListServiceInstance,
+    'service-instance-show': service_instance.ShowServiceInstance,
+    'service-instance-update': service_instance.UpdateServiceInstance,
+    'service-instance-delete': service_instance.DeleteServiceInstance,
     'device-create': device.CreateDevice,
     'device-list': device.ListDevice,
     'device-show': device.ShowDevice,
diff --git a/tackerclient/tacker/v1_0/vm/service_instance.py b/tackerclient/tacker/v1_0/vm/service_instance.py
new file mode 100644
index 00000000..b68ebcf0
--- /dev/null
+++ b/tackerclient/tacker/v1_0/vm/service_instance.py
@@ -0,0 +1,164 @@
+#
+# Copyright 2013 Intel
+# Copyright 2013 Isaku Yamahata <isaku.yamahata at intel com>
+#                               <isaku.yamahata at gmail com>
+# 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.
+#
+# @author: Isaku Yamahata, Intel
+
+from tackerclient.common import exceptions
+from tackerclient.openstack.common.gettextutils import _
+from tackerclient.tacker import v1_0 as tackerV10
+
+
+_SERVICE_INSTANCE = 'service_instance'
+
+
+class ListServiceInstance(tackerV10.ListCommand):
+    """List service instance that belong to a given tenant."""
+
+    resource = _SERVICE_INSTANCE
+
+
+class ShowServiceInstance(tackerV10.ShowCommand):
+    """show information of a given ServiceInstance."""
+
+    resource = _SERVICE_INSTANCE
+
+
+class CreateServiceInstance(tackerV10.CreateCommand):
+    """create a ServiceInstance."""
+
+    resource = _SERVICE_INSTANCE
+
+    def add_known_arguments(self, parser):
+        parser.add_argument(
+            '--name',
+            default=None,
+            help='Set a name for the devicetemplate')
+        parser.add_argument(
+            '--service-type-id',
+            required=True,
+            help='service type id to create service instance based on')
+        parser.add_argument(
+            '--service-table-id',
+            required=True,
+            help='service type id to create service instance based on')
+        parser.add_argument(
+            '--mgmt-driver',
+            default=None,
+            help='Set a manegement driver name for the service instance')
+        parser.add_argument(
+            '--service-context',
+            metavar='<network-id=network-uuid,subnet-id=subnet-uuid,'
+            'port-id=port-uuid,router-id=router-uuid,'
+            'role=role-string,index=int>',
+            action='append',
+            dest='service_context',
+            default=[],
+            help='service context to insert service')
+        parser.add_argument(
+            '--device',
+            required=True,
+            help='Set a device for the service instance to create on')
+        parser.add_argument(
+            '--kwargs',
+            metavar='<key>=<value>',
+            action='append',
+            dest='kwargs',
+            default=[],
+            help='instance specific argument')
+
+    def args2body(self, parsed_args):
+        body = {
+            self.resource: {
+                'service_type_id': parsed_args.service_type_id,
+                'service_table_id': parsed_args.service_table_id,
+                'devices': [parsed_args.device],
+            }
+        }
+        if parsed_args.name is not None:
+            body[self.resource]['name'] = parsed_args.name
+        if parsed_args.mgmt_driver is not None:
+            body[self.resource]['mgmt_driver'] = parsed_args.mgmt_driver
+        if parsed_args.kwargs:
+            try:
+                kwargs = dict(key_value.split('=', 1)
+                              for key_value in parsed_args.kwargs)
+            except ValueError:
+                msg = (_('invalid argument for --kwargs %s') %
+                       parsed_args.kwargs)
+                raise exceptions.TackerCLIError(msg)
+            if kwargs:
+                body[self.resource]['kwargs'] = kwargs
+        if parsed_args.service_context:
+            try:
+                service_context = [dict(
+                    (k.replace('-', '_'), v)
+                    for k, v in (key_value.split('=', 1)
+                                 for key_value in entry_string.split(',')))
+                    for entry_string in parsed_args.service_context]
+            except ValueError:
+                msg = (_('invalid argument for --service-context %s') %
+                       parsed_args.service_context)
+                raise exceptions.TackerCLIError(msg)
+
+            if service_context:
+                body[self.resource]['service_context'] = service_context
+
+        tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id'])
+        return body
+
+
+class UpdateServiceInstance(tackerV10.UpdateCommand):
+    """Update a given ServiceInstance."""
+
+    resource = _SERVICE_INSTANCE
+
+    def add_known_arguments(self, parser):
+        parser.add_argument(
+            '--name',
+            help='Set a name for the devicetemplate')
+        parser.add_argument(
+            '--kwargs',
+            metavar='<key>=<value>',
+            action='append',
+            dest='kwargs',
+            default=[],
+            help='instance specific argument')
+
+    def args2body(self, parsed_args):
+        body = {self.resource: {}}
+        if parsed_args.name:
+            body[self.resource]['name'] = parsed_args.name
+        if parsed_args.kwargs:
+            try:
+                kwargs = dict(key_value.split('=', 1)
+                              for key_value in parsed_args.kwargs)
+            except ValueError:
+                msg = (_('invalid argument for --kwargs %s') %
+                       parsed_args.kwargs)
+                raise exceptions.TackerCLIError(msg)
+            if kwargs:
+                body[self.resource]['kwargs'] = kwargs
+        tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id'])
+        return body
+
+
+class DeleteServiceInstance(tackerV10.DeleteCommand):
+    """Delete a given ServiceInstance."""
+
+    resource = _SERVICE_INSTANCE
diff --git a/tackerclient/v1_0/client.py b/tackerclient/v1_0/client.py
index ff0c4a8a..c9e54a07 100644
--- a/tackerclient/v1_0/client.py
+++ b/tackerclient/v1_0/client.py
@@ -339,6 +339,8 @@ class Client(ClientBase):
     device_path = '/devices/%s'
     interface_attach_path = '/devices/%s/attach_interface'
     interface_detach_path = '/devices/%s/detach_interface'
+    service_instances_path = '/service-instances'
+    service_instance_path = '/service-instances/%s'
 
     # API has no way to report plurals, so we have to hard code them
     # EXTED_PLURALS = {}
@@ -401,3 +403,26 @@ class Client(ClientBase):
     @APIParamsCall
     def detach_interface(self, device, body=None):
         return self.put(self.detach_interface_path % device, body)
+
+    @APIParamsCall
+    def list_service_instances(self, retrieve_all=True, **_params):
+        return self.list('service_instances', self.service_instances_path,
+                         retrieve_all, **_params)
+
+    @APIParamsCall
+    def show_service_instance(self, service_instance, **_params):
+        return self.get(self.service_instance_path % service_instance,
+                        params=_params)
+
+    @APIParamsCall
+    def update_service_instance(self, service_instance, body=None):
+        return self.put(self.service_instance_path % service_instance,
+                        body=body)
+
+    @APIParamsCall
+    def create_service_instance(self, body=None):
+        return self.post(self.service_instances_path, body=body)
+
+    @APIParamsCall
+    def delete_service_instance(self, service_instance):
+        return self.delete(self.service_instance_path % service_instance)