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.  
diff --git a/TestON/tests/SdnIpTest/SdnIpTest.py b/TestON/tests/SdnIpTest/SdnIpTest.py
index 543bea2..1e5e520 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,46 @@
                                 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_results = main.QuaggaCliHost.ping_test("1.168.30.100", "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh", "~/SDNIP/SdnIpIntentDemo/CASE1-ping-results-before-delete-routes-" + strftime("%Y-%m-%d-%H:%M:%S", gmtime()) + ".txt")
+        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_results = main.QuaggaCliHost.ping_test("1.168.30.100", "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh", "~/SDNIP/SdnIpIntentDemo/CASE1-ping-results-after-delete-routes-" + strftime("%Y-%m-%d-%H:%M:%S", gmtime()) + ".txt")
+        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>
