diff --git a/TestON/drivers/common/cli/emulator/remotemininetdriver.py b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
new file mode 100644
index 0000000..b55a371
--- /dev/null
+++ b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
@@ -0,0 +1,312 @@
+#!/usr/bin/env python
+'''
+Created on 26-Oct-2012
+
+@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/>.		
+
+
+MininetCliDriver is the basic driver which will handle the Mininet functions
+'''
+
+import pexpect
+import struct
+import fcntl
+import os
+import signal
+import re
+import sys
+import core.teston
+sys.path.append("../")
+from drivers.common.cli.emulatordriver import Emulator
+from drivers.common.clidriver import CLI
+from time import time
+
+class RemoteMininetDriver(Emulator):
+    '''
+        MininetCliDriver is the basic driver which will handle the Mininet functions
+    '''
+    def __init__(self):
+        super(Emulator, self).__init__()
+        self.handle = self
+        self.wrapped = sys.modules[__name__]
+        self.flag = 0
+
+    def connect(self, **connectargs):
+        #,user_name, ip_address, pwd,options):
+        # Here the main is the TestON instance after creating all the log handles.
+        for key in connectargs:
+            vars(self)[key] = connectargs[key]       
+        
+        self.name = self.options['name']
+        self.handle = super(RemoteMininetDriver, self).connect(user_name = self.user_name, ip_address = self.ip_address,port = None, pwd = self.pwd)
+        
+        self.ssh_handle = self.handle
+        
+        # Copying the readme file to process the 
+        if self.handle :
+            return main.TRUE
+
+        else :
+            main.log.error("Connection failed to the host "+self.user_name+"@"+self.ip_address) 
+            main.log.error("Failed to connect to the Mininet")
+            return main.FALSE
+  
+    def pingLong(self,**pingParams):
+        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 ) 
+        self.execute(cmd=command,prompt="(.*)",timeout=10)
+        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
+         
+        args = utilities.parse_args(["SRC"],**pingParams)
+        self.handle.sendline("tail /tmp/ping." + args["SRC"])
+        self.handle.expect("tail")
+        self.handle.expect("\$")
+        result = self.handle.before + self.handle.after
+        if re.search('Unreachable', result ):
+            main.log.info("Unreachable found in ping logs...") 
+            return main.FALSE
+        elif re.search('64\sbytes', result): 
+            main.log.info("Pings look good") 
+            return main.TRUE
+        else: 
+            main.log.info("No, or faulty ping data...") 
+            return main.FALSE
+         
+    def pingKill(self):
+        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/" 
+        self.execute(cmd=command,prompt="100%",timeout=20)
+        return main.TRUE
+        
+    def pingHost(self,**pingParams):
+        
+        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 ) 
+        response = self.execute(cmd=command,prompt="rtt",timeout=10 )
+        if utilities.assert_matches(expect=',\s0\%\spacket\sloss',actual=response,onpass="No Packet loss",onfail="Host is not reachable"):
+            main.log.info("NO PACKET LOSS, HOST IS REACHABLE")
+            main.last_result = main.TRUE 
+            return main.TRUE
+        else :
+            main.log.error("PACKET LOST, HOST IS NOT REACHABLE")
+            main.last_result = main.FALSE
+            return main.FALSE
+        
+    
+    def checknum(self,num):
+        '''
+            Verifies the correct number of switches are running 
+        '''
+        if self.handle :
+            self.handle.sendline("")
+            self.handle.expect("\$")
+            self.handle.sendline('ifconfig -a | grep "sw.. " | wc -l')
+            self.handle.expect("wc")
+            self.handle.expect("\$")
+            response = self.handle.before
+            self.handle.sendline('ps -ef | grep "bash -ms mininet:sw" | grep -v color | wc -l') 
+            self.handle.expect("color")
+            self.handle.expect("\$")
+            response2 = self.handle.before
+
+            if re.search(num, response):
+                if re.search(num, response2):
+                    return main.TRUE
+                else:
+                    return main.FALSE
+            else:
+                return main.FALSE
+        else :
+            main.log.error("Connection failed to the host") 
+
+    def ctrl_none(self):
+        self.execute(cmd="~/ONOS/scripts/test-ctrl-none.sh", prompt="\$",timeout=10)
+
+    def ctrl_one(self, ip):
+        self.execute(cmd="~/ONOS/scripts/test-ctrl-one.sh "+ip, prompt="\$",timeout=10)
+ 
+    def ctrl_local(self):
+        self.execute(cmd="~/ONOS/scripts/test-ctrl-local.sh ", prompt="\$",timeout=10)
+
+ #   def verifySSH(self,**connectargs):
+ #       response = self.execute(cmd="h1 /usr/sbin/sshd -D&",prompt="mininet>",timeout=10)
+ #       response = self.execute(cmd="h4 /usr/sbin/sshd -D&",prompt="mininet>",timeout=10)
+ #       for key in connectargs:
+ #           vars(self)[key] = connectargs[key]
+ #       response = self.execute(cmd="xterm h1 h4 ",prompt="mininet>",timeout=10)
+ #       import time
+ #       time.sleep(20)
+ #       if self.flag == 0:
+ #           self.flag = 1
+ #           return main.FALSE
+ #       else :
+ #           return main.TRUE
+ #   
+ #   def getMacAddress(self,host):
+ #       '''
+ #           Verifies the host's ip configured or not.
+ #       '''
+ #       if self.handle :
+ #           response = self.execute(cmd=host+" ifconfig",prompt="mininet>",timeout=10)
+
+ #           pattern = "HWaddr\s(((\d|\w)+:)+(\d|\w))"
+ #           mac_address_search = re.search(pattern, response)
+ #           main.log.info("Mac-Address of Host "+host +" is "+mac_address_search.group(1))
+ #           return mac_address_search.group(1)
+ #       else :
+ #           main.log.error("Connection failed to the host") 
+ #   def getIPAddress(self,host):
+ #       '''
+ #           Verifies the host's ip configured or not.
+ #       '''
+ #       if self.handle :
+ #           response = self.execute(cmd=host+" ifconfig",prompt="mininet>",timeout=10)
+
+ #           pattern = "inet\saddr:(\d+\.\d+\.\d+\.\d+)"
+ #           ip_address_search = re.search(pattern, response)
+ #           main.log.info("IP-Address of Host "+host +" is "+ip_address_search.group(1))
+ #           return ip_address_search.group(1)
+ #       else :
+ #           main.log.error("Connection failed to the host") 
+ #       
+ #   def dump(self):
+ #       main.log.info("Dump node info")
+ #       self.execute(cmd = 'dump',prompt = 'mininet>',timeout = 10)
+ #       return main.TRUE
+ #           
+ #   def intfs(self):
+ #       main.log.info("List interfaces")
+ #       self.execute(cmd = 'intfs',prompt = 'mininet>',timeout = 10)
+ #       return main.TRUE
+ #   
+ #   def net(self):
+ #       main.log.info("List network connections")
+ #       self.execute(cmd = 'net',prompt = 'mininet>',timeout = 10)
+ #       return main.TRUE
+ #   
+ #   def iperf(self):
+ #       main.log.info("Simple iperf TCP test between two (optionally specified) hosts")
+ #       self.execute(cmd = 'iperf',prompt = 'mininet>',timeout = 10)
+ #       return main.TRUE
+ #   
+ #   def iperfudp(self):
+ #       main.log.info("Simple iperf TCP test between two (optionally specified) hosts")
+ #       self.execute(cmd = 'iperfudp',prompt = 'mininet>',timeout = 10)
+ #       return main.TRUE
+ #   
+ #   def nodes(self):
+ #       main.log.info("List all nodes.")
+ #       self.execute(cmd = 'nodes',prompt = 'mininet>',timeout = 10)    
+ #       return main.TRUE
+ #   
+ #   def pingpair(self):
+ #       main.log.infoe("Ping between first two hosts")
+ #       self.execute(cmd = 'pingpair',prompt = 'mininet>',timeout = 20)
+ #       
+ #       if utilities.assert_matches(expect='0% packet loss',actual=response,onpass="No Packet loss",onfail="Hosts not reachable"):
+ #           main.log.info("Ping between two hosts SUCCESS")
+ #           main.last_result = main.TRUE 
+ #           return main.TRUE
+ #       else :
+ #           main.log.error("PACKET LOST, HOSTS NOT REACHABLE")
+ #           main.last_result = main.FALSE
+ #           return main.FALSE
+ #   
+ #   def link(self,**linkargs):
+ #       '''
+ #       Bring link(s) between two nodes up or down
+ #       '''
+ #       main.log.info('Bring link(s) between two nodes up or down')
+ #       args = utilities.parse_args(["END1","END2","OPTION"],**linkargs)
+ #       end1 = args["END1"] if args["END1"] != None else ""
+ #       end2 = args["END2"] if args["END2"] != None else ""
+ #       option = args["OPTION"] if args["OPTION"] != None else ""
+ #       command = "link "+str(end1) + " " + str(end2)+ " " + str(option)
+ #       response = self.execute(cmd=command,prompt="mininet>",timeout=10)
+ #       return main.TRUE
+ #       
+
+ #   def dpctl(self,**dpctlargs):
+ #       '''
+ #        Run dpctl command on all switches.
+ #       '''
+ #       main.log.info('Run dpctl command on all switches')
+ #       args = utilities.parse_args(["CMD","ARGS"],**dpctlargs)
+ #       cmd = args["CMD"] if args["CMD"] != None else ""
+ #       cmdargs = args["ARGS"] if args["ARGS"] != None else ""
+ #       command = "dpctl "+cmd + " " + str(cmdargs)
+ #       response = self.execute(cmd=command,prompt="mininet>",timeout=10)
+ #       return main.TRUE
+ #  
+ #       
+ #   def get_version(self):
+ #       file_input = path+'/lib/Mininet/INSTALL'
+ #       version = super(Mininet, self).get_version()
+ #       pattern = 'Mininet\s\w\.\w\.\w\w*'
+ #       for line in open(file_input,'r').readlines():
+ #           result = re.match(pattern, line)
+ #           if result:
+ #               version = result.group(0)
+ #               
+ #           
+ #       return version    
+
+    def disconnect(self):
+        
+        response = ''
+        #print "Disconnecting Mininet"
+        if self.handle:
+            self.handle.sendline("exit") 
+            self.handle.expect("exit")
+            self.handle.expect("(.*)")
+            response = self.handle.before
+
+        else :
+            main.log.error("Connection failed to the host")
+            response = main.FALSE
+        return response  
+
+if __name__ != "__main__":
+    import sys
+    sys.modules[__name__] = RemoteMininetDriver()
