diff --git a/tackerclient/shell.py b/tackerclient/shell.py
index 09611240..bd4d5ed6 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 vnf
 from tackerclient.tacker.v1_0.vm import vnfd
 from tackerclient.version import __version__
 
@@ -120,6 +121,13 @@ COMMAND_V1 = {
     'vnfd-delete': vnfd.DeleteVNFD,
     'vnfd-list': vnfd.ListVNFD,
     'vnfd-show': vnfd.ShowVNFD,
+
+    'vnf-create': vnf.CreateVNF,
+    'vnf-delete': vnf.DeleteVNF,
+    'vnf-list': vnf.ListVNF,
+    'vnf-show': vnf.ShowVNF,
+    # 'vnf-config-create'
+    # 'vnf-config-push'
 }
 
 COMMANDS = {'1.0': COMMAND_V1}
diff --git a/tackerclient/tacker/v1_0/vm/vnf.py b/tackerclient/tacker/v1_0/vm/vnf.py
new file mode 100644
index 00000000..390e0737
--- /dev/null
+++ b/tackerclient/tacker/v1_0/vm/vnf.py
@@ -0,0 +1,159 @@
+#
+# 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
+
+import abc
+import six
+
+from tackerclient.common import exceptions
+from tackerclient.openstack.common.gettextutils import _
+from tackerclient.tacker import v1_0 as tackerV10
+
+
+_DEVICE = 'device'
+
+
+class ListVNF(tackerV10.ListCommand):
+    """List device that belong to a given tenant."""
+
+    resource = _DEVICE
+
+
+class ShowVNF(tackerV10.ShowCommand):
+    """show information of a given VNF."""
+
+    resource = _DEVICE
+
+
+class CreateVNF(tackerV10.CreateCommand):
+    """create a VNF."""
+
+    resource = _DEVICE
+
+    def add_known_arguments(self, parser):
+        parser.add_argument(
+            '--vnfd-id',
+            required=True,
+            help='vnfd id to instantiate vnf based on')
+        parser.add_argument(
+            '--attributes',
+            metavar='<key>=<value>',
+            action='append',
+            dest='attributes',
+            default=[],
+            help='instance specific argument')
+
+    def args2body(self, parsed_args):
+        body = {
+            self.resource: {
+                'template_id': parsed_args.vnfd_id,
+            }
+        }
+        if parsed_args.attributes:
+            try:
+                attributes = dict(key_value.split('=', 1)
+                                  for key_value in parsed_args.attributes)
+            except ValueError:
+                msg = (_('invalid argument for --attributes %s') %
+                       parsed_args.attributes)
+                raise exceptions.TackerCLIError(msg)
+            if attributes:
+                body[self.resource]['attributes'] = attributes
+
+        tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id'])
+        return body
+
+
+class UpdateVNF(tackerV10.UpdateCommand):
+    """Update a given VNF."""
+
+    resource = _DEVICE
+
+    def add_known_arguments(self, parser):
+        parser.add_argument(
+            '--attributes',
+            metavar='<key>=<value>',
+            action='append',
+            dest='attributes',
+            default=[],
+            help='instance specific argument')
+
+    def args2body(self, parsed_args):
+        body = {self.resource: {}}
+        if parsed_args.attributes:
+            try:
+                attributes = dict(key_value.split('=', 1)
+                                  for key_value in parsed_args.attributes)
+            except ValueError:
+                msg = (_('invalid argument for --attributes %s') %
+                       parsed_args.attributes)
+                raise exceptions.TackerCLIError(msg)
+            if attributes:
+                body[self.resource]['attributes'] = attributes
+        tackerV10.update_dict(parsed_args, body[self.resource], ['tenant_id'])
+        return body
+
+
+class DeleteVNF(tackerV10.DeleteCommand):
+    """Delete a given VNF."""
+
+    resource = _DEVICE
+
+
+@six.add_metaclass(abc.ABCMeta)
+class _XtachInterface(tackerV10.UpdateCommand):
+    resource = _DEVICE
+
+    @abc.abstractmethod
+    def call_api(self, tacker_client, device_id, body):
+        pass
+
+    def args2body(self, parsed_args):
+        body = {
+            'port_id': parsed_args.port_id,
+        }
+        tackerV10.update_dict(parsed_args, body, [])
+        return body
+
+    def get_parser(self, prog_name):
+        parser = super(AttachInterface, self).get_parser(prog_name)
+        parser.add_argument('port_id', metavar='PORT',
+                            help=_('port to attach/detach'))
+        self.add_known_arguments(parser)
+        return parser
+
+    def run(self, parsed_args):
+        tacker_client = self.get_client()
+        tacker_client.format = parsed_args.request_format
+        body = self.args2body(parsed_args)
+        _id = tackerV10.find_resourceid_by_name_or_id(tacker_client,
+                                                      self.resource,
+                                                      parsed_args.id)
+        self.call_api(tacker_client, _id, body)
+
+
+class AttachInterface(_XtachInterface):
+    def call_api(self, tacker_client, device_id, body):
+        return tacker_client.attach_interface(device_id, body)
+
+
+class DetachInterface(_XtachInterface):
+    def call_api(self, tacker_client, device_id, body):
+        return tacker_client.detach_interface(device_id, body)