diff --git a/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.params b/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.params
index 24403e2..1a58556 100755
--- a/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.params
+++ b/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.params
@@ -1,10 +1,10 @@
 <PARAMS>
 
-    <testcases>1,2,3,4,10</testcases>
+    <testcases>1,2,3</testcases>
 
     <SCALE>
-        <size>1</size>
-        <max>1</max>
+        <size>3</size>
+        <max>3</max>
     </SCALE>
 
     <DEPENDENCY>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.py b/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.py
index 9a0d91c..77e90e3 100755
--- a/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.py
+++ b/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.py
@@ -1,13 +1,7 @@
-# This test should always succeed. it runs cases 1,2,3,4
-#CASE1: Get and Build ONOS
-#CASE2: Package and Install ONOS
-#CASE3: Start Mininet and check flows
-#CASE4: Ping all
-#CASE5: Link Failure
-#CASE6: Switch Failure
-#CASE7: ONOS Failure
-#CASE8: CLUSTER Failure
-#CASE10: Logging
+# This test should always succeed. it runs cases 1,2,3
+#CASE1: 2x2 Leaf-Spine topo and test IP connectivity
+#CASE2: 4x4 topo + IP connectivity test
+#CASE3: 2x2 topo + 3-node ONOS CLUSTER + IP connectivity test
 
 class SRSanity:
 
@@ -15,605 +9,78 @@
         self.default = ''
 
     def CASE1( self, main ):
-        import time
-        import os
-        import imp
-        import re
-
         """
-        - Construct tests variables
-        - GIT ( optional )
-            - Checkout ONOS master branch
-            - Pull latest ONOS code
-        - Building ONOS ( optional )
-            - Install ONOS package
-            - Build ONOS package
+        Sets up 1-node Onos-cluster
+        Start 2x2 Leaf-Spine topology
+        Pingall
         """
+        from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as run
+        if not hasattr(main,'apps'):
+            run.initTest(main)
 
-        main.case( "Constructing test variables and building ONOS" )
-        main.step( "Constructing test variables" )
-        stepResult = main.FALSE
+        description = "Bridging and Routing sanity test with 2x2 Leaf-spine "
+        main.case( description )
 
-        # Test variables
-        main.cellName = main.params[ 'ENV' ][ 'cellName' ]
-        main.apps = main.params[ 'ENV' ][ 'cellApps' ]
-        main.diff = []
-        main.diff.extend(( main.params[ 'ENV' ][ 'diffApps' ] ).split(";"))
-        main.diff=main.diff*2
-        gitBranch = main.params[ 'GIT' ][ 'branch' ]
-        main.path = os.path.dirname( main.testFile )
-        main.dependencyPath = main.path +"/../dependencies/"
-        main.topology = main.params[ 'DEPENDENCY' ][ 'topology' ]
-        main.json = ["2x2"]*4
-        main.args = [" "]*4
-        main.scale = ( main.params[ 'SCALE' ][ 'size' ] ).split( "," )
-        main.maxNodes = int( main.params[ 'SCALE' ][ 'max' ] )
-        main.ONOSport = main.params[ 'CTRL' ][ 'port' ]
-        wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
-        main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
-        gitPull = main.params[ 'GIT' ][ 'pull' ]
-        main.cellData = {} # for creating cell file
-        main.CLIs = []
-        main.ONOSip = []
+        main.cfgName = '2x2'
+        main.numCtrls = 1
+        run.installOnos(main)
+        run.startMininet(main, 'cord_fabric.py')
+        #pre-configured routing and bridging test
+        run.checkFlows(main, flowCount=116)
+        run.pingAll(main, "CASE1")
+        #TODO Dynamic config of hosts in subnet
+        #TODO Dynamic config of host not in subnet
+        #TODO Dynamic config of vlan xconnect
+        #TODO Vrouter integration
+        #TODO Mcast integration
+        run.cleanup(main)
 
-        # Assigning ONOS cli handles to a list
-        for i in range( 1,  main.maxNodes + 1 ):
-            main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
-            main.ONOSip.append( main.CLIs[i-1].ip_address )
-        # -- INIT SECTION, ONLY RUNS ONCE -- #
-        main.startUp = imp.load_source( wrapperFile1,
-                                        main.dependencyPath +
-                                        wrapperFile1 +
-                                        ".py" )
-
-        copyResult1 = main.ONOSbench.scp( main.Mininet1,
-                                          main.dependencyPath +
-                                          main.topology,
-                                          main.Mininet1.home,
-                                          direction="to" )
-        if main.CLIs:
-            stepResult = main.TRUE
-        else:
-            main.log.error( "Did not properly created list of ONOS CLI handle" )
-            stepResult = main.FALSE
-
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=stepResult,
-                                 onpass="Successfully construct " +
-                                        "test variables ",
-                                 onfail="Failed to construct test variables" )
-
-        if gitPull == 'True':
-            main.step( "Building ONOS in " + gitBranch + " branch" )
-            onosBuildResult = main.startUp.onosBuild( main, gitBranch )
-            stepResult = onosBuildResult
-            utilities.assert_equals( expect=main.TRUE,
-                                     actual=stepResult,
-                                     onpass="Successfully compiled " +
-                                            "latest ONOS",
-                                     onfail="Failed to compile " +
-                                            "latest ONOS" )
-        else:
-            main.log.warn( "Did not pull new code so skipping mvn " +
-                           "clean install" )
-        main.numCtrls = int( main.scale[ 0 ] )
-         
     def CASE2( self, main ):
         """
-        - Set up cell
-            - Create cell file
-            - Set cell file
-            - Verify cell file
-        - Kill ONOS process
-        - Uninstall ONOS cluster
-        - Verify ONOS start up
-        - Install ONOS cluster
-        - Connect to cli
+        Sets up 1-node Onos-cluster
+        Start 4x4 Leaf-Spine topology
+        Pingall
         """
-
-        # main.scale[ 0 ] determines the current number of ONOS controller
-        main.numCtrls = int( main.scale[ 0 ] )
-        main.scale.remove( main.scale[ 0 ] )
-        apps=main.apps
-        if main.diff:
-            apps = main.apps+","+main.diff.pop(0)
-        else: main.log.error( "App list is empty" )
-        main.case( "Package and start ONOS using apps:" + apps)
-
-        print "NODE COUNT = ", main.numCtrls
-        print main.ONOSip
-        tempOnosIp = []
-        for i in range( main.numCtrls ):
-            tempOnosIp.append( main.ONOSip[i] )
-
-        onosUser = main.params[ 'ENV' ][ 'cellUser' ]
-        main.step("Create and Apply cell file")
-        main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
-                                       "temp",
-                                       main.Mininet1.ip_address,
-                                       apps,
-                                       tempOnosIp,
-                                       onosUser )
-
-        cellResult = main.ONOSbench.setCell( "temp" )
-        verifyResult = main.ONOSbench.verifyCell()
-        stepResult = cellResult and verifyResult
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=stepResult,
-                                 onpass="Successfully applied cell to " + \
-                                        "environment",
-                                 onfail="Failed to apply cell to environment " )
-        #kill off all onos processes
-        main.log.info( "Safety check, killing all ONOS processes" +
-                       " before initiating environment setup" )
-
-        for i in range( main.maxNodes ):
-            main.ONOSbench.onosDie( main.ONOSip[ i ] )
-
-        main.step( "Create and Install ONOS package" )
-        main.jsonFile=main.json.pop(0)
-        main.ONOSbench.handle.sendline( "cp "+main.dependencyPath+"/"+main.jsonFile+".json ~/onos/tools/package/config/network-cfg.json")
-        packageResult = main.ONOSbench.onosPackage()
-
-        onosInstallResult = main.TRUE
-        for i in range( main.numCtrls ):
-            onosInstallResult = onosInstallResult and \
-                    main.ONOSbench.onosInstall( node=main.ONOSip[ i ] )
-        stepResult = onosInstallResult
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=stepResult,
-                                 onpass="Successfully installed ONOS package",
-                                 onfail="Failed to install ONOS package" )
-
-        main.step( "Starting ONOS service" )
-        stopResult = main.TRUE
-        startResult = main.TRUE
-        onosIsUp = main.TRUE
-
-        for i in range( main.numCtrls ):
-            onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
-        if onosIsUp == main.TRUE:
-            main.log.report( "ONOS instance is up and ready" )
-        else:
-            main.log.report( "ONOS instance may not be up, stop and " +
-                             "start ONOS again " )
-            for i in range( main.numCtrls ):
-                stopResult = stopResult and \
-                        main.ONOSbench.onosStop( main.ONOSip[ i ] )
-            for i in range( main.numCtrls ):
-                startResult = startResult and \
-                        main.ONOSbench.onosStart( main.ONOSip[ i ] )
-        stepResult = onosIsUp and stopResult and startResult
-
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=stepResult,
-                                 onpass="ONOS service is ready",
-                                 onfail="ONOS service did not start properly" )
-        main.step( "Checking if ONOS CLI is ready" )
-        main.CLIs[0].startCellCli()
-        cliResult = main.CLIs[0].startOnosCli( main.ONOSip[ 0 ],
-                                           commandlineTimeout=60, onosStartTimeout=100 )
-        utilities.assert_equals( expect=main.TRUE,
-                             actual=cliResult,
-                             onpass="ONOS CLI is ready",
-                             onfail="ONOS CLI is not ready" )
-        for i in range( 10 ):
-            ready = True
-            output = main.CLIs[0].summary()
-            if not output:
-                ready = False
-            if ready:
-                break
-            time.sleep( 10 )
-        utilities.assert_equals( expect=True, actual=ready,
-                                 onpass="ONOS summary command succeded",
-                                 onfail="ONOS summary command failed" )
-
-        if not ready:
-            main.log.error( "ONOS startup failed!" )
-            main.cleanup()
-            main.exit()
+        from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as run
+        if not hasattr(main,'apps'):
+            run.initTest(main)
+        description = "Bridging and Routing sanity test with 4x4 Leaf-spine "
+        main.case( description )
+        main.cfgName = '4x4'
+        main.numCtrls = 1
+        run.installOnos(main)
+        run.startMininet(main, 'cord_fabric.py', args="--leaf=4 --spine=4")
+        #pre-configured routing and bridging test
+        run.checkFlows(main, flowCount=350)
+        run.pingAll(main, 'CASE2')
+        #TODO Dynamic config of hosts in subnet
+        #TODO Dynamic config of host not in subnet
+        #TODO Dynamic config of vlan xconnect
+        #TODO Vrouter integration
+        #TODO Mcast integration
+        run.cleanup(main)
 
     def CASE3( self, main ):
         """
-            Start mininet
-        """
-        main.case( "Start Leaf-Spine "+main.jsonFile+" Mininet Topology" )
-        main.log.report( "Start Mininet topology" )
-
-        main.step( "Starting Mininet Topology" )
-        args,topo=" "," "
-        if main.args:
-            args = "--onos %d %s" % (main.numCtrls, main.args.pop(0))
-        else: main.log.error( "Argument list is empty" )
- 
-        topoResult = main.Mininet1.startNet( topoFile= main.dependencyPath + main.topology, args=args )
-        stepResult = topoResult
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=stepResult,
-                                 onpass="Successfully loaded topology",
-                                 onfail="Failed to load topology" )
-        # Exit if topology did not load properly
-        if not topoResult:
-            main.cleanup()
-            main.exit()
-        main.step(" Check whether the flow count is bigger than 116" )
-        count =  utilities.retry( main.CLIs[0].checkFlowCount,
-                                 main.FALSE,
-                                 kwargs={'min':116},
-                                 attempts=10,
-                                 sleep=10 )
-        utilities.assertEquals( \
-            expect=True,
-            actual=(count>0),
-            onpass="Flow count looks correct: "+str(count),
-            onfail="Flow count looks wrong: "+str(count) )
-
-        main.step( "Check whether all flow status are ADDED" )
-        flowCheck = utilities.retry( main.CLIs[0].checkFlowsState,
-                                 main.FALSE,
-                                 kwargs={'isPENDING':False},
-                                 attempts=10,
-                                 sleep=10)
-        utilities.assertEquals( \
-            expect=main.TRUE,
-            actual=flowCheck,
-            onpass="Flow status is correct!",
-            onfail="Flow status is wrong!" )
-        main.ONOSbench.dumpFlows( main.ONOSip[0],
-                 main.logdir, "flowsBefore" + main.jsonFile)
-        main.ONOSbench.dumpGroups( main.ONOSip[0],
-                                   main.logdir, "groupsBefore" + main.jsonFile)
-        main.count=1
-
-    def CASE4( self, main ):
-        main.case( "Check full connectivity" )
-        main.log.report( "Check full connectivity" )
-
-        main.step("Check full connectivity"+str(main.count))
-        pa = main.Mininet1.pingall()
-        utilities.assert_equals( expect=main.TRUE, actual=pa,
-                                 onpass="Full connectivity successfully tested",
-                                 onfail="Full connectivity failed" )
-        main.ONOSbench.dumpFlows( main.ONOSip[0],
-                 main.logdir, "flowsAfter" + str(main.count) + main.jsonFile)
-        main.ONOSbench.dumpGroups( main.ONOSip[0],
-                           main.logdir, "groupsAfter" + str(main.count) + main.jsonFile)
-
-    def CASE5( self, main ):
-        """
-        Link spine101-leaf2 down
-        Pingall
-        Link spine101-leaf2 up
+        Sets up 3-node Onos-cluster
+        Start 2x2 Leaf-Spine topology
         Pingall
         """
-        import time
-        assert main.numCtrls, "main.numCtrls not defined"
-        assert main, "main not defined"
-        assert utilities.assert_equals, "utilities.assert_equals not defined"
-        assert main.CLIs, "main.CLIs not defined"
-
-        linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
-
-        description = "Turn off a link to ensure that Segment Routing reroutes traffic " + \
-                      "properly"
+        from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as run
+        if not hasattr(main,'apps'):
+            run.initTest(main)
+        description = "Bridging and Routing sanity test with 2x2 Leaf-spine "
         main.case( description )
-
-        main.step( "Kill Link between spine101 and leaf2" )
-        LinkDown = main.Mininet1.link( END1="spine101", END2="leaf2", OPTION="down" )
-        main.log.info( "Waiting %s seconds for link up to be discovered" % (linkSleep) )
-        # TODO Maybe parameterize number of expected links
-        time.sleep( linkSleep )
-        topology =  utilities.retry( main.CLIs[0].checkStatus,
-                                      main.FALSE,
-                                      kwargs={'numoswitch':'4', 'numolink':'6'},
-                                      attempts=10,
-                                      sleep=linkSleep)
-        result = topology & LinkDown
-        utilities.assert_equals( expect=main.TRUE, actual=result,
-                                 onpass="Link down successful",
-                                 onfail="Failed to turn off link?" )
-
-        main.step( "Check connectivity after link failure" )
-        pa = main.Mininet1.pingall()
-        utilities.assert_equals( expect=main.TRUE, actual=pa,
-                                 onpass="Survived link failure successfully",
-                                 onfail="Did not survive link failure" )
-        main.ONOSbench.dumpFlows( main.ONOSip[0],
-                                  main.logdir,
-                                  "flowsAfterLinkFailure" + main.jsonFile)
-        main.ONOSbench.dumpGroups( main.ONOSip[0],
-                                   main.logdir,
-                                   "groupsAfterLinkFailure" + main.jsonFile)
-
-        main.step( "Restore link between spine101 and leaf2" )
-
-        result = False
-        count=0
-        while True:
-            count+=0
-            main.Mininet1.link( END1="spine101", END2="leaf2", OPTION="up" )
-            main.Mininet1.link( END2="spine101", END1="leaf2", OPTION="up" )
-            main.log.info( "Waiting %s seconds for link up to be discovered" % (linkSleep) )
-            time.sleep( linkSleep )
-
-            main.CLIs[0].portstate(dpid='of:0000000000000002', port='1')
-            main.CLIs[0].portstate(dpid='of:0000000000000101', port='2')
-            time.sleep( linkSleep )
-
-            result = main.CLIs[0].checkStatus(numoswitch='4', numolink='8')
-            if count>10 or result:
-                break
-        utilities.assert_equals( expect=main.TRUE, actual=result,
-                                 onpass="Link up successful",
-                                 onfail="Failed to bring link up" )
-
-        main.step( "Check connectivity after link recovery" )
-        pa = main.Mininet1.pingall()
-        utilities.assert_equals( expect=main.TRUE, actual=pa,
-                                 onpass="Survived link recovery successfully",
-                                 onfail="Did not survive link recovery" )
-        main.ONOSbench.dumpFlows( main.ONOSip[0],
-                                  main.logdir,
-                                  "flowsAfterLinkRecovery" + main.jsonFile)
-        main.ONOSbench.dumpGroups( main.ONOSip[0],
-                                   main.logdir,
-                                   "groupsAfterLinkRecovery" + main.jsonFile)
-
-    def CASE6( self, main ):
-        """
-        Switch Down
-        Pingall
-        Switch up
-        Pingall
-        """
-        import time
-        assert main.numCtrls, "main.numCtrls not defined"
-        assert main, "main not defined"
-        assert utilities.assert_equals, "utilities.assert_equals not defined"
-        assert main.CLIs, "main.CLIs not defined"
-    
-        switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
-    
-        description = "Killing a switch to ensure it is discovered correctly"
-        onosCli = main.CLIs[0]
-        main.case( description )
-        switch = main.params[ 'kill' ][ 'switch' ]
-        switchDPID = main.params[ 'kill' ][ 'dpid' ]
-
-        main.step( "Kill " + switch )
-        main.log.info( "Stopping" + switch )
-        main.Mininet1.switch( SW=switch, OPTION="stop")
-        main.log.info( "Waiting %s seconds for switch down to be discovered" %(switchSleep))
-        time.sleep( switchSleep )
-        topology =  utilities.retry( main.CLIs[0].checkStatus,
-                                      main.FALSE,
-                                     kwargs={'numoswitch':'3', 'numolink':'4'},
-                                      attempts=10,
-                                     sleep=switchSleep)
-        utilities.assert_equals( expect=main.TRUE, actual=topology,
-                                 onpass="Kill switch successful",
-                                 onfail="Failed to kill switch?" )
-
-        main.step( "Check connectivity after switch failure" )
-        pa = main.Mininet1.pingall()
-        utilities.assert_equals( expect=main.TRUE, actual=pa,
-                                 onpass="Survived switch failure successfully",
-                                 onfail="Did not survive switch failure" )
-        main.ONOSbench.dumpFlows( main.ONOSip[0],
-                                  main.logdir,
-                                  "flowsAfterSwitchFailure" + main.jsonFile)
-        main.ONOSbench.dumpGroups( main.ONOSip[0],
-                                   main.logdir,
-                                   "groupsAfterSwitchFailure" + main.jsonFile)
-
-        main.step( "Recovering " + switch )
-        main.log.info( "Starting" + switch )
-        main.Mininet1.switch( SW=switch, OPTION="start")
-        main.log.info( "Waiting %s seconds for switch up to be discovered" %(switchSleep))
-        time.sleep( switchSleep )
-        topology =  utilities.retry( main.CLIs[0].checkStatus,
-                                     main.FALSE,
-                                     kwargs={'numoswitch':'4', 'numolink':'8'},
-                                     attempts=10,
-                                     sleep=switchSleep)
-        utilities.assert_equals( expect=main.TRUE, actual=topology,
-                                 onpass="Switch recovery successful",
-                                 onfail="Failed to recover switch?" )
-
-        main.step( "Check connectivity after switch recovery" )
-        pa = main.Mininet1.pingall()
-        utilities.assert_equals( expect=main.TRUE, actual=pa,
-                                 onpass="Survived switch recovery successfully",
-                                 onfail="Did not survive switch recovery" )
-        main.ONOSbench.dumpFlows( main.ONOSip[0],
-                                  main.logdir,
-                                  "flowsAfterSwitchRecovery" + main.jsonFile)
-        main.ONOSbench.dumpGroups( main.ONOSip[0],
-                                   main.logdir,
-                                   "groupsAfterSwitchRecovery" + main.jsonFile)
-
-    def CASE7( self, main ):
-        """
-        OnosInstance1 Down
-        Pingall
-        OnosInstance1 up
-        Pingall
-        """
-
-        description = "Killing single instance to test controlplane resilience of Segment Routing"
-        main.case( description )
-        main.step( "Killing ONOS instance" )
-        killResult = main.ONOSbench.onosDie( main.CLIs[0].ip_address )
-        utilities.assert_equals( expect=main.TRUE, actual=killResult,
-                                 onpass="ONOS instance Killed",
-                                 onfail="Error killing ONOS instance" )
-        time.sleep( 12 )
-        topology =  utilities.retry( main.CLIs[1].checkStatus,
-                                     main.FALSE,
-                                     kwargs={'numoswitch':'4', 'numolink':'8', 'numoctrl':'2'},
-                                     attempts=10,
-                                     sleep=12)
-        utilities.assert_equals( expect=main.TRUE, actual=topology,
-                                 onpass="ONOS Instance down successful",
-                                 onfail="Failed to turn off ONOS Instance" )
-        main.step( "Check connectivity after ONOS instance failure" )
-        pa = main.Mininet1.pingall()
-        utilities.assert_equals( expect=main.TRUE, actual=pa,
-                                 onpass="Survived instance failure successfully",
-                                 onfail="Did not survive instance failure" )
-        main.ONOSbench.dumpFlows( main.ONOSip[1], main.logdir,
-                                  "flowsAfterSwitchFailure" + main.jsonFile)
-        main.ONOSbench.dumpGroups( main.ONOSip[1], main.logdir,
-                                   "groupsAfterSwitchFailure" + main.jsonFile)
-        main.step( "Recovering ONOS instance" )
-        startResult = main.ONOSbench.onosStart( main.CLIs[0].ip_address )
-        isUp = main.ONOSbench.isup( main.ONOSip[ 0 ] )
-        utilities.assert_equals( expect=main.TRUE, actual=isUp,
-                                 onpass="ONOS service is ready",
-                                 onfail="ONOS service did not start properly" )
-        main.step( "Checking if ONOS CLI is ready" )
-        main.CLIs[0].startCellCli()
-        cliResult = main.CLIs[0].startOnosCli( main.ONOSip[ 0 ],
-                                               commandlineTimeout=60, onosStartTimeout=100 )
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=cliResult,
-                                 onpass="ONOS CLI is ready",
-                                 onfail="ONOS CLI is not ready" )
-        for i in range( 10 ):
-            ready = True
-            output = main.CLIs[0].summary()
-            if not output:
-                ready = False
-            if ready:
-                break
-            time.sleep( 10 )
-        utilities.assert_equals( expect=True, actual=ready,
-                                 onpass="ONOS summary command succeded",
-                                 onfail="ONOS summary command failed" )
-        if not ready:
-            main.log.error( "ONOS startup failed!" )
-            main.cleanup()
-            main.exit()
-        main.step(" Check whether the flow count is bigger than 116" )
-        count =  utilities.retry( main.CLIs[0].checkFlowCount,
-                                  main.FALSE,
-                                  kwargs={'min':116},
-                                  attempts=10,
-                                  sleep=10 )
-        utilities.assertEquals( expect=True,
-                                actual=(count>0),
-                                onpass="Flow count looks correct: "+str(count),
-                                onfail="Flow count looks wrong: "+str(count) )
-
-        main.step( "Check connectivity after ONOS instance recovery" )
-        pa = main.Mininet1.pingall()
-        utilities.assert_equals( expect=main.TRUE, actual=pa,
-                                 onpass="Survived instance recovery successfully",
-                                 onfail="Did not survive recovery failure" )
-        main.ONOSbench.dumpFlows( main.ONOSip[0], main.logdir,
-                                  "flowsAfterCtrlFailure" + main.jsonFile)
-        main.ONOSbench.dumpGroups( main.ONOSip[0], main.logdir,
-                                   "groupsAfterCtrlFailure" + main.jsonFile)
-
-    def CASE8( self, main ):
-        """
-        Cluster Down
-        Pingall
-        Cluster up
-        Pingall
-        """
-        description = "Killing all instances to test controlplane resilience of Segment Routing"
-        main.case( description )
-        main.step( "Shutting down ONOS Cluster" )
-        for i in range( main.numCtrls ):
-            killResult = main.ONOSbench.onosDie( main.CLIs[i].ip_address )
-            utilities.assert_equals( expect=main.TRUE, actual=killResult,
-                                 onpass="ONOS instance Killed",
-                                 onfail="Error killing ONOS instance" )
-        time.sleep(12)
-        main.step( "Check connectivity after ONOS instance failure" )
-        pa = main.Mininet1.pingall()
-        utilities.assert_equals( expect=main.TRUE, actual=pa,
-                                 onpass="Survived instance failure successfully",
-                                 onfail="Did not survive instance failure" )
-        main.step( "Recovering ONOS Cluster" )
-        for i in range( main.numCtrls ):
-            startResult = main.ONOSbench.onosStart( main.CLIs[i].ip_address )
-            isUp = main.ONOSbench.isup( main.ONOSip[ i ] )
-            utilities.assert_equals( expect=main.TRUE, actual=isUp,
-                                 onpass="ONOS service is ready",
-                                 onfail="ONOS service did not start properly" )
-        main.step( "Checking if ONOS CLI is ready" )
-        for i in range( main.numCtrls ):
-            main.CLIs[i].startCellCli()
-            cliResult = main.CLIs[i].startOnosCli( main.ONOSip[ i ],
-                                           commandlineTimeout=60, onosStartTimeout=100 )
-            utilities.assert_equals( expect=main.TRUE,
-                             actual=cliResult,
-                             onpass="ONOS CLI is ready",
-                             onfail="ONOS CLI is not ready" )
-        for i in range( 10 ):
-            ready = True
-            output = main.CLIs[0].summary()
-            if not output:
-                ready = False
-            if ready:
-                break
-            time.sleep( 10 )
-        utilities.assert_equals( expect=True, actual=ready,
-                                 onpass="ONOS summary command succeded",
-                                 onfail="ONOS summary command failed" )
-        if not ready:
-            main.log.error( "ONOS startup failed!" )
-            main.cleanup()
-            main.exit()
-
-        main.step(" Check whether the flow count is bigger than 116" )
-        count =  utilities.retry( main.CLIs[0].checkFlowCount,
-                                  main.FALSE,
-                                  kwargs={'min':116},
-                                  attempts=10,
-                                  sleep=10 )
-        utilities.assertEquals( expect=True,
-                                actual=(count>0),
-                                onpass="Flow count looks correct: "+str(count),
-                                onfail="Flow count looks wrong: "+str(count) )
-
-        main.step( "Check connectivity after CLUSTER recovery" )
-        pa = main.Mininet1.pingall()
-        utilities.assert_equals( expect=main.TRUE, actual=pa,
-                                 onpass="Survived instance recovery successfully",
-                                 onfail="Did not survive recovery failure" )
-        main.ONOSbench.dumpFlows( main.ONOSip[0], main.logdir,
-                                  "flowsAfterCtrlFailure" + main.jsonFile)
-        main.ONOSbench.dumpGroups( main.ONOSip[0], main.logdir,
-                                   "groupsAfterCtrlFailure" + main.jsonFile)
-
-    def CASE10( self, main ):
-        '''
-            Report errors/warnings/exceptions
-        '''
-        main.case( "Logging test for " + main.jsonFile )
-        for i in range(main.numCtrls):
-            main.ONOSbench.onosStop( main.ONOSip[i] )
-        main.Mininet1.stopNet()
-        
-        main.ONOSbench.scp( main.ONOScli1 ,
-                                          "/opt/onos/log/karaf.log",
-                                          "/tmp/karaf.log",
-                                          direction="from" )
-        main.ONOSbench.cpLogsToDir("/tmp/karaf.log",main.logdir,
-                                   copyFileName="karaf.log."+main.jsonFile+str(len(main.json)))
-        #main.ONOSbench.logReport( main.ONOSip[ 0 ],
-        #                          [ "INFO" ],
-        #                          "a" )
-        #main.log.info("Error report: \n" )
-        main.ONOSbench.logReport( main.ONOSip[ 0 ],
-                                  [ "INFO",
-                                    "FOLLOWER",
-                                    "WARN",
-                                    "flow",
-                                    "ERROR",
-                                    "Except" ],
-                                  "s" )
+        main.cfgName = '2x2'
+        main.numCtrls = 3
+        run.installOnos(main)
+        run.startMininet(main, 'cord_fabric.py')
+        #pre-configured routing and bridging test
+        run.checkFlows(main, flowCount=116)
+        run.pingAll(main, 'CASE3')
+        #TODO Dynamic config of hosts in subnet
+        #TODO Dynamic config of host not in subnet
+        #TODO Dynamic config of vlan xconnect
+        #TODO Vrouter integration
+        #TODO Mcast integration
+        run.cleanup(main)
