diff --git a/src/test/cordvtn/cordvtnTest.py b/src/test/cordvtn/cordvtnTest.py
index 8c2f49b..bb5087f 100644
--- a/src/test/cordvtn/cordvtnTest.py
+++ b/src/test/cordvtn/cordvtnTest.py
@@ -19,7 +19,7 @@
 import keystoneclient.apiclient.exceptions
 import neutronclient.v2_0.client as nclient
 import neutronclient.common.exceptions
-#import novaclient.v1_1.client as novaclient
+import novaclient.v1_1.client as novaclient
 from novaclient import client as nova_client
 from multiprocessing import Pool
 from neutronclient.v2_0 import client as neutron_client
@@ -30,6 +30,7 @@
 from CordLogger import CordLogger
 from TestManifest import TestManifest
 from OnosFlowCtrl import OnosFlowCtrl
+from scapy.all import *
 from credentials import *
 from VSGAccess import VSGAccess
 from SSHTestAgent import SSHTestAgent
@@ -152,7 +153,7 @@
     def get_compute_nodes(cls):
         credentials = get_nova_credentials_v2()
         novaclient = nova_client.Client('2', **credentials)
-        print(novaclient.hypervisors.list())
+        print novaclient.hypervisors.list()
         return novaclient.hypervisors.list()
 
     def create_network(i):
@@ -163,10 +164,10 @@
         while True:
            try:
               net = neutron.create_network(body=json)
-              print('\nnetwork-' + str(i) + ' created')
+              print '\nnetwork-' + str(i) + ' created'
               return net
            except Exception as e:
-              print(e)
+              print e
               continue
 
     def create_tenant(tenant_name):
@@ -182,7 +183,7 @@
             user_name = tenant_name + '-user-' + str(j)
             user_data.append(create_user(user_name, tenant_id))
 
-        print(" Tenant and User Created")
+        print " Tenant and User Created"
 
         tenant_data = {'tenant_name': tenant_name,
                        'tenant_id': tenant_id,
@@ -442,7 +443,7 @@
                  match = True
                  return match
         if match is True:
-           print("Network search is successful")
+           print"Network search is successful"
         return match
 
     def get_key_value(self, d, key = None, value = None,):
@@ -458,7 +459,7 @@
                   if type(d[i]) is dict:
                      match,ret_k,ret_v = self.get_key_value(d[i], key, value)
                      if match is True:
-                        print("Network creation is successful")
+                        print "Network creation is successful"
                         break
         else:
            for k, v in d.items():
@@ -559,23 +560,38 @@
         return resp
 
     def nova_instance_creation_and_validation(self,net_name,nova_obj,instance_name,image_name, flavor_id):
+        print nova_obj.images.list()
         image = nova_obj.images.find(name=image_name)
         flavor = nova_obj.flavors.find(name=flavor_id)
-        network = nova_obj.networks.find(label=net_name)
-        print(network.id)
+
+        nics_list = ""
+        if len(net_name) == 2:
+            network_1 = nova_obj.networks.find(label=net_name[0])
+            network_2 = nova_obj.networks.find(label=net_name[1])
+            print network_1.id
+            print network_2.id
+            nics_list = [{'net-id':network_1.id},{'net-id':network_2.id}]
+        else:
+            network_1 = nova_obj.networks.find(label=net_name)
+            print network_1.id
+            nics_list = [{'net-id':network_1.id}]
 
         server = nova_obj.servers.create(name = instance_name,
                                          image = image.id,
                                          flavor = flavor.id,
-                                         nics = [{'net-id':network.id}])
+                                         nics = nics_list,
+                                         userdata = "#cloud-config \n password: ubuntu \n chpasswd: { expire: False }\n ssh_pwauth: True")
+                                 #        key_name = keypair.name)
         server_details =  nova_obj.servers.find(id=server.id)
         print('Server is launched and status is %s' %server_details.status)
         if server_details.status == 'BUILD':
-           time.sleep(20)
+           time.sleep(120)
         server_details =  nova_obj.servers.find(id=server.id)
         print('After delay server status is %s state'%server_details.status)
         if server_details.status == 'ERROR':
            print('Server status is still in %s state'%server_details.status)
+        server_boot_up_log = nova_obj.servers.get_console_output(server.id)
+        print 'Server boot Up console log \n%s'%server_boot_up_log
         return server_details
 
     def create_net_subnet_nova_instance(self,net_name, subnet_name, instance_vm_details,management_type):
@@ -591,7 +607,7 @@
         creds = get_nova_credentials()
         nova = nova_client.Client('2', **creds)
         new_instance_details = self.nova_instance_creation_and_validation(net_name,nova,instance_vm_details[0],instance_vm_details[1],instance_vm_details[2])
-        #assert_equal(new_instance_details.status, 'ACTIVE')
+        assert_equal(new_instance_details.status, 'ACTIVE')
         return [nova, new_instance_details]
 
     def nova_instance_tenants_access_check(self, target_tenants_details, compute_details = None, source_tenants_details = None , check_type = 'Ping_from_compute'):
@@ -608,37 +624,40 @@
            compute_ip = compute_details.ip
 
         ## TO DO New instance is not getting subnet ip, hence checking only mysite-vsg1 vm from compute node
-        if target_tenants_details.addresses == {}:
-           target_tenants_details.addresses = '10.1.0.1'
+        if target_tenants_details == {}:
+           target_tenants_details = '10.1.0.1'
 
         ## TO DO New instance is not getting subnet ip, hence checking only mysite-vsg1 vm from compute node
         if source_tenants_details is not None:
-           if source_tenants_details.addresses == {}:
-              source_tenants_details.addresses = '10.1.0.1'
+           if source_tenants_details == {}:
+              source_tenants_details = '10.1.0.1'
 
         if check_type == "Ping_from_compute":
-           cmd = "ping -c 3 {0}".format(target_tenants_details.addresses)
+           cmd2 = "ping -c 3 {0}".format(target_tenants_details)
            ssh_agent = SSHTestAgent(host = compute_ip)
-           status, output = ssh_agent.run_cmd(cmd, timeout = 5)
+           status, output = ssh_agent.run_cmd(cmd2, timeout = 5)
+           print output
 
         if source_tenants_details is not None:
            if check_type == "Ping_from_source_tenant":
-              cmd = "ping -c 3 {0}".format(target_tenants_details.addresses)
-              ssh_cmd = 'ssh {} {}'.format(source_tenants_details.addresses, cmd)
-              print(ssh_cmd)
+              cmd = "ping -c 3 {0}".format(target_tenants_details)
+              ssh_cmd = 'ssh {} {}'.format(source_tenants_details, cmd)
               ssh_agent = SSHTestAgent(host = compute_ip)
-              status, output = ssh_agent.run_cmd(cmd, timeout = 5)
+              status, output = ssh_agent.run_cmd(ssh_cmd, timeout = 5)
+              print output
 
         if check_type == "Ping_to_external":
            cmd = "ping -c 3 google.com"
+           ssh_cmd = 'ssh {} {}'.format(target_tenants_details, cmd)
            ssh_agent = SSHTestAgent(host = compute_ip)
-           status, output = ssh_agent.run_cmd(cmd, timeout = 5)
+           status, output = ssh_agent.run_cmd(ssh_cmd, timeout = 5)
+           print output
 
         if status == True and output:
-           print("Ping is successful")
+           print "Ping is successful"
            output = output.strip()
-        else:
-           print("Ping is not successful")
+        elif status == False:
+           print "Ping is not successful"
            output = None
         return [status, output]
 
@@ -646,9 +665,9 @@
     def nova_instance_deletion(self, nova_obj, server_details):
         results_nova_instance_deletion=nova_obj.servers.delete(server_details.id)
         if results_nova_instance_deletion == None:
-           print("Nova instance is deleted")
+           print"Nova instance is deleted"
         else:
-           print("Nova instance is not deleted")
+           print"Nova instance is not deleted"
         return results_nova_instance_deletion
 
     def test_cordvtn_neutron_network_creation_and_validation_on_head_node_with_neutron_service(self):
@@ -788,7 +807,7 @@
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under management network
+        1. Create subnetwork whose ip is under management network
         2. Run sync command for cordvtn
         3. Do GET Rest API and validate creation of network
         4. Pushed the network type as management local to onos
@@ -825,11 +844,11 @@
         self.neutron_network_deletion(test_net_name)
         assert_equal(net_type_json['message'], 'null already exists')
 
-    def test_cordvtn_management_network_creation_with_launching_nova_instance_and_validation_on_head_node_with_nova_service(self):
+    def test_cordvtn_with_management_network_creation_launching_nova_instance_and_validation_on_head_node_with_nova_service(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under management network
+        1. Create subnetwork whose ip is under management network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under management network
         5. Validate new nova instance is created on nova service
@@ -855,11 +874,11 @@
         self.nova_instance_deletion(nova, new_instance_details)
         assert_equal(new_instance_details.status, 'ACTIVE')
 
-    def test_cordvtn_neutron_public_network_creation_and_validation_on_head_node_with_neutron_service(self):
+    def test_cordvtn_with_public_network_creation_and_validation_on_head_node_with_neutron_service(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork who ip is under management network
+        1. Create subnetwork who ip is under management network
         2. Run sync command for cordvtn
         3. Do GET Rest API and validate creation of network
         4. Validate network synch with created network in cord-onos
@@ -873,11 +892,11 @@
            self.neutron_network_deletion(test_net_name)
         assert_equal(sub_result[0], True)
 
-    def test_cordvtn_neutron_public_network_creation_and_validation_on_onos(self):
+    def test_cordvtn_with_public_network_creation_and_validation_on_onos(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whoes ip is under management network
+        1. Create subnetwork whoes ip is under management network
         2. Run sync command for cordvtn
         3. Do GET Rest API and validate creation of network
         """
@@ -907,11 +926,11 @@
                     assert_equal(sub_net_id[0], True)
                     break
 
-    def test_cordvtn_neutron_public_network_creation_and_post_network_type_as_public_to_onos(self):
+    def test_cordvtn_with_public_network_creation_and_post_network_type_as_public_to_onos(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under management network
+        1. Create subnetwork whose ip is under management network
         2. Run sync command for cordvtn
         3. Do GET Rest API and validate creation of network
         4. Pushed the network type as management local to onos
@@ -953,7 +972,7 @@
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under public network
+        1. Create subnetwork whose ip is under public network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under public network
         5. Validate new nova instance is created on nova service
@@ -978,11 +997,11 @@
         self.nova_instance_deletion(nova, new_instance_details)
         assert_equal(new_instance_details.status, 'ACTIVE')
 
-    def test_cordvtn_neutron_private_network_creation_and_validation_on_head_node_with_neutron_service(self):
+    def test_cordvtn_with_private_network_creation_and_validation_on_head_node_with_neutron_service(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork who ip is under private network
+        1. Create subnetwork who ip is under private network
         2. Run sync command for cordvtn
         3. Do GET Rest API and validate creation of network
         4. Validate network synch with created network in cord-onos
@@ -996,11 +1015,11 @@
            self.neutron_network_deletion(test_net_name)
         assert_equal(sub_result[0], True)
 
-    def test_cordvtn_neutron_private_network_creation_and_validation_on_onos(self):
+    def test_cordvtn_with_private_network_creation_and_validation_on_onos(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whoes ip is under management network
+        1. Create subnetwork whoes ip is under management network
         2. Run sync command for cordvtn
         3. Do GET Rest API and validate creation of network
         """
@@ -1031,11 +1050,11 @@
                     assert_equal(sub_net_id[0], True)
                     break
 
-    def test_cordvtn_neutron_private_network_creation_and_post_network_type_as_private_to_onos(self):
+    def test_cordvtn_with_private_network_creation_and_post_network_type_as_private_to_onos(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under management network
+        1. Create subnetwork whose ip is under management network
         2. Run sync command for cordvtn
         3. Do GET Rest API and validate creation of network
         4. Pushed the network type as management local to onos
@@ -1073,11 +1092,11 @@
         self.neutron_network_deletion(test_net_name)
         assert_equal(net_type_json['message'], 'null already exists')
 
-    def test_cordvtn_private_network_creation_with_launching_nova_instance_and_validation_on_head_node_with_nova_service(self):
+    def test_cordvtn_with_private_network_creation_launching_nova_instance_and_validating_on_head_node_with_nova_service(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under private network
+        1. Create subnetwork whose ip is under private network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under private network
         5. Validate new nova instance is created on nova service
@@ -1102,11 +1121,11 @@
         self.nova_instance_deletion(nova, new_instance_details)
         assert_equal(new_instance_details.status, 'ACTIVE')
 
-    def test_cordvtn_management_network_instance_ping_form_host_machine_or_compute_node(self):
+    def test_cordvtn_management_network_instance_and_validate_connectivity_from_host_machine_or_compute_node(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under management network
+        1. Create subnetwork whose ip is under management network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under management network
         5. Validate new nova instance is created on nova service
@@ -1116,7 +1135,8 @@
         test_sub_net_cidr = ["management","172.27.0.0/24", "172.27.0.20", "172.27.0.21"]
         test_management_type = "management_local"
         instance_vm_name = 'vtn_test_17_nova_instance_management_net'
-        image_name = "vsg-1.1"
+        #image_name = "vsg-1.1"
+        image_name = "trusty-server-multi-nic"
         flavor_id = 'm1.small'
         result = self.neutron_network_creation_and_validation(test_net_name)
         assert_equal(result, True)
@@ -1130,19 +1150,22 @@
         creds = get_nova_credentials()
         nova = nova_client.Client('2', **creds)
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
-        #assert_equal(new_instance_details.status, 'ACTIVE')
+        assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print(new_instance_details.addresses)
+        print new_instance_details.addresses
+        time.sleep(60)
         status, output = self.nova_instance_tenants_access_check(new_instance_details)
+        self.nova_instance_deletion(nova, new_instance_details)
+        time.sleep(5)
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
         assert_equal(status, True)
 
-    def test_cordvtn_management_network_instance_ping_to_external_network(self):
+    def test_cordvtn_for_management_network_instance_and_validate_connectivity_to_external_network(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under management network
+        1. Create subnetwork whose ip is under management network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under management network
         5. Validate new nova instance is created on nova service
@@ -1166,19 +1189,19 @@
         creds = get_nova_credentials()
         nova = nova_client.Client('2', **creds)
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
-        #assert_equal(new_instance_details.status, 'ACTIVE')
+        assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print(new_instance_details.addresses)
+        print new_instance_details.addresses
         status, output = self.nova_instance_tenants_access_check(new_instance_details, check_type = "Ping_to_external")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
         assert_equal(status, False)
 
-    def test_cordvtn_management_network_two_instance_ping_between_two_instances(self):
+    def test_cordvtn_with_management_network_creating_two_instances_and_validate_connectivity_between_two(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under management network
+        1. Create subnetwork whose ip is under management network
         3. Do GET Rest API and validate creation of network
         4. Create first nova instance under management network
         5. Validate first nova instance is created on nova service
@@ -1206,23 +1229,23 @@
         nova = nova_client.Client('2', **creds)
         first_nova_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,first_instance_vm_name,image_name,flavor_id)
         second_nova_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,second_instance_vm_name,image_name,flavor_id)
-        #assert_equal(first_instance_details.status, 'ACTIVE')
-        #assert_equal(second_instance_details.status, 'ACTIVE')
+        assert_equal(first_instance_details.status, 'ACTIVE')
+        assert_equal(second_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print('New nova instance ip addresses are ')
-        print(first_nova_instance_details.addresses)
-        print(second_nova_instance_details.addresses)
+        print 'New nova instance ip addresses are '
+        print first_nova_instance_details.addresses
+        print second_nova_instance_details.addresses
         status, output = self.nova_instance_tenants_access_check(first_nova_instance_details,source_tenants_details = second_nova_instance_details, check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, first_nova_instance_details)
         self.nova_instance_deletion(nova, second_nova_instance_details)
         assert_equal(status, False)
 
-    def test_cordvtn_two_management_network_instances_ping_between_two_networks_via_management_network(self):
+    def test_cordvtn_creating_two_management_network_instances_and_validate_connectivity_between_two_networks_via_management_network(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under management network
+        1. Create subnetwork whose ip is under management network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under management network
         5. Validate new nova instance is created on nova service
@@ -1242,12 +1265,12 @@
         nova_netA, nova_instance_details_netA = self.create_net_subnet_nova_instance(test_netA_name, test_sub_netA_cidr, netA_instance_vm_details, test_management_type)
         nova_netB, nova_instance_details_netB = self.create_net_subnet_nova_instance(test_netB_name, test_sub_netB_cidr, netB_instance_vm_details, test_management_type)
 
-        #assert_equal(nova_instance_details_netA.status, 'ACTIVE')
-        #assert_equal(nova_instance_details_netB.status, 'ACTIVE')
+        assert_equal(nova_instance_details_netA.status, 'ACTIVE')
+        assert_equal(nova_instance_details_netB.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print('New nova instance ip addresses are ')
-        print(nova_instance_details_netA.addresses)
-        print(nova_instance_details_netB.addresses)
+        print 'New nova instance ip addresses are '
+        print nova_instance_details_netA.addresses
+        print nova_instance_details_netB.addresses
         status, output = self.nova_instance_tenants_access_check(nova_instance_details_netA, source_tenants_details = nova_instance_details_netB,check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_netA_name)
         self.nova_instance_deletion(nova_netA, nova_instance_details_netA)
@@ -1255,12 +1278,11 @@
         self.nova_instance_deletion(nova_netB, nova_instance_details_netB)
         assert_equal(status, False)
 
-    def test_cordvtn_public_network_instance_ping_form_host_machine_or_compute_node(self):
-
+    def test_cordvtn_creating_public_network_instance_and_validate_connectivity_from_host_machine_or_compute_node(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under public network
+        1. Create subnetwork whose ip is under public network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under public network
         5. Validate new nova instance is created on nova service
@@ -1284,19 +1306,19 @@
         creds = get_nova_credentials()
         nova = nova_client.Client('2', **creds)
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
-        #assert_equal(new_instance_details.status, 'ACTIVE')
+        assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print(new_instance_details.addresses)
+        print new_instance_details.addresses
         status, output = self.nova_instance_tenants_access_check(new_instance_details)
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
         assert_equal(status, False)
 
-    def test_cordvtn_public_network_instance_ping_to_external_network(self):
+    def test_cordvtn_creating_public_network_instance_and_validate_connectivity_to_external_network(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under public network
+        1. Create subnetwork whose ip is under public network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under public network
         5. Validate new nova instance is created on nova service
@@ -1320,20 +1342,19 @@
         creds = get_nova_credentials()
         nova = nova_client.Client('2', **creds)
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
-        #assert_equal(new_instance_details.status, 'ACTIVE')
+        assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print(new_instance_details.addresses)
+        print new_instance_details.addresses
         status, output = self.nova_instance_tenants_access_check(new_instance_details, check_type = "Ping_to_external")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
         assert_equal(status, True)
 
-
-    def test_cordvtn_public_network_two_instance_ping_between_two_instances(self):
+    def test_cordvtn_creating_public_network_with_two_instances_and_validate_connectivity_between_two(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under public network
+        1. Create subnetwork whose ip is under public network
         3. Do GET Rest API and validate creation of network
         4. Create first nova instance under public network
         5. Validate first nova instance is created on nova service
@@ -1361,23 +1382,23 @@
         nova = nova_client.Client('2', **creds)
         first_nova_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,first_instance_vm_name,image_name,flavor_id)
         second_nova_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,second_instance_vm_name,image_name,flavor_id)
-        #assert_equal(first_instance_details.status, 'ACTIVE')
-        #assert_equal(second_instance_details.status, 'ACTIVE')
+        assert_equal(first_instance_details.status, 'ACTIVE')
+        assert_equal(second_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print('New nova instance ip addresses are ')
-        print(first_nova_instance_details.addresses)
-        print(second_nova_instance_details.addresses)
+        print 'New nova instance ip addresses are '
+        print first_nova_instance_details.addresses
+        print second_nova_instance_details.addresses
         status, output = self.nova_instance_tenants_access_check(first_nova_instance_details,source_tenants_details = second_nova_instance_details, check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, first_nova_instance_details)
         self.nova_instance_deletion(nova, second_nova_instance_details)
         assert_equal(status, False)
 
-    def test_cordvtn_two_public_network_instances_ping_between_two_networks_via_public_network(self):
+    def test_cordvtn_creating_two_public_network_instances_and_check_connectvity_between_two_networks_via_public_network(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under public network
+        1. Create subnetwork whose ip is under public network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under public network
         5. Validate new nova instance is created on nova service
@@ -1397,12 +1418,12 @@
         nova_netA, nova_instance_details_netA = self.create_net_subnet_nova_instance(test_netA_name, test_sub_netA_cidr, netA_instance_vm_details, test_management_type)
         nova_netB, nova_instance_details_netB = self.create_net_subnet_nova_instance(test_netB_name, test_sub_netB_cidr, netB_instance_vm_details, test_management_type)
 
-        #assert_equal(nova_instance_details_netA.status, 'ACTIVE')
-        #assert_equal(nova_instance_details_netB.status, 'ACTIVE')
+        assert_equal(nova_instance_details_netA.status, 'ACTIVE')
+        assert_equal(nova_instance_details_netB.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print('New nova instance ip addresses are ')
-        print(nova_instance_details_netA.addresses)
-        print(nova_instance_details_netB.addresses)
+        print 'New nova instance ip addresses are '
+        print nova_instance_details_netA.addresses
+        print nova_instance_details_netB.addresses
         status, output = self.nova_instance_tenants_access_check(nova_instance_details_netA, source_tenants_details = nova_instance_details_netB,check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_netA_name)
         self.nova_instance_deletion(nova_netA, nova_instance_details_netA)
@@ -1410,11 +1431,11 @@
         self.nova_instance_deletion(nova_netB, nova_instance_details_netB)
         assert_equal(status, False)
 
-    def test_cordvtn_private_network_instance_ping_form_host_machine_or_compute_node(self):
+    def test_cordvtn_creating_private_network_instance_and_validate_connectivity_from_host_machine_or_compute_node(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under private network
+        1. Create subnetwork whose ip is under private network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under private network
         5. Validate new nova instance is created on nova service
@@ -1438,19 +1459,19 @@
         creds = get_nova_credentials()
         nova = nova_client.Client('2', **creds)
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
-        #assert_equal(new_instance_details.status, 'ACTIVE')
+        assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print(new_instance_details.addresses)
+        print new_instance_details.addresses
         status, output = self.nova_instance_tenants_access_check(new_instance_details)
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
         assert_equal(status, False)
 
-    def test_cordvtn_private_network_instance_ping_to_external_network(self):
+    def test_cordvtn_creating_private_network_instance_and_validate_connectivity_to_external_network(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under private network
+        1. Create subnetwork whose ip is under private network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under private network
         5. Validate new nova instance is created on nova service
@@ -1474,19 +1495,19 @@
         creds = get_nova_credentials()
         nova = nova_client.Client('2', **creds)
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
-        #assert_equal(new_instance_details.status, 'ACTIVE')
+        assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print(new_instance_details.addresses)
+        print new_instance_details.addresses
         status, output = self.nova_instance_tenants_access_check(new_instance_details, check_type = "Ping_to_external")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
         assert_equal(status, False)
 
-    def test_cordvtn_private_network_two_instance_ping_between_two_instances(self):
+    def test_cordvtn_creating_private_network_with_two_instances_and_check_connectvity_between_two_instances(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under private network
+        1. Create subnetwork whose ip is under private network
         3. Do GET Rest API and validate creation of network
         4. Create first nova instance under private network
         5. Validate first nova instance is created on nova service
@@ -1514,23 +1535,23 @@
         nova = nova_client.Client('2', **creds)
         first_nova_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,first_instance_vm_name,image_name,flavor_id)
         second_nova_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,second_instance_vm_name,image_name,flavor_id)
-        #assert_equal(first_instance_details.status, 'ACTIVE')
-        #assert_equal(second_instance_details.status, 'ACTIVE')
+        assert_equal(first_instance_details.status, 'ACTIVE')
+        assert_equal(second_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print('New nova instance ip addresses are ')
-        print(first_nova_instance_details.addresses)
-        print(second_nova_instance_details.addresses)
+        print 'New nova instance ip addresses are '
+        print first_nova_instance_details.addresses
+        print second_nova_instance_details.addresses
         status, output = self.nova_instance_tenants_access_check(first_nova_instance_details,source_tenants_details = second_nova_instance_details, check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, first_nova_instance_details)
         self.nova_instance_deletion(nova, second_nova_instance_details)
         assert_equal(status, True)
 
-    def test_cordvtn_two_private_network_instances_ping_between_two_networks_via_private_network(self):
+    def test_cordvtn_creating_two_private_network_instances_and_validate_connectivity_between_two_networks_via_private_network(self):
         """
         Algo:
         0. Create Test-Net,
-        1. Cretae subnetwork whose ip is under private network
+        1. Create subnetwork whose ip is under private network
         3. Do GET Rest API and validate creation of network
         4. Create new nova instance under private network
         5. Validate new nova instance is created on nova service
@@ -1550,12 +1571,12 @@
         nova_netA, nova_instance_details_netA = self.create_net_subnet_nova_instance(test_netA_name, test_sub_netA_cidr, netA_instance_vm_details, test_management_type)
         nova_netB, nova_instance_details_netB = self.create_net_subnet_nova_instance(test_netB_name, test_sub_netB_cidr, netB_instance_vm_details, test_management_type)
 
-        #assert_equal(nova_instance_details_netA.status, 'ACTIVE')
-        #assert_equal(nova_instance_details_netB.status, 'ACTIVE')
+        assert_equal(nova_instance_details_netA.status, 'ACTIVE')
+        assert_equal(nova_instance_details_netB.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print('New nova instance ip addresses are ')
-        print(nova_instance_details_netA.addresses)
-        print(nova_instance_details_netB.addresses)
+        print 'New nova instance ip addresses are '
+        print nova_instance_details_netA.addresses
+        print nova_instance_details_netB.addresses
         status, output = self.nova_instance_tenants_access_check(nova_instance_details_netA, source_tenants_details = nova_instance_details_netB,check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_netA_name)
         self.nova_instance_deletion(nova_netA, nova_instance_details_netA)
@@ -1563,6 +1584,728 @@
         self.nova_instance_deletion(nova_netB, nova_instance_details_netB)
         assert_equal(status, False)
 
+    def test_cordvtn_creating_management_and_public_network_instances_and_validate_connectivity_from_host_machine_or_compute_node_and_validate_connectivity_to_internet(self):
+        """
+        Algo:
+        0. Create Test-Net,
+        1. Create subnetwork whose ip is under management network
+        3. Do GET Rest API and validate creation of network
+        4. Create new nova instance under management network
+        5. Validate new nova instance is created on nova service
+        6. Verify ping is getting successful from compute node to nova instance which is created in step 4.
+        """
+        test_second_network_name = ['vtn_test_29_net_management','vtn_test_29_net_public']
+        test_sub_second_network_cidr = [["management","172.27.0.0/24", "172.27.0.20", "172.27.0.21"], ["public","10.6.1.192/26",'10.6.1.193']]
+        test_management_type = ["management_local", 'public']
+        instance_vm_name = 'vtn_test_29_nova_instance_management_net'
+#        image_name = "vsg-1.1"
+        image_name = "trusty-server-multi-nic"
+        flavor_id = 'm1.small'
+        for test_net_name in test_second_network_name:
+            result = self.neutron_network_creation_and_validation(test_net_name)
+            assert_equal(result, True)
+        neutron_creds = self.get_neutron_credentials()
+        neutron = neutronclient.Client(**neutron_creds)
+        #for test_net_name,test_sub_net_cidr in test_second_network_name test_sub_2networks_cidr:
+        for i in range(0,2):
+           networks = neutron.list_networks(name=test_second_network_name[i])
+           network_id = self.get_key_value(d=networks, key = 'id')
+           sub_result = self.neutron_subnet_creation_and_validation(test_second_network_name[i],test_sub_2networks_cidr[i])
+           assert_equal(sub_result[0], True)
+           net_type_post = self.sub_network_type_post_to_onos(test_second_network_name[i], test_management_type[i])
+        creds = get_nova_credentials()
+        nova = nova_client.Client('2', **creds)
+        print nova.security_groups.list()
+        new_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,instance_vm_name,image_name,flavor_id)
+        time.sleep(60)
+        assert_equal(new_instance_details.status, 'ACTIVE')
+        compute_details = self.get_compute_nodes()
+        print new_instance_details.addresses
+        address = new_instance_details.addresses
+        print 'Nova instance management ip = %s and public ip %s'%(address[test_second_network_name[0]][0]['addr'],address[test_2networks_name[1]][0]['addr'])
+        print address[test_second_network_name[0]][0]['addr']
+        print nova.security_groups.list()
+        print address[test_second_network_name[1]][0]['addr']
+        print nova.security_groups.list()
+        secgroup = nova.security_groups.find(name="default")
+#        nova.security_group_rules.create(secgroup.id,ip_protocol="tcp",
+                                     #from_port="22",
+                                     #to_port="22",
+                                    # cidr="0.0.0.0/0",)
+
+ #       nova.security_group_rules.create(secgroup.id,
+                                    # ip_protocol="icmp",
+                                    # from_port=-1,
+                                    # cidr="0.0.0.0/0",
+                                    # to_port=-1)
+        print nova.security_groups.list()
+
+        status_1, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'],check_type = "Ping_to_external")
+        self.nova_instance_deletion(nova, new_instance_details)
+        time.sleep(3)
+        self.neutron_network_deletion(test_second_network_name[0])
+        self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+
+    def test_cordvtn_creating_management_and_public_network_instance_with_and_without_pause_and_validate_connectivity_from_host_machine_or_compute_node_and_validate_connectivity_to_internet(self):
+        """
+        Algo:
+        0. Create Test-Net,
+        1. Create subnetwork whose ip is under management network
+        3. Do GET Rest API and validate creation of network
+        4. Create new nova instance under management network
+        5. Validate new nova instance is created on nova service
+        6. Verify ping is getting successful from compute node to nova instance which is created in step 4.
+        7. Now pause the nova instance and check connectivity
+        8. Now unpause the nova instance and check connectivity
+        """
+        test_second_network_name = ['vtn_test_30_net_management','vtn_test_30_net_public']
+        test_sub_second_network_cidr = [["management","172.27.0.0/24", "172.27.0.20", "172.27.0.21"], ["public","10.6.1.192/26",'10.6.1.193']]
+        test_management_type = ["management_local", 'public']
+        instance_vm_name = 'vtn_test_30_nova_instance_management_net'
+#        image_name = "vsg-1.1"
+        image_name = "trusty-server-multi-nic"
+        flavor_id = 'm1.small'
+        for test_net_name in test_second_network_name:
+            result = self.neutron_network_creation_and_validation(test_net_name)
+            assert_equal(result, True)
+        neutron_creds = self.get_neutron_credentials()
+        neutron = neutronclient.Client(**neutron_creds)
+        #for test_net_name,test_sub_net_cidr in test_second_network_name test_sub_2networks_cidr:
+        for i in range(0,2):
+           networks = neutron.list_networks(name=test_second_network_name[i])
+           network_id = self.get_key_value(d=networks, key = 'id')
+           sub_result = self.neutron_subnet_creation_and_validation(test_second_network_name[i],test_sub_2networks_cidr[i])
+           assert_equal(sub_result[0], True)
+           net_type_post = self.sub_network_type_post_to_onos(test_second_network_name[i], test_management_type[i])
+        creds = get_nova_credentials()
+        nova = nova_client.Client('2', **creds)
+        print nova.security_groups.list()
+        new_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,instance_vm_name,image_name,flavor_id)
+        time.sleep(60)
+        assert_equal(new_instance_details.status, 'ACTIVE')
+        compute_details = self.get_compute_nodes()
+        print new_instance_details.addresses
+        address = new_instance_details.addresses
+        print 'Nova instance management ip = %s and public ip %s'%(address[test_second_network_name[0]][0]['addr'],address[test_2networks_name[1]][0]['addr'])
+        print address[test_second_network_name[0]][0]['addr']
+        print nova.security_groups.list()
+        print address[test_second_network_name[1]][0]['addr']
+        print nova.security_groups.list()
+        secgroup = nova.security_groups.find(name="default")
+#        nova.security_group_rules.create(secgroup.id,ip_protocol="tcp",
+                                     #from_port="22",
+                                     #to_port="22",
+                                    # cidr="0.0.0.0/0",)
+
+ #       nova.security_group_rules.create(secgroup.id,
+                                    # ip_protocol="icmp",
+                                    # from_port=-1,
+                                    # cidr="0.0.0.0/0",
+                                    # to_port=-1)
+        print nova.security_groups.list()
+
+        status_1, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'],check_type = "Ping_to_external")
+        if status_1 is False or status_2 is False:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+        new_instance_details.pause()
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'],check_type = "Ping_to_external")
+        if status_1 is True or status_2 is True:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, False)
+        assert_equal(status_2, False)
+        new_instance_details.unpause()
+        print 'Nova instance is paused and unpasued now checking connectivity'
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'],check_type = "Ping_to_external")
+        self.nova_instance_deletion(nova, new_instance_details)
+        time.sleep(3)
+        self.neutron_network_deletion(test_second_network_name[0])
+        self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+
+    def test_cordvtn_creating_management_and_public_network_instance_doing_suspend_and_resume_validating_connectivity_from_host_machine_or_compute_node_and_validate_connectivity_to_internet(self):
+        """
+        Algo:
+        0. Create Test-Net,
+        1. Create subnetwork whose ip is under management network
+        3. Do GET Rest API and validate creation of network
+        4. Create new nova instance under management network
+        5. Validate new nova instance is created on nova service
+        6. Verify ping is getting successful from compute node to nova instance which is created in step 4.
+        7. Now suspend the nova instance and check connectivity
+        8. Now resume the nova instance and check connectivity
+        """
+        test_second_network_name = ['vtn_test_31_net_management','vtn_test_31_net_public']
+        test_sub_second_network_cidr = [["management","172.27.0.0/24", "172.27.0.20", "172.27.0.21"], ["public","10.6.1.192/26",'10.6.1.193']]
+        test_management_type = ["management_local", 'public']
+        instance_vm_name = 'vtn_test_31_nova_instance_management_net'
+#        image_name = "vsg-1.1"
+        image_name = "trusty-server-multi-nic"
+        flavor_id = 'm1.small'
+        for test_net_name in test_second_network_name:
+            result = self.neutron_network_creation_and_validation(test_net_name)
+            assert_equal(result, True)
+        neutron_creds = self.get_neutron_credentials()
+        neutron = neutronclient.Client(**neutron_creds)
+        #for test_net_name,test_sub_net_cidr in test_second_network_name test_sub_2networks_cidr:
+        for i in range(0,2):
+           networks = neutron.list_networks(name=test_second_network_name[i])
+           network_id = self.get_key_value(d=networks, key = 'id')
+           sub_result = self.neutron_subnet_creation_and_validation(test_second_network_name[i],test_sub_2networks_cidr[i])
+           assert_equal(sub_result[0], True)
+           net_type_post = self.sub_network_type_post_to_onos(test_second_network_name[i], test_management_type[i])
+        creds = get_nova_credentials()
+        nova = nova_client.Client('2', **creds)
+        print nova.security_groups.list()
+        new_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,instance_vm_name,image_name,flavor_id)
+        time.sleep(60)
+        assert_equal(new_instance_details.status, 'ACTIVE')
+        compute_details = self.get_compute_nodes()
+        print new_instance_details.addresses
+        address = new_instance_details.addresses
+        print 'Nova instance management ip = %s and public ip %s'%(address[test_second_network_name[0]][0]['addr'],address[test_2networks_name[1]][0]['addr'])
+        print address[test_second_network_name[0]][0]['addr']
+        print nova.security_groups.list()
+        print address[test_second_network_name[1]][0]['addr']
+        print nova.security_groups.list()
+        secgroup = nova.security_groups.find(name="default")
+#        nova.security_group_rules.create(secgroup.id,ip_protocol="tcp",
+                                     #from_port="22",
+                                     #to_port="22",
+                                    # cidr="0.0.0.0/0",)
+
+ #       nova.security_group_rules.create(secgroup.id,
+                                    # ip_protocol="icmp",
+                                    # from_port=-1,
+                                    # cidr="0.0.0.0/0",
+                                    # to_port=-1)
+        print nova.security_groups.list()
+
+        status_1, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'],check_type = "Ping_to_external")
+        if status_1 is False or status_2 is False:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+        new_instance_details.suspend()
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'],check_type = "Ping_to_external")
+        if status_1 is True or status_2 is True:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, False)
+        assert_equal(status_2, False)
+        new_instance_details.resume()
+        print 'Nova instance is suspend and rsumed now checking connectivity'
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'],check_type = "Ping_to_external")
+        self.nova_instance_deletion(nova, new_instance_details)
+        time.sleep(3)
+        self.neutron_network_deletion(test_second_network_name[0])
+        self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+
+    def test_cordvtn_creating_mgmt_and_public_network_instance_with_stopping_and_starting_instances_and_checking_connectvity_from_host_machine_or_compute_node_and_validate_connectivity_to_internet(self):
+        """
+        Algo:
+        0. Create Test-Net,
+        1. Create subnetwork whose ip is under management network
+        3. Do GET Rest API and validate creation of network
+        4. Create new nova instance under management network
+        5. Validate new nova instance is created on nova service
+        6. Verify ping is getting successful from compute node to nova instance which is created in step 4.
+        7. Now stop the nova instance and check connectivity
+        8. Now start the nova instance and check connectivity
+        """
+        test_second_network_name = ['vtn_test_32_net_management','vtn_test_32_net_public']
+        test_sub_second_network_cidr = [["management","172.27.0.0/24", "172.27.0.20", "172.27.0.21"], ["public","10.6.1.192/26",'10.6.1.193']]
+        test_management_type = ["management_local", 'public']
+        instance_vm_name = 'vtn_test_32_nova_instance_management_net'
+#        image_name = "vsg-1.1"
+        image_name = "trusty-server-multi-nic"
+        flavor_id = 'm1.small'
+        for test_net_name in test_second_network_name:
+            result = self.neutron_network_creation_and_validation(test_net_name)
+            assert_equal(result, True)
+        neutron_creds = self.get_neutron_credentials()
+        neutron = neutronclient.Client(**neutron_creds)
+        #for test_net_name,test_sub_net_cidr in test_second_network_name test_sub_2networks_cidr:
+        for i in range(0,2):
+           networks = neutron.list_networks(name=test_second_network_name[i])
+           network_id = self.get_key_value(d=networks, key = 'id')
+           sub_result = self.neutron_subnet_creation_and_validation(test_second_network_name[i],test_sub_2networks_cidr[i])
+           assert_equal(sub_result[0], True)
+           net_type_post = self.sub_network_type_post_to_onos(test_second_network_name[i], test_management_type[i])
+        creds = get_nova_credentials()
+        nova = nova_client.Client('2', **creds)
+        print nova.security_groups.list()
+        new_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,instance_vm_name,image_name,flavor_id)
+        time.sleep(60)
+        assert_equal(new_instance_details.status, 'ACTIVE')
+        compute_details = self.get_compute_nodes()
+        print new_instance_details.addresses
+        address = new_instance_details.addresses
+        print 'Nova instance management ip = %s and public ip %s'%(address[test_second_network_name[0]][0]['addr'],address[test_2networks_name[1]][0]['addr'])
+        print address[test_second_network_name[0]][0]['addr']
+        print nova.security_groups.list()
+        print address[test_second_network_name[1]][0]['addr']
+        print nova.security_groups.list()
+        secgroup = nova.security_groups.find(name="default")
+#        nova.security_group_rules.create(secgroup.id,ip_protocol="tcp",
+                                     #from_port="22",
+                                     #to_port="22",
+                                    # cidr="0.0.0.0/0",)
+
+ #       nova.security_group_rules.create(secgroup.id,
+                                    # ip_protocol="icmp",
+                                    # from_port=-1,
+                                    # cidr="0.0.0.0/0",
+                                    # to_port=-1)
+        print nova.security_groups.list()
+
+        status_1, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'],check_type = "Ping_to_external")
+        if status_1 is False or status_2 is False:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+        new_instance_details.stop()
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'],check_type = "Ping_to_external")
+        if status_1 is True or status_2 is True:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, False)
+        assert_equal(status_2, False)
+        new_instance_details.start()
+        print 'Nova instance is stopped and started now checking connectivity'
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'],check_type = "Ping_to_external")
+        self.nova_instance_deletion(nova, new_instance_details)
+        time.sleep(3)
+        self.neutron_network_deletion(test_second_network_name[0])
+        self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+
+
+    def test_cordvtn_creating_mgmt_and_private_network_instance_and_validate_connectivity_from_host_machine_or_compute_node_and_validate_connectivity_to_internet(self):
+        """
+        Algo:
+        0. Create Test-Net,
+        1. Create subnetwork whose ip is under management network
+        3. Do GET Rest API and validate creation of network
+        4. Create new nova instance under management network
+        5. Validate new nova instance is created on nova service
+        6. Verify ping is getting successful from compute node to nova instance which is created in step 4.
+        """
+        test_second_network_name = ['vtn_test_33_net_management','vtn_test_33_net_private']
+        test_sub_second_network_cidr = [["management","172.27.0.0/24", "172.27.0.20", "172.27.0.21"], ["private","10.160.160.192/26",'10.160.160.193']]
+        test_management_type = ["management_local", 'private']
+        instance_vm_name = 'vtn_test_33_nova_instance_management_net'
+#        image_name = "vsg-1.1"
+        image_name = "trusty-server-multi-nic"
+        flavor_id = 'm1.small'
+        for test_net_name in test_second_network_name:
+            result = self.neutron_network_creation_and_validation(test_net_name)
+            assert_equal(result, True)
+        neutron_creds = self.get_neutron_credentials()
+        neutron = neutronclient.Client(**neutron_creds)
+        #for test_net_name,test_sub_net_cidr in test_second_network_name test_sub_2networks_cidr:
+        for i in range(0,2):
+           networks = neutron.list_networks(name=test_second_network_name[i])
+           network_id = self.get_key_value(d=networks, key = 'id')
+           sub_result = self.neutron_subnet_creation_and_validation(test_second_network_name[i],test_sub_2networks_cidr[i])
+           assert_equal(sub_result[0], True)
+           net_type_post = self.sub_network_type_post_to_onos(test_second_network_name[i], test_management_type[i])
+        creds = get_nova_credentials()
+        nova = nova_client.Client('2', **creds)
+        print nova.security_groups.list()
+        new_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,instance_vm_name,image_name,flavor_id)
+        time.sleep(60)
+        assert_equal(new_instance_details.status, 'ACTIVE')
+        compute_details = self.get_compute_nodes()
+        print new_instance_details.addresses
+        address = new_instance_details.addresses
+        print 'Nova instance management ip = %s and private ip %s'%(address[test_second_network_name[0]][0]['addr'],address[test_2networks_name[1]][0]['addr'])
+        print address[test_second_network_name[0]][0]['addr']
+        print nova.security_groups.list()
+        print address[test_second_network_name[1]][0]['addr']
+        print nova.security_groups.list()
+        secgroup = nova.security_groups.find(name="default")
+#        nova.security_group_rules.create(secgroup.id,ip_protocol="tcp",
+                                     #from_port="22",
+                                     #to_port="22",
+                                    # cidr="0.0.0.0/0",)
+
+ #       nova.security_group_rules.create(secgroup.id,
+                                    # ip_protocol="icmp",
+                                    # from_port=-1,
+                                    # cidr="0.0.0.0/0",
+                                    # to_port=-1)
+        print nova.security_groups.list()
+        status_1, output = self.nova_instance_tenants_access_check(address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(address[test_second_network_name[1]][0]['addr'],check_type = "Ping_to_external")
+        self.nova_instance_deletion(nova, new_instance_details)
+        time.sleep(3)
+        self.neutron_network_deletion(test_second_network_name[0])
+        self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, False)
+
+    def test_cordvtn_creating_mgmt_and_private_network_with_two_instances_and_validate_connectivity_from_host_machine_or_compute_node_and_check_connectivity_to_other_instance(self):
+        """
+        Algo:
+        0. Create Test-Net,
+        1. Create subnetwork whose ip is under management network
+        3. Do GET Rest API and validate creation of network
+        4. Create new nova instance under management network
+        5. Validate new nova instance is created on nova service
+        6. Verify ping is getting successful from compute node to nova instance which is created in step 4.
+        """
+        test_second_network_name = ['vtn_test_34_net_management','vtn_test_34_net_private']
+        test_sub_second_network_cidr = [["management","172.27.0.0/24", "172.27.0.20", "172.27.0.21"], ["private","10.160.160.192/26",'10.160.160.193']]
+        test_management_type = ["management_local", 'private']
+        first_instance_vm_name = 'vtn_test_34_nova_first_instance_management_net'
+        second_instance_vm_name = 'vtn_test_34_nova_second_instance_management_net'
+#        image_name = "vsg-1.1"
+        image_name = "trusty-server-multi-nic"
+        flavor_id = 'm1.small'
+        for test_net_name in test_second_network_name:
+            result = self.neutron_network_creation_and_validation(test_net_name)
+            assert_equal(result, True)
+        neutron_creds = self.get_neutron_credentials()
+        neutron = neutronclient.Client(**neutron_creds)
+        #for test_net_name,test_sub_net_cidr in test_second_network_name test_sub_2networks_cidr:
+        for i in range(0,2):
+           networks = neutron.list_networks(name=test_second_network_name[i])
+           network_id = self.get_key_value(d=networks, key = 'id')
+           sub_result = self.neutron_subnet_creation_and_validation(test_second_network_name[i],test_sub_2networks_cidr[i])
+           assert_equal(sub_result[0], True)
+           net_type_post = self.sub_network_type_post_to_onos(test_second_network_name[i], test_management_type[i])
+        creds = get_nova_credentials()
+        nova = nova_client.Client('2', **creds)
+        print nova.security_groups.list()
+        new_first_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,first_instance_vm_name,image_name,flavor_id)
+        new_second_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,second_instance_vm_name,image_name,flavor_id)
+        time.sleep(60)
+        assert_equal(new_first_instance_details.status, 'ACTIVE')
+        assert_equal(new_second_instance_details.status, 'ACTIVE')
+        compute_details = self.get_compute_nodes()
+        first_instance_address = new_first_instance_details.addresses
+        second_instance_address = new_second_instance_details.addresses
+        print 'Nova first instance management ip = %s and private ip %s'%(first_instance_address[test_second_network_name[0]][0]['addr'],first_instance_address[test_2networks_name[1]][0]['addr'])
+        print 'Nova second instance management ip = %s and private ip %s'%(second_instance_address[test_second_network_name[0]][0]['addr'],second_instance_address[test_2networks_name[1]][0]['addr'])
+        secgroup = nova.security_groups.find(name="default")
+#        nova.security_group_rules.create(secgroup.id,ip_protocol="tcp",
+                                     #from_port="22",
+                                     #to_port="22",
+                                    # cidr="0.0.0.0/0",)
+
+ #       nova.security_group_rules.create(secgroup.id,
+                                    # ip_protocol="icmp",
+                                    # from_port=-1,
+                                    # cidr="0.0.0.0/0",
+                                    # to_port=-1)
+        print nova.security_groups.list()
+
+        status_1, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'],source_tenants_details = second_instance_address[test_2networks_name[1]][0]['addr'],check_type = "Ping_from_source_tenant")
+        self.nova_instance_deletion(nova, new_instance_details)
+        time.sleep(3)
+        self.neutron_network_deletion(test_second_network_name[0])
+        self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+
+    def test_cordvtn_creating_mgmt_and_private_network_with_two_instances_with_and_without_pause_validating_connectivity_from_host_machine_or_compute_node_and_validating_connectivity_to_other_instance(self):
+        """
+        Algo:
+        0. Create Test-Net,
+        1. Create subnetwork whose ip is under management network
+        3. Do GET Rest API and validate creation of network
+        4. Create new nova instance under management network
+        5. Validate new nova instance is created on nova service
+        6. Verify ping is getting successful from compute node to nova instance which is created in step 4.
+        7. Now pause one of the nova instance and check connectivity
+        8. Now start the same nova instance and check connectivity
+        """
+        test_second_network_name = ['vtn_test_35_net_management','vtn_test_35_net_private']
+        test_sub_second_network_cidr = [["management","172.27.0.0/24", "172.27.0.20", "172.27.0.21"], ["private","10.160.160.192/26",'10.160.160.193']]
+        test_management_type = ["management_local", 'private']
+        first_instance_vm_name = 'vtn_test_35_nova_first_instance_management_net'
+        second_instance_vm_name = 'vtn_test_35_nova_second_instance_management_net'
+#        image_name = "vsg-1.1"
+        image_name = "trusty-server-multi-nic"
+        flavor_id = 'm1.small'
+        for test_net_name in test_second_network_name:
+            result = self.neutron_network_creation_and_validation(test_net_name)
+            assert_equal(result, True)
+        neutron_creds = self.get_neutron_credentials()
+        neutron = neutronclient.Client(**neutron_creds)
+        #for test_net_name,test_sub_net_cidr in test_second_network_name test_sub_2networks_cidr:
+        for i in range(0,2):
+           networks = neutron.list_networks(name=test_second_network_name[i])
+           network_id = self.get_key_value(d=networks, key = 'id')
+           sub_result = self.neutron_subnet_creation_and_validation(test_second_network_name[i],test_sub_2networks_cidr[i])
+           assert_equal(sub_result[0], True)
+           net_type_post = self.sub_network_type_post_to_onos(test_second_network_name[i], test_management_type[i])
+        creds = get_nova_credentials()
+        nova = nova_client.Client('2', **creds)
+        print nova.security_groups.list()
+        new_first_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,first_instance_vm_name,image_name,flavor_id)
+        new_second_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,second_instance_vm_name,image_name,flavor_id)
+        time.sleep(60)
+        assert_equal(new_first_instance_details.status, 'ACTIVE')
+        assert_equal(new_second_instance_details.status, 'ACTIVE')
+        compute_details = self.get_compute_nodes()
+        first_instance_address = new_first_instance_details.addresses
+        second_instance_address = new_second_instance_details.addresses
+        print 'Nova first instance management ip = %s and private ip %s'%(first_instance_address[test_second_network_name[0]][0]['addr'],first_instance_address[test_2networks_name[1]][0]['addr'])
+        print 'Nova second instance management ip = %s and private ip %s'%(second_instance_address[test_second_network_name[0]][0]['addr'],second_instance_address[test_2networks_name[1]][0]['addr'])
+        secgroup = nova.security_groups.find(name="default")
+#        nova.security_group_rules.create(secgroup.id,ip_protocol="tcp",
+                                     #from_port="22",
+                                     #to_port="22",
+                                    # cidr="0.0.0.0/0",)
+
+ #       nova.security_group_rules.create(secgroup.id,
+                                    # ip_protocol="icmp",
+                                    # from_port=-1,
+                                    # cidr="0.0.0.0/0",
+                                    # to_port=-1)
+        print nova.security_groups.list()
+        status_1, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'],source_tenants_details = second_instance_address[test_2networks_name[1]][0]['addr'],check_type = "Ping_from_source_tenant")
+        if status_1 is False or status_2 is False:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+        new_first_instance_details.pause()
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'],source_tenants_details = second_instance_address[test_2networks_name[1]][0]['addr'],check_type = "Ping_from_source_tenant")
+        if status_1 is True or status_2 is True:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, False)
+        assert_equal(status_2, False)
+        new_first_instance_details.unpause()
+        print 'Nova instance is paused and unpased now checking connectivity'
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'],source_tenants_details = second_instance_address[test_2networks_name[1]][0]['addr'],check_type = "Ping_from_source_tenant")
+        self.nova_instance_deletion(nova, new_instance_details)
+        time.sleep(3)
+        self.neutron_network_deletion(test_second_network_name[0])
+        self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+
+    def test_cordvtn_creating_mgmt_and_private_network_with_two_instances_and_doing_suspend_and_resume_validating_connectivity_from_host_machine_or_compute_node_and_validating_connectivity_to_other_instance(self):
+        """
+        Algo:
+        0. Create Test-Net,
+        1. Create subnetwork whose ip is under management network
+        3. Do GET Rest API and validate creation of network
+        4. Create new nova instance under management network
+        5. Validate new nova instance is created on nova service
+        6. Verify ping is getting successful from compute node to nova instance which is created in step 4.
+        7. Now suspend one of the nova instance and check connectivity
+        8. Now resume the same nova instance and check connectivity
+        """
+        test_second_network_name = ['vtn_test_36_net_management','vtn_test_36_net_private']
+        test_sub_second_network_cidr = [["management","172.27.0.0/24", "172.27.0.20", "172.27.0.21"], ["private","10.160.160.192/26",'10.160.160.193']]
+        test_management_type = ["management_local", 'private']
+        first_instance_vm_name = 'vtn_test_36_nova_first_instance_management_net'
+        second_instance_vm_name = 'vtn_test_36_nova_second_instance_management_net'
+#        image_name = "vsg-1.1"
+        image_name = "trusty-server-multi-nic"
+        flavor_id = 'm1.small'
+        for test_net_name in test_second_network_name:
+            result = self.neutron_network_creation_and_validation(test_net_name)
+            assert_equal(result, True)
+        neutron_creds = self.get_neutron_credentials()
+        neutron = neutronclient.Client(**neutron_creds)
+        #for test_net_name,test_sub_net_cidr in test_second_network_name test_sub_2networks_cidr:
+        for i in range(0,2):
+           networks = neutron.list_networks(name=test_second_network_name[i])
+           network_id = self.get_key_value(d=networks, key = 'id')
+           sub_result = self.neutron_subnet_creation_and_validation(test_second_network_name[i],test_sub_2networks_cidr[i])
+           assert_equal(sub_result[0], True)
+           net_type_post = self.sub_network_type_post_to_onos(test_second_network_name[i], test_management_type[i])
+        creds = get_nova_credentials()
+        nova = nova_client.Client('2', **creds)
+        print nova.security_groups.list()
+        new_first_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,first_instance_vm_name,image_name,flavor_id)
+        new_second_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,second_instance_vm_name,image_name,flavor_id)
+        time.sleep(60)
+        assert_equal(new_first_instance_details.status, 'ACTIVE')
+        assert_equal(new_second_instance_details.status, 'ACTIVE')
+        compute_details = self.get_compute_nodes()
+        first_instance_address = new_first_instance_details.addresses
+        second_instance_address = new_second_instance_details.addresses
+        print 'Nova first instance management ip = %s and private ip %s'%(first_instance_address[test_second_network_name[0]][0]['addr'],first_instance_address[test_2networks_name[1]][0]['addr'])
+        print 'Nova second instance management ip = %s and private ip %s'%(second_instance_address[test_second_network_name[0]][0]['addr'],second_instance_address[test_2networks_name[1]][0]['addr'])
+        secgroup = nova.security_groups.find(name="default")
+#        nova.security_group_rules.create(secgroup.id,ip_protocol="tcp",
+                                     #from_port="22",
+                                     #to_port="22",
+                                    # cidr="0.0.0.0/0",)
+
+ #       nova.security_group_rules.create(secgroup.id,
+                                    # ip_protocol="icmp",
+                                    # from_port=-1,
+                                    # cidr="0.0.0.0/0",
+                                    # to_port=-1)
+        print nova.security_groups.list()
+        status_1, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'],source_tenants_details = second_instance_address[test_2networks_name[1]][0]['addr'],check_type = "Ping_from_source_tenant")
+        if status_1 is False or status_2 is False:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+        new_first_instance_details.suspend()
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'],source_tenants_details = second_instance_address[test_2networks_name[1]][0]['addr'],check_type = "Ping_from_source_tenant")
+        if status_1 is True or status_2 is True:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, False)
+        assert_equal(status_2, False)
+        new_first_instance_details.resume()
+        print 'Nova instance is suspend and resume now checking connectivity'
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'],source_tenants_details = second_instance_address[test_2networks_name[1]][0]['addr'],check_type = "Ping_from_source_tenant")
+        self.nova_instance_deletion(nova, new_instance_details)
+        time.sleep(3)
+        self.neutron_network_deletion(test_second_network_name[0])
+        self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+
+    def test_cordvtn_creating_mgmt_and_private_network_with_two_instances_applying_stop_and_start_validating_connectivity_from_host_machine_or_compute_node_and_validating_connectivity_to_other_instance(self):
+        """
+        Algo:
+        0. Create Test-Net,
+        1. Create subnetwork whose ip is under management network
+        3. Do GET Rest API and validate creation of network
+        4. Create new nova instance under management network
+        5. Validate new nova instance is created on nova service
+        6. Verify ping is getting successful from compute node to nova instance which is created in step 4.
+        7. Now stop one of the nova instance and check connectivity
+        8. Now start the same nova instance and check connectivity
+        """
+        test_second_network_name = ['vtn_test_37_net_management','vtn_test_37_net_private']
+        test_sub_second_network_cidr = [["management","172.27.0.0/24", "172.27.0.20", "172.27.0.21"], ["private","10.160.160.192/26",'10.160.160.193']]
+        test_management_type = ["management_local", 'private']
+        first_instance_vm_name = 'vtn_test_37_nova_first_instance_management_net'
+        second_instance_vm_name = 'vtn_test_37_nova_second_instance_management_net'
+#        image_name = "vsg-1.1"
+        image_name = "trusty-server-multi-nic"
+        flavor_id = 'm1.small'
+        for test_net_name in test_second_network_name:
+            result = self.neutron_network_creation_and_validation(test_net_name)
+            assert_equal(result, True)
+        neutron_creds = self.get_neutron_credentials()
+        neutron = neutronclient.Client(**neutron_creds)
+        #for test_net_name,test_sub_net_cidr in test_second_network_name test_sub_2networks_cidr:
+        for i in range(0,2):
+           networks = neutron.list_networks(name=test_second_network_name[i])
+           network_id = self.get_key_value(d=networks, key = 'id')
+           sub_result = self.neutron_subnet_creation_and_validation(test_second_network_name[i],test_sub_2networks_cidr[i])
+           assert_equal(sub_result[0], True)
+           net_type_post = self.sub_network_type_post_to_onos(test_second_network_name[i], test_management_type[i])
+        creds = get_nova_credentials()
+        nova = nova_client.Client('2', **creds)
+        print nova.security_groups.list()
+        new_first_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,first_instance_vm_name,image_name,flavor_id)
+        new_second_instance_details = self.nova_instance_creation_and_validation(test_second_network_name,nova,second_instance_vm_name,image_name,flavor_id)
+        time.sleep(60)
+        assert_equal(new_first_instance_details.status, 'ACTIVE')
+        assert_equal(new_second_instance_details.status, 'ACTIVE')
+        compute_details = self.get_compute_nodes()
+        first_instance_address = new_first_instance_details.addresses
+        second_instance_address = new_second_instance_details.addresses
+        print 'Nova first instance management ip = %s and private ip %s'%(first_instance_address[test_second_network_name[0]][0]['addr'],first_instance_address[test_2networks_name[1]][0]['addr'])
+        print 'Nova second instance management ip = %s and private ip %s'%(second_instance_address[test_second_network_name[0]][0]['addr'],second_instance_address[test_2networks_name[1]][0]['addr'])
+        secgroup = nova.security_groups.find(name="default")
+        print nova.security_groups.list()
+        status_1, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'],source_tenants_details = second_instance_address[test_2networks_name[1]][0]['addr'],check_type = "Ping_from_source_tenant")
+        if status_1 is False or status_2 is False:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+        new_first_instance_details.stop()
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'],source_tenants_details = second_instance_address[test_2networks_name[1]][0]['addr'],check_type = "Ping_from_source_tenant")
+        if status_1 is True or status_2 is True:
+           self.nova_instance_deletion(nova, new_instance_details)
+           time.sleep(3)
+           self.neutron_network_deletion(test_second_network_name[0])
+           self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, False)
+        assert_equal(status_2, False)
+        new_first_instance_details.start()
+        print 'Nova instance is stopped and started now checking connectivity'
+        time.sleep(60)
+        status_1, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'])
+        status_2, output = self.nova_instance_tenants_access_check(first_instance_address[test_second_network_name[0]][0]['addr'],source_tenants_details = second_instance_address[test_2networks_name[1]][0]['addr'],check_type = "Ping_from_source_tenant")
+        self.nova_instance_deletion(nova, new_instance_details)
+        time.sleep(3)
+        self.neutron_network_deletion(test_second_network_name[0])
+        self.neutron_network_deletion(test_second_network_name[1])
+        assert_equal(status_1, True)
+        assert_equal(status_2, True)
+
     def test_cordvtn_with_neutron_network_creation_and_validation_on_head_node_with_neutron_service(self):
         """
         Algo:
@@ -1674,193 +2417,6 @@
         result = self.search_value(data, device_id)
         assert_equal(result, True)
 
-    def test_cordvtn_basic_tenant(self):
-
-        tenant_1= create_tenant("CORD_Subscriber_Test_Tenant_1")
-        if tenant1 != 0:
-           print("Creation of CORD Subscriber Test Tenant 1")
-
-        tenant_2 = create_tenant("CORD_Subscriber_Test_Tenant_2")
-        if tenant2 != 0:
-           print("Creation of CORD Subscriber Test Tenant 2")
-
-        create_net(tenant_1,"a1")
-        create_subnet(tenant_1,"a1","as1","10.0.1.0/24")
-
-        create_net(tenant_2,"a2")
-        create_subnet(tenant_2,"a2","as1","10.0.2.0/24")
-
-        netid_1 = get_id(tenant_1,"net","a1")
-        netid_2 = get_id(tenant_2,"net","a2")
-
-        nova_boot(tenant_1,"vm1",netid=netid)
-        nova_boot(tenant_2,"vm1",netid=netid)
-
-	nova_wait_boot(tenant_1,"vm1", "ACTIVE")
-	nova_wait_boot(tenant_2,"vm1", "ACTIVE")
-
-        router_create(tenant_1,"r1")
-        router_interface_add(tenant_1,"r1","as1")
-        router_create(tenant_2,"r1")
-        router_interface_add(tenant_2,"r1","as1")
-
-        create_net(tenant_1,"x1","","--router:external=True")
-        create_net(tenant_2,"x1","","--router:external=True")
-
-        router_gateway_set(tenant_1,"r1","x1")
-        router_gateway_set(tenant_2,"r1","x1")
-
-        subnetid_1 = get_id(tenant_1,"subnet","as1")
-        subnetid_2 = get_id(tenant_2,"subnet","as1")
-        port_create(tenant_1,"p1","a1","10.0.1.100",subnetid_1)
-        port_create(tenant_2,"p1","a1","10.0.1.100",subnetid_2)
-
-        port_id_1 = get_id(tenant_1,"port","p1")
-        port_id_2 = get_id(tenant_2,"port","p1")
-        status = validate_vtn_flows()
-        assert_equal(status, True)
-
-    def test_cordvtn_for_creation_of_network(self):
-
-        ret1 = create_tenant(netA)
-        if ret1 != 0:
-           print("Creation of Tenant netA Failed")
-
-        ret2 = create_tenant(netB)
-        if ret2 != 0:
-           print("Creation of Tenant netB Failed")
-        network = {'name': self.network_name, 'admin_state_up': True}
-        self.neutron.create_network({'network':network})
-        log_test.info("Created network:{0}".format(self.network_name))
-        status = validate_vtn_flows()
-        assert_equal(status, True)
-
-    def test_cordvtn_to_create_net_work_with_subnet(self):
-        ret1 = create_tenant(netA)
-        if ret1 != 0:
-           print("Creation of Tenant netA Failed")
-
-        ret2 = create_tenant(netB)
-        if ret2 != 0:
-           print("Creation of Tenant netB Failed")
-        network_name = self.network_name
-        network = {'name': network_name, 'admin_state_up': True}
-        network_info = self.neutron.create_network({'network':network})
-        network_id = network_info['network']['id']
-
-        log_test.info("Created network:{0}".format(network_id))
-        self.network_ids.append(network_id)
-        subnet_count = 1
-        for cidr in self.subnet_cidrs:
-            gateway_ip = str(list(cidr)[1])
-            subnet = {"network_id": network_id, "ip_version":4,
-                      "cidr":str(cidr), "enable_dhcp":True,
-                      "host_routes":[{"destination":"0.0.0.0/0", "nexthop":gateway_ip}]
-                     }
-            subnet = {"name":"subnet-"+str(subnet_count), "network_id": network_id, "ip_version":4, "cidr":str(cidr), "enable_dhcp":True}
-            print(subnet)
-            self.neutron.create_subnet({'subnet':subnet})
-            log_test.info("Created subnet:{0}".format(str(cidr)))
-            if not self.number_of_subnet - 1:
-                break
-        self.number_of_subnet -= 1
-        subnet_count += 1
-        status = validate_vtn_flows()
-        assert_equal(status, True)
-
-    def test_cordvtn_subnet_limit(self):
-        ret1 = create_tenant(netA)
-        if ret1 != 0:
-           print("Creation of Tenant netA Failed")
-
-        ret2 = create_tenant(netB)
-        if ret2 != 0:
-           print("Creation of Tenant netB Failed")
-        network_name = uuid.uuid4().get_hex()
-        network = {'name': network_name, 'admin_state_up': True}
-        network_info = self.neutron.create_network({'network':network})
-        log_test.info("Created network:{0}".format(network_name))
-        network_id = network_info['network']['id']
-        self.network_ids.append(network_id)
-        subnet_cidrs = ['11.2.2.0/29',  '11.2.2.8/29']
-        for cidr in subnet_cidrs:
-            subnet = {"network_id": network_id, "ip_version":4, "cidr": cidr}
-            subnet_info = self.neutron.create_subnet({'subnet':subnet})
-            subnet_id = subnet_info['subnet']['id']
-            log_test.info("Created subnet:{0}".format(cidr))
-        while True:
-            port = {"network_id": network_id, "admin_state_up": True}
-            port_info = self.neutron.create_port({'port':port})
-            port_id = port_info['port']['id']
-            self.port_ids.append(port_id)
-            log_test.info("Created Port:{0}".format(port_info['port']['id']))
-            if not self.quota_limit:
-               break
-            self.quota_limit -= 1
-        status = validate_vtn_flows()
-        assert_equal(status, True)
-
-    def test_cordvtn_floatingip_limit(self):
-        ret1 = create_tenant(netA)
-        if ret1 != 0:
-           print("Creation of Tenant netA Failed")
-
-        ret2 = create_tenant(netB)
-        if ret2 != 0:
-           print("Creation of Tenant netB Failed")
-        while True:
-            floatingip = {"floating_network_id": self.floating_nw_id}
-            fip_info = self.neutron.create_floatingip({'floatingip':floatingip})
-            fip_id = fip_info['floatingip']['id']
-            log_test.info("Created Floating IP:{0}".format(fip_id))
-            self.fip_ids.append(fip_id)
-            if not self.quota_limit:
-               break
-            self.quota_limit -= 1
-        status = validate_vtn_flows()
-        assert_equal(status, True)
-
-    def test_cordvtn_for_10_neutron_networks(self):
-        ret1 = create_tenant(netA)
-        if ret1 != 0:
-           print("Creation of Tenant netA Failed")
-
-        ret2 = create_tenant(netB)
-        if ret2 != 0:
-           print("Creation of Tenant netB Failed")
-        pool = Pool(processes=10)
-        ret = os.system("neutron quote-update --network 15")
-        if ret1 != 0:
-           print("Neutron network install failed")
-        for i in range(1, 11):
-            pool.apply_async(create_network, (i, ))
-
-        pool.close()
-        pool.join()
-        status = validate_vtn_flows()
-        assert_equal(status, True)
-
-    def test_cordvtn_for_100_neutron_networks(self):
-        ret1 = create_tenant(netA)
-        if ret1 != 0:
-           print("Creation of Tenant netA Failed")
-
-        ret2 = create_tenant(netB)
-        if ret2 != 0:
-           print("Creation of Tenant netB Failed")
-        pool = Pool(processes=10)
-
-        ret = os.system("neutron quote-update --network 105")
-        if ret1 != 0:
-           print("Neutron network install failed")
-        for i in range(1, 101):
-            pool.apply_async(create_network, (i, ))
-
-        pool.close()
-        pool.join()
-        status = validate_vtn_flows()
-        assert_equal(status, True)
-
     def test_cordvtn_creating_virtual_private_network(self):
 	"""
 	Algo:
