diff --git a/_modules/contrail.py b/_modules/contrail.py
index 11d7ca1..3719653 100644
--- a/_modules/contrail.py
+++ b/_modules/contrail.py
@@ -14,6 +14,8 @@
 # limitations under the License.
 
 from netaddr import IPNetwork
+from vnc_api.vnc_api import PhysicalRouter, PhysicalInterface, LogicalInterface
+from vnc_api.vnc_api import EncapsulationPrioritiesType
 
 try:
     from vnc_api import vnc_api
@@ -23,6 +25,7 @@
         ConfigNode, DatabaseNode, BgpRouter
     from vnc_api.gen.resource_xsd import AddressFamilies, BgpSessionAttributes, \
         BgpSession, BgpPeeringAttributes, BgpRouterParams
+
     HAS_CONTRAIL = True
 except ImportError:
     HAS_CONTRAIL = False
@@ -53,13 +56,13 @@
     use_ssl = False
     auth_host = kwargs.get('auth_host_ip')
     vnc_lib = vnc_api.VncApi(user, password, tenant_name,
-        api_host, api_port, api_base_url, wait_for_connect=True,
-        api_server_use_ssl=use_ssl, auth_host=auth_host)
+                             api_host, api_port, api_base_url, wait_for_connect=True,
+                             api_server_use_ssl=use_ssl, auth_host=auth_host)
 
     return vnc_lib
 
 
-def _get_config(vnc_client, global_system_config = 'default-global-system-config'):
+def _get_config(vnc_client, global_system_config='default-global-system-config'):
     try:
         gsc_obj = vnc_client.global_system_config_read(id=global_system_config)
     except vnc_api.NoIdError:
@@ -71,7 +74,6 @@
 
 
 def _get_rt_inst_obj(vnc_client):
-
     # TODO pick fqname hardcode from common
     rt_inst_obj = vnc_client.routing_instance_read(
         fq_name=['default-domain', 'default-project',
@@ -84,7 +86,6 @@
     return str(IPNetwork(ip_w_pfx).ip)
 
 
-
 def virtual_router_list(**kwargs):
     '''
     Return a list of all Contrail virtual routers
@@ -101,7 +102,9 @@
     for vrouter_obj in vrouter_objs:
         ret[vrouter_obj.name] = {
             'ip_address': vrouter_obj.virtual_router_ip_address,
-            'dpdk_enabled': vrouter_obj.virtual_router_dpdk_enabled
+            'dpdk_enabled': vrouter_obj.virtual_router_dpdk_enabled,
+            'uuid': vrouter_obj.uuid
+
         }
     return ret
 
@@ -125,7 +128,7 @@
     return ret
 
 
-def virtual_router_create(name, ip_address, dpdk_enabled=False, **kwargs):
+def virtual_router_create(name, ip_address, router_type=None, dpdk_enabled=False, **kwargs):
     '''
     Create specific Contrail virtual router
 
@@ -134,21 +137,48 @@
     .. code-block:: bash
 
         salt '*' contrail.virtual_router_create cmp02 10.10.10.102
+        router_types:
+        - tor-agent
+        - tor-service-node
+        - embedded
     '''
     ret = {}
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     vrouter_objs = virtual_router_list(**kwargs)
     if name in vrouter_objs:
-        return {'Error': 'Virtual router %s already exists' % name}
+        vrouter = virtual_router_get(name)
+        vrouter_obj = vnc_client._object_read('virtual-router', id=vrouter[name]['uuid'])
+        changed = False
+        if vrouter_obj.get_virtual_router_ip_address() != ip_address:
+            ret['ip_address'] = {'from': vrouter_obj.get_virtual_router_ip_address(), "to": ip_address}
+            vrouter_obj.set_virtual_router_ip_address(ip_address)
+            changed = True
+        if vrouter_obj.get_virtual_router_type() != router_type:
+            ret['router_type'] = {"from": vrouter_obj.get_virtual_router_type(), "to": router_type}
+            vrouter_obj.set_virtual_router_type(router_type)
+            changed = True
+        if vrouter_obj.get_virtual_router_dpdk_enabled() != dpdk_enabled:
+            ret['dpdk_enabled'] = {"from": vrouter_obj.get_virtual_router_dpdk_enabled(), "to": dpdk_enabled}
+            vrouter_obj.set_virtual_router_dpdk_enabled(dpdk_enabled)
+            changed = True
+        if changed:
+            if __opts__['test']:
+                return "Virtual router " + name + " will be updated"
+            vnc_client.virtual_router_update(vrouter_obj)
+            return ret
+        return {'OK': 'Virtual router %s already exists and is updated' % name}
     else:
         vrouter_obj = VirtualRouter(
             name, gsc_obj,
-            virtual_router_ip_address=ip_address)
+            virtual_router_ip_address=ip_address,
+            virtual_router_type=router_type)
         vrouter_obj.set_virtual_router_dpdk_enabled(dpdk_enabled)
+        if __opts__['test']:
+            return "Virtual router " + name + " will be created"
         vnc_client.virtual_router_create(vrouter_obj)
     ret = virtual_router_list(**kwargs)
-    return ret[name]
+    return "Create"
 
 
 def virtual_router_delete(name, **kwargs):
@@ -164,8 +194,462 @@
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     vrouter_obj = VirtualRouter(name, gsc_obj)
+    if __opts__['test']:
+        return "Virtual router " + name + " will be deleted"
     vnc_client.virtual_router_delete(
         fq_name=vrouter_obj.get_fq_name())
+    return "Deleted"
+
+
+def physical_router_list(**kwargs):
+    '''
+    Return a list of all Contrail physical routers
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.physical_router_list
+    '''
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    prouter_objs = vnc_client._objects_list('physical-router', detail=True)
+    for prouter_obj in prouter_objs:
+        ret[prouter_obj.name] = {
+            'uuid': prouter_obj._uuid,
+            'management_ip': prouter_obj._physical_router_management_ip,
+            'product_name': prouter_obj._physical_router_product_name,
+        }
+
+    return ret
+
+
+def physical_router_get(name, **kwargs):
+    '''
+    Return a specific Contrail physical router
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.physical_router_get router_name
+    '''
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    prouter_objs = vnc_client._objects_list('physical-router', detail=True)
+    for prouter_obj in prouter_objs:
+        if name == prouter_obj.name:
+            ret[name] = prouter_obj.__dict__
+    if len(ret) == 0:
+        return {'Error': 'Error in retrieving physical router.'}
+    return ret
+
+
+def physical_router_create(name, parent_type=None,
+                           management_ip=None,
+                           dataplane_ip=None,  # VTEP address in web GUI
+                           vendor_name=None,
+                           product_name=None,
+                           vnc_managed=None,
+                           junos_service_ports=None,
+                           agents=None, **kwargs):
+    '''
+    Create specific Contrail physical router
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.physical_router_create OVSDB_router management_ip=10.167.4.202 dataplane_ip=172.16.20.15 vendor_name=MyVendor product_name=MyProduct agents="['tor01','tns01']"
+    '''
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    gsc_obj = _get_config(vnc_client)
+    prouter_objs = physical_router_list(**kwargs)
+    if name in prouter_objs:
+        prouter = physical_router_get(name)
+        prouter_obj = vnc_client._object_read('physical-router', id=prouter[name]['_uuid'])
+        if prouter_obj.physical_router_management_ip != management_ip:
+            ret['management_ip'] = {'from': prouter_obj.physical_router_management_ip, "to": management_ip}
+            prouter_obj.set_physical_router_management_ip(management_ip)
+        if prouter_obj.physical_router_dataplane_ip != dataplane_ip:
+            ret['dataplane_ip'] = {'from': prouter_obj.physical_router_dataplane_ip, "to": dataplane_ip}
+            prouter_obj.set_physical_router_dataplane_ip(dataplane_ip)
+        if prouter_obj.get_physical_router_vendor_name() != vendor_name:
+            ret['vendor_name'] = {'from': prouter_obj.get_physical_router_vendor_name(), "to": vendor_name}
+            prouter_obj.set_physical_router_vendor_name(vendor_name)
+        if prouter_obj.get_physical_router_product_name() != product_name:
+            ret['product_name'] = {'from': prouter_obj.get_physical_router_product_name(), "to": product_name}
+            prouter_obj.set_physical_router_product_name(product_name)
+        if prouter_obj.get_physical_router_vnc_managed() != vnc_managed:
+            ret['vnc_managed'] = {'from': prouter_obj.get_physical_router_vnc_managed(), "to": vnc_managed}
+            prouter_obj.set_physical_router_vnc_managed(vnc_managed)
+        if prouter_obj.get_physical_router_junos_service_ports() != junos_service_ports:
+            ret['junos_service_ports'] = {'from': prouter_obj.get_physical_router_junos_service_ports(),
+                                          "to": junos_service_ports}
+            prouter_obj.set_physical_router_junos_service_ports(junos_service_ports)
+
+        if __opts__['test']:
+            if len(ret) != 0:
+                return "Physical router " + name + " will be updated"
+            return {"OK": "Physical router exists and is updated"}
+
+        vrouter_objs = vnc_client._objects_list('virtual-router', detail=True)  # all vrouter objects
+        c_agents = []  # referenced vrouters
+        for c_agent in prouter_obj.get_virtual_router_refs():
+            c_agents.append(c_agent['uuid'])
+        agent_objs = []  # required state of references
+        for vrouter_obj in vrouter_objs:
+            if vrouter_obj._display_name in agents and vrouter_obj._uuid not in c_agents:
+                prouter_obj.add_virtual_router(vrouter_obj)
+                ret['vrouter ' + vrouter_obj._display_name] = "Reference added"
+            if vrouter_obj._display_name not in agents and vrouter_obj._uuid in c_agents:
+                prouter_obj.del_virtual_router(vrouter_obj)
+                ret['vrouter ' + vrouter_obj._display_name] = "Reference removed"
+        vnc_client.physical_router_update(prouter_obj)
+
+        if len(ret) == 0:
+            return {"OK": "Physical router exists and is updated"}
+        return ret
+    else:
+        if __opts__['test']:
+            return "Physical router " + name + " will be created"
+        prouter_obj = PhysicalRouter(
+            name=name,
+            parent_obj=None,
+            physical_router_management_ip=management_ip,
+            physical_router_dataplane_ip=dataplane_ip,
+            physical_router_vendor_name=vendor_name,
+            physical_router_product_name=product_name,
+            physical_router_vnc_managed=vnc_managed,
+            physical_router_junos_service_ports=junos_service_ports,
+        )
+        for agent in agents:
+            vrouter = virtual_router_get(agent)
+            vrouter_obj = vnc_client._object_read('virtual-router', id=vrouter[agent]['uuid'])
+            prouter_obj.add_virtual_router(vrouter_obj)
+        vnc_client.physical_router_create(prouter_obj)
+    return "Created"
+
+
+def physical_router_delete(name, **kwargs):
+    '''
+    Delete specific Contrail physical router
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.physical_router_delete router_name
+    '''
+    vnc_client = _auth(**kwargs)
+    gsc_obj = _get_config(vnc_client)
+    prouter_obj = PhysicalRouter(name, gsc_obj)
+    if __opts__['test']:
+        return "Physical router " + name + " will be deleted"
+    vnc_client.physical_router_delete(
+        fq_name=prouter_obj.get_fq_name())
+    return "Deleted"
+
+
+def physical_interface_list(**kwargs):
+    '''
+    Return a list of all Contrail physical interface
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.physical_interface_list
+    '''
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    pinterface_objs = vnc_client._objects_list('physical-interface', detail=True)
+    for pinterface_obj in pinterface_objs:
+        ret[pinterface_obj.name] = {
+            'uuid': pinterface_obj._uuid,
+            'fq_name': pinterface_obj.fq_name,
+            'parent_type': pinterface_obj.parent_type,
+        }
+
+    return ret
+
+
+def physical_interface_get(name, physical_router, **kwargs):
+    '''
+    Return a specific Contrail physical interface
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.physical_interface_get interface_name physical_router_name
+    '''
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    pinterf_objs = vnc_client._objects_list('physical-interface', detail=True)
+    for pinterf_obj in pinterf_objs:
+        if name == pinterf_obj.name and physical_router in pinterf_obj.fq_name:
+            ret[name] = pinterf_obj.__dict__
+    if len(ret) == 0:
+        return {'Error': 'Error in retrieving physical interface.'}
+    return ret
+
+
+def physical_interface_create(name, physical_router, **kwargs):
+    '''
+    Create specific Contrail physical interface
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.physical_interface_create ge-0/0/10 physical_router_name
+    '''
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    gsc_obj = _get_config(vnc_client)
+    pinterf_obj = physical_interface_get(name, physical_router, **kwargs)
+    if 'Error' not in pinterf_obj:
+        return {'OK': 'Physical interface ' + name + ' on ' + physical_router + ' already exists'}
+    else:
+        if __opts__['test']:
+            return "Physical interface " + name + " will be created"
+        prouter = physical_router_get(physical_router)
+        prouter_obj = vnc_client._object_read('physical-router', id=prouter[physical_router]['_uuid'])
+        pinterf_obj = PhysicalInterface(name, prouter_obj)
+        vnc_client.physical_interface_create(pinterf_obj)
+    return "Created"
+
+
+def physical_interface_delete(name, physical_router, **kwargs):
+    '''
+    Delete specific Contrail physical interface
+
+    CLI Example:
+    .. code-block:: bash
+
+        salt '*' contrail.physical_interface_delete ge-0/0/0 phr01
+    '''
+    vnc_client = _auth(**kwargs)
+    gsc_obj = _get_config(vnc_client)
+    piface = physical_interface_get(name, physical_router)
+    if __opts__['test']:
+        return "Physical interface " + name + " will be deleted"
+    vnc_client.physical_interface_delete(id=piface[name]['_uuid'])
+    return "Deleted"
+
+
+def logical_interface_list(**kwargs):
+    '''
+    Return a list of all Contrail logical interfaces
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.logical_interface_list
+    '''
+    ret = []
+    vnc_client = _auth(**kwargs)
+    liface_objs = vnc_client._objects_list('logical-interface', detail=True)
+    for liface_obj in liface_objs:
+        ret.append({
+            'name': liface_obj.name,
+            'uuid': liface_obj._uuid,
+            'fq_name': liface_obj.fq_name,
+            'parent_type': liface_obj.parent_type,
+        })
+    return ret
+
+
+def logical_interface_get(name, parent_names, parent_type=None, **kwargs):
+    '''
+    Return a specific Contrail logical interface
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.logical_interface_get ge-0/0/0.10 ['phr01']
+        or
+        salt '*' contrail.logical_interface_get ge-0/0/0.10 ['ge-0/0/0','phr01']
+        or
+        salt '*' contrail.logical_interface_get ge-0/0/0.10 ['phr01'] parent_type=physcal-interface
+    '''
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    liface_objs = vnc_client._objects_list('logical-interface', detail=True)
+    count = 0
+    for liface_obj in liface_objs:
+        if name == liface_obj.name and set(parent_names).issubset(liface_obj.fq_name):
+            if parent_type and parent_type == liface_obj.parent_type:
+                count += 1
+                ret[liface_obj.name] = liface_obj.__dict__
+            if not parent_type:
+                count += 1
+                ret[liface_obj.name] = liface_obj.__dict__
+    if len(ret) == 0:
+        return {'Error': 'Error in retrieving logical interface.'}
+    if count > 1:
+        return {
+            'Error': 'Error Was found more then one logical interface. Please put more parent_name or put parent_type to chose one of them.'}
+    return ret
+
+
+def logical_interface_create(name, parent_names, parent_type='physical-interface', vlan_tag=None, interface_type="l2",
+                             **kwargs):
+    '''
+    Create specific Contrail logical interface
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.logical_interface_create ge-0/0/10.11 parent_names="['ge-0/0/0','phr1']" parent_type=physical-interface vlan_tag=1025 interface_type=L2
+    '''
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    gsc_obj = _get_config(vnc_client)
+    liface_obj = logical_interface_get(name, parent_names, parent_type, **kwargs)
+    if 'Error' not in liface_obj:
+        return {'OK': 'Logical interface ' + name + ' already exists'}
+    else:
+        if __opts__['test']:
+            return "Logical interface " + name + " will be created"
+        parent_obj = None
+        for router in parent_names:
+            parent_router = physical_router_get(router)
+            if 'Error' not in parent_router:
+                parent_obj = vnc_client._object_read('physical-router', id=parent_router[router]['_uuid'])
+                break
+        if not parent_obj:
+            return {'Error': 'Physical router have to be defined'}
+        if parent_type == 'physical-interface':
+            for interface in parent_names:
+                parent_interface = physical_interface_get(interface, parent_obj.name)
+                if 'Error' not in parent_interface:
+                    parent_obj = vnc_client._object_read('physical-interface', id=parent_interface[interface]['_uuid'])
+                    break
+        if interface_type.lower() == "l3":
+            return {'Error': "Virtual Network have to be defined for L3 interface type"}
+
+        liface_obj = LogicalInterface(name, parent_obj, vlan_tag, interface_type.lower())
+        vnc_client.logical_interface_create(liface_obj)
+    return "Created"
+
+
+def logical_interface_delete(name, parent_names, parent_type=None, **kwargs):
+    '''
+    Delete specific Contrail logical interface
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.logical_interface_delete ge-0/0/0.12 ['ge-0/0/0','phr01']
+        or
+        salt '*' contrail.logical_interface_delete ge-0/0/0.12 ['phr01'] parent_type=physical-router
+
+    '''
+    vnc_client = _auth(**kwargs)
+    gsc_obj = _get_config(vnc_client)
+    liface = logical_interface_get(name, parent_names, parent_type)
+    if 'Error' not in liface:
+        if __opts__['test']:
+            return "Logical interface " + name + " will be deleted"
+        vnc_client.logical_interface_delete(id=liface[name]['_uuid'])
+        return "Deleted"
+    else:
+        return liface
+
+
+def global_vrouter_config_list(**kwargs):
+    '''
+    Return a list of all Contrail global vrouter configs
+
+    CLI Example:
+
+    .. code-block:: bash"
+
+        salt '*' global_vrouter_config_list
+    '''
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    vrouter_conf_objs = vnc_client._objects_list('global-vrouter-config', detail=True)
+    for vrouter_conf_obj in vrouter_conf_objs:
+        ret[vrouter_conf_obj._display_name] = vrouter_conf_obj.__dict__
+    return ret
+
+
+def global_vrouter_config_get(name, **kwargs):
+    '''
+    Return a specific Contrail global vrouter config
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.global_vrouter_get global-vrouter-config
+    '''
+    ret = {}
+    vrouter_conf_objs = global_vrouter_config_list(**kwargs)
+    if name in vrouter_conf_objs:
+        ret[name] = vrouter_conf_objs.get(name)
+    if len(ret) == 0:
+        return {'Error': 'Error in retrieving  global vrouter config.'}
+    return ret
+
+
+def global_vrouter_config_create(name, parent_type, encap_priority, vxlan_vn_id_mode, *fq_names, **kwargs):
+    '''
+    Create specific Contrail global vrouter config
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.global_vrouter_config_create name=global-vrouter-config parent_type=global-system-config encap_priority="MPLSoUDP,MPLSoGRE" vxlan_vn_id_mode="automatic" fq_names="['default-global-system-config', 'default-global-vrouter-config']"
+    '''
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    gsc_obj = _get_config(vnc_client)
+    vrouter_conf_objs = global_vrouter_config_list(**kwargs)
+    if name in vrouter_conf_objs:
+        return {'OK': 'Global vrouter config %s already exists' % name}
+    else:
+        vrouter_conf_obj = GlobalVrouterConfig(
+            name=name,
+            parent_obj=None,
+            encapsulation_priorities=EncapsulationPrioritiesType(encapsulation=encap_priority.split(",")),
+            fq_name=fq_names,
+            vxlan_network_identifier_mode=vxlan_vn_id_mode,
+            parent_type=parent_type,
+        )
+        if __opts__['test']:
+            return "Global vRouter config " + name + " will be created"
+        vnc_client.global_vrouter_config_create(vrouter_conf_obj)
+    return "Created"
+
+
+def global_vrouter_config_delete(name, **kwargs):
+    '''
+    Delete specific Contrail global vrouter config
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.global_vrouter_config_delete global-vrouter-config
+    '''
+    vnc_client = _auth(**kwargs)
+    gsc_obj = _get_config(vnc_client)
+    vrouter_conf_obj = GlobalVrouterConfig(name, gsc_obj)
+    if __opts__['test']:
+        return "Global vRouter config " + name + " will be deleted"
+    vnc_client.global_vrouter_config_delete(
+        fq_name=vrouter_conf_obj.get_fq_name())
+    return "Deleted"
 
 
 def analytics_node_list(**kwargs):
@@ -220,14 +704,15 @@
     gsc_obj = _get_config(vnc_client)
     analytics_node_objs = analytics_node_list(**kwargs)
     if name in analytics_node_objs:
-        return {'Error': 'Analytics node %s already exists' % name}
+        return {'OK': 'Analytics node %s already exists' % name}
     else:
         analytics_node_obj = AnalyticsNode(
             name, gsc_obj,
             analytics_node_ip_address=ip_address)
+        if __opts__['test']:
+            return "AnalyticsNode " + name + " will be created"
         vnc_client.analytics_node_create(analytics_node_obj)
-    ret = analytics_node_list(**kwargs)
-    return ret[name]
+    return "Created"
 
 
 def analytics_node_delete(name, **kwargs):
@@ -243,8 +728,11 @@
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     analytics_node_obj = AnalyticsNode(name, gsc_obj)
+    if __opts__['test']:
+        return "AnalyticsNode " + name + " will be deleted"
     vnc_client.analytics_node_delete(
         fq_name=analytics_node_obj.get_fq_name())
+    return "Deleted"
 
 
 def config_node_list(**kwargs):
@@ -299,14 +787,15 @@
     gsc_obj = _get_config(vnc_client)
     config_node_objs = config_node_list(**kwargs)
     if name in config_node_objs:
-        return {'Error': 'Config node %s already exists' % name}
+        return {'OK': 'Config node %s already exists' % name}
     else:
         config_node_obj = ConfigNode(
             name, gsc_obj,
             config_node_ip_address=ip_address)
+        if __opts__['test']:
+            return "ConfigNode " + name + " will be created"
         vnc_client.config_node_create(config_node_obj)
-    ret = config_node_list(**kwargs)
-    return ret[name]
+    return "Created"
 
 
 def config_node_delete(name, **kwargs):
@@ -322,8 +811,11 @@
     vnc_client = _auth(**kwargs)
     gsc_obj = _get_config(vnc_client)
     config_node_obj = ConfigNode(name, gsc_obj)
+    if __opts__['test']:
+        return "ConfigNode " + name + " will be deleted"
     vnc_client.config_node_delete(
         fq_name=config_node_obj.get_fq_name())
+    return "Deleted"
 
 
 def bgp_router_list(**kwargs):
@@ -377,39 +869,45 @@
     ret = {}
     vnc_client = _auth(**kwargs)
 
+    address_families = ['route-target', 'inet-vpn', 'e-vpn', 'erm-vpn',
+                        'inet6-vpn']
+    if type != 'control-node':
+        address_families.remove('erm-vpn')
+
+    bgp_addr_fams = AddressFamilies(address_families)
+    bgp_sess_attrs = [
+        BgpSessionAttributes(address_families=bgp_addr_fams)]
+    bgp_sessions = [BgpSession(attributes=bgp_sess_attrs)]
+    bgp_peering_attrs = BgpPeeringAttributes(session=bgp_sessions)
+    rt_inst_obj = _get_rt_inst_obj(vnc_client)
+
+    if type == 'control-node':
+        vendor = 'contrail'
+    elif type == 'router':
+        vendor = 'mx'
+    else:
+        vendor = 'unknown'
+
+    router_params = BgpRouterParams(router_type=type,
+                                    vendor=vendor, autonomous_system=int(asn),
+                                    identifier=_get_ip(ip_address),
+                                    address=_get_ip(ip_address),
+                                    port=179, address_families=bgp_addr_fams)
+
     bgp_router_objs = bgp_router_list(**kwargs)
     if name in bgp_router_objs:
-        return {'Error': 'control node %s already exists' % name}
+        bgp_router_obj = vnc_client._object_read('bgp-router', id=bgp_router_objs[name]['_uuid'])
+        bgp_router_obj.set_bgp_router_parameters(router_params)
+        if __opts__['test']:
+            return "BGP router " + name + " will be updated"
+        vnc_client.bgp_router_update(bgp_router_obj)
     else:
-        address_families = ['route-target', 'inet-vpn', 'e-vpn', 'erm-vpn',
-                            'inet6-vpn']
-        if type != 'control-node':
-            address_families.remove('erm-vpn')
-
-        bgp_addr_fams = AddressFamilies(address_families)
-        bgp_sess_attrs = [
-            BgpSessionAttributes(address_families=bgp_addr_fams)]
-        bgp_sessions = [BgpSession(attributes=bgp_sess_attrs)]
-        bgp_peering_attrs = BgpPeeringAttributes(session=bgp_sessions)
-        rt_inst_obj = _get_rt_inst_obj(vnc_client)
-
-        if type == 'control-node':
-            vendor = 'contrail'
-        elif type == 'router':
-            vendor = 'mx'
-        else:
-            vendor = 'unknown'
-
-        router_params = BgpRouterParams(router_type=type,
-            vendor=vendor, autonomous_system=int(asn),
-            identifier=_get_ip(ip_address),
-            address=_get_ip(ip_address),
-            port=179, address_families=bgp_addr_fams)
-        bgp_router_obj = BgpRouter(name, rt_inst_obj,
-            bgp_router_parameters=router_params)
+        bgp_router_obj = BgpRouter(name, rt_inst_obj, bgp_router_parameters=router_params)
+        if __opts__['test']:
+            return "BGP router " + name + " will be created"
         vnc_client.bgp_router_create(bgp_router_obj)
-    ret = bgp_router_list(**kwargs)
-    return ret[name]
+        return "Created"
+    return {'OK': 'Config node %s already exists' % name}
 
 
 def bgp_router_delete(name, **kwargs):
@@ -423,11 +921,16 @@
         salt '*' contrail.bgp_router_delete mx01
     '''
     vnc_client = _auth(**kwargs)
-    gsc_obj = _get_control(vnc_client)
+    gsc_obj = _get_config(vnc_client)
     bgp_router_obj = BgpRouter(name, gsc_obj)
+
+    if __opts__['test']:
+        return "BGP router " + name + " will be deleted"
     vnc_client.bgp_router_delete(
         fq_name=bgp_router_obj.get_fq_name())
 
+    return "Deleted"
+
 
 def database_node_list(**kwargs):
     '''
@@ -481,14 +984,15 @@
     gsc_obj = _get_config(vnc_client)
     database_node_objs = database_node_list(**kwargs)
     if name in database_node_objs:
-        return {'Error': 'Database node %s already exists' % name}
+        return {'OK': 'Database node %s already exists' % name}
     else:
         database_node_obj = DatabaseNode(
             name, gsc_obj,
             database_node_ip_address=ip_address)
+        if __opts__['test']:
+            return "DatabaseNode " + name + " will be created"
         vnc_client.database_node_create(database_node_obj)
-    ret = database_node_list(**kwargs)
-    return ret[name]
+    return "Created"
 
 
 def database_node_delete(name, **kwargs):
@@ -502,14 +1006,14 @@
         salt '*' contrail.database_node_delete cmp01
     '''
     vnc_client = _auth(**kwargs)
-    gsc_obj = _get_database(vnc_client)
-    database_node_obj = databaseNode(name, gsc_obj)
+    gsc_obj = _get_config(vnc_client)
+    database_node_obj = DatabaseNode(name, gsc_obj)
+    if __opts__['test']:
+        return "DatabaseNode " + name + " will be deleted"
     vnc_client.database_node_delete(
         fq_name=database_node_obj.get_fq_name())
 
 
-
-
 def _get_vrouter_config(vnc_client):
     try:
         config = vnc_client.global_vrouter_config_read(
@@ -520,7 +1024,6 @@
     return config
 
 
-
 def linklocal_service_list(**kwargs):
     '''
     Return a list of all Contrail link local services
@@ -602,7 +1105,11 @@
     if current_config is None:
         new_services = LinklocalServicesTypes([service_entry])
         new_config = GlobalVrouterConfig(linklocal_services=new_services)
-        vnc_client.global_vrouter_config_create(new_config)
+        if __opts__['test']:
+            ret['GlobalVrouterConfig'] = "Global vRouter Config will be created"
+        else:
+            ret = "Created"
+            vnc_client.global_vrouter_config_create(new_config)
     else:
         _current_service_list = current_config.get_linklocal_services()
         if _current_service_list is None:
@@ -617,13 +1124,18 @@
                 entry = _entry.__dict__
                 if 'linklocal_service_name' in entry:
                     if entry['linklocal_service_name'] == name:
-                        return {'Error': 'Link local service "{0}" already exists'.format(name)}
+                        return {'OK': 'Link local service "{0}" already exists'.format(name)}
                     new_services.append(_entry)
+            if __opts__['test']:
+                ret['Test'] = "LinkLocalSevices will be created"
             service_list[key] = new_services
         new_config = GlobalVrouterConfig(linklocal_services=service_list)
-        vnc_client.global_vrouter_config_update(new_config)
-    ret = linklocal_service_list(**kwargs)
-    return ret[name]
+        if __opts__['test']:
+            ret['GlobalVrouterConfig'] = "Global vRouter Config will be updated"
+        else:
+            vnc_client.global_vrouter_config_update(new_config)
+            ret = "Created"
+    return ret
 
 
 def linklocal_service_delete(name, **kwargs):
@@ -660,6 +1172,46 @@
                         new_services.append(_entry)
             service_list[key] = new_services
         new_config = GlobalVrouterConfig(linklocal_services=service_list)
+        if __opts__['test']:
+            return "Link local service " + name + " will be deleted"
         vnc_client.global_vrouter_config_update(new_config)
+        return "Deleted"
     if not found:
         return {'Error': 'Link local service "{0}" not found'.format(name)}
+
+
+def virtual_machine_interface_list(**kwargs):
+    '''
+    Return a list of all Contrail virtual machine interfaces
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.virtual_machine_interfaces
+    '''
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    vm_ifaces = vnc_client._objects_list('virtual-machine-interface', detail=True)
+    for vm_iface in vm_ifaces:
+        ret[vm_iface.name] = vm_iface.__dict__
+    return ret
+
+
+def virtual_network_list(**kwargs):
+    '''
+    Return a list of all Contrail virtual network
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' contrail.virtual_network
+    '''
+
+    ret = {}
+    vnc_client = _auth(**kwargs)
+    virtual_networks = vnc_client._objects_list('virtual-network', detail=True)
+    for virtual_network in virtual_networks:
+        ret[virtual_network.name] = virtual_network.__dict__
+    return ret
