diff --git a/TestON/drivers/common/api/dockerapidriver.py b/TestON/drivers/common/api/dockerapidriver.py
index 2630f6b..fc96682 100644
--- a/TestON/drivers/common/api/dockerapidriver.py
+++ b/TestON/drivers/common/api/dockerapidriver.py
@@ -5,6 +5,7 @@
 import re
 import subprocess
 from docker import Client
+from docker import errors
 from drivers.common.apidriver import API
 
 class DockerApiDriver( API ):
@@ -39,20 +40,23 @@
         except Exception as e:
             main.log.exception( e )
 
-    def dockerPull( self, image="onosproject/onos", tag="latest" ):
+    def dockerPull( self, onosRepo ="onosproject/onos", onosTag="latest" ):
         """
         Pulls Docker image from repository
         """
         try:
             main.log.info( self.name +
-                           ": Pulling Docker image " + image + ":"+tag )
-            for line in self.dockerClient.pull( repository=image, \
-                    tag=tag, stream=True ):
-                response = json.dumps( json.loads( line ), indent=4 )
-            if( re.search( "Downloaded", response ) ):
+                           ": Pulling Docker image " + onosRepo + ":"+ onosTag )
+            for line in self.dockerClient.pull( repository = onosRepo, \
+                    tag = onosTag, stream = True ):
+                print(json.dumps(json.loads(line), indent =4))
+
+            #response = json.dumps( json.load( pullResult ), indent=4 )
+            if re.search( "for onosproject/onos:latest", line ):
+                main.log.info( "latest onos docker image pulled is: " + line )
                 return main.TRUE
             else:
-                main.log.error( "Failed to download image: " + image +":"+ tag )
+                main.log.error( "Failed to download image from: " + onosRepo +":"+ onosTag )
                 main.log.error( "Error respone: " )
                 main.log.error( response )
                 return main.FALSE
@@ -61,36 +65,39 @@
             main.cleanup()
             main.exit()
 
-    def dockerRun( self, image="onosproject/onos", node="onos1" ):
+    def dockerCreateCT( self, onosImage="onosproject/onos:latest", onosNode="onos1" ):
         """
-            Run specified Docker container
+            Create a Docker container with a specific image
         """
         try:
             main.log.info( self.name +
-                           ": Creating Docker conatiner for node " + node )
-            reponse = self.dockerClient.create_container( image=image, \
-                    tty=True, hostname=node, detach=True )
-            if( reponse['Warnings'] == 'None' ):
-                main.log.info( "Created container for node: " + node )
-                return main.TRUE
+                           ": Creating Docker container for node: " + onosNode )
+            response = self.dockerClient.create_container( image=onosImage, \
+                    tty=True, name=onosNode, detach=True )
+            #print response
+            #print response.get("Id")
+            #print response.get("Warnings")
+            if( str( response.get("Warnings") ) == 'None' ):
+                main.log.info( "Created container for node: " + onosNode + "; container id is: " + response.get("Id") )
+                return ( main.TRUE, response.get("Id") )
             else:
                 main.log.info( "Noticed warnings during create" )
-                return main.FALSE
+                return ( main.FALSE, null)
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
-    def dockerStart( self, node="onos1" ):
+    def dockerStartCT( self, ctID ):
         """
             Start Docker container
         """
         try:
             main.log.info( self.name +
-                           ": Starting Docker conatiner for node " + node )
-            reponse = self.dockerClient.start( node )
-            if( reponse == 'None' ):
-                main.log.info( "Started container for node: " + node )
+                           ": Starting Docker conatiner Id " + ctID )
+            response = self.dockerClient.start( container = ctID )
+            if response is None:
+                main.log.info( "Started container for Id: " + ctID )
                 return main.TRUE
             else:
                 main.log.info( "Noticed warnings during start" )
@@ -100,35 +107,38 @@
             main.cleanup()
             main.exit()
 
-    def dockerStop( self, node="onos1" ):
+    def dockerStopCT( self, ctName ):
         """
             Stop docker container
         """
         try:
             main.log.info( self.name +
-                           ": Stopping Docker conatiner for node " + node )
-            reponse = self.dockerClient.stop( node )
-            if( reponse == 'None' ):
-                main.log.info( "Stopped container for node: " + node )
+                           ": Stopping Docker conatiner for node " + ctName )
+            response = self.dockerClient.stop( ctName )
+            if response is None:
+                main.log.info( "Stopped container for node: " + ctName )
                 return main.TRUE
             else:
                 main.log.info( "Noticed warnings during stop" )
                 return main.FALSE
+        except errors.NotFound:
+            main.log.info( ctName + " not found! Continue on tests...")
+            return main.TRUE
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
-            main.cleanup()
-            main.exit()
+            #main.cleanup()
+            #main.exit()
 
-    def dockerRestart( self, node="onos1" ):
+    def dockerRestartCT( self, ctName ):
         """
             Restart Docker container
         """
         try:
             main.log.info( self.name +
-                           ": Restarting Docker conatiner for node " + node )
-            reponse = self.dockerClient.restart( node )
-            if( reponse == 'None' ):
-                main.log.info( "Restarted container for node: " + node )
+                           ": Restarting Docker conatiner for node " + ctName )
+            response = self.dockerClient.restart( ctName )
+            if response is None:
+                main.log.info( "Restarted container for node: " + ctName )
                 return main.TRUE
             else:
                 main.log.info( "Noticed warnings during Restart" )
@@ -138,62 +148,77 @@
             main.cleanup()
             main.exit()
 
-    def dockerStatus( self, node="onos1" ):
+    def dockerCheckCTName( self, ctName):
         """
             Check Docker conatiner status
         """
         try:
             main.log.info( self.name +
-                           ": Checking Docker Status for node " + node )
-            reponse = self.dockerClient.inspect_container( node )
-            if( reponse == 'True' ):
-                main.log.info( "Container " + node + " is running" )
+                           ": Checkeng Docker Status for CT with 'Names'  " + ctName )
+            namelist = [response["Names"] for response in self.dockerClient.containers(all=True) if not []]
+            main.log.info("Name list is: " + str(namelist) )
+            if( [ctName] in namelist):
+                main.log.info( "Container " + ctName + " exists" )
                 return main.TRUE
             else:
-                main.log.info( "Container " + node + " is not running" )
+                main.log.info( "Container " + ctName + " does not exist" )
                 return main.FALSE
+        except errors.NotFound:
+            main.log.warn( ctName + "not found! Continue with the tests...")
+            return main.FALSE
         except Exception:
-            main.log.exception( self.name + ": Uncaught exception!" )
-            main.cleanup()
-            main.exit()
+            main.log.exception( self.name + ": Uncaught exception! Continue tests..." )
+            #main.cleanup()
+            #main.exit()
 
-    def dockerRemove( self, node="onos1" ):
+    def dockerRemoveCT( self, ctName ):
         """
             Remove Docker conatiner
         """
         try:
             main.log.info( self.name +
-                           ": Removing Docker container for node " + node )
-            reponse = self.dockerClient.remove_container( node )
-            if( reponse == 'None' ):
-                main.log.info( "Removed container for node: " + node )
+                           ": Removing Docker container for node " + ctName )
+            response = self.dockerClient.remove_container( ctName, force=True )
+            if response is None:
+                main.log.info( "Removed container for node: " + ctName )
                 return main.TRUE
             else:
-                main.log.info( "Noticed warnings during Remove " + node )
+                main.log.info( "Noticed warnings during Remove " + ctName)
                 return main.FALSE
+            main.log.exception(self.name + ": not found, continuing...")
+        except errors.NotFound:
+            main.log.warn( ctName + "not found! Continue with the tests...")
+            return main.TRUE
         except Exception:
-            main.log.exception( self.name + ": Uncaught exception!" )
-            main.cleanup()
-            main.exit()
+            main.log.exception( self.name + ": Uncaught exception! Continuing..." )
+            #main.cleanup()
+            #main.exit()
 
-    def dockerImageRemove( self, image="onosproject/onos" ):
+    def dockerRemoveImage( self, image="onosproject/onos:latest" ):
         """
             Remove Docker image
         """
-        try:
-            main.log.info( self.name +
-                           ": Removing Docker container for node " + node )
-            reponse = self.dockerClient.remove_image( image )
-            if( reponse == 'None' ):
-                main.log.info( "Removed Docker image: " + image )
+        if self.dockerClient.images() is []: 
+            main.log.info( "no image found with RepoTags: " + image )
+            return main.TRUE
+        else:
+            try:
+                main.log.info( self.name +
+                           ": Removing Docker image " + image )
+                response = self.dockerClient.remove_image( image, force = True)
+                if response is None:
+                    main.log.info( "Removed Docker image: " + image )
+                    return main.TRUE
+                else:
+                    main.log.info( "Noticed warnings during Remove " + image )
+                    return main.FALSE
+            except errors.NotFound:
+                main.log.warn( image + "not found! Continue with the tests...")
                 return main.TRUE
-            else:
-                main.log.info( "Noticed warnings during Remove " + image )
-                return main.FALSE
-        except Exception:
-            main.log.exception( self.name + ": Uncaught exception!" )
-            main.cleanup()
-            main.exit()
+            except Exception:
+                main.log.exception( self.name + ": Uncaught exception! Continuing..." )
+                #main.cleanup()
+                #main.exit()
 
     def fetchLatestClusterFile( self, branch="master" ):
         """
@@ -211,32 +236,37 @@
             main.cleanup()
             main.exit()
 
-    def onosFormCluster( self, onosIPs, user="onos", passwd="rocks" ):
+    def onosFormCluster( self, onosIPs, cmdPath="~/OnosSystemTest/TestON/tests/PLATdockertest/Dependency", user="karaf", passwd="karaf" ):
         """
             From ONOS cluster for IP addresses in onosIPs list
         """
         try:
             onosIPs = " ".join(onosIPs)
-            command = "./onos-form-cluster -u " + user + " -p " + passwd + \
-                    " `" + onosIPs + "`"
-            subprocess.call( command ) # output checks are missing for now
-            return main.TRUE # FALSE condition will be verified from output
+            command = cmdPath + "/onos-form-cluster -u " + user + " -p " + passwd + \
+                    " " + onosIPs
+            result = subprocess.call( command, shell=True )
+            if result == 0:
+                return main.TRUE
+            else:
+                main.log.info("Something is not right in forming cluster>")
+                return main.FALSE
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
-    def dockerIP( self, node='onos1' ):
+    def dockerIP( self, ctName ):
         """
             Fetch IP address assigned to specified node/container
         """
         try:
-            output = self.dockerClient.inspect_container(node)
+            output = self.dockerClient.inspect_container( ctName )
             nodeIP = output['NetworkSettings']['IPAddress']
-            #main.log.info( " Docker IP " + str(nodeIP) )
+            main.log.info( " Docker IP " + str(nodeIP) )
             return str(nodeIP)
 
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
+
