diff --git a/src/test/setup/cord-test.py b/src/test/setup/cord-test.py
index 1f95311..02c4038 100755
--- a/src/test/setup/cord-test.py
+++ b/src/test/setup/cord-test.py
@@ -404,11 +404,6 @@
     test_port = CORD_TEST_PORT
     if len(test_server_params) > 1:
         test_port = int(test_server_params[1])
-    try:
-        test_server = cord_test_server_start(daemonize = False, cord_test_host = test_host, cord_test_port = test_port)
-    except:
-        ##Most likely a server instance is already running (daemonized earlier)
-        test_server = None
 
     test_containers = []
     #These tests end up restarting ONOS/quagga/radius
@@ -448,15 +443,33 @@
     radius_ip = test_manifest.radius_ip
     head_node = test_manifest.head_node
     iterations = test_manifest.iterations
+    onos_cord_loc = test_manifest.onos_cord
 
-    #don't spawn onos if the user has specified external test controller with test interface config
-    if args.test_controller:
-        ips = args.test_controller.split('/')
-        onos_ip = ips[0]
-        if len(ips) > 1:
-            radius_ip = ips[1]
+    if onos_cord_loc:
+        if onos_cord_loc.find(os.path.sep) < 0:
+            onos_cord_loc = os.path.join(os.getenv('HOME'), onos_cord_loc)
+        #check if the wrapper is already active. If yes, we back out
+        if os.access(OnosCord.onos_cord_dir, os.F_OK):
+           onos_cord_loc = None
         else:
-            radius_ip = None
+            if not os.access(onos_cord_loc, os.F_OK):
+                print('ONOS cord config location %s is not accessible' %onos_cord_loc)
+                sys.exit(1)
+
+    onos_cord = None
+    if onos_cord_loc:
+        if not onos_ip:
+            ##Unexpected case. Specify the external controller ip when running on cord node
+            print('Specify ONOS ip using \"-e\" option when running the cord-tester on cord node')
+            sys.exit(1)
+        onos_cord = OnosCord(onos_ip, onos_cord_loc)
+
+    try:
+        test_server = cord_test_server_start(daemonize = False, cord_test_host = test_host, cord_test_port = test_port,
+                                             onos_cord = onos_cord)
+    except:
+        ##Most likely a server instance is already running (daemonized earlier)
+        test_server = None
 
     Container.IMAGE_PREFIX = test_manifest.image_prefix
     Onos.MAX_INSTANCES = test_manifest.onos_instances
@@ -652,6 +665,9 @@
         test_cnt.run_tests()
 
     if test_server:
+        if onos_cord_loc:
+            if OnosCord.restore_onos_cord(onos_cord_loc, onos_ip) is False:
+                OnosCord.cleanup()
         cord_test_server_stop(test_server)
 
     return status
@@ -668,16 +684,6 @@
        for c in update_map.keys():
            update_map[c] = True
 
-    onos_cord_loc = test_manifest.onos_cord
-    if onos_cord_loc:
-        if onos_cord_loc.find(os.path.sep) < 0:
-            onos_cord_loc = os.path.join(os.getenv('HOME'), onos_cord_loc)
-        if not os.access(onos_cord_loc, os.F_OK):
-            print('ONOS cord config location %s is not accessible' %onos_cord_loc)
-            sys.exit(1)
-        #Disable test container provisioning on the ONOS compute node
-        args.dont_provision = True
-
     use_manifest = False
     if args.manifest:
         if os.access(args.manifest, os.F_OK):
@@ -690,14 +696,21 @@
             test_manifest = TestManifest(manifest = dest)
             use_manifest = True
 
+    onos_cord_loc = test_manifest.onos_cord
+    if onos_cord_loc:
+        if onos_cord_loc.find(os.path.sep) < 0:
+            onos_cord_loc = os.path.join(os.getenv('HOME'), onos_cord_loc)
+        if not os.access(onos_cord_loc, os.F_OK):
+            print('ONOS cord config location %s is not accessible' %onos_cord_loc)
+            sys.exit(1)
+
     onos_ip = test_manifest.onos_ip
     radius_ip = test_manifest.radius_ip
     head_node = test_manifest.head_node
     iterations = test_manifest.iterations
-
     onos_cord = None
     if onos_cord_loc:
-        if not test_manifest.onos_ip:
+        if not onos_ip:
             ##Unexpected case. Specify the external controller ip when running on cord node
             print('Specify ONOS ip using \"-e\" option when running the cord-tester on cord node')
             sys.exit(1)
@@ -894,7 +907,8 @@
 
     if args.onos_cord:
         #restore the ONOS cord instance
-        OnosCord.restore_onos_cord(args.onos_cord, args.onos_ip)
+        if OnosCord.restore_onos_cord(args.onos_cord, args.onos_ip) is False:
+            OnosCord.cleanup()
 
     if args.xos:
         ##cleanup XOS images
diff --git a/src/test/utils/CordContainer.py b/src/test/utils/CordContainer.py
index df9a196..1a7656b 100644
--- a/src/test/utils/CordContainer.py
+++ b/src/test/utils/CordContainer.py
@@ -369,13 +369,28 @@
         os.system(build_cmd)
 
     @classmethod
+    def cleanup(cls):
+        if not os.access(cls.onos_cord_dir, os.F_OK):
+            return
+        cmd = 'cd {} && docker-compose down'.format(cls.onos_cord_dir)
+        try:
+            os.system(cmd)
+        except: pass
+
+        print('Cleaning up the ONOS cord wrapper directory at %s' %(cls.onos_cord_dir))
+        try:
+            os.system('rm -rf {}'.format(cls.onos_cord_dir))
+        except:
+            pass
+
+    @classmethod
     def restore_onos_cord(cls, onos_cord, onos_ip):
         #bring down the onos cord wrapper container
         #if there is no saved config, there is nothing to restore as it was never restarted
         if not os.access(cls.onos_cfg_save_loc, os.F_OK):
-            return
+            return False
         if not onos_cord or not os.access(onos_cord, os.F_OK):
-            return
+            return False
 
         print('Stopping the existing ONOS cord wrapper instance at %s' %(cls.onos_cord_dir))
         cmd = 'cd {} && docker-compose down'.format(cls.onos_cord_dir)
@@ -401,11 +416,8 @@
                 os.unlink(cls.onos_cfg_save_loc)
             except: pass
 
-        print('Cleaning up the ONOS cord wrapper directory at %s' %(cls.onos_cord_dir))
-        try:
-            os.system('rm -rf {}'.format(cls.onos_cord_dir))
-        except:
-            pass
+        cls.cleanup()
+        return True
 
 class OnosCordStopWrapper(Container):
     onos_cord_dir = os.path.join(os.getenv('HOME'), 'cord-tester-cord')
