diff --git a/TestON/drivers/common/cli/quaggaclidriver.py b/TestON/drivers/common/cli/quaggaclidriver.py
index 0f84bc0..779472d 100644
--- a/TestON/drivers/common/cli/quaggaclidriver.py
+++ b/TestON/drivers/common/cli/quaggaclidriver.py
@@ -14,25 +14,25 @@
     def __init__(self):
         super(CLI, self).__init__()
 
-    #TODO: simplify this method
+    # TODO: simplify this method
     def connect(self, **connectargs):
         for key in connectargs:
             vars(self)[key] = connectargs[key]
-        
+
         self.name = self.options['name']
-        #self.handle = super(QuaggaCliDriver,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd)
+        # self.handle = super(QuaggaCliDriver,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd)
         self.handle = super(QuaggaCliDriver, self).connect(user_name=self.user_name, ip_address="1.1.1.1", port=self.port, pwd=self.pwd)
         main.log.info("connect parameters:" + str(self.user_name) + ";" + str(self.ip_address) + ";" + str(self.port) + ";" + str(self.pwd))
 
-        if self.handle: 
+        if self.handle:
             self.handle.expect("")
             self.handle.expect("\$")
             self.handle.sendline("telnet localhost 2605")
-            self.handle.expect("Password:", timeout = 5)
+            self.handle.expect("Password:", timeout=5)
             self.handle.sendline("hello")
-            self.handle.expect("bgpd",timeout = 5)
+            self.handle.expect("bgpd", timeout=5)
             self.handle.sendline("enable")
-            self.handle.expect("bgpd#", timeout = 5)
+            self.handle.expect("bgpd#", timeout=5)
             return self.handle
         else :
             main.log.info("NO HANDLE")
@@ -72,11 +72,11 @@
             self.disconnect()
             return main.FALSE
         self.handle.sendline("configure terminal")
-        self.handle.expect("config", timeout = 5)
+        self.handle.expect("config", timeout=5)
         routerAS = "router bgp " + str(asn)
         try:
             self.handle.sendline(routerAS)
-            self.handle.expect("config-router", timeout = 5)
+            self.handle.expect("config-router", timeout=5)
             return main.TRUE
         except:
             return main.FALSE
@@ -117,9 +117,9 @@
             if peer['ipAddress'] == nextHop:
                 egress = "of:" + str(peer['attachmentDpid']).replace(":", "") + ":" + str(peer['attachmentPort'])
             else:
-                ingress.append("of:" + str(peer['attachmentDpid']).replace(":", "") + ":" + str(peer['attachmentPort']) )
+                ingress.append("of:" + str(peer['attachmentDpid']).replace(":", "") + ":" + str(peer['attachmentPort']))
 
-        selector = "[ETH_TYPE{ethType=800}, IPV4_DST{ip=" + prefix + "}]"
+        selector = "ETH_TYPE{ethType=800},IPV4_DST{ip=" + prefix + "}"
         treatment = "[ETH_DST{mac=" + str(nextHopMac) + "}]"
 
         intent = egress + "/" + str(sorted(ingress)) + "/" + selector + "/" + treatment
@@ -127,7 +127,7 @@
 
     def generate_expected_onePeerRouteIntents(self, prefixes, nextHop, nextHopMac, sdnip_json_file_path):
         intents = []
-        sdnip_json_file=open(sdnip_json_file_path).read()
+        sdnip_json_file = open(sdnip_json_file_path).read()
 
         sdnip_data = json.loads(sdnip_json_file)
 
@@ -163,12 +163,18 @@
         for intent in intents_json_obj:
             if intent['appId'] != "org.onlab.onos.sdnip" :
                 continue
-            if intent['type'] == "MultiPointToSinglePointIntent":
-                egress = str(intent['egress']['device'])+ ":" + str(intent['egress']['port'])
+            if intent['type'] == "MultiPointToSinglePointIntent" and intent['state'] == 'INSTALLED':
+                egress = str(intent['egress']['device']) + ":" + str(intent['egress']['port'])
                 ingress = []
                 for attachmentPoint in intent['ingress']:
                     ingress.append(str(attachmentPoint['device']) + ":" + str(attachmentPoint['port']))
-                intent = egress + "/" + str(sorted(ingress)) + "/" + intent['selector'] + "/" + intent['treatment']
+
+                selector = intent['selector'].replace("[" , "").replace("]" , "").replace(" ", "")
+                if str(selector).startswith("IPV4"):
+                    str1, str2 = str(selector).split(",")
+                    selector = str2 + "," + str1
+
+                intent = egress + "/" + str(sorted(ingress)) + "/" + selector + "/" + intent['treatment']
                 intents.append(intent)
         return sorted(intents)
 
@@ -195,37 +201,37 @@
     def generate_expected_bgpIntents(self, sdnip_json_file_path):
         from operator import eq
 
-        sdnip_json_file=open(sdnip_json_file_path).read()
+        sdnip_json_file = open(sdnip_json_file_path).read()
         sdnip_data = json.loads(sdnip_json_file)
 
         intents = []
-        bgpPeerAttachmentPoint=""
+        bgpPeerAttachmentPoint = ""
         bgpSpeakerAttachmentPoint = "of:" + str(sdnip_data['bgpSpeakers'][0]['attachmentDpid']).replace(":", "") + ":" + str(sdnip_data['bgpSpeakers'][0]['attachmentPort'])
         for peer in sdnip_data['bgpPeers']:
             bgpPeerAttachmentPoint = "of:" + str(peer['attachmentDpid']).replace(":", "") + ":" + str(peer['attachmentPort'])
             # find out the BGP speaker IP address for this BGP peer
-            bgpSpeakerIpAddress=""
+            bgpSpeakerIpAddress = ""
             for interfaceAddress in sdnip_data['bgpSpeakers'][0]['interfaceAddresses']:
-                #if eq(interfaceAddress['interfaceDpid'],sdnip_data['bgpSpeakers'][0]['attachmentDpid']) and eq(interfaceAddress['interfacePort'], sdnip_data['bgpSpeakers'][0]['attachmentPort']):
-                if eq(interfaceAddress['interfaceDpid'],peer['attachmentDpid']) and eq(interfaceAddress['interfacePort'], peer['attachmentPort']):
-                    bgpSpeakerIpAddress =  interfaceAddress['ipAddress']
+                # if eq(interfaceAddress['interfaceDpid'],sdnip_data['bgpSpeakers'][0]['attachmentDpid']) and eq(interfaceAddress['interfacePort'], sdnip_data['bgpSpeakers'][0]['attachmentPort']):
+                if eq(interfaceAddress['interfaceDpid'], peer['attachmentDpid']) and eq(interfaceAddress['interfacePort'], peer['attachmentPort']):
+                    bgpSpeakerIpAddress = interfaceAddress['ipAddress']
                     break
                 else:
                     continue
 
             # from bgpSpeakerAttachmentPoint to bgpPeerAttachmentPoint direction
-            selector_str = "IPV4_SRC{ip=" + bgpSpeakerIpAddress + "/32}," + "IPV4_DST{ip=" + peer['ipAddress']+ "/32}," + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}"            
+            selector_str = "IPV4_SRC{ip=" + bgpSpeakerIpAddress + "/32}," + "IPV4_DST{ip=" + peer['ipAddress'] + "/32}," + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}"
             selector = selector_str.replace(" ", "").replace("[", "").replace("]", "").split(",")
             intent = bgpSpeakerAttachmentPoint + "/" + bgpPeerAttachmentPoint + "/" + str(sorted(selector))
             intents.append(intent)
 
-            selector_str = "IPV4_SRC{ip=" + bgpSpeakerIpAddress + "/32}," + "IPV4_DST{ip=" + peer['ipAddress']+ "/32}," + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_SRC{tcpPort=179}"
+            selector_str = "IPV4_SRC{ip=" + bgpSpeakerIpAddress + "/32}," + "IPV4_DST{ip=" + peer['ipAddress'] + "/32}," + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_SRC{tcpPort=179}"
             selector = selector_str.replace(" ", "").replace("[", "").replace("]", "").split(",")
             intent = bgpSpeakerAttachmentPoint + "/" + bgpPeerAttachmentPoint + "/" + str(sorted(selector))
             intents.append(intent)
 
             # from bgpPeerAttachmentPoint to bgpSpeakerAttachmentPoint direction
-            selector_str = "IPV4_SRC{ip=" + peer['ipAddress'] + "/32}," + "IPV4_DST{ip=" + bgpSpeakerIpAddress + "/32}," + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}"            
+            selector_str = "IPV4_SRC{ip=" + peer['ipAddress'] + "/32}," + "IPV4_DST{ip=" + bgpSpeakerIpAddress + "/32}," + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}"
             selector = selector_str.replace(" ", "").replace("[", "").replace("]", "").split(",")
             intent = bgpPeerAttachmentPoint + "/" + bgpSpeakerAttachmentPoint + "/" + str(sorted(selector))
             intents.append(intent)
@@ -236,14 +242,14 @@
             intents.append(intent)
 
         return sorted(intents)
-    
+
     def add_routes(self, routes, routeRate):
         main.log.info("I am in add_routes method!")
-        
+
         routes_added = 0
         try:
             self.handle.sendline("")
-            #self.handle.expect("config-router")
+            # self.handle.expect("config-router")
             self.handle.expect("config-router", timeout=5)
         except:
             main.log.warn("Probably not in config-router mode!")
@@ -264,7 +270,60 @@
             main.log.info("Finished adding routes")
             return main.TRUE
         return main.FALSE
-    
+
+    def delete_routes(self, routes, routeRate):
+        main.log.info("I am in delete_routes method!")
+
+        routes_added = 0
+        try:
+            self.handle.sendline("")
+            # self.handle.expect("config-router")
+            self.handle.expect("config-router", timeout=5)
+        except:
+            main.log.warn("Probably not in config-router mode!")
+            self.disconnect()
+        main.log.info("Start to delete routes")
+
+        for i in range(0, len(routes)):
+            routeCmd = "no network " + routes[i]
+            try:
+                self.handle.sendline(routeCmd)
+                self.handle.expect("bgpd", timeout=5)
+            except:
+                main.log.warn("Failed to add route")
+                self.disconnect()
+            waitTimer = 1.00 / routeRate
+            time.sleep(waitTimer)
+        if routes_added == len(routes):
+            main.log.info("Finished deleting routes")
+            return main.TRUE
+        return main.FALSE
+
+    def ping_test(self, ip_address, ping_test_file, ping_test_result_file):
+        main.log.info("I am in ping_test method!")
+
+
+        self.name = self.options['name']
+        self.handle = super(QuaggaCliDriver, self).connect(
+            user_name=self.user_name, ip_address=ip_address,
+            port=self.port, pwd=self.pwd)
+        main.log.info("connect parameters:" + str(self.user_name) + ";"
+        + str(self.ip_address) + ";" + str(self.port) + ";" + str(self.pwd))
+
+        if self.handle:
+            self.handle.expect("")
+            self.handle.expect("\$")
+            main.log.info("I in host " + str(ip_address))
+            self.handle.sendline(ping_test_file + ">" + ping_test_result_file + "&")
+            self.handle.expect("\$", timeout=60)
+            handle = self.handle.before
+
+            return handle
+        else:
+            main.log.info("NO HANDLE")
+            return main.FALSE
+
+
     # Please use the generate_routes plus add_routes instead of this one
     def add_route(self, net, numRoutes, routeRate):
         try:
@@ -274,8 +333,8 @@
             main.log.warn("Probably not in config-router mode!")
             self.disconnect()
         main.log.info("Adding Routes")
-        j=0
-        k=0
+        j = 0
+        k = 0
         while numRoutes > 255:
             numRoutes = numRoutes - 255
             j = j + 1
@@ -283,8 +342,8 @@
         routes_added = 0
         if numRoutes > 255:
             numRoutes = 255
-        for m in range(1,j+1):
-            for n in range(1, numRoutes+1):
+        for m in range(1, j + 1):
+            for n in range(1, numRoutes + 1):
                 network = str(net) + "." + str(m) + "." + str(n) + ".0/24"
                 routeCmd = "network " + network
                 try:
@@ -292,12 +351,12 @@
                     self.handle.expect("bgpd")
                 except:
                     main.log.warn("failed to add route")
-                    self.disconnect() 
-                waitTimer = 1.00/routeRate
+                    self.disconnect()
+                waitTimer = 1.00 / routeRate
                 time.sleep(waitTimer)
                 routes_added = routes_added + 1
-        for d in range(j+1,j+2):
-            for e in range(1,k+1):
+        for d in range(j + 1, j + 2):
+            for e in range(1, k + 1):
                 network = str(net) + "." + str(d) + "." + str(e) + ".0/24"
                 routeCmd = "network " + network
                 try:
@@ -306,7 +365,7 @@
                 except:
                     main.log.warn("failed to add route")
                     self.disconnect
-                waitTimer = 1.00/routeRate
+                waitTimer = 1.00 / routeRate
                 time.sleep(waitTimer)
                 routes_added = routes_added + 1
         if routes_added == numRoutes:
@@ -321,8 +380,8 @@
             main.log.warn("Probably not in config-router mode!")
             self.disconnect()
         main.log.info("Deleting Routes")
-        j=0
-        k=0
+        j = 0
+        k = 0
         while numRoutes > 255:
             numRoutes = numRoutes - 255
             j = j + 1
@@ -330,8 +389,8 @@
         routes_deleted = 0
         if numRoutes > 255:
             numRoutes = 255
-        for m in range(1,j+1):
-            for n in range(1, numRoutes+1):
+        for m in range(1, j + 1):
+            for n in range(1, numRoutes + 1):
                 network = str(net) + "." + str(m) + "." + str(n) + ".0/24"
                 routeCmd = "no network " + network
                 try:
@@ -340,11 +399,11 @@
                 except:
                     main.log.warn("Failed to delete route")
                     self.disconnect()
-                waitTimer = 1.00/routeRate
+                waitTimer = 1.00 / routeRate
                 time.sleep(waitTimer)
                 routes_deleted = routes_deleted + 1
-        for d in range(j+1,j+2):
-            for e in range(1,k+1):
+        for d in range(j + 1, j + 2):
+            for e in range(1, k + 1):
                 network = str(net) + "." + str(d) + "." + str(e) + ".0/24"
                 routeCmd = "no network " + network
                 try:
@@ -353,17 +412,18 @@
                 except:
                     main.log.warn("Failed to delete route")
                     self.disconnect()
-                waitTimer = 1.00/routeRate
+                waitTimer = 1.00 / routeRate
                 time.sleep(waitTimer)
                 routes_deleted = routes_deleted + 1
         if routes_deleted == numRoutes:
             return main.TRUE
         return main.FALSE
+
     def check_routes(self, brand, ip, user, pw):
         def pronto(ip, user, passwd):
             print "Connecting to Pronto switch"
             child = pexpect.spawn("telnet " + ip)
-            i = child.expect(["login:", "CLI#",pexpect.TIMEOUT])
+            i = child.expect(["login:", "CLI#", pexpect.TIMEOUT])
             if i == 0:
                 print "Username and password required. Passing login info."
                 child.sendline(user)
@@ -381,7 +441,7 @@
             child.expect("Flow table show")
             count = 0
             while 1:
-                i = child.expect(['17\d\.\d{1,3}\.\d{1,3}\.\d{1,3}','CLI#',pexpect.TIMEOUT])
+                i = child.expect(['17\d\.\d{1,3}\.\d{1,3}\.\d{1,3}', 'CLI#', pexpect.TIMEOUT])
                 if i == 0:
                     count = count + 1
                 elif i == 1:
@@ -389,10 +449,10 @@
                     break
                 else:
                     break
-        def cisco(ip,user,passwd):
+        def cisco(ip, user, passwd):
             print "Establishing Cisco switch connection"
-            child = pexpect.spawn("ssh " +  user + "@" + ip)
-            i = child.expect(["Password:", "CLI#",pexpect.TIMEOUT])
+            child = pexpect.spawn("ssh " + user + "@" + ip)
+            i = child.expect(["Password:", "CLI#", pexpect.TIMEOUT])
             if i == 0:
                 print "Password required. Passing now."
                 child.sendline(passwd)
@@ -403,7 +463,7 @@
             print "Flow table retrieved. Counting flows"
             count = 0
             while 1:
-                i = child.expect(["nw_src=17","#",pexpect.TIMEOUT])
+                i = child.expect(["nw_src=17", "#", pexpect.TIMEOUT])
                 if i == 0:
                     count = count + 1
                 elif i == 1:
@@ -412,9 +472,9 @@
                 else:
                     break
             if brand == "pronto" or brand == "PRONTO":
-                pronto(ip,user,passwd)
-            #elif brand  == "cisco" or brand == "CISCO":
-            #    cisco(ip,user,passwd) 
+                pronto(ip, user, passwd)
+            # elif brand  == "cisco" or brand == "CISCO":
+            #    cisco(ip,user,passwd)
     def disconnect(self):
         '''
         Called when Test is complete to disconnect the Quagga handle.  
