diff --git a/TestON/drivers/common/cli/cassandraclidriver.py b/TestON/drivers/common/cli/cassandraclidriver.py
index 0b43d32..d307f93 100644
--- a/TestON/drivers/common/cli/cassandraclidriver.py
+++ b/TestON/drivers/common/cli/cassandraclidriver.py
@@ -37,7 +37,7 @@
 
 class CassandraCliDriver(CLI):
     '''
-        CassandraCliDriver is the basic driver which will handle the Cassandra's functions
+    CassandraCliDriver is the basic driver which will handle the Cassandra's functions
     '''
     def __init__(self):
         super(CLI, self).__init__()
@@ -64,7 +64,9 @@
    
  
     def start(self):
-        ''' This Function will start the Cassandra'''
+        '''
+        This Function will start the Cassandra
+        '''
         main.log.info( "Starting Cassandra" )
         self.handle.sendline("")
         self.handle.expect("\$")
@@ -81,7 +83,9 @@
             return main.FALSE
         
     def status(self):
-        '''This Function will return the Status of the Cassandra '''
+        '''
+        This Function will return the Status of the Cassandra
+        '''
         time.sleep(5)
         self.execute(cmd="\r",prompt="\$",timeout=10)
         response = self.execute(cmd="~/ONOS/start-cassandra.sh status ",prompt="\d+\sinstance\sof\scassandra\srunning(.*)",timeout=10)
@@ -98,7 +102,9 @@
             return main.TRUE
             
     def stop(self):
-        '''This Function will stop the Cassandra if it is Running''' 
+        '''
+        This Function will stop the Cassandra if it is Running
+        ''' 
         self.execute(cmd="\r",prompt="\$",timeout=10)
         time.sleep(5)
         response = self.execute(cmd="~/ONOS/start-cassandra.sh stop ",prompt="Killed\sexisting\sprosess(.*)",timeout=10)
@@ -111,7 +117,9 @@
             return main.FALSE
             
     def disconnect(self):
-        
+        ''' 
+        Called at the end of the test to disconnect the ssh handle. 
+        ''' 
         response = ''
         if self.handle:
             self.handle.sendline("exit")
@@ -122,6 +130,11 @@
         return response 
 
     def isup(self):
+        '''
+        A more complete status check of cassandra.
+        Tries 5 times to call start-cassandra.sh status
+        returns TRUE if it sees four occurances of both Up, and Normal 
+        '''
         tries = 5
         main.log.info("trying %i times" % tries )
         for i in range(tries):
diff --git a/TestON/drivers/common/cli/emulator/mininetclidriver.py b/TestON/drivers/common/cli/emulator/mininetclidriver.py
index aa02ed1..4e60f46 100644
--- a/TestON/drivers/common/cli/emulator/mininetclidriver.py
+++ b/TestON/drivers/common/cli/emulator/mininetclidriver.py
@@ -124,6 +124,27 @@
         else :
             main.log.error("Connection failed to the host") 
             return main.FALSE
+
+    def fpingHost(self,**pingParams):
+        ''' 
+        Uses the fping package for faster pinging...
+        *requires fping to be installed on machine running mininet 
+        ''' 
+        args = utilities.parse_args(["SRC","TARGET"],**pingParams)
+        command = args["SRC"] + " fping -i 100 -t 10 -C 1 -q "+args["TARGET"]
+        self.handle.sendline(command) 
+        self.handle.expect(args["TARGET"]) 
+        self.handle.expect("mininet")
+        response = self.handle.before 
+        if re.search(":\s-" ,response):
+            main.log.info("Ping fail") 
+            return main.FALSE
+        elif re.search(":\s\d\.\d\d", response):
+            main.log.info("Ping good!")
+            return main.TRUE
+        main.log.info("Install fping on mininet machine... ") 
+        main.log.info("\n---\n"+response)
+        return main.FALSE
         
     def pingHost(self,**pingParams):
         
@@ -255,6 +276,32 @@
         return main.TRUE
         
 
+    def yank(self, **yangargs):
+	'''
+	yank out a mininet switch interfacet to host
+	'''
+	main.log.info('Yang out the switch interface attached to a host')
+	args = utilities.parse_args(["SW","INTF"])
+	sw = args["SW"] if args["SW"] !=None else ""
+	intf = args["INTF"] if args["INTF"] != None else ""
+	command = "py "+ str(sw) + '.detach("' + str(intf) + '")'
+	response = self.execute(cmd=command,prompt="mininet>",timeout=10)
+	return main.TRUE
+
+    def plug(self, **plugargs):
+        '''
+        plug the yanked mininet switch interface to a switch
+        '''
+        main.log.info('Plug the switch interface attached to a switch')
+        args = utilities.parse_args(["SW","INTF"])
+        sw = args["SW"] if args["SW"] !=None else ""
+        intf = args["INTF"] if args["INTF"] != None else ""
+        command = "py "+ str(sw) + '.attach("' + str(intf) + '")'
+        response = self.execute(cmd=command,prompt="mininet>",timeout=10)
+        return main.TRUE
+
+
+
     def dpctl(self,**dpctlargs):
         '''
          Run dpctl command on all switches.
diff --git a/TestON/drivers/common/cli/emulator/remotemininetdriver.py b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
index b55a371..5452dbe 100644
--- a/TestON/drivers/common/cli/emulator/remotemininetdriver.py
+++ b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
@@ -37,7 +37,9 @@
 
 class RemoteMininetDriver(Emulator):
     '''
-        MininetCliDriver is the basic driver which will handle the Mininet functions
+    RemoteMininetCliDriver is the basic driver which will handle the Mininet functions
+    The main different between this and the MininetCliDriver is that this one does not build the mininet. 
+    It assumes that there is already a mininet running on the target. 
     '''
     def __init__(self):
         super(Emulator, self).__init__()
@@ -66,6 +68,9 @@
             return main.FALSE
   
     def pingLong(self,**pingParams):
+        '''
+        Starts a continuous ping on the mininet host outputing to a file in the /tmp dir. 
+        '''
         args = utilities.parse_args(["SRC","TARGET"],**pingParams)
         command = "mininet/util/m " + args["SRC"] + " ping "+args ["TARGET"]+" -i .1 -D -W 1 > /tmp/ping." + args["SRC"] + " &"
         main.log.info( command ) 
@@ -73,15 +78,9 @@
         return main.TRUE
 
     def pingstatus(self,**pingParams):
-        #self.handle.sendline("pgrep ping")
-        #self.handle.expect("pgrep")
-        #self.handle.expect("\$")
-        #result = self.handle.before + self.handle.after
-        #if re.search('\d\d+', result ):
-        #    return main.TRUE
-        #else: 
-        #    return main.FALSE
-         
+        '''
+        Tails the respective ping output file and check that there is a moving "64 bytes"
+        '''
         args = utilities.parse_args(["SRC"],**pingParams)
         self.handle.sendline("tail /tmp/ping." + args["SRC"])
         self.handle.expect("tail")
@@ -98,20 +97,17 @@
             return main.FALSE
          
     def pingKill(self):
+        '''
+        Kills all continuous ping processes.
+        Then copies all the ping files to the TestStation.
+        '''
+        import time
         command = "sudo pkill ping" 
         main.log.info( command ) 
         self.execute(cmd=command,prompt="(.*)",timeout=10)
-        #command = "sudo pgrep ping" 
-        #result1 = self.execute(cmd="\r",prompt="\$",timout=10)
-        #result = self.execute(cmd=command,prompt=self.user_name,timout=10)
-        #if utilities.assert_matches(expect='[^\s]+',actual=result,onpass="match",onfail="no match"):
-        #    main.log.info( "pings running as process"  )
-        #    main.log.info( result )
-        #    return main.FALSE
         main.log.info( "Removing old ping data" )
         command = "rm /tmp/ping.*"
         os.popen(command) 
-        import time
         time.sleep(2)      
         main.log.info( "Transferring ping files to TestStation" )
         command = "scp /tmp/ping.* admin@10.128.7.7:/tmp/" 
@@ -119,7 +115,9 @@
         return main.TRUE
         
     def pingHost(self,**pingParams):
-        
+        ''' 
+        Pings between two hosts on remote mininet  
+        ''' 
         args = utilities.parse_args(["SRC","TARGET"],**pingParams)
         command = "mininet/util/m " + args["SRC"] + " ping "+args ["TARGET"]+" -c 4 -W 1 -i .2"
         main.log.info ( command ) 
@@ -136,7 +134,7 @@
     
     def checknum(self,num):
         '''
-            Verifies the correct number of switches are running 
+        Verifies the correct number of switches are running 
         '''
         if self.handle :
             self.handle.sendline("")
@@ -161,12 +159,21 @@
             main.log.error("Connection failed to the host") 
 
     def ctrl_none(self):
+        '''
+        Sets all the switches to no controllers. 
+        '''
         self.execute(cmd="~/ONOS/scripts/test-ctrl-none.sh", prompt="\$",timeout=10)
 
     def ctrl_one(self, ip):
+        '''
+        Sets all the switches to point to the supplied IP
+        '''
         self.execute(cmd="~/ONOS/scripts/test-ctrl-one.sh "+ip, prompt="\$",timeout=10)
  
     def ctrl_local(self):
+        '''
+        Sets all the switches to point to the Controller on the same machine that they are running on. 
+        '''
         self.execute(cmd="~/ONOS/scripts/test-ctrl-local.sh ", prompt="\$",timeout=10)
 
  #   def verifySSH(self,**connectargs):
@@ -293,7 +300,9 @@
  #       return version    
 
     def disconnect(self):
-        
+        '''    
+        Called at the end of the test to disconnect the handle.    
+        '''    
         response = ''
         #print "Disconnecting Mininet"
         if self.handle:
diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
index 670a492..41505f2 100644
--- a/TestON/drivers/common/cli/onosclidriver.py
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -62,14 +62,16 @@
         self.handle.sendline("cd ~/ONOS")
         self.handle.expect("ONOS\$")
         self.handle.sendline("./start-onos.sh start")
+        self.handle.expect("onos.sh start")
         i=self.handle.expect(["Starting\sONOS\scontroller","Cassandra\sis\snot\srunning"])
         if i==0:
-            if self.handle.expect("ONOS\$", 60):
+            try: 
+                self.handle.expect("ONOS\$", timeout=60)
                 main.log.info("ONOS Started ") 
-                return main.TRUE
-            else:  
+            except:  
                 main.log.info("ONOS NOT Started, stuck while waiting for it to start ") 
                 return main.FALSE
+            return main.TRUE
         elif i==1:
             main.log.error("ONOS didn't start because cassandra wasn't running.") 
             return main.FALSE
@@ -192,8 +194,9 @@
         self.handle.expect("ONOS\$")
         self.handle.sendline("./start-onos.sh stop")
         self.handle.expect("stop", 2)
+        result = self.handle.before 
         self.handle.expect("ONOS\$", 60)
-        if re.search("Killed",response):
+        if re.search("Killed", result):
             main.log.info("ONOS Killed Successfully")
             return main.TRUE
         else :
@@ -215,18 +218,17 @@
         
     def disconnect(self):
         '''
-        Called when Test is complete to dissconnect the ONOS handle.  
+        Called when Test is complete to disconnect the ONOS handle.  
         '''
-        if self.handle:
+        response = ''
+        try:
             self.handle.sendline("exit")
-            self.handle.expect("closed") 
-            if self.handle.isalive():   
-                response = main.TRUE
-        else :
+            self.handle.expect("closed")
+        except: 
             main.log.error("Connection failed to the host")
             response = main.FALSE
-        return response 
-
+        return response
+ 
     def get_version(self):
         ''' 
         Writes the COMMIT number to the report to be parsed by Jenkins data collecter.  
diff --git a/TestON/drivers/common/cli/zookeeperclidriver.py b/TestON/drivers/common/cli/zookeeperclidriver.py
index 60ac65e..2a575ae 100644
--- a/TestON/drivers/common/cli/zookeeperclidriver.py
+++ b/TestON/drivers/common/cli/zookeeperclidriver.py
@@ -37,7 +37,7 @@
 
 class ZookeeperCliDriver(CLI):
     '''
-        ZookeeperCliDriver is the basic driver which will handle the Zookeeper's functions
+    ZookeeperCliDriver is the basic driver which will handle the Zookeeper's functions
     '''
     def __init__(self):
         super(CLI, self).__init__()
@@ -64,7 +64,9 @@
    
  
     def start(self):
-        ''' This Function will start the Zookeeper'''
+        '''
+        This Function will start the Zookeeper
+        '''
         main.log.info( "Starting Zookeeper" )
         self.handle.sendline("")
         self.handle.expect("\$")
@@ -82,7 +84,9 @@
             return main.FALSE
         
     def status(self):
-        '''This Function will return the Status of the Zookeeper '''
+        '''
+        This Function will return the Status of the Zookeeper 
+        '''
         time.sleep(5)
         self.execute(cmd="\r",prompt="\$",timeout=10)
         response = self.execute(cmd="~/zookeeper-3.4.5/bin/zkServer.sh status ",prompt="JMX",timeout=10)
@@ -91,7 +95,9 @@
         return response
         
     def stop(self):
-        '''This Function will stop the Zookeeper if it is Running''' 
+        '''
+        This Function will stop the Zookeeper if it is Running
+        ''' 
         self.execute(cmd="\r",prompt="\$",timeout=10)
         time.sleep(5)
         response = self.execute(cmd="~/zookeeper-3.4.5/bin/zkServer.sh stop ",prompt="STOPPED",timeout=10)
@@ -104,7 +110,9 @@
             return main.FALSE
             
     def disconnect(self):
-        
+        ''' 
+        Called at the end of the test to disconnect the ZK handle 
+        ''' 
         response = ''
         if self.handle:
             self.handle.sendline("exit")
@@ -115,6 +123,9 @@
         return response 
 
     def isup(self):
+        '''
+        Calls the zookeeper status and returns TRUE if it has an assigned Mode to it. 
+        '''
         self.execute(cmd="\n",prompt="\$",timeout=10)
         response = self.execute(cmd="~/zookeeper-3.4.5/bin/zkServer.sh status ",prompt="Mode",timeout=10)
         pattern = '(.*)Mode(.*)'
