diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
index feca717..3a33619 100644
--- a/TestON/drivers/common/cli/onosclidriver.py
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -468,11 +468,12 @@
             main.cleanup()
             main.exit()
         
-    def devices(self, json_format=True, grep_str=""):
+    def devices(self, json_format=True, grep_str="",node_ip=""):
         '''
         Lists all infrastructure devices or switches
         Optional argument:
-            * grep_str - pass in a string to grep
+            * grep_str : pass in a string to grep
+            * node_ip : used to reattempt CLI connection
         '''
         try:
             self.handle.sendline("")
@@ -482,12 +483,36 @@
                 if not grep_str:
                     self.handle.sendline("devices -j")
                     self.handle.expect("devices -j")
-                    self.handle.expect("onos>")
+                    i = self.handle.expect([
+                        "onos>", "\$", pexpect.TIMEOUT])
+                    if (i == 1 or i == 2) and node_ip:
+                        self.handle.sendline("onos -w "+node_ip)
+                        self.handle.expect("onos>")
+                        self.handle.sendline("devices -j")
+                        self.handle.expect("devices -j")
+                    elif not node_ip and i == 2: 
+                        main.log.info("ONOS CLI exited. Please "+
+                            "provide node_ip in the function to "+
+                            "attempt to reconnect")
                 else:
                     self.handle.sendline("devices -j | grep '"+
                         str(grep_str)+"'")
                     self.handle.expect("devices -j | grep '"+str(grep_str)+"'")
-                    self.handle.expect("onos>")
+                    i = self.handle.expect([
+                        "onos>","\$", pexpect.TIMEOUT])
+
+                    if (i == 1 or i == 2) and node_ip:
+                        main.log.info("CLI dropped. Logging back into"+
+                            " ONOS")
+                        self.handle.sendline("onos -w "+node_ip)
+                        self.handle.expect("onos>")
+                        self.handle.sendline("devices -j")
+                        self.handle.expect("devices -j")
+                    elif not node_ip and i == 2:
+                        main.log.info("ONOS CLI exited. Please "+
+                            "provide node_ip in the function to "+
+                            "attempt to reconnect")
+                
                 handle = self.handle.before
                 '''
                 handle variable here contains some ANSI escape color code sequences at the end which are invisible in the print command output
@@ -1250,8 +1275,8 @@
             main.cleanup()
             main.exit()
 
-    def push_test_intents(self, dpid_src, dpid_dst, num_intents,
-            report=True):
+    def push_test_intents(self, dpid_src, dpid_dst, num_intents, 
+            num_mult="", app_id="", report=True):
         '''
         Description:
             Push a number of intents in a batch format to 
@@ -1261,12 +1286,22 @@
             * dpid_dst: specify destination dpid
             * num_intents: specify number of intents to push
         Optional:
+            * num_mult: number multiplier for multiplying
+              the number of intents specified
+            * app_id: specify the application id init to further
+              modularize the intents
             * report: default True, returns latency information
         '''
         try:
             cmd = "push-test-intents "+\
                   str(dpid_src)+" "+str(dpid_dst)+" "+\
                   str(num_intents)
+            
+            if num_mult:
+                cmd += " " + str(num_mult)
+                if app_id:
+                    cmd += " " + str(app_id)
+            
             self.handle.sendline(cmd)
             self.handle.expect(cmd)
             self.handle.expect("onos>")
@@ -1278,8 +1313,20 @@
             handle = ansi_escape.sub('', handle)
     
             if report:
+                lat_result = []
                 main.log.info(handle)
-                return handle
+                #Split result by newline
+                newline = handle.split("\r\r\n")
+                #Ignore the first object of list, which is empty
+                newline = newline[1:]
+                #Some sloppy parsing method to get the latency
+                for result in newline:
+                    result = result.split(": ")
+                    #Append the first result of second parse
+                    lat_result.append(result[1].split(" ")[0])
+
+                print lat_result 
+                return lat_result 
             else:
                 return main.TRUE
 
diff --git a/TestON/drivers/common/cli/onosdriver.py b/TestON/drivers/common/cli/onosdriver.py
index 8489c98..0c01e9f 100644
--- a/TestON/drivers/common/cli/onosdriver.py
+++ b/TestON/drivers/common/cli/onosdriver.py
@@ -955,6 +955,52 @@
             main.cleanup()
             main.exit()
 
+    def push_test_intents_shell(self, dpid_src, dpid_dst, num_intents,
+            dir_file, onos_ip, num_mult="", app_id="", report=True):    
+        '''  
+        Description:
+            Use the linux prompt to push test intents to 
+            better parallelize the results than the CLI
+        Required:
+            * dpid_src: specify source dpid
+            * dpid_dst: specify destination dpid
+            * num_intents: specify number of intents to push
+            * dir_file: specify directory and file name to save
+              results
+            * onos_ip: specify the IP of ONOS to install on
+        NOTE: 
+            You must invoke this command at linux shell prompt
+        '''
+        try: 
+            #Create the string to sendline 
+            base_cmd = "onos "+str(onos_ip)+" push-test-intents "
+            add_dpid = base_cmd + str(dpid_src) + " " + str(dpid_dst)  
+            if not num_mult:
+                add_intents = add_dpid + " " + str(num_intents)
+            elif num_mult:
+                add_intents = add_dpid + " " + str(num_intents) + " " +\
+                              str(num_mult)
+                if app_id:
+                    add_app = add_intents + " " + str(app_id) 
+                else:
+                    add_app = add_intents
+
+            send_cmd = add_app + " > " + str(dir_file) + " &" 
+            main.log.info("Send cmd: "+send_cmd)
+
+            self.handle.sendline(send_cmd)
+
+        except pexpect.EOF:
+            main.log.error(self.name + ": EOF exception found")
+            main.log.error(self.name + ":    " + self.handle.before)
+            main.cleanup()
+            main.exit()
+        except:
+            main.log.info(self.name+" ::::::")
+            main.log.error( traceback.print_exc())
+            main.log.info(self.name+" ::::::")
+            main.cleanup()
+            main.exit() 
 
     def get_topology(self,topology_output):
         '''
diff --git a/TestON/drivers/common/clidriver.py b/TestON/drivers/common/clidriver.py
index 9ae90fb..797473d 100644
--- a/TestON/drivers/common/clidriver.py
+++ b/TestON/drivers/common/clidriver.py
@@ -50,7 +50,7 @@
         if self.port:
             self.handle =pexpect.spawn('ssh -p '+self.port+' '+self.user_name+'@'+self.ip_address,maxread=50000)
         else :
-            self.handle =pexpect.spawn('ssh -X '+self.user_name+'@'+self.ip_address,maxread=50000)
+            self.handle =pexpect.spawn('ssh -X '+self.user_name+'@'+self.ip_address,maxread=1000000,timeout=60)
 
         self.handle.logfile = self.logfile_handler
 	i = 5
