diff --git a/TestON/drivers/common/cli/quaggaclidriver.py b/TestON/drivers/common/cli/quaggaclidriver.py
index 0f84bc0..acb0831 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,59 @@
             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("Start the ping test on host:" + str(ip_address))
+
+        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 +332,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 +341,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 +350,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 +364,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 +379,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 +388,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 +398,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 +411,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 +440,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 +448,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 +462,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 +471,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.  
diff --git a/TestON/tests/SdnIpTest/SdnIpTest.py b/TestON/tests/SdnIpTest/SdnIpTest.py
index 543bea2..acd9b0f 100755
--- a/TestON/tests/SdnIpTest/SdnIpTest.py
+++ b/TestON/tests/SdnIpTest/SdnIpTest.py
@@ -1,6 +1,6 @@
 from cupshelpers.config import prefix
 
-#Testing the basic functionality of SDN-IP
+# Testing the basic functionality of SDN-IP
 
 class SdnIpTest:
     def __init__(self):
@@ -20,23 +20,25 @@
         import time
         import json
         from operator import eq
-        
+        # from datetime import datetime
+        from time import gmtime, strftime
+
         main.case("The test case is to help to setup the TestON environment and test new drivers")
         SDNIP_JSON_FILE_PATH = "../tests/SdnIpTest/sdnip.json"
         # all expected routes for all BGP peers
         allRoutes_expected = []
         main.step("Start to generate routes for all BGP peers")
-        #bgpPeerHosts = []
-        #for i in range(3, 5):
+        # bgpPeerHosts = []
+        # for i in range(3, 5):
         #    bgpPeerHosts.append("host" + str(i))
-        #main.log.info("BGP Peer Hosts are:" + bgpPeerHosts)
+        # main.log.info("BGP Peer Hosts are:" + bgpPeerHosts)
 
-        #for i in range(3, 5):
+        # for i in range(3, 5):
          #   QuaggaCliHost = "QuaggaCliHost" + str(i)
           #  prefixes = main.QuaggaCliHost.generate_prefixes(3, 10)
 
            # main.log.info(prefixes)
-            #allRoutes_expected.append(prefixes)
+            # allRoutes_expected.append(prefixes)
         main.log.info("Generate prefixes for host3")
         prefixes_host3 = main.QuaggaCliHost3.generate_prefixes(3, 10)
         main.log.info(prefixes_host3)
@@ -69,6 +71,7 @@
         main.QuaggaCliHost4.enter_config(64516)
         main.log.info("Add routes to Quagga on host4")
         main.QuaggaCliHost4.add_routes(prefixes_host4, 1)
+        time.sleep(30)
 
 
         cell_name = main.params['ENV']['cellName']
@@ -80,24 +83,24 @@
 
         main.step("Set cell for ONOS-cli environment")
         main.ONOScli.set_cell(cell_name)
-   
+
         main.step("Start ONOS-cli")
         # TODO: change the hardcode in start_onos_cli method in ONOS CLI driver
-        time.sleep(5)
-        main.ONOScli.start_onos_cli(ONOS1_ip)    
+
+        main.ONOScli.start_onos_cli(ONOS1_ip)
 
         main.step("Get devices in the network")
         list_result = main.ONOScli.devices(json_format=False)
         main.log.info(list_result)
 
-        #get all routes inside SDN-IP
+        # get all routes inside SDN-IP
         get_routes_result = main.ONOScli.routes(json_format=True)
-                     
+
         # parse routes from ONOS CLI
         allRoutes_actual = main.QuaggaCliHost3.extract_actual_routes(get_routes_result)
-      
+
         allRoutes_str_expected = str(sorted(allRoutes_expected))
-        allRoutes_str_actual = str(allRoutes_actual).replace('u',"")
+        allRoutes_str_actual = str(allRoutes_actual).replace('u', "")
         main.step("Check routes installed")
         main.log.info("Routes expected:")
         main.log.info(allRoutes_str_expected)
@@ -114,9 +117,9 @@
         main.step("Check MultiPointToSinglePointIntent intents installed")
         # route_intents_expected are generated when generating routes
         # get rpoute intents from ONOS CLI
-        routeIntents_actual  = main.QuaggaCliHost3.extract_actual_routeIntents(get_intents_result)
+        routeIntents_actual = main.QuaggaCliHost3.extract_actual_routeIntents(get_intents_result)
         routeIntents_str_expected = str(sorted(routeIntents_expected))
-        routeIntents_str_actual = str(routeIntents_actual).replace('u',"")
+        routeIntents_str_actual = str(routeIntents_actual).replace('u', "")
         main.log.info("MultiPointToSinglePoint intents expected:")
         main.log.info(routeIntents_str_expected)
         main.log.info("MultiPointToSinglePoint intents get from ONOS CLI:")
@@ -132,7 +135,7 @@
         # get BGP intents from ONOS CLI
         bgpIntents_actual = main.QuaggaCliHost3.extract_actual_bgpIntents(get_intents_result)
 
-        bgpIntents_str_expected = str(bgpIntents_expected).replace('u',"")
+        bgpIntents_str_expected = str(bgpIntents_expected).replace('u', "")
         bgpIntents_str_actual = str(bgpIntents_actual)
         main.log.info("PointToPointIntent intents expected:")
         main.log.info(bgpIntents_str_expected)
@@ -143,7 +146,50 @@
                                 onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
                                 onfail="***PointToPointIntent Intents in SDN-IP are wrong!***")
 
-        #main.step("Test whether Mininet is started")
-        #main.Mininet2.handle.sendline("xterm host1")
-        #main.Mininet2.handle.expect("mininet>")
+        #============================= Ping Test ========================
+        # wait until all MultiPointToSinglePoint
+        time.sleep(20)
+        ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+        ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-results-before-delete-routes-" + strftime("%Y-%m-%d-%H:%M:%S", gmtime()) + ".txt"
+        ping_test_results = main.QuaggaCliHost.ping_test("1.168.30.100", ping_test_script, ping_test_results_file)
+        main.log.info(ping_test_results)
+
+        # ping test
+
+        #============================= Deleting Routes ==================
+        main.step("Check deleting routes installed")
+        main.QuaggaCliHost3.delete_routes(prefixes_host3, 1)
+        main.QuaggaCliHost4.delete_routes(prefixes_host4, 1)
+
+        # main.log.info("main.ONOScli.get_routes_num() = " )
+        # main.log.info(main.ONOScli.get_routes_num())
+        # utilities.assert_equals(expect = "Total SDN-IP routes = 1", actual= main.ONOScli.get_routes_num(),
+        get_routes_result = main.ONOScli.routes(json_format=True)
+        allRoutes_actual = main.QuaggaCliHost3.extract_actual_routes(get_routes_result)
+        main.log.info("allRoutes_actual = ")
+        main.log.info(allRoutes_actual)
+
+        utilities.assert_equals(expect="[]", actual=str(allRoutes_actual),
+                                onpass="***Route number in SDN-IP is 0, correct!***",
+                                onfail="***Routes number in SDN-IP is not 0, wrong!***")
+
+        main.step("Check intents after deleting routes")
+        get_intents_result = main.ONOScli.intents(json_format=True)
+        routeIntents_actual = main.QuaggaCliHost3.extract_actual_routeIntents(get_intents_result)
+        main.log.info("main.ONOScli.intents()= ")
+        main.log.info(routeIntents_actual)
+        utilities.assert_equals(expect="[]", actual=str(routeIntents_actual),
+                                onpass="***MultiPointToSinglePoint Intents number in SDN-IP is 0, correct!***",
+                                onfail="***MultiPointToSinglePoint Intents number in SDN-IP is 0, wrong!***")
+
+
+        time.sleep(20)
+        ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+        ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-results-after-delete-routes-" + strftime("%Y-%m-%d-%H:%M:%S", gmtime()) + ".txt"
+        ping_test_results = main.QuaggaCliHost.ping_test("1.168.30.100", ping_test_script, ping_test_results_file)
+        main.log.info(ping_test_results)
+
+        # main.step("Test whether Mininet is started")
+        # main.Mininet2.handle.sendline("xterm host1")
+        # main.Mininet2.handle.expect("mininet>")
 
diff --git a/TestON/tests/SdnIpTest/SdnIpTest.topo b/TestON/tests/SdnIpTest/SdnIpTest.topo
index a2d9616..51b5ac8 100755
--- a/TestON/tests/SdnIpTest/SdnIpTest.topo
+++ b/TestON/tests/SdnIpTest/SdnIpTest.topo
@@ -44,14 +44,14 @@
             <connect_order>5</connect_order>
             <COMPONENTS> </COMPONENTS>
         </QuaggaCliHost4>
-        <QuaggaCliHost5>
+        <QuaggaCliHost>
             <host>127.0.0.1</host>
             <user>username</user>
             <password>password</password>
             <type>QuaggaCliDriver</type>
             <connect_order>5</connect_order>
             <COMPONENTS> </COMPONENTS>
-        </QuaggaCliHost5>
+        </QuaggaCliHost>
 
     </COMPONENT>
 </TOPOLOGY>
