diff --git a/TestON/drivers/common/api/dockerapidriver.py b/TestON/drivers/common/api/dockerapidriver.py
new file mode 100644
index 0000000..2630f6b
--- /dev/null
+++ b/TestON/drivers/common/api/dockerapidriver.py
@@ -0,0 +1,242 @@
+#!/usr/bin/env python
+
+import json
+import os
+import re
+import subprocess
+from docker import Client
+from drivers.common.apidriver import API
+
+class DockerApiDriver( API ):
+
+    def __init__( self ):
+        """
+        Initialize client
+        """
+        self.name = None
+        self.home = None
+        self.handle = None
+        super( API, self ).__init__()
+
+    def connect( self, **connectargs ):
+        """
+        Create Client handle to connnect to Docker server
+        """
+        try:
+            for key in connectargs:
+                vars( self )[ key ] = connectargs[ key ]
+            self.name = self.options[ 'name' ]
+            for key in self.options:
+                if key == "home":
+                    self.home = self.options[ 'home' ]
+                    break
+            if self.home is None or self.home == "":
+                self.home = "/var/tmp"
+
+            self.handle = super( DockerApiDriver, self ).connect()
+            self.dockerClient = Client(base_url='unix://var/run/docker.sock')
+            return self.handle
+        except Exception as e:
+            main.log.exception( e )
+
+    def dockerPull( self, image="onosproject/onos", tag="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 ) ):
+                return main.TRUE
+            else:
+                main.log.error( "Failed to download image: " + image +":"+ tag )
+                main.log.error( "Error respone: " )
+                main.log.error( response )
+                return main.FALSE
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def dockerRun( self, image="onosproject/onos", node="onos1" ):
+        """
+            Run specified Docker container
+        """
+        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
+            else:
+                main.log.info( "Noticed warnings during create" )
+                return main.FALSE
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def dockerStart( self, node="onos1" ):
+        """
+            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 )
+                return main.TRUE
+            else:
+                main.log.info( "Noticed warnings during start" )
+                return main.FALSE
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def dockerStop( self, node="onos1" ):
+        """
+            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 )
+                return main.TRUE
+            else:
+                main.log.info( "Noticed warnings during stop" )
+                return main.FALSE
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def dockerRestart( self, node="onos1" ):
+        """
+            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 )
+                return main.TRUE
+            else:
+                main.log.info( "Noticed warnings during Restart" )
+                return main.FALSE
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def dockerStatus( self, node="onos1" ):
+        """
+            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" )
+                return main.TRUE
+            else:
+                main.log.info( "Container " + node + " is not running" )
+                return main.FALSE
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def dockerRemove( self, node="onos1" ):
+        """
+            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 )
+                return main.TRUE
+            else:
+                main.log.info( "Noticed warnings during Remove " + node )
+                return main.FALSE
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def dockerImageRemove( self, image="onosproject/onos" ):
+        """
+            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 )
+                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()
+
+    def fetchLatestClusterFile( self, branch="master" ):
+        """
+            Fetch onos-form-cluster file from a particular branch
+        """
+        try:
+            command = "wget -N https://raw.githubusercontent.com/opennetworkinglab/\
+                    onos/" + branch + "/tools/package/bin/onos-form-cluster"
+            subprocess.call( command ) # output checks are missing for now
+            command = "chmod u+x " + "onos-form-cluster"
+            subprocess.call( command )
+            return main.TRUE
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def onosFormCluster( self, onosIPs, user="onos", passwd="rocks" ):
+        """
+            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
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def dockerIP( self, node='onos1' ):
+        """
+            Fetch IP address assigned to specified node/container
+        """
+        try:
+            output = self.dockerClient.inspect_container(node)
+            nodeIP = output['NetworkSettings']['IPAddress']
+            #main.log.info( " Docker IP " + str(nodeIP) )
+            return str(nodeIP)
+
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
