diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
index fd9df50..63acde9 100644
--- a/TestON/drivers/common/cli/onosclidriver.py
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -1001,12 +1001,11 @@
             main.cleanup()
             main.exit()
 
-    def find_host(self,RestIP,RestPort,RestAPI,hostIP):
-        retcode = 0
-        retswitch = []
-        retport = []
-        retmac = []
-        foundIP = []
+    def find_host(self,RestIP,RestPort,RestAPI,hostMAC):
+        retcode = 0 # number of devices found with given MAC
+        retswitch = [] # Switch DPID's of devices found with MAC
+        retport = [] # Switch port connected to to devices found with MAC
+        foundHost = []
         try:
             ##### device rest API is: 'host:8080/wm/onos/topology/switches/json' ###
             url ="http://%s:%s%s" %(RestIP,RestPort,RestAPI)
@@ -1021,22 +1020,39 @@
                 parsedResult = ""
 
             if parsedResult == "":
-                return (retcode, "Rest API has an error", retport, retmac)
+                return (retcode, "Rest API has an error", retport)
             else:
+                for host in enumerate(parsedResult):
+                    print host
+                    if (host[1] != []):
+                        try:
+                            foundHost = host[1]['mac']
+                        except:
+                            print "Error in detecting MAC address."
+                        print foundHost
+                        print hostMAC
+                        if foundHost == hostMAC:
+                            for switch in enumerate(host[1]['attachmentPoints']):
+                                retswitch.append(switch[1]['dpid'])
+                                retport.append(switch[1]['port'])
+                            retcode = retcode +1
+                            foundHost ='' 
+                '''
                 for switch in enumerate(parsedResult):
                     for port in enumerate(switch[1]['ports']):
                         if ( port[1]['devices'] != [] ):
                             try:
-                                foundIP = port[1]['devices'][0]['ipv4addresses'][0]['ipv4']
+                                foundHost = port[1]['devices'][0]['ipv4addresses'][0]['ipv4']
                             except:
-                                print "Error in detecting IP address."
-                            if foundIP == hostIP:
+                                print "Error in detecting MAC address."
+                            if foundHost == hostMAC:
                                 retswitch.append(switch[1]['dpid'])
                                 retport.append(port[1]['desc'])
                                 retmac.append(port[1]['devices'][0]['mac'])
                                 retcode = retcode +1
-                                foundIP =''
-            return(retcode, retswitch, retport, retmac)
+                                foundHost =''
+                '''
+            return(retcode, retswitch, retport)
         except pexpect.EOF:
             main.log.error(self.name + ": EOF exception found")
             main.log.error(self.name + ":     " + self.handle.before)
diff --git a/TestON/drivers/common/cli/remotetestbed/flowvisorclidriver.py b/TestON/drivers/common/cli/remotetestbed/flowvisorclidriver.py
deleted file mode 100644
index 936ce9d..0000000
--- a/TestON/drivers/common/cli/remotetestbed/flowvisorclidriver.py
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/usr/bin/env python
-'''
-Created on 12-Feb-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/>.		
-
-
-FlowVisorCliDriver 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 time
-
-sys.path.append("../")
-
-from drivers.common.cli.remotetestbeddriver import RemoteTestBedDriver
-
-class FlowVisorCliDriver(RemoteTestBedDriver):
-    '''
-        FlowVisorCliDriver is the basic driver which will handle the Mininet functions
-    '''
-    def __init__(self):
-        super(RemoteTestBedDriver, self).__init__()
-        
-    def connect(self,**connectargs):
-        for key in connectargs:
-            vars(self)[key] = connectargs[key]
-        
-        self.name = self.options['name']
-
-        self.handle = super(FlowVisorCliDriver,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd)
-        if self.handle :
-            main.log.info(self.name+" connected successfully")
-            return self.handle
-        else :
-            main.log.error("Failed to connect "+self.name)
-            return main.FALSE
-    
-    def removeFlowSpace(self,id):
-        if id == "all":
-            flow_space = self.listFlowSpace()
-            flow_ids = re.findall("\,id=\[(\d+)\]", flow_space)
-            for id in flow_ids :
-                self.removeFlowSpace(id)
-        else :
-            self.execute(cmd="clear",prompt="\$",timeout=10)
-            self.execute(cmd="fvctl removeFlowSpace "+id,prompt="passwd:",timeout=10)
-            self.execute(cmd="\r",prompt="\$",timeout=10)
-            main.log.info("Removed flowSpace which is having id :"+id)
-            
-        return main.TRUE
-        
-    def addFlowSpace(self,flow_space):
-        self.execute(cmd="clear",prompt="\$",timeout=10)
-        self.execute(cmd="fvctl addFlowSpace "+flow_space,prompt="passwd:",timeout=10)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        sucess_match = re.search("success\:\s+(\d+)", main.last_response)
-        if sucess_match :
-            main.log.info("Added flow Space and id is "+sucess_match.group(1))
-            return main.TRUE
-        else :
-            return main.FALSE
-    
-    def listFlowSpace(self):
-        self.execute(cmd="clear",prompt="\$",timeout=10)
-        self.execute(cmd="fvctl listFlowSpace ",prompt="passwd:",timeout=10)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        flow_space = main.last_response
-        flow_space = self.remove_contol_chars( flow_space)
-        flow_space = re.sub("rule\s(\d+)\:", "\nrule "+r'\1'+":",flow_space)
-        #main.log.info(flow_space)
-        
-        return main.TRUE
-        
-    def listDevices(self):
-        self.execute(cmd="clear",prompt="\$",timeout=10)
-        self.execute(cmd="fvctl listDevices ",prompt="passwd:",timeout=10)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        devices_list = ''
-        last_response = re.findall("(Device\s\d+\:\s((\d|[a-z])(\d|[a-z])\:)+(\d|[a-z])(\d|[a-z]))", main.last_response)
-        
-        for resp in last_response :
-            devices_match = re.search("(Device\s\d+\:\s((\d|[a-z])(\d|[a-z])\:)+(\d|[a-z])(\d|[a-z]))", str(resp))
-            if devices_match:
-                devices_list = devices_list+devices_match.group(0)+"\n"
-        main.log.info("List of Devices \n"+devices_list)  
-        return main.TRUE
-    
-    
-    
diff --git a/TestON/tests/RRCOnosSanity4nodesJ/RRCOnosSanity4nodesJ.params b/TestON/tests/RRCOnosSanity4nodesJ/RRCOnosSanity4nodesJ.params
index 5471d4e..3f0c13a 100644
--- a/TestON/tests/RRCOnosSanity4nodesJ/RRCOnosSanity4nodesJ.params
+++ b/TestON/tests/RRCOnosSanity4nodesJ/RRCOnosSanity4nodesJ.params
@@ -1,5 +1,5 @@
 <PARAMS>
-    <testcases>1,2,21,31,4,41,5,6,7,4,5,6,7,66</testcases>
+    <testcases>1,2,21,31,4,41,5,6,7,4,5,6,7</testcases>
     <FLOWDEF>~/flowdef_files/Center_Triangle/flowdef_20.txt</FLOWDEF>
     <CASE1>       
         <destination>h6</destination>
