diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
new file mode 100644
index 0000000..670a492
--- /dev/null
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -0,0 +1,608 @@
+#!/usr/bin/env python
+'''
+Created on 31-May-2013 
+
+@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)      
+
+    TestON is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 2 of the License, or
+    (at your option) any later version.
+
+    TestON is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.        
+
+
+''' 
+import time
+import pexpect
+import struct, fcntl, os, sys, signal
+import sys
+import re
+import json
+sys.path.append("../")
+from drivers.common.clidriver import CLI
+
+class OnosCliDriver(CLI):
+    
+    def __init__(self):
+        super(CLI, self).__init__()
+        
+    def connect(self,**connectargs):
+	'''
+        Creates ssh handle for ONOS. 
+        '''
+        for key in connectargs:
+           vars(self)[key] = connectargs[key]
+
+        
+        self.name = self.options['name']
+        self.handle = super(OnosCliDriver,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd)
+
+        if self.handle:
+            #self.start()
+            #self.start_rest()
+            return self.handle
+        else :
+            main.log.info("NO HANDLE")
+            return main.FALSE
+        
+    def start(self):
+        '''
+        Starts ONOS on remote machine.
+        Returns false if any errors were encountered. 
+        '''
+        self.handle.sendline("")
+        self.handle.expect("\$")
+        self.handle.sendline("cd ~/ONOS")
+        self.handle.expect("ONOS\$")
+        self.handle.sendline("./start-onos.sh start")
+        i=self.handle.expect(["Starting\sONOS\scontroller","Cassandra\sis\snot\srunning"])
+        if i==0:
+            if self.handle.expect("ONOS\$", 60):
+                main.log.info("ONOS Started ") 
+                return main.TRUE
+            else:  
+                main.log.info("ONOS NOT Started, stuck while waiting for it to start ") 
+                return main.FALSE
+        elif i==1:
+            main.log.error("ONOS didn't start because cassandra wasn't running.") 
+            return main.FALSE
+        
+        main.log.error("ONOS expect script missed something... ") 
+        return main.FALSE
+    
+    def link_down(self, **linkParams):
+        '''
+        Specifically used for the ONOS demo on the HW.
+        Should be replaced by actual switch drivers in the future.
+        '''
+        args = utilities.parse_args(["SDPID","SPORT","DDPID","DPORT"], **linkParams)
+        sdpid = args["SDPID"] if args["SDPID"] != None else "00:00:00:00:ba:5e:ba:13"
+        sport = args["SPORT"] if args["SPORT"] != None else "22"
+        ddpid = args["DDPID"] if args["DDPID"] != None else "00:00:20:4e:7f:51:8a:35"
+        dport = args["DPORT"] if args["DPORT"] != None else "22"
+       
+        cmd = "curl -s  10.128.4.11:9000/gui/link/down/" + sdpid + "/" + sport + "/" + ddpid + "/" + dport + " > /tmp/log &"
+        os.popen( cmd ) 
+
+    def link_up(self, **linkParams):
+        '''
+        Specifically used for the ONOS demo on the HW.
+        Should be replaced by actual switch drivers in the future.
+        '''
+        args = utilities.parse_args(["SDPID","SPORT","DDPID","DPORT"], **linkParams)
+        sdpid = args["SDPID"] if args["SDPID"] != None else "00:00:00:00:ba:5e:ba:13"
+        sport = args["SPORT"] if args["SPORT"] != None else "22"
+        ddpid = args["DDPID"] if args["DDPID"] != None else "00:00:20:4e:7f:51:8a:35"
+        dport = args["DPORT"] if args["DPORT"] != None else "22"
+       
+        cmd = "curl -s  10.128.4.11:9000/gui/link/up/" + sdpid + "/" + sport + "/" + ddpid + "/" + dport + " > /tmp/log &"
+        os.popen( cmd ) 
+
+    def start_rest(self):
+        '''
+        Starts the rest server on ONOS.
+        '''
+        self.execute(cmd="cd ONOS",prompt="ONOS\$",timeout=10)
+        response = self.execute(cmd="start-rest.sh start",prompt="\$",timeout=10)
+        if re.search("admin",response):
+            main.log.info("Rest Server Started Successfully")
+            time.sleep(5)
+            return main.TRUE
+        else :
+            main.log.warn("Failed to start Rest Server")   
+            return main.FALSE     
+        
+    def status(self):
+        '''
+        Called start-onos.sh status and returns TRUE/FALSE accordingly 
+        '''
+        self.execute(cmd="\r",prompt="\$",timeout=10)
+        response = self.execute(cmd="~/ONOS/start-onos.sh status ",prompt="\d+\sinstance\sof\sonos\srunning",timeout=10)
+        self.execute(cmd="\r",prompt="\$",timeout=10)
+        if re.search("1\sinstance\sof\sonos\srunning",response):
+            return main.TRUE
+        elif re.search("0\sinstance\sof\sonos\srunning",response):
+            return main.FALSE
+        else :
+            return main.FALSE
+
+    def isup(self):
+        '''
+        A more complete check to see if ONOS is up and running properly. 
+        First, it checks if the process is up. 
+        Second, it reads the logs for "Exception: Connection refused" 
+        Third, it makes sure the logs are actually moving. 
+        returns TRUE/FALSE accordingly.
+        '''
+        self.execute(cmd="\r",prompt="\$",timeout=10)
+        response = self.execute(cmd="~/ONOS/start-onos.sh status ",prompt="running",timeout=10)
+        self.execute(cmd="\r",prompt="\$",timeout=10)
+        tail1 = self.execute(cmd="tail ~/ONOS/onos-logs/onos.*.log",prompt="\$",timeout=10)
+        time.sleep(2)
+        self.execute(cmd="\r",prompt="\$",timeout=10)
+        tail2 = self.execute(cmd="tail ~/ONOS/onos-logs/onos.*.log",prompt="\$",timeout=10)
+        pattern = '(.*)1 instance(.*)'
+        pattern2 = '(.*)Exception: Connection refused(.*)'
+        if utilities.assert_matches(expect=pattern,actual=response,onpass="ONOS process is running...",onfail="ONOS process not running..."):
+            if tail1 == tail2:
+                main.log.error("ONOS is frozen...")
+                return main.FALSE
+            elif re.search( pattern2,tail1 ):
+                main.log.info("Connection Refused found in onos log") 
+                return main.FALSE
+            elif re.search( pattern2,tail2 ):
+                main.log.info("Connection Refused found in onos log") 
+                return main.FALSE
+            else:
+                main.log.info("Onos log is moving! It's looking good!")
+                return main.TRUE
+        else:
+            return main.FALSE
+
+    
+    def rest_status(self): 
+        '''
+        Checks if the rest server is running. 
+        '''
+        response = self.execute(cmd="~/ONOS/start-rest.sh status ",prompt="running",timeout=10)
+        if re.search("rest\sserver\sis\srunning",response):
+            main.log.info("Rest Server is running")
+        elif re.search("rest\sserver\sis\snot\srunning",response):
+            main.log.warn("Rest Server is not Running")
+        else :
+            main.log.error("No response" +response)
+        self.execute(cmd="\r",prompt="\$",timeout=10)
+        
+        return response
+    
+    def stop(self):
+        '''
+        Runs ./start-onos.sh stop to stop ONOS
+        '''
+        self.handle.sendline("")
+        self.handle.expect("\$")
+        self.handle.sendline("cd ~/ONOS")
+        self.handle.expect("ONOS\$")
+        self.handle.sendline("./start-onos.sh stop")
+        self.handle.expect("stop", 2)
+        self.handle.expect("ONOS\$", 60)
+        if re.search("Killed",response):
+            main.log.info("ONOS Killed Successfully")
+            return main.TRUE
+        else :
+            main.log.warn("ONOS wasn't running")
+            return main.FALSE
+    
+    def rest_stop(self):
+        '''
+        Runs ./start-rest.sh stop to stop ONOS rest server
+        '''
+        response = self.execute(cmd="~/ONOS/start-rest.sh stop ",prompt="killing",timeout=10)
+        self.execute(cmd="\r",prompt="\$",timeout=10)
+        if re.search("killing", response):
+            main.log.info("Rest Server Stopped")
+            return main.TRUE
+        else :
+            main.log.error("Failed to Stop, Rest Server is not Running")
+            return main.FALSE
+        
+    def disconnect(self):
+        '''
+        Called when Test is complete to dissconnect the ONOS handle.  
+        '''
+        if self.handle:
+            self.handle.sendline("exit")
+            self.handle.expect("closed") 
+            if self.handle.isalive():   
+                response = main.TRUE
+        else :
+            main.log.error("Connection failed to the host")
+            response = main.FALSE
+        return response 
+
+    def get_version(self):
+        ''' 
+        Writes the COMMIT number to the report to be parsed by Jenkins data collecter.  
+        ''' 
+        self.handle.sendline("cat /home/admin/ONOS/.git/ORIG_HEAD")
+        self.handle.expect("ORIG_HEAD")
+        self.handle.expect("\$")
+        main.log.report( "COMMIT: " + str(self.handle.before + self.handle.after))
+
+    def add_flow(self, path):
+        ''' 
+        Copies the flowdef file from TestStation -> ONOS machine
+        Then runs ./add_flow.py to add the flows to ONOS
+        ''' 
+        main.log.info("Adding Flows...")
+        self.handle.sendline("scp admin@10.128.7.7:%s /tmp/flowtmp" % path) 
+        self.handle.expect("100%")
+        self.handle.expect("\$", 30)
+        self.handle.sendline("~/ONOS/web/add_flow.py -m onos -f /tmp/flowtmp") 
+        self.handle.expect("add_flow")
+        self.handle.expect("\$", 1000)
+        main.log.info("Flows added")
+
+    def delete_flow(self, *delParams):
+        '''
+        Deletes a specific flow, a range of flows, or all flows.
+        '''
+        if len(delParams)==1:
+             if str(delParams[0])=="all":
+                  main.log.info("Deleting ALL flows...")
+                  #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh all",prompt="done",timeout=150)
+                  self.handle.sendline("~/ONOS/web/delete_flow.py all")
+                  self.handle.expect("delete_flow")
+                  self.handle.expect("\$",1000)
+                  self.handle.sendline("~/ONOS/web/clear_flow.py all")
+                  self.handle.expect("clear_flow")
+                  self.handle.expect("\$",1000)
+                  main.log.info("Flows deleted")
+             else:
+                  main.log.info("Deleting flow "+str(delParams[0])+"...")
+                  #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0]),prompt="done",timeout=150)
+                  #self.execute(cmd="\n",prompt="\$",timeout=60)
+                  self.handle.sendline("~/ONOS/web/delete_flow.py %d" % int(delParams[0]))
+                  self.handle.expect("delete_flow")
+                  self.handle.expect("\$",60)
+                  self.handle.sendline("~/ONOS/web/clear_flow.py %d" % int(delParams[0]))
+                  self.handle.expect("clear_flow")
+                  self.handle.expect("\$",60)
+                  main.log.info("Flow deleted")
+        elif len(delParams)==2:
+             main.log.info("Deleting flows "+str(delParams[0])+" through "+str(delParams[1])+"...")
+             #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0])+" "+str(delParams[1]),prompt="done",timeout=150)
+             #self.execute(cmd="\n",prompt="\$",timeout=60)
+             self.handle.sendline("~/ONOS/web/delete_flow.py %d %d" % (int(delParams[0]), int(delParams[1])))
+             self.handle.expect("delete_flow")
+             self.handle.expect("\$",600)
+             self.handle.sendline("~/ONOS/web/clear_flow.py %d %d" % (int(delParams[0]), int(delParams[1])))
+             self.handle.expect("clear_flow")
+             self.handle.expect("\$",600)
+             main.log.info("Flows deleted")
+
+    def check_flow(self):
+        '''
+        Calls the ./get_flow.py all and checks:
+          - If each FlowPath has at least one FlowEntry  
+          - That there are no "NOT"s found
+        returns TRUE/FALSE 
+        '''
+        flowEntryDetect = 1
+        count = 0
+        self.handle.sendline("clear")
+        time.sleep(1)
+        self.handle.sendline("~/ONOS/web/get_flow.py all")
+        self.handle.expect("get_flow")
+        while 1:
+            i=self.handle.expect(['FlowPath','FlowEntry','NOT','\$',pexpect.TIMEOUT],timeout=180)
+            if i==0:
+                count = count + 1
+                if flowEntryDetect == 0:
+                    main.log.info("FlowPath without FlowEntry")
+                    return main.FALSE
+                else:
+                    flowEntryDetect = 0
+            elif i==1:
+                flowEntryDetect = 1
+            elif i==2:
+                main.log.error("Found a NOT")
+                return main.FALSE
+            elif i==3:
+                if count == 0:
+                    main.log.info("There don't seem to be any flows here...")
+                    return main.FALSE
+                else:
+                    main.log.info("All flows pass")
+                    main.log.info("Number of FlowPaths: "+str(count))
+                    return main.TRUE
+            elif i==4:
+                main.log.error("Command Timeout!")
+                return main.FALSE
+
+    def get_flow(self, *flowParams):
+         '''
+         Returns verbose output of ./get_flow.py
+         '''
+         if len(flowParams)==1:
+              if str(flowParams[0])=="all":
+                   self.execute(cmd="\n",prompt="\$",timeout=60)
+                   main.log.info("Getting all flow data...")
+                   data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh all",prompt="done",timeout=150)
+                   self.execute(cmd="\n",prompt="\$",timeout=60)
+                   return data
+              else:
+                   main.log.info("Retrieving flow "+str(flowParams[0])+" data...")
+                   data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh "+str(flowParams[0]),prompt="done",timeout=150)
+                   self.execute(cmd="\n",prompt="\$",timeout=60)
+                   return data
+         elif len(flowParams)==5:
+              main.log.info("Retrieving flow installer data...")
+              data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh "+str(flowParams[0])+" "+str(flowParams[1])+" "+str(flowParams[2])+" "+str(flowParams[3])+" "+str(flowParams[4]),prompt="done",timeout=150)
+              self.execute(cmd="\n",prompt="\$",timeout=60)
+              return data
+         elif len(flowParams)==4:
+              main.log.info("Retrieving flow endpoints...")
+              data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh "+str(flowParams[0])+" "+str(flowParams[1])+" "+str(flowParams[2])+" "+str(flowParams[3]),prompt="done",timeout=150)
+              self.execute(cmd="\n",prompt="\$",timeout=60)
+              return data
+
+
+# http://localhost:8080/wm/core/topology/switches/all/json
+# http://localhost:8080/wm/core/topology/links/json
+# http://localhost:8080/wm/registry/controllers/json
+# http://localhost:8080/wm/registry/switches/json"
+
+    def get_json(self, url):
+        '''
+        Helper functions used to parse the json output of a rest call 
+        '''
+        try:
+            command = "curl -s %s" % (url)
+            result = os.popen(command).read()
+            parsedResult = json.loads(result)
+        except:
+            print "REST IF %s has issue" % command
+            parsedResult = ""
+    
+        if type(parsedResult) == 'dict' and parsedResult.has_key('code'):
+            print "REST %s returned code %s" % (command, parsedResult['code'])
+            parsedResult = ""
+        return parsedResult 
+
+    def check_switch(self,RestIP,correct_nr_switch ):
+        ''' 
+        Used by check_status 
+        ''' 
+        buf = ""
+        retcode = 0
+        RestPort="8080"
+        url="http://%s:%s/wm/core/topology/switches/all/json" % (RestIP, RestPort)
+        parsedResult = self.get_json(url)
+        if parsedResult == "":
+            retcode = 1
+            return (retcode, "Rest API has an issue")
+        url = "http://%s:%s/wm/registry/switches/json" % (RestIP, RestPort)
+        registry = self.get_json(url)
+    
+        if registry == "":
+            retcode = 1
+            return (retcode, "Rest API has an issue")
+    
+        cnt = 0
+        active = 0
+
+        for s in parsedResult:
+            cnt += 1
+            if s['state']  == "ACTIVE":
+               active += 1
+
+        buf += "switch: network %d : %d switches %d active\n" % (0+1, cnt, active)
+        if correct_nr_switch != cnt:
+            buf += "switch fail: network %d should have %d switches but has %d\n" % (1, correct_nr_switch, cnt)
+            retcode = 1
+
+        if correct_nr_switch != active:
+            buf += "switch fail: network %d should have %d active switches but has %d\n" % (1, correct_nr_switch, active)
+            retcode = 1
+    
+        return (retcode, buf)
+
+    def check_link(self,RestIP, nr_links):
+        ''' 
+        Used by check_status 
+        ''' 
+        RestPort = "8080"
+        buf = ""
+        retcode = 0
+    
+        url = "http://%s:%s/wm/core/topology/links/json" % (RestIP, RestPort)
+        parsedResult = self.get_json(url)
+    
+        if parsedResult == "":
+            retcode = 1
+            return (retcode, "Rest API has an issue")
+    
+        buf += "link: total %d links (correct : %d)\n" % (len(parsedResult), nr_links)
+        intra = 0
+        interlink=0
+    
+        for s in parsedResult:
+            intra = intra + 1 
+    
+        if intra != nr_links:
+            buf += "link fail\n"
+            retcode = 1
+    
+        return (retcode, buf)
+
+    def check_status_report(self, ip, numoswitch, numolink):
+        ''' 
+        Checks the number of swithes & links that ONOS sees against the supplied values.
+        Writes to the report log.  
+        ''' 
+        main.log.info("Making some rest calls...") 
+        switch = self.check_switch(ip, int(numoswitch))
+        link = self.check_link(ip, int(numolink))
+        value = switch[0]
+        value += link[0]
+        main.log.report( "\n-----\n%s%s-----\n" % ( switch[1], link[1]) )
+        if value != 0:
+            return 0
+        else: 
+            # "PASS"
+            return 1
+
+    def check_status(self, ip, numoswitch, numolink):
+        ''' 
+        Checks the number of swithes & links that ONOS sees against the supplied values.
+        Writes to the main log.  
+        ''' 
+        main.log.info("Making some rest calls...") 
+        switch = self.check_switch(ip, int(numoswitch))
+        link = self.check_link(ip, int(numolink))
+        value = switch[0]
+        value += link[0]
+        main.log.info( "\n-----\n%s%s-----\n" % ( switch[1], link[1]) )
+        if value != 0:
+            return 0
+        else: 
+            # "PASS"
+            return 1
+ 
+    def drop_keyspace(self):
+        '''
+        Drops the ONOS keyspace
+        '''
+        self.handle.sendline("~/ONOS/scripts/test-drop-keyspace.sh")
+        self.handle.expect("keyspace")
+        self.handle.sendline("")
+        self.handle.expect("\$")
+        self.handle.expect("\$")
+
+    def ctrl_none(self):
+        '''
+        Points all the mininet swithces to no controllers 
+        *NOTE will only work if CLUSTER is set up on ONOS nodes
+        '''
+        self.execute(cmd="switch none", prompt="\$",timeout=10)
+
+    def ctrl_one(self, ip):
+        '''
+        Points all the mininet swithces to all controllers 
+        *NOTE will only work if CLUSTER is set up on ONOS nodes
+        '''
+        self.execute(cmd="switch one", prompt="\$",timeout=10)
+
+    def check_for_no_exceptions(self):
+        '''
+        Used by CassndraCheck.py to scan ONOS logs for Exceptions
+        '''
+        self.handle.sendline(r"dsh 'grep Exception ~/ONOS/onos-logs/onos.*.log'")
+        self.handle.expect("\$ dsh") 
+        self.handle.expect("\$")
+        output = self.handle.before
+        main.log.info( output ) 
+        if re.search("Exception",output):
+            return main.FALSE
+        else :
+            return main.TRUE
+ 
+    def git_pull(self):
+        '''
+        Stops the ONOS, pulls the latest code, and builds with mvn. 
+        Assumes that "git pull" works without login 
+        '''
+        main.log.info("Stopping onos") 
+        self.stop()
+        self.handle.sendline("cd ~/ONOS") 
+        self.handle.expect("ONOS\$")
+        self.handle.sendline("git pull")
+        
+        i=self.handle.expect(['fatal','Username\sfor\s(.*):\s','Unpacking\sobjects',pexpect.TIMEOUT,'Already up-to-date','Aborting'],timeout=180)
+        if i==0:
+            main.log.error("Git pull had some issue...") 
+            return main.FALSE
+        elif i==1:
+            main.log.error("Asking for username!!! BADD!") 
+            return false 
+            
+            self.handle.expect('Password\sfor\s(.*):\s')
+            j = self.handle.expect(['Unpacking\sobjects','Already up-to-date'])
+            if j == 0:
+                main.log.info("pulling repository now")
+            elif j == 1:
+                main.log.info("Up to date!")
+            else:
+                main.log.error("something went wrong")
+                return main.FALSE
+            self.handle.expect("ONOS\$", 30)
+        elif i==2:
+            main.log.info("pulling repository now")
+            self.handle.expect("ONOS\$", 30)
+        elif i==3:
+            main.log.error("TIMEOUT")
+            return main.FALSE
+        elif i==4:
+            main.log.info("Already up to date") 
+        elif i==5:
+            main.log.info("Aborting... Are there conflicting git files?")
+            return main.FALSE
+        
+        
+        main.log.info("./setup-local-maven.sh")
+        self.handle.sendline("./setup-local-maven.sh")
+        self.handle.expect("local-maven.sh")
+        while 1: 
+            i=self.handle.expect(['BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=90)
+            if i == 0:
+                main.log.error("Build failure!")
+                return main.FALSE
+            elif i == 1:
+                main.log.info("Build success!")
+            elif i == 2:
+                main.log.info("Build complete") 
+                break;
+            elif i == 3:
+                main.log.error("TIMEOUT!")
+                return main.FALSE
+ 
+        main.log.info("mvn clean") 
+        self.handle.sendline("mvn clean")
+        while 1: 
+            i=self.handle.expect(['BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=30)
+            if i == 0:
+                main.log.error("Build failure!")
+                return main.FALSE
+            elif i == 1:
+                main.log.info("Build success!")
+            elif i == 2:
+                main.log.info("Build complete") 
+                break;
+            elif i == 3:
+                main.log.error("TIMEOUT!")
+                return main.FALSE
+        
+        main.log.info("mvn compile") 
+        self.handle.sendline("mvn compile")
+        while 1: 
+            i=self.handle.expect(['BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=30)
+            if i == 0:
+                main.log.error("Build failure!")
+                return main.FALSE
+            elif i == 1:
+                main.log.info("Build success!")
+            elif i == 2:
+                main.log.info("Build complete") 
+                break;
+            elif i == 3:
+                main.log.error("TIMEOUT!")
+                return main.FALSE
+        
