diff --git a/TestON/tests/PeeringRouterTest/PeeringRouterTest.py b/TestON/tests/PeeringRouterTest/PeeringRouterTest.py
index 10d9617..41460e1 100755
--- a/TestON/tests/PeeringRouterTest/PeeringRouterTest.py
+++ b/TestON/tests/PeeringRouterTest/PeeringRouterTest.py
@@ -59,12 +59,13 @@
         main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
         main.step("waiting 20 secs for all switches and quagga instances to comeup")
         time.sleep(20)
-        main.step("verifying mininet launch")
+        main.step( "Test whether Mininet is started" )
         main.log.info( "Login Quagga CLI on host3" )
         main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
         # all expected routes for all BGP peers
         allRoutesExpected = []
         main.step( "Start to generate routes for all BGP peers" )
+
         main.log.info( "Generate prefixes for host3" )
         prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
         main.log.info( prefixesHost3 )
@@ -79,18 +80,6 @@
         main.log.info( "Generate prefixes for host4" )
         prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
         main.log.info( prefixesHost4 )
-
-        # generate route with next hop
-        for prefix in prefixesHost3:
-            allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
-        routeIntentsExpectedHost3 = \
-            main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
-            prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
-            SDNIPJSONFILEPATH )
-
-        main.log.info( "Generate prefixes for host4" )
-        prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
-        main.log.info( prefixesHost4 )
         # generate route with next hop
         for prefix in prefixesHost4:
             allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
@@ -264,9 +253,10 @@
 
         main.case("The test case is to help to setup the TestON environment \
             and test new drivers" )
-        CURRENT_PATH = "/home/sdnip/TestON/tests/PeeringRouterTest/"
-        SDNIPJSONFILEPATH = \
-            "/home/sdnip/TestON/tests/PeeringRouterTest/sdnip.json"
+        TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+        TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/mininet"
+        SDNIPJSONFILEPATH = TESTCASE_ROOT_PATH + "/sdnip.json"
+        main.log.info("sdnip.json file path: "+ SDNIPJSONFILEPATH)
         # all expected routes for all BGP peers
         allRoutesExpected = []
         main.step( "Start to generate routes for all BGP peers" )
@@ -452,9 +442,9 @@
         # wait until all MultiPointToSinglePoint
         time.sleep( 10 )
         main.log.info("Start ping test")
-        pingTestScript = CURRENT_PATH + "CASE4-ping-as2host.sh"
+        pingTestScript = TESTCASE_ROOT_PATH + "CASE4-ping-as2host.sh"
         pingTestResultsFile = \
-        CURRENT_PATH + "CASE4-ping-results-before-delete-routes-" \
+        TESTCASE_ROOT_PATH + "CASE4-ping-results-before-delete-routes-" \
             + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
         pingTestResults = main.QuaggaCliHost.pingTest(
             "1.168.30.100", pingTestScript, pingTestResultsFile )
@@ -510,9 +500,9 @@
 
         time.sleep( 10 )
         main.log.info("Ping test after removing routs")
-        pingTestScript = CURRENT_PATH + "CASE4-ping-as2host.sh"
+        pingTestScript = TESTCASE_ROOT_PATH + "CASE4-ping-as2host.sh"
         pingTestResultsFile = \
-        CURRENT_PATH + "CASE4-ping-results-after-delete-routes-" \
+        TESTCASE_ROOT_PATH + "CASE4-ping-results-after-delete-routes-" \
             + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
         pingTestResults = main.QuaggaCliHost.pingTest(
             "1.168.30.100", pingTestScript, pingTestResultsFile )
@@ -523,307 +513,11 @@
         # main.step( "Test whether Mininet is started" )
         # main.Mininet2.handle.sendline( "xterm host1" )
         # main.Mininet2.handle.expect( "mininet>" )
+        main.ONOScli.disconnect()
+        main.ONOSbench.onosStop(ONOS1Ip);
 
-    def CASE3( self, main ):
-        """
-        Test the SDN-IP functionality
-        allRoutesExpected: all expected routes for all BGP peers
-        routeIntentsExpected: all expected MultiPointToSinglePointIntent intents
-        bgpIntentsExpected: expected PointToPointIntent intents
-        allRoutesActual: all routes from ONOS LCI
-        routeIntentsActual: actual MultiPointToSinglePointIntent intents from \
-        ONOS CLI
-        bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
-        """
-        import time
-        import json
-        from operator import eq
-        # from datetime import datetime
-        from time import localtime, strftime
-
-        main.case( "The test case is to help to setup the TestON \
-            environment and test new drivers" )
-        # SDNIPJSONFILEPATH = "../tests/SdnIpTest/sdnip.json"
-        TESTPATH = "/home/adnip/TestOn/tests/PeeringRouterTest/"
-        SDNIPJSONFILEPATH = \
-            "/home/sdnip/onos/tools/package/config/sdnip.json"
-        # all expected routes for all BGP peers
-        allRoutesExpected = []
-        main.step( "Start to generate routes for all BGP peers" )
-        main.log.info( "Generate prefixes for host3" )
-        prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
-        main.log.info( prefixesHost3 )
-        # generate route with next hop
-        for prefix in prefixesHost3:
-            allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
-        routeIntentsExpectedHost3 = \
-            main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
-            prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
-            SDNIPJSONFILEPATH )
-
-        main.log.info( "Generate prefixes for host4" )
-        prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
-        main.log.info( prefixesHost4 )
-        # generate route with next hop
-        for prefix in prefixesHost4:
-            allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
-        routeIntentsExpectedHost4 = \
-            main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
-            prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
-            SDNIPJSONFILEPATH )
-
-        routeIntentsExpected = routeIntentsExpectedHost3 + \
-            routeIntentsExpectedHost4
-
-        cellName = main.params[ 'ENV' ][ 'cellName' ]
-        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
-        main.step( "Set cell for ONOS-cli environment" )
-        main.ONOScli.setCell( cellName )
-        verifyResult = main.ONOSbench.verifyCell()
-
-        main.log.report( "Removing raft logs" )
-        main.ONOSbench.onosRemoveRaftLogs()
-        main.log.report( "Uninstalling ONOS" )
-        main.ONOSbench.onosUninstall( ONOS1Ip )
-
-        main.step( "Installing ONOS package" )
-        onos1InstallResult = main.ONOSbench.onosInstall(
-            options="-f", node=ONOS1Ip )
-
-        main.step( "Checking if ONOS is up yet" )
-        time.sleep( 60 )
-        onos1Isup = main.ONOSbench.isup( ONOS1Ip )
-        if not onos1Isup:
-            main.log.report( "ONOS1 didn't start!" )
-
-        main.step( "Start ONOS-cli" )
-
-        main.ONOScli.startOnosCli( ONOS1Ip )
-
-        main.step( "Get devices in the network" )
-        listResult = main.ONOScli.devices( jsonFormat=False )
-        main.log.info( listResult )
-        time.sleep( 10 )
-        main.log.info( "Installing sdn-ip feature" )
-        main.ONOScli.featureInstall( "onos-app-sdnip" )
-        time.sleep( 10 )
-        main.step( "Login all BGP peers and add routes into peers" )
-
-        main.log.info( "Login Quagga CLI on host3" )
-        main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
-        main.log.info( "Enter configuration model of Quagga CLI on host3" )
-        main.QuaggaCliHost3.enterConfig( 64514 )
-        main.log.info( "Add routes to Quagga on host3" )
-        main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
-
-        main.log.info( "Login Quagga CLI on host4" )
-        main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
-        main.log.info( "Enter configuration model of Quagga CLI on host4" )
-        main.QuaggaCliHost4.enterConfig( 64516 )
-        main.log.info( "Add routes to Quagga on host4" )
-        main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
-
-        for i in range( 101, 201 ):
-            prefixesHostX = \
-                main.QuaggaCliHost.generatePrefixes( str( i ), 10 )
-            main.log.info( prefixesHostX )
-            for prefix in prefixesHostX:
-                allRoutesExpected.append(
-                    prefix + "/" + "192.168.40." + str( i - 100 ) )
-
-            routeIntentsExpectedHostX = \
-                main.QuaggaCliHost.generateExpectedOnePeerRouteIntents(
-                prefixesHostX, "192.168.40." + str( i - 100 ),
-                "00:00:%02d:00:00:90" % ( i - 101 ), SDNIPJSONFILEPATH )
-            routeIntentsExpected = routeIntentsExpected + \
-                routeIntentsExpectedHostX
-
-            main.log.info( "Login Quagga CLI on host" + str( i ) )
-            QuaggaCliHostX = getattr( main, ( 'QuaggaCliHost' + str( i ) ) )
-            QuaggaCliHostX.loginQuagga( "1.168.30." + str( i ) )
-            main.log.info(
-                "Enter configuration model of Quagga CLI on host" + str( i ) )
-            QuaggaCliHostX.enterConfig( 65000 + i - 100 )
-            main.log.info( "Add routes to Quagga on host" + str( i ) )
-            QuaggaCliHostX.addRoutes( prefixesHostX, 1 )
-
-        time.sleep( 60 )
-
-        # get routes inside SDN-IP
-        getRoutesResult = main.ONOScli.routes( jsonFormat=True )
-
-        # parse routes from ONOS CLI
-        allRoutesActual = \
-            main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
-
-        allRoutesStrExpected = str( sorted( allRoutesExpected ) )
-        allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
-        main.step( "Check routes installed" )
-        main.log.info( "Routes expected:" )
-        main.log.info( allRoutesStrExpected )
-        main.log.info( "Routes get from ONOS CLI:" )
-        main.log.info( allRoutesStrActual )
-        utilities.assertEquals(
-            expect=allRoutesStrExpected, actual=allRoutesStrActual,
-            onpass="***Routes in SDN-IP are correct!***",
-            onfail="***Routes in SDN-IP are wrong!***" )
-        if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
-            main.log.report(
-                "***Routes in SDN-IP after adding routes are correct!***" )
-        else:
-            main.log.report(
-                "***Routes in SDN-IP after adding routes are wrong!***" )
-
-        time.sleep( 20 )
-        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
-
-        main.step( "Check MultiPointToSinglePointIntent intents installed" )
-        # routeIntentsExpected are generated when generating routes
-        # get rpoute intents from ONOS CLI
-        routeIntentsActual = \
-            main.QuaggaCliHost3.extractActualRouteIntents(
-                getIntentsResult )
-        routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
-        routeIntentsStrActual = str( routeIntentsActual ).replace( 'u', "" )
-        main.log.info( "MultiPointToSinglePoint intents expected:" )
-        main.log.info( routeIntentsStrExpected )
-        main.log.info( "MultiPointToSinglePoint intents get from ONOS CLI:" )
-        main.log.info( routeIntentsStrActual )
-        utilities.assertEquals(
-            expect=True,
-            actual=eq( routeIntentsStrExpected, routeIntentsStrActual ),
-            onpass="***MultiPointToSinglePoint Intents in SDN-IP are \
-            correct!***",
-            onfail="***MultiPointToSinglePoint Intents in SDN-IP are \
-            wrong!***" )
-
-        if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
-            main.log.report(
-                "***MultiPointToSinglePoint Intents before deleting routes \
-                correct!***" )
-        else:
-            main.log.report(
-                "***MultiPointToSinglePoint Intents before deleting routes \
-                wrong!***" )
-
-        main.step( "Check BGP PointToPointIntent intents installed" )
-        # bgp intents expected
-        bgpIntentsExpected = main.QuaggaCliHost3.generateExpectedBgpIntents(
-            SDNIPJSONFILEPATH )
-        # get BGP intents from ONOS CLI
-        bgpIntentsActual = main.QuaggaCliHost3.extractActualBgpIntents(
-            getIntentsResult )
-
-        bgpIntentsStrExpected = str( bgpIntentsExpected ).replace( 'u', "" )
-        bgpIntentsStrActual = str( bgpIntentsActual )
-        main.log.info( "PointToPointIntent intents expected:" )
-        main.log.info( bgpIntentsStrExpected )
-        main.log.info( "PointToPointIntent intents get from ONOS CLI:" )
-        main.log.info( bgpIntentsStrActual )
-
-        utilities.assertEquals(
-            expect=True,
-            actual=eq( bgpIntentsStrExpected, bgpIntentsStrActual ),
-            onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
-            onfail="***PointToPointIntent Intents in SDN-IP are wrong!***" )
-
-        if ( eq( bgpIntentsStrExpected, bgpIntentsStrActual ) ):
-            main.log.report(
-                "***PointToPointIntent Intents in SDN-IP are correct!***" )
-        else:
-            main.log.report(
-                "***PointToPointIntent Intents in SDN-IP are wrong!***" )
-
-        #============================= Ping Test ========================
-        # wait until all MultiPointToSinglePoint
-        time.sleep( 20 )
-        pingTestScript = "~/SDNIP/test-tools/CASE3-ping-as2host.sh"
-        pingTestResultsFile = \
-        "~/SDNIP/SdnIpIntentDemo/log/CASE3-ping-results-before-delete-routes-" \
-            + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
-        pingTestResults = main.QuaggaCliHost.pingTest(
-            "1.168.30.100", pingTestScript, pingTestResultsFile )
-        main.log.info( pingTestResults )
-        time.sleep( 20 )
-
-        #============================= Deleting Routes ==================
-        main.step( "Check deleting routes installed" )
-        main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
-        main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
-        for i in range( 101, 201 ):
-            prefixesHostX = \
-                main.QuaggaCliHost.generatePrefixes( str( i ), 10 )
-            main.log.info( prefixesHostX )
-            QuaggaCliHostX = getattr( main, ( 'QuaggaCliHost' + str( i ) ) )
-            QuaggaCliHostX.deleteRoutes( prefixesHostX, 1 )
-
-        getRoutesResult = main.ONOScli.routes( jsonFormat=True )
-        allRoutesActual = main.QuaggaCliHost3.extractActualRoutes(
-            getRoutesResult )
-        main.log.info( "allRoutes_actual = " )
-        main.log.info( allRoutesActual )
-
-        utilities.assertEquals(
-            expect="[]", actual=str( allRoutesActual ),
-            onpass="***Route number in SDN-IP is 0, correct!***",
-            onfail="***Routes number in SDN-IP is not 0, wrong!***" )
-
-        if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
-            main.log.report(
-                "***Routes in SDN-IP after deleting correct!***" )
-        else:
-            main.log.report(
-                "***Routes in SDN-IP after deleting wrong!***" )
-
-        main.step( "Check intents after deleting routes" )
-        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
-        routeIntentsActual = \
-            main.QuaggaCliHost3.extractActualRouteIntents(
-                getIntentsResult )
-        main.log.info( "main.ONOScli.intents()= " )
-        main.log.info( routeIntentsActual )
-        utilities.assertEquals(
-            expect="[]", actual=str( routeIntentsActual ),
-            onpass="***MultiPointToSinglePoint Intents number in SDN-IP is \
-            0, correct!***",
-            onfail="***MultiPointToSinglePoint Intents number in SDN-IP is \
-            0, wrong!***" )
-
-        if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
-            main.log.report(
-                "***MultiPointToSinglePoint Intents after deleting routes \
-                correct!***" )
-        else:
-            main.log.report(
-                "***MultiPointToSinglePoint Intents after deleting routes \
-                wrong!***" )
-
-        time.sleep( 20 )
-        pingTestScript = "~/SDNIP/test-tools/CASE3-ping-as2host.sh"
-        pingTestResultsFile = \
-        "~/SDNIP/SdnIpIntentDemo/log/CASE3-ping-results-after-delete-routes-" \
-            + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
-        pingTestResults = main.QuaggaCliHost.pingTest(
-            "1.168.30.100", pingTestScript, pingTestResultsFile )
-        main.log.info( pingTestResults )
-        time.sleep( 100 )
-
-        # main.step( "Test whether Mininet is started" )
-        # main.Mininet2.handle.sendline( "xterm host1" )
-        # main.Mininet2.handle.expect( "mininet>" )
-
-    def CASE1( self, main ):
-        """
-        Test the SDN-IP functionality
-        allRoutesExpected: all expected routes for all BGP peers
-        routeIntentsExpected: all expected MultiPointToSinglePointIntent \
-        intents
-        bgpIntentsExpected: expected PointToPointIntent intents
-        allRoutesActual: all routes from ONOS LCI
-        routeIntentsActual: actual MultiPointToSinglePointIntent intents \
-        from ONOS CLI
-        bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
-        """
+    # Route convergence and connectivity test
+    def CASE21( self, main):
         import time
         import json
         from operator import eq
@@ -832,22 +526,24 @@
 
         main.case("The test case is to help to setup the TestON environment \
             and test new drivers" )
-        SDNIPJSONFILEPATH = "../tests/SdnIpTest/sdnip.json"
+        TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+        TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/routeconvergence/mininet"
+        SDNIPJSONFILEPATH = TESTCASE_ROOT_PATH + "/sdnip.json"
+        main.log.info("sdnip.json file path: "+ SDNIPJSONFILEPATH)
+        # Launch mininet topology for this case
+        MININET_TOPO_FILE = TESTCASE_MININET_ROOT_PATH + "/PeeringRouterConvergenceMininet.py"
+        main.step( "Launch mininet" )
+        main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
+        main.step("waiting 20 secs for all switches and quagga instances to comeup")
+        time.sleep(20)
+        main.step( "Test whether Mininet is started" )
+        main.log.info( "Login Quagga CLI on host3" )
+        main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
         # all expected routes for all BGP peers
         allRoutesExpected = []
         main.step( "Start to generate routes for all BGP peers" )
-        # bgpPeerHosts = []
-        # for i in range( 3, 5 ):
-        #    bgpPeerHosts.append( "host" + str( i ) )
-        # main.log.info( "BGP Peer Hosts are:" + bgpPeerHosts )
-
-        # for i in range( 3, 5 ):
-         #   QuaggaCliHost = "QuaggaCliHost" + str( i )
-          #  prefixes = main.QuaggaCliHost.generatePrefixes( 3, 10 )
-
-           # main.log.info( prefixes )
-            # allRoutesExpected.append( prefixes )
         main.log.info( "Generate prefixes for host3" )
+
         prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
         main.log.info( prefixesHost3 )
         # generate route with next hop
@@ -869,36 +565,39 @@
             prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
             SDNIPJSONFILEPATH )
 
+        main.log.info( "Generate prefixes for host5" )
+        prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 10 )
+        main.log.info( prefixesHost5 )
+        for prefix in prefixesHost5:
+            allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+        routeIntentsExpectedHost5 = \
+            main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+            prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+            SDNIPJSONFILEPATH )
+
         routeIntentsExpected = routeIntentsExpectedHost3 + \
-            routeIntentsExpectedHost4
+            routeIntentsExpectedHost4 + routeIntentsExpectedHost5
 
         cellName = main.params[ 'ENV' ][ 'cellName' ]
         ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
         main.step( "Set cell for ONOS-cli environment" )
         main.ONOScli.setCell( cellName )
         verifyResult = main.ONOSbench.verifyCell()
+
         main.log.report( "Removing raft logs" )
         main.ONOSbench.onosRemoveRaftLogs()
         main.log.report( "Uninstalling ONOS" )
         main.ONOSbench.onosUninstall( ONOS1Ip )
-        main.step( "Creating ONOS package" )
-        packageResult = main.ONOSbench.onosPackage()
 
-        main.step( "Starting ONOS service" )
-        # TODO: start ONOS from Mininet Script
-        # startResult = main.ONOSbench.onosStart( "127.0.0.1" )
         main.step( "Installing ONOS package" )
         onos1InstallResult = main.ONOSbench.onosInstall(
             options="-f", node=ONOS1Ip )
 
-        main.step( "Checking if ONOS is up yet" )
-        time.sleep( 60 )
         onos1Isup = main.ONOSbench.isup( ONOS1Ip )
         if not onos1Isup:
             main.log.report( "ONOS1 didn't start!" )
 
         main.step( "Start ONOS-cli" )
-        # TODO: change the hardcode in startOnosCli method in ONOS CLI driver
 
         main.ONOScli.startOnosCli( ONOS1Ip )
 
@@ -906,10 +605,11 @@
         listResult = main.ONOScli.devices( jsonFormat=False )
         main.log.info( listResult )
         time.sleep( 10 )
-        main.log.info( "Installing sdn-ip feature" )
-        main.ONOScli.featureInstall( "onos-app-sdnip" )
+        main.log.info( "Installing gbprouter feature" )
+        main.ONOScli.featureInstall( "onos-app-bgprouter" )
         time.sleep( 10 )
         main.step( "Login all BGP peers and add routes into peers" )
+
         main.log.info( "Login Quagga CLI on host3" )
         main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
         main.log.info( "Enter configuration model of Quagga CLI on host3" )
@@ -923,14 +623,23 @@
         main.QuaggaCliHost4.enterConfig( 64516 )
         main.log.info( "Add routes to Quagga on host4" )
         main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
-        time.sleep( 60 )
 
-        # get all routes inside SDN-IP
+        main.log.info( "Login Quagga CLI on host5" )
+        main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+        main.log.info( "Enter configuration model of Quagga CLI on host5" )
+        main.QuaggaCliHost5.enterConfig( 64521 )
+        main.log.info( "Add routes to Quagga on host5" )
+        main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+        #time.sleep( 30 )
+        time.sleep(10)
+
+        # get routes inside SDN-IP
         getRoutesResult = main.ONOScli.routes( jsonFormat=True )
 
         # parse routes from ONOS CLI
         allRoutesActual = \
-            main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+           main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
 
         allRoutesStrExpected = str( sorted( allRoutesExpected ) )
         allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
@@ -950,91 +659,79 @@
             main.log.report(
                 "***Routes in SDN-IP after adding routes are wrong!***" )
 
-        time.sleep( 20 )
-        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+        #============================= Ping Test ========================
+        pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllPass( "1.168.30.100" )
+        main.log.info("Ping test result")
+        if pingTestResults:
+            main.log.info("Test succeeded")
+        else:
+            main.log.info("Test failed")
+       
+        utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+                                  onpass="Default connectivity check PASS",
+                                  onfail="Default connectivity check FAIL")
 
-        main.step( "Check MultiPointToSinglePointIntent intents installed" )
-        # routeIntentsExpected are generated when generating routes
-        # get rpoute intents from ONOS CLI
-        routeIntentsActual = \
-            main.QuaggaCliHost3.extractActualRouteIntents(
-                getIntentsResult )
-        routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
-        routeIntentsStrActual = str( routeIntentsActual ).replace( 'u', "" )
-        main.log.info( "MultiPointToSinglePoint intents expected:" )
-        main.log.info( routeIntentsStrExpected )
-        main.log.info( "MultiPointToSinglePoint intents get from ONOS CLI:" )
-        main.log.info( routeIntentsStrActual )
+        #============= Disconnect the BGP session between QuaggaCliHost4 and ONOS ==================
+        main.log.info( "Disabling bgp session between QuaggaCliHost4 and 192.168.30.101:" )
+        main.QuaggaCliHost4.disable_bgp_peer( "192.168.30.101", "64513" )
+        main.log.info( "Sleeping for 150 seconds for network to converge" )
+        time.sleep(150)
+        # get routes inside SDN-IP
+        main.log.info( "Getting Routes from ONOS CLI" )
+        getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+        # parse routes from ONOS CLI
+        newAllRoutesActual = \
+            main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+        newAllRoutesStrActual = str( newAllRoutesActual ).replace( 'u', "" )
+
+        # Expected routes with changed next hop
+        newAllRoutesExpected = []
+        for prefix in prefixesHost3:
+            newAllRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+        for prefix in prefixesHost4:
+            newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+        for prefix in prefixesHost5:
+            newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+        newAllRoutesStrExpected = str( sorted( newAllRoutesExpected ) )
+        main.step( "Check routes installed after convergence-1" )
+        main.log.info( "Routes expected:" )
+        main.log.info( newAllRoutesStrExpected )
+        main.log.info( "Routes got from ONOS CLI after convergence-1:" )
+        main.log.info( newAllRoutesStrActual )
         utilities.assertEquals(
-            expect=True,
-            actual=eq( routeIntentsStrExpected, routeIntentsStrActual ),
-            onpass="***MultiPointToSinglePoint Intents in SDN-IP are \
-            correct!***",
-            onfail="***MultiPointToSinglePoint Intents in SDN-IP are \
-            wrong!***" )
-
-        if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+            expect=newAllRoutesStrExpected, actual=newAllRoutesStrActual,
+            onpass="***Routes in SDN-IP are correct after convergence!***",
+            onfail="***Routes in SDN-IP are wrong after convergence!***" )
+        if( eq( newAllRoutesStrExpected, newAllRoutesStrActual ) ):
             main.log.report(
-                "***MultiPointToSinglePoint Intents before deleting routes \
-                correct!***" )
+                "***Routes in SDN-IP after convergence are correct!***" )
         else:
             main.log.report(
-                "***MultiPointToSinglePoint Intents before deleting routes \
-                wrong!***" )
-
-        main.step( "Check BGP PointToPointIntent intents installed" )
-        # bgp intents expected
-        bgpIntentsExpected = \
-            main.QuaggaCliHost3.generateExpectedBgpIntents( SDNIPJSONFILEPATH )
-        # get BGP intents from ONOS CLI
-        bgpIntentsActual = main.QuaggaCliHost3.extractActualBgpIntents(
-            getIntentsResult )
-
-        bgpIntentsStrExpected = str( bgpIntentsExpected ).replace( 'u', "" )
-        bgpIntentsStrActual = str( bgpIntentsActual )
-        main.log.info( "PointToPointIntent intents expected:" )
-        main.log.info( bgpIntentsStrExpected )
-        main.log.info( "PointToPointIntent intents get from ONOS CLI:" )
-        main.log.info( bgpIntentsStrActual )
-
-        utilities.assertEquals(
-            expect=True,
-            actual=eq( bgpIntentsStrExpected, bgpIntentsStrActual ),
-            onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
-            onfail="***PointToPointIntent Intents in SDN-IP are wrong!***" )
-
-        if ( eq( bgpIntentsStrExpected, bgpIntentsStrActual ) ):
-            main.log.report(
-                "***PointToPointIntent Intents in SDN-IP are correct!***" )
-        else:
-            main.log.report(
-                "***PointToPointIntent Intents in SDN-IP are wrong!***" )
+                "***Routes in SDN-IP after convergence are wrong!***" )
 
         #============================= Ping Test ========================
-        # wait until all MultiPointToSinglePoint
-        time.sleep( 20 )
-        pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-        pingTestResultsFile = \
-        "~/SDNIP/SdnIpIntentDemo/log/CASE1-ping-results-before-delete-routes-" \
-             + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
-        pingTestResults = main.QuaggaCliHost.pingTest(
-            "1.168.30.100", pingTestScript, pingTestResultsFile )
-        main.log.info( pingTestResults )
-
-        # ping test
+        pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllPass( "1.168.30.100" )
+        main.log.info("Ping test result")
+        if pingTestResults:
+            main.log.info("Test succeeded")
+        else:
+            main.log.info("Test failed")
+       
+        utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+                                  onpass="Default connectivity check PASS",
+                                  onfail="Default connectivity check FAIL")
 
         #============================= Deleting Routes ==================
         main.step( "Check deleting routes installed" )
         main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
         main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+        main.QuaggaCliHost5.deleteRoutes( prefixesHost5, 1 )
 
-        # main.log.info( "main.ONOScli.get_routes_num() = " )
-        # main.log.info( main.ONOScli.getRoutesNum() )
-        # utilities.assertEquals( expect="Total SDN-IP routes = 1", actual=
-        # main.ONOScli.getRoutesNum(),
         getRoutesResult = main.ONOScli.routes( jsonFormat=True )
         allRoutesActual = \
             main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
         main.log.info( "allRoutes_actual = " )
         main.log.info( allRoutesActual )
 
@@ -1044,324 +741,23 @@
             onfail="***Routes number in SDN-IP is not 0, wrong!***" )
 
         if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
-            main.log.report(
-                "***Routes in SDN-IP after deleting correct!***" )
+            main.log.report( "***Routes in SDN-IP after deleting correct!***" )
         else:
-            main.log.report(
-                "***Routes in SDN-IP after deleting wrong!***" )
+            main.log.report( "***Routes in SDN-IP after deleting wrong!***" )
 
-        main.step( "Check intents after deleting routes" )
-        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
-        routeIntentsActual = \
-            main.QuaggaCliHost3.extractActualRouteIntents(
-                getIntentsResult )
-        main.log.info( "main.ONOScli.intents()= " )
-        main.log.info( routeIntentsActual )
-        utilities.assertEquals(
-            expect="[]", actual=str( routeIntentsActual ),
-            onpass="***MultiPointToSinglePoint Intents number in SDN-IP is \
-            0, correct!***",
-            onfail="***MultiPointToSinglePoint Intents number in SDN-IP is \
-            0, wrong!***" )
-
-        if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
-            main.log.report(
-                "***MultiPointToSinglePoint Intents after deleting routes \
-                correct!***" )
+        #============================= Ping Test ========================
+        pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllFail( "1.168.30.100" )
+        main.log.info("Ping test result")
+        if pingTestResults:
+            main.log.info("Test succeeded")
         else:
-            main.log.report(
-                "***MultiPointToSinglePoint Intents after deleting routes \
-                wrong!***" )
+            main.log.info("Test failed")
 
-        time.sleep( 20 )
-        pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-        pingTestResultsFile = \
-        "~/SDNIP/SdnIpIntentDemo/log/CASE1-ping-results-after-delete-routes-" \
-             + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
-        pingTestResults = main.QuaggaCliHost.pingTest(
-            "1.168.30.100", pingTestScript, pingTestResultsFile )
-        main.log.info( pingTestResults )
-        time.sleep( 30 )
+        utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+                                  onpass="disconnect check PASS",
+                                  onfail="disconnect check FAIL")
 
-        # main.step( "Test whether Mininet is started" )
-        # main.Mininet2.handle.sendline( "xterm host1" )
-        # main.Mininet2.handle.expect( "mininet>" )
-
-    def CASE2( self, main ):
-        """
-        Test the SDN-IP functionality
-        allRoutesExpected: all expected routes for all BGP peers
-        routeIntentsExpected: all expected MultiPointToSinglePointIntent \
-        intents
-        bgpIntentsExpected: expected PointToPointIntent intents
-        allRoutesActual: all routes from ONOS LCI
-        routeIntentsActual: actual MultiPointToSinglePointIntent intents \
-        from ONOS CLI
-        bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
-        """
-        import time
-        import json
-        from operator import eq
-        from time import localtime, strftime
-
-        main.case(
-            "The test case is to help to setup the TestON environment and \
-            test new drivers" )
-        SDNIPJSONFILEPATH = "../tests/SdnIpTest/sdnip.json"
-        # all expected routes for all BGP peers
-        allRoutesExpected = []
-        main.step( "Start to generate routes for all BGP peers" )
-
-        main.log.info( "Generate prefixes for host3" )
-        prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
-        main.log.info( prefixesHost3 )
-        # generate route with next hop
-        for prefix in prefixesHost3:
-            allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
-        routeIntentsExpectedHost3 = \
-            main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
-            prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
-            SDNIPJSONFILEPATH )
-
-        main.log.info( "Generate prefixes for host4" )
-        prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
-        main.log.info( prefixesHost4 )
-        # generate route with next hop
-        for prefix in prefixesHost4:
-            allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
-        routeIntentsExpectedHost4 = \
-            main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
-            prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
-            SDNIPJSONFILEPATH )
-
-        routeIntentsExpected = routeIntentsExpectedHost3 + \
-            routeIntentsExpectedHost4
-
-        main.log.report( "Removing raft logs" )
-        main.ONOSbench.onosRemoveRaftLogs()
-        main.log.report( "Uninstalling ONOS" )
-        main.ONOSbench.onosUninstall( ONOS1Ip )
-
-        cellName = main.params[ 'ENV' ][ 'cellName' ]
-        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
-        main.step( "Set cell for ONOS-cli environment" )
-        main.ONOScli.setCell( cellName )
-        verifyResult = main.ONOSbench.verifyCell()
-        # main.log.report( "Removing raft logs" )
-        # main.ONOSbench.onosRemoveRaftLogs()
-        # main.log.report( "Uninstalling ONOS" )
-        # main.ONOSbench.onosUninstall( ONOS1Ip )
-        main.step( "Creating ONOS package" )
-        # packageResult = main.ONOSbench.onosPackage()
-
-        main.step( "Installing ONOS package" )
-        # onos1InstallResult = main.ONOSbench.onosInstall( options="-f",
-        # node=ONOS1Ip )
-
-        main.step( "Checking if ONOS is up yet" )
-        # time.sleep( 60 )
-        onos1Isup = main.ONOSbench.isup( ONOS1Ip )
-        if not onos1Isup:
-            main.log.report( "ONOS1 didn't start!" )
-
-        main.step( "Start ONOS-cli" )
-        main.ONOScli.startOnosCli( ONOS1Ip )
-
-        main.step( "Get devices in the network" )
-        listResult = main.ONOScli.devices( jsonFormat=False )
-        main.log.info( listResult )
-        time.sleep( 10 )
-        main.log.info( "Installing sdn-ip feature" )
-        main.ONOScli.featureInstall( "onos-app-sdnip" )
-        time.sleep( 10 )
-
-        main.step( "Check BGP PointToPointIntent intents installed" )
-        # bgp intents expected
-        bgpIntentsExpected = main.QuaggaCliHost3.generateExpectedBgpIntents(
-            SDNIPJSONFILEPATH )
-        # get BGP intents from ONOS CLI
-        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
-        bgpIntentsActual = main.QuaggaCliHost3.extractActualBgpIntents(
-            getIntentsResult )
-
-        bgpIntentsStrExpected = str( bgpIntentsExpected ).replace( 'u', "" )
-        bgpIntentsStrActual = str( bgpIntentsActual )
-        main.log.info( "PointToPointIntent intents expected:" )
-        main.log.info( bgpIntentsStrExpected )
-        main.log.info( "PointToPointIntent intents get from ONOS CLI:" )
-        main.log.info( bgpIntentsStrActual )
-
-        utilities.assertEquals(
-            expect=True,
-            actual=eq( bgpIntentsStrExpected, bgpIntentsStrActual ),
-            onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
-            onfail="***PointToPointIntent Intents in SDN-IP are wrong!***" )
-
-        if ( eq( bgpIntentsStrExpected, bgpIntentsStrActual ) ):
-            main.log.report(
-                "***PointToPointIntent Intents in SDN-IP are correct!***" )
-        else:
-            main.log.report(
-                "***PointToPointIntent Intents in SDN-IP are wrong!***" )
-
-        allRoutesStrExpected = str( sorted( allRoutesExpected ) )
-        routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
-        pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-        # roundNum = 0;
-        # while( True ):
-        for roundNum in range( 1, 6 ):
-            # round = round + 1;
-            main.log.report( "The Round " + str( roundNum ) +
-                             " test starts................................" )
-
-            main.step( "Login all BGP peers and add routes into peers" )
-            main.log.info( "Login Quagga CLI on host3" )
-            main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
-            main.log.info(
-                "Enter configuration model of Quagga CLI on host3" )
-            main.QuaggaCliHost3.enterConfig( 64514 )
-            main.log.info( "Add routes to Quagga on host3" )
-            main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
-
-            main.log.info( "Login Quagga CLI on host4" )
-            main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
-            main.log.info(
-                "Enter configuration model of Quagga CLI on host4" )
-            main.QuaggaCliHost4.enterConfig( 64516 )
-            main.log.info( "Add routes to Quagga on host4" )
-            main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
-            time.sleep( 60 )
-
-            # get all routes inside SDN-IP
-            getRoutesResult = main.ONOScli.routes( jsonFormat=True )
-
-            # parse routes from ONOS CLI
-            allRoutesActual = \
-                main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
-
-            # allRoutesStrExpected = str( sorted( allRoutesExpected ) )
-            allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
-            main.step( "Check routes installed" )
-            main.log.info( "Routes expected:" )
-            main.log.info( allRoutesStrExpected )
-            main.log.info( "Routes get from ONOS CLI:" )
-            main.log.info( allRoutesStrActual )
-            utilities.assertEquals(
-                expect=allRoutesStrExpected, actual=allRoutesStrActual,
-                onpass="***Routes in SDN-IP are correct!***",
-                onfail="***Routes in SDN-IP are wrong!***" )
-            if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
-                main.log.report(
-                    "***Routes in SDN-IP after adding correct!***" )
-            else:
-                main.log.report(
-                    "***Routes in SDN-IP after adding wrong!***" )
-
-            time.sleep( 20 )
-            getIntentsResult = main.ONOScli.intents( jsonFormat=True )
-
-            main.step(
-                "Check MultiPointToSinglePointIntent intents installed" )
-            # routeIntentsExpected are generated when generating routes
-            # get route intents from ONOS CLI
-            routeIntentsActual = \
-                main.QuaggaCliHost3.extractActualRouteIntents(
-                    getIntentsResult )
-            # routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
-            routeIntentsStrActual = str(
-                routeIntentsActual ).replace( 'u', "" )
-            main.log.info( "MultiPointToSinglePoint intents expected:" )
-            main.log.info( routeIntentsStrExpected )
-            main.log.info(
-                "MultiPointToSinglePoint intents get from ONOS CLI:" )
-            main.log.info( routeIntentsStrActual )
-            utilities.assertEquals(
-                expect=True,
-                actual=eq( routeIntentsStrExpected, routeIntentsStrActual ),
-                onpass="***MultiPointToSinglePoint Intents in SDN-IP are \
-                correct!***",
-                onfail="***MultiPointToSinglePoint Intents in SDN-IP are \
-                wrong!***" )
-
-            if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
-                main.log.report(
-                    "***MultiPointToSinglePoint Intents after adding routes \
-                    correct!***" )
-            else:
-                main.log.report(
-                    "***MultiPointToSinglePoint Intents after adding routes \
-                    wrong!***" )
-
-            #============================= Ping Test ========================
-            # wait until all MultiPointToSinglePoint
-            time.sleep( 20 )
-            # pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-            pingTestResultsFile = \
-                "~/SDNIP/SdnIpIntentDemo/log/CASE2-Round" \
-                + str( roundNum ) + "-ping-results-before-delete-routes-" \
-                + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
-            pingTestResults = main.QuaggaCliHost.pingTest(
-                "1.168.30.100", pingTestScript, pingTestResultsFile )
-            main.log.info( pingTestResults )
-            # ping test
-
-            #============================= Deleting Routes ==================
-            main.step( "Check deleting routes installed" )
-            main.log.info( "Delete routes to Quagga on host3" )
-            main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
-            main.log.info( "Delete routes to Quagga on host4" )
-            main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
-
-            getRoutesResult = main.ONOScli.routes( jsonFormat=True )
-            allRoutesActual = \
-                main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
-            main.log.info( "allRoutes_actual = " )
-            main.log.info( allRoutesActual )
-
-            utilities.assertEquals(
-                expect="[]", actual=str( allRoutesActual ),
-                onpass="***Route number in SDN-IP is 0, correct!***",
-                onfail="***Routes number in SDN-IP is not 0, wrong!***" )
-
-            if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
-                main.log.report(
-                    "***Routes in SDN-IP after deleting correct!***" )
-            else:
-                main.log.report(
-                    "***Routes in SDN-IP after deleting wrong!***" )
-
-            main.step( "Check intents after deleting routes" )
-            getIntentsResult = main.ONOScli.intents( jsonFormat=True )
-            routeIntentsActual = \
-                main.QuaggaCliHost3.extractActualRouteIntents(
-                    getIntentsResult )
-            main.log.info( "main.ONOScli.intents()= " )
-            main.log.info( routeIntentsActual )
-            utilities.assertEquals(
-                expect="[]", actual=str( routeIntentsActual ),
-                onpass=
-                "***MultiPointToSinglePoint Intents number in SDN-IP \
-                is 0, correct!***",
-                onfail="***MultiPointToSinglePoint Intents number in SDN-IP \
-                is 0, wrong!***" )
-
-            if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
-                main.log.report(
-                    "***MultiPointToSinglePoint Intents after deleting \
-                    routes correct!***" )
-            else:
-                main.log.report(
-                    "***MultiPointToSinglePoint Intents after deleting \
-                    routes wrong!***" )
-
-            time.sleep( 20 )
-            # pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-            pingTestResultsFile = \
-                "~/SDNIP/SdnIpIntentDemo/log/CASE2-Round" \
-                + str( roundNum ) + "-ping-results-after-delete-routes-" \
-                + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
-            pingTestResults = main.QuaggaCliHost.pingTest(
-                "1.168.30.100", pingTestScript, pingTestResultsFile )
-            main.log.info( pingTestResults )
-            time.sleep( 30 )
+        main.ONOScli.disconnect()
+        main.ONOSbench.onosStop(ONOS1Ip);
+        main.Mininet.disconnect()
 
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/PeeringRouterConvergenceMininet.py b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/PeeringRouterConvergenceMininet.py
new file mode 100755
index 0000000..13c66ac
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/PeeringRouterConvergenceMininet.py
@@ -0,0 +1,346 @@
+#!/usr/bin/python
+
+"""
+Start up the SDN-IP demo topology
+"""
+
+"""
+AS1 = 64513, (SDN AS)
+AS2 = 64514, reachable by 192.168.10.1, 192.168.20.1
+AS3 = 64516, reachable by 192.168.30.1
+AS4 = 64517, reachable by 192.168.40.1
+AS6 = 64520, reachable by 192.168.60.2, (route server 192.168.60.1)
+"""
+
+from mininet.net import Mininet
+from mininet.node import Controller, RemoteController
+from mininet.log import setLogLevel, info
+from mininet.cli import CLI
+from mininet.topo import Topo
+from mininet.util import quietRun
+from mininet.moduledeps import pathCheck
+
+import os.path
+import time
+import sys
+from subprocess import Popen, STDOUT, PIPE
+
+QUAGGA_DIR = '/usr/lib/quagga'
+#QUAGGA_DIR = '/usr/local/sbin'
+QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
+
+QUAGGA_CONFIG_FILE_DIR = '/home/tutorial1/ONLabTest/TestON/tests/PeeringRouterTest/mininet'
+
+class SDNIpModifiedTopo( Topo ):
+    "SDN Ip Modified Topology"
+    
+    def __init__( self, *args, **kwargs ):
+        global numHost101 
+        global numHost200
+        numHost101 = 101
+        numHost200 = 200
+        Topo.__init__( self, *args, **kwargs )
+        sw1 = self.addSwitch('sw1', dpid='0000000000000001')
+        sw2 = self.addSwitch('sw2', dpid='0000000000000002')
+        #sw3 = self.addSwitch('sw3', dpid='00000000000000a3')
+        #sw4 = self.addSwitch('sw4', dpid='00000000000000a4')
+        #sw5 = self.addSwitch('sw5', dpid='00000000000000a5')
+        #sw6 = self.addSwitch('sw6', dpid='00000000000000a6')
+        #add a switch for 3 quagga hosts
+        swTestOn = self.addSwitch('swTestOn', dpid='0000000000000102')
+        #Note this switch isn't part of the SDN topology
+        #We'll use the ovs-controller to turn this into a learning switch
+        as6sw = self.addSwitch('as6sw', dpid='00000000000000a7')
+
+        host1 = self.addHost( 'host1' )
+        root1 = self.addHost( 'root1', inNamespace=False , ip='0')
+        rootTestOn = self.addHost( 'rootTestOn', inNamespace=False, ip='0' )
+
+        #AS2 host
+        host3 = self.addHost( 'host3' )
+        as2host = self.addHost( 'as2host' )
+        #AS3 host
+        host4 = self.addHost( 'host4' )
+        as3host = self.addHost( 'as3host' )
+        #AS6 host
+        host5 = self.addHost( 'host5' )
+        as6host = self.addHost( 'as6host' )
+
+        self.addLink( host1, sw2 )
+        #Links to the multihomed AS
+        self.addLink( host3, sw1 )
+        self.addLink( host3, sw1 )
+        self.addLink( as2host, host3 )
+        #Single links to the remaining two ASes
+        self.addLink( host4, sw1 )
+        self.addLink( as3host, host4 )
+          
+        #AS3-AS4 link
+        #self.addLink( host4, host5)
+        #Add new AS6 to its bridge
+        self.addLink( host5, as6sw )
+        self.addLink( as6host, host5 )
+
+        #Backup link from router5 to router4
+        self.addLink( host4, host5)
+
+        #test the host behind the router(behind the router server)
+#        for i in range(1, 10):
+ #           host = self.addHost('as6host%d' % i)
+  #          self.addLink(host, as6router)
+
+        ## Internal Connection To Hosts ##
+        self.addLink( root1, host1 )
+
+ #       self.addLink( sw1, sw2 )
+ #       self.addLink( sw1, sw3 )
+ #       self.addLink( sw2, sw4 )
+ #       self.addLink( sw3, sw4 )
+ #       self.addLink( sw3, sw5 )
+ #       self.addLink( sw4, sw6 )
+ #       self.addLink( sw5, sw6 )
+        self.addLink( as6sw, sw1 )
+        
+        
+        self.addLink(swTestOn, rootTestOn)
+        #self.addLink(swTestOn, host1)
+        self.addLink(swTestOn, host3)
+        self.addLink(swTestOn, host4)
+        self.addLink(swTestOn, host5)
+        self.addLink(swTestOn, as2host)
+        
+        
+        #self.addLink(rootTestOn, host4)
+
+def startsshd( host ):
+    "Start sshd on host"
+    info( '*** Starting sshd\n' )
+    name, intf, ip = host.name, host.defaultIntf(), host.IP()
+    banner = '/tmp/%s.banner' % name
+    host.cmd( 'echo "Welcome to %s at %s" >  %s' % ( name, ip, banner ) )
+    host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
+    info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
+
+def startsshds ( hosts ):
+    for h in hosts:
+        startsshd( h )
+
+def stopsshd( ):
+    "Stop *all* sshd processes with a custom banner"
+    info( '*** Shutting down stale sshd/Banner processes ',
+          quietRun( "pkill -9 -f Banner" ), '\n' )
+
+def startquagga( host, num, config_file ):
+    info( '*** Starting Quagga on %s\n' % host )
+    zebra_cmd = 'sudo %s/zebra -d -f  %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+    quagga_cmd = 'sudo %s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+    
+    print zebra_cmd
+    print quagga_cmd
+
+    host.cmd( zebra_cmd )
+    host.cmd( quagga_cmd )
+    
+def startquaggahost5( host, num ):
+    info( '*** Starting Quagga on %s\n' % host )
+    zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+    quagga_cmd = 'sudo %s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+   
+    host.cmd( zebra_cmd )
+    host.cmd( quagga_cmd )    
+    
+
+def stopquagga( ):
+    quietRun( 'sudo pkill -9 -f bgpd' )
+    quietRun( 'sudo pkill -9 -f zebra' )
+
+def sdn1net():
+    topo = SDNIpModifiedTopo()
+    info( '*** Creating network\n' )
+    net = Mininet( topo=topo, controller=RemoteController )
+    net = Mininet( topo=topo, controller=RemoteController )
+
+    host1, host3, host4, host5 = net.get( 'host1', 'host3', 'host4', 'host5' )
+    
+        #host100.setIP('1.168.30.' + str(i), 24, str(host100) + "-eth2")  
+         
+        #host500.setMAC('00:00:00:00:04:%d' % (i-101), 'host%d-eth0' %(i))
+        #add IP prefixes
+        #for j in range(0,121):
+            #host100.cmd('sudo ip addr add %s.0.40.%s/24 dev host%s-eth0' %(i,j,i))
+
+    ## Adding 2nd, 3rd and 4th interface to host1 connected to sw1 (for another BGP peering)
+    #sw1 = net.get('sw1')
+    host1.setMAC('00:00:00:00:00:01', 'host1-eth0')
+    host1.cmd('ip addr add 192.168.20.101/24 dev host1-eth0')
+    host1.cmd('ip addr add 192.168.30.101/24 dev host1-eth0')
+    #host1.cmd('ip addr add 192.168.40.101/24 dev host1-eth0')
+    host1.cmd('ip addr add 192.168.60.101/24 dev host1-eth0')
+
+    # Net has to be start after adding the above link
+    net.start()
+
+    # Set up as6sw as a learning switch as quickly as possible so it 
+    # hopefully doesn't connect to the actual controller
+    # TODO figure out how to change controller before starting switch
+    as6sw = net.get('as6sw')
+    as6sw.cmd('ovs-vsctl set-controller as6sw none')
+    as6sw.cmd('ovs-vsctl set-fail-mode as6sw standalone')
+
+
+    sw1 = net.get('sw1')
+    sw1.cmd('ovs-vsctl set-controller sw1 tcp:127.0.0.1:6633')
+#    sw2.cmd('ovs-vsctl set-controller sw2 tcp:127.0.0.1:6633')
+#    sw3.cmd('ovs-vsctl set-controller sw3 tcp:127.0.0.1:6633')
+#    sw4.cmd('ovs-vsctl set-controller sw4 tcp:127.0.0.1:6633')
+#    sw5.cmd('ovs-vsctl set-controller sw5 tcp:127.0.0.1:6633')
+#    sw6.cmd('ovs-vsctl set-controller sw6 tcp:127.0.0.1:6633')
+
+    
+    swTestOn = net.get('swTestOn')
+    swTestOn.cmd('ovs-vsctl set-controller swTestOn none')
+    swTestOn.cmd('ovs-vsctl set-fail-mode swTestOn standalone')
+
+    host1.defaultIntf().setIP('192.168.10.101/24') 
+    # Run BGPd
+    #host1.cmd('%s -d -f %s' % (BGPD, BGPD_CONF))
+    #host1.cmd('/sbin/route add default gw 192.168.10.254 dev %s-eth0' % (host1.name))
+    
+    # Configure new host interfaces
+    #host2.defaultIntf().setIP('172.16.10.2/24')
+    #host2.defaultIntf().setMAC('00:00:00:00:01:02') 
+    #host2.cmd('/sbin/route add default gw 172.16.10.254 dev %s-eth0' % (host2.name))
+
+    # Set up AS2
+    host3.setIP('192.168.10.1', 24, 'host3-eth0')
+    #host3.cmd('sudo ip addr add 172.16.20.1/24 dev host3-eth0')
+    host3.setIP('192.168.20.1', 24, 'host3-eth1')
+    host3.setMAC('00:00:00:00:02:01', 'host3-eth0')
+    host3.setMAC('00:00:00:00:02:02', 'host3-eth1')
+    #host3.setIP('172.16.20.254', 24, 'host3-eth2')
+    host3.setIP('3.0.0.254', 8, 'host3-eth2')
+    host3.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+    
+    host3.setIP('1.168.30.2', 24, 'host3-eth3')   
+    host3.cmd('sysctl net.ipv4.conf.all.arp_ignore=1')
+    host3.cmd('sysctl net.ipv4.conf.all.arp_announce=1')
+    as2host = net.get('as2host')
+    #as2host.defaultIntf().setIP('172.16.20.1/24')
+    for i in range(0, 20):
+        as2host.cmd('sudo ip addr add 3.0.%d.1/24 dev as2host-eth0' %i)
+    as2host.setIP('1.168.30.100', 24, 'as2host-eth1')
+    
+    as2host.cmd('ip route add default via 3.0.0.254')
+    
+    # Set up AS3
+    host4.setIP('192.168.30.1', 24, 'host4-eth0')
+    host4.setMAC('00:00:00:00:03:01', 'host4-eth0')
+    host4.setIP('4.0.0.254', 8, 'host4-eth1')
+    host4.setMAC('00:00:00:00:03:99', 'host4-eth1')
+    host4.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+    as3host = net.get('as3host')
+    for i in range(0, 20):
+        as3host.cmd('sudo ip addr add 4.0.%d.1/24 dev as3host-eth0' %i)
+    as3host.cmd('ip route add default via 4.0.0.254')
+    
+    host4.setIP('10.0.0.4', 24, 'host4-eth2')
+    host4.setMAC('00:00:00:00:03:33', 'host4-eth2')
+    
+    #root space
+    host4.setIP('1.168.30.3', 24, 'host4-eth3')
+    host4.setMAC('00:00:00:00:03:03', 'host4-eth3')
+    
+    # Set up AS4
+    #as4host = net.get('as4host')
+    #as4host.defaultIntf().setIP('172.16.40.1/24')
+    #as4host.cmd('ip route add default via 172.16.40.254')
+    
+    # setup interface address for 100 quagga hosts
+    time.sleep(10)
+    #for i in range(numHost101, numHost200 + 1):
+        #host100 = net.get('host' + str(i))
+        #host100.cmd(str(i)+'.0.1.254', 24, 'host'+str(i)+'-eth1')
+        #as4host100 = net.get('as4host%s' %(i))
+        #as4host100.defaultIntf().setIP(str(i) + '.0.0.1/24')
+        #as4host100.cmd('ip route add default via ' + str(i) + '.0.0.254')
+        #for j in range(0, 100):
+            #as4host100.cmd('sudo ip addr add %d.0.%d.1/24 dev %s-eth0' %(i, j, as4host100))
+
+    # Set up AS6 - This has a router and a route server
+    #as6rs, host5 = net.get('as6rs', 'host5')
+    host5 = net.get('host5')
+    #as6rs.setIP('192.168.60.1', 24, 'as6rs-eth0')
+    #as6rs.setMAC('00:00:00:00:06:01', 'as6rs-eth0')
+    host5.setIP('192.168.60.2', 24, 'host5-eth0')
+    host5.setMAC('00:00:00:00:06:02', 'host5-eth0')
+    #as6router.setIP('172.16.60.254', 24, 'as6router-eth1')
+    host5.setIP('5.0.0.254', 8, 'host5-eth1')
+    host5.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+    host5.setIP('10.0.0.5', 24, 'host5-eth2')
+    host5.setMAC('00:00:00:00:06:66', 'host5-eth2')
+    host5.setIP('1.168.30.5', 24, 'host5-eth3')
+    host5.setMAC('00:00:00:00:06:05', 'host5-eth3')
+
+    as6host = net.get('as6host')
+    #as6host.defaultIntf().setIP('5.0.0.1/24')
+    for i in range(0, 10):
+        as6host.cmd('sudo ip addr add 5.0.%d.1/24 dev as6host-eth0' %i)
+    as6host.cmd('ip route add default via 5.0.0.254')
+
+    # test the host in the as6
+    #for i in range(1, 10):
+    #    baseip = (i-1)*4
+    #    host = net.get('as6host%d' % i)
+    #    host.defaultIntf().setIP('172.16.70.%d/24' % (baseip+1))
+    #    host.cmd('ip route add default via 172.16.70.%d' % (baseip+2))
+     #   as6router.setIP('172.16.70.%d' % (baseip+2), 30, 'as6router-eth%d' % (i+1))
+
+    # Start Quagga on border routers
+    startquagga(host3, 1, QUAGGA_CONFIG_FILE_DIR + '/quagga1.conf')
+    startquagga(host4, 2, QUAGGA_CONFIG_FILE_DIR + '/quagga2.conf')
+    #for i in range(numHost101, numHost200 + 1):
+        #host100=net.get('host%d' % (i))
+        #startquaggahost5(host100, i)
+
+    #startquagga(as6rs, 4, 'quagga-as6-rs.conf')
+    startquagga(host5, 5, QUAGGA_CONFIG_FILE_DIR + '/quagga-as6.conf')
+
+    #root1, root2, rootTestOn  = net.get( 'root1', 'root2', 'rootTestOn' )
+    root1, rootTestOn  = net.get( 'root1', 'rootTestOn' )
+    host1.intf('host1-eth1').setIP('1.1.1.1/24')
+    root1.intf('root1-eth0').setIP('1.1.1.2/24')
+    #host2.intf('host2-eth1').setIP('1.1.2.1/24')
+    #root2.intf('root2-eth0').setIP('1.1.2.2/24')
+    
+    #rootTestOn.cmd('ip addr add 1.168.30.102/24 dev rootTestOn-eth0')
+    rootTestOn.cmd('ip addr add 1.168.30.99/24 dev rootTestOn-eth0')
+    
+    stopsshd()    
+
+    startquagga(host1, 100, QUAGGA_CONFIG_FILE_DIR + '/quagga-sdn-modified.conf')    
+    hosts = [ host1, host3, host4, host5, as2host ];
+    #sshdHosts = sshdHosts + hosts
+    startsshds( hosts )
+    #
+    onos1 = '127.0.0.1'
+    forwarding1 = '%s:2000:%s:2000' % ('1.1.1.2', onos1)
+    root1.cmd( 'ssh -nNT -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % (forwarding1, onos1) )
+
+    # Forward 2605 to root namespace for easier access to SDN domain BGPd
+    # If root can ssh to itself without a password this should work
+    root1.cmd('ssh -N -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -L 2605:1.1.1.1:2605 1.1.1.1 &')
+    #time.sleep(3000000000)
+    CLI( net )
+
+    # Close the ssh port forwarding
+    #quietRun('sudo pkill -f 1.1.1.1')
+
+    stopsshd()
+    stopquagga()
+    net.stop()
+
+if __name__ == '__main__':
+    setLogLevel( 'debug' )
+    if len(sys.argv) > 1:
+        QUAGGA_CONFIG_FILE_DIR = sys.argv[1]
+    sdn1net()
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-as6.conf b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-as6.conf
new file mode 100644
index 0000000..434f983
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-as6.conf
@@ -0,0 +1,39 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64521
+  bgp router-id 192.168.60.2
+  neighbor 192.168.60.101 remote-as 64513
+! neighbor 192.168.60.1 remote-as 64520
+! neighbor 192.168.60.3 remote-as 64520
+!  network 172.16.60.0/24
+!  network 172.16.70.4/30
+ ! network 172.16.70.8/30
+ ! network 172.16.70.12/30
+ ! network 172.16.70.16/30
+ ! network 172.16.70.20/30
+ ! network 172.16.70.24/30
+ ! network 172.16.70.28/30
+ ! network 172.16.70.32/30
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-sdn-modified.conf b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-sdn-modified.conf
new file mode 100644
index 0000000..d334c2a
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-sdn-modified.conf
@@ -0,0 +1,49 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+  set as-path prepend 65000
+!
+router bgp 64513
+  bgp router-id 192.168.10.101
+  timers bgp 1 3
+  !timers bgp 3 9 
+  neighbor 192.168.10.1 remote-as 64514
+  neighbor 192.168.10.1 ebgp-multihop
+  neighbor 192.168.10.1 timers connect 5
+  neighbor 192.168.20.1 remote-as 64514
+  neighbor 192.168.20.1 ebgp-multihop
+  neighbor 192.168.20.1 timers connect 5
+  neighbor 192.168.20.1 route-map AS65000 in
+  neighbor 192.168.30.1 remote-as 64516
+  neighbor 192.168.30.1 ebgp-multihop
+  neighbor 192.168.30.1 timers connect 5
+  neighbor 192.168.60.2 remote-as 64521
+  neighbor 192.168.60.2 ebgp-multihop
+  neighbor 192.168.60.2 timers connect 5
+  neighbor 1.1.1.2 remote-as 64513
+  neighbor 1.1.1.2 port 2000
+  neighbor 1.1.1.2 timers connect 5
+
+
+
+  network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga1.conf b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga1.conf
new file mode 100644
index 0000000..264f85e
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga1.conf
@@ -0,0 +1,32 @@
+!
+! Zebra configuration saved from vty
+!   2014/11/25 11:22:24
+!
+hostname bgpd
+password hello
+log stdout
+!
+router bgp 64514
+ bgp router-id 192.168.10.1
+! network 3.0.0.0/24
+! network 3.0.1.0/24
+! network 3.0.2.0/24
+! network 3.0.3.0/24
+! network 3.0.4.0/24
+! network 3.0.5.0/24
+! network 3.0.6.0/24
+! network 3.0.7.0/24
+! network 3.0.8.0/24
+! network 3.0.9.0/24
+ neighbor 192.168.20.101 remote-as 64513
+ neighbor 192.168.20.101 route-map PREPEND2 in
+ neighbor 192.168.20.101 route-map PREPEND2 out
+!
+route-map PREPEND1 permit 1
+ set as-path prepend 64514
+!
+route-map PREPEND2 permit 2
+ set as-path prepend 64514 64514
+!
+line vty
+!
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga2.conf b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga2.conf
new file mode 100644
index 0000000..14c7d67
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga2.conf
@@ -0,0 +1,32 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64516
+  bgp router-id 192.168.30.1
+!  timers bgp 1 3
+  neighbor 192.168.30.101 remote-as 64513
+  neighbor 10.0.0.5 remote-as 64521
+! neighbor 192.168.50.2   remote-as 65001
+! network 172.16.30.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/zebra.conf b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/zebra.conf
new file mode 100644
index 0000000..0f8e3a2
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/zebra.conf
@@ -0,0 +1,26 @@
+! -*- zebra -*-
+!
+! zebra sample configuration file
+!
+! $Id: zebra.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
+!
+hostname zebra 
+password hello
+enable password 0fw0rk
+log stdout
+!
+! Interfaces description.
+!
+!interface lo
+! description test of desc.
+!
+!interface sit0
+! multicast
+
+!
+! Static default route sample.
+!
+!ip route 0.0.0.0/0 203.181.89.241
+!
+
+!log file /usr/local/var/log/quagga/zebra.log
