Merge "Update HA Tests"
diff --git a/TestON/drivers/common/api/controller/onosrestdriver.py b/TestON/drivers/common/api/controller/onosrestdriver.py
old mode 100644
new mode 100755
index 08f541e..033353b
--- a/TestON/drivers/common/api/controller/onosrestdriver.py
+++ b/TestON/drivers/common/api/controller/onosrestdriver.py
@@ -1180,6 +1180,7 @@
                  udpDst="",
                  udpSrc="",
                  mpls="",
+                 priority=100,
                  ip="DEFAULT",
                  port="DEFAULT",
                  debug=False ):
@@ -1210,7 +1211,7 @@
             of the ONOS node
         """
         try:
-            flowJson = { "priority":100,
+            flowJson = {   "priority":priority,
                            "isPermanent":"true",
                            "timeout":0,
                            "deviceId":deviceId,
diff --git a/TestON/drivers/common/cli/emulator/scapyclidriver.py b/TestON/drivers/common/cli/emulator/scapyclidriver.py
index 456e565..f1457ea 100644
--- a/TestON/drivers/common/cli/emulator/scapyclidriver.py
+++ b/TestON/drivers/common/cli/emulator/scapyclidriver.py
@@ -624,7 +624,132 @@
             main.cleanup()
             main.exit()
 
-    def buildICMP( self, **kwargs ):
+    def buildSCTP( self, ipVersion=4, **kwargs ):
+        """
+        Build an SCTP frame
+
+        Will create a frame class with the given options. If a field is
+        left blank it will default to the below value unless it is
+        overwritten by the next frame.
+
+        NOTE: Some arguments require quotes around them. It's up to you to
+        know which ones and to add them yourself. Arguments with an asterisk
+        do not need quotes.
+
+        Options:
+        ipVersion - Either 4 (default) or 6, indicates what Internet Protocol
+                    frame to use to encapsulate into
+        Default frame:
+        ###[ SCTP ]###
+          sport= domain *
+          dport= domain *
+          tag = None
+          chksum = None
+
+        Returns main.TRUE or main.FALSE on error
+        """
+        try:
+            # Set the SCTP frame
+            cmd = 'sctp = SCTP( '
+            options = [ ]
+            for key, value in kwargs.iteritems( ):
+                options.append( str( key ) + "=" + str( value ) )
+            cmd += ", ".join( options )
+            cmd += ' )'
+            self.handle.sendline( cmd )
+            self.handle.expect( self.scapyPrompt )
+            if "Traceback" in self.handle.before:
+                # KeyError, SyntaxError, ...
+                main.log.error( "Error in sending command: " + self.handle.before )
+                return main.FALSE
+            if str( ipVersion ) is '4':
+                self.handle.sendline( "packet = ether/ip/sctp" )
+            elif str( ipVersion ) is '6':
+                self.handle.sendline( "packet = ether/ipv6/sctp" )
+            else:
+                main.log.error( "Unrecognized option for ipVersion, given " +
+                               repr( ipVersion ) )
+                return main.FALSE
+            self.handle.expect( self.scapyPrompt )
+            if "Traceback" in self.handle.before:
+                # KeyError, SyntaxError, ...
+                main.log.error( "Error in sending command: " + self.handle.before )
+                return main.FALSE
+            return main.TRUE
+        except pexpect.TIMEOUT:
+            main.log.exception( self.name + ": Command timed out" )
+            return main.FALSE
+        except pexpect.EOF:
+            main.log.exception( self.name + ": connection closed." )
+            main.cleanup( )
+            main.exit( )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup( )
+            main.exit( )
+
+    def buildARP( self, **kwargs ):
+        """
+        Build an ARP frame
+
+        Will create a frame class with the given options. If a field is
+        left blank it will default to the below value unless it is
+        overwritten by the next frame.
+
+        NOTE: Some arguments require quotes around them. It's up to you to
+        know which ones and to add them yourself. Arguments with an asterisk
+        do not need quotes.
+
+        Default frame:
+        ###[ ARP ]###
+        hwtype     : XShortField          = (1)
+        ptype      : XShortEnumField      = (2048)
+        hwlen      : ByteField            = (6)
+        plen       : ByteField            = (4)
+        op         : ShortEnumField       = (1)
+        hwsrc      : ARPSourceMACField    = (None)
+        psrc       : SourceIPField        = (None)
+        hwdst      : MACField             = ('00:00:00:00:00:00')
+        pdst       : IPField              = ('0.0.0.0')
+
+        Returns main.TRUE or main.FALSE on error
+        """
+        try:
+            # Set the ARP frame
+            cmd = 'arp = ARP( '
+            options = []
+            for key, value in kwargs.iteritems( ):
+                if isinstance( value, str ):
+                    value = '"' + value + '"'
+                options.append( str( key ) + "=" + str( value ) )
+            cmd += ", ".join( options )
+            cmd += ' )'
+            self.handle.sendline( cmd )
+            self.handle.expect( self.scapyPrompt )
+            if "Traceback" in self.handle.before:
+                # KeyError, SyntaxError, ...
+                main.log.error( "Error in sending command: " + self.handle.before )
+                return main.FALSE
+            self.handle.sendline( "packet = ether/arp" )
+            self.handle.expect( self.scapyPrompt )
+            if "Traceback" in self.handle.before:
+                # KeyError, SyntaxError, ...
+                main.log.error( "Error in sending command: " + self.handle.before )
+                return main.FALSE
+            return main.TRUE
+        except pexpect.TIMEOUT:
+            main.log.exception( self.name + ": Command timed out" )
+            return main.FALSE
+        except pexpect.EOF:
+            main.log.exception( self.name + ": connection closed." )
+            main.cleanup( )
+            main.exit( )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup( )
+            main.exit( )
+
+    def buildICMP( self, ipVersion=4, **kwargs ):
         """
         Build an ICMP frame
 
@@ -639,13 +764,24 @@
           id= 0x0
           seq= 0x0
 
+        Options:
+        ipVersion - Either 4 (default) or 6, indicates what Internet Protocol
+                    frame to use to encapsulate into
+
         Returns main.TRUE or main.FALSE on error
         """
         try:
             # Set the ICMP frame
-            cmd = 'icmp = ICMP( '
+            if str( ipVersion ) is '4':
+                cmd = 'icmp = ICMP( '
+            elif str( ipVersion ) is '6':
+                cmd = 'icmp6 = ICMPv6EchoReply( '
+            else:
+                main.log.error( "Unrecognized option for ipVersion, given " +
+                                repr( ipVersion ) )
+                return main.FALSE
             options = []
-            for key, value in kwargs.iteritems():
+            for key, value in kwargs.iteritems( ):
                 if isinstance( value, str ):
                     value = '"' + value + '"'
                 options.append( str( key ) + "=" + str( value ) )
@@ -657,7 +793,15 @@
                 # KeyError, SyntaxError, ...
                 main.log.error( "Error in sending command: " + self.handle.before )
                 return main.FALSE
-            self.handle.sendline( "packet = ether/ip/icmp" )
+
+            if str( ipVersion ) is '4':
+                self.handle.sendline( "packet = ether/ip/icmp" )
+            elif str( ipVersion ) is '6':
+                self.handle.sendline( "packet = ether/ipv6/icmp6" )
+            else:
+                main.log.error( "Unrecognized option for ipVersion, given " +
+                               repr( ipVersion ) )
+                return main.FALSE
             self.handle.expect( self.scapyPrompt )
             if "Traceback" in self.handle.before:
                 # KeyError, SyntaxError, ...
@@ -669,12 +813,12 @@
             return main.FALSE
         except pexpect.EOF:
             main.log.exception( self.name + ": connection closed." )
-            main.cleanup()
-            main.exit()
+            main.cleanup( )
+            main.exit( )
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
-            main.cleanup()
-            main.exit()
+            main.cleanup( )
+            main.exit( )
 
     def sendPacket( self, iface=None, packet=None, timeout=1 ):
         """
@@ -822,12 +966,15 @@
             main.exit()
         return self.handle.before
 
-    def updateSelf( self ):
+    def updateSelf( self, IPv6=False ):
         """
         Updates local MAC and IP fields
         """
         self.hostMac = self.getMac()
-        self.hostIp = self.getIp()
+        if IPv6:
+            self.hostIp = self.getIp( IPv6=True )
+        else:
+            self.hostIp = self.getIp()
 
     def getMac( self, ifaceName=None ):
         """
@@ -857,24 +1004,33 @@
             main.cleanup()
             main.exit()
 
-    def getIp( self, ifaceName=None ):
+    def getIp( self, ifaceName=None, IPv6=False ):
         """
         Save host's IP address
 
         Returns the IP of the first interface that is not a loopback device.
         If no IP could be found then it will return 0.0.0.0.
+
+        If IPv6 is equal to True, returns IPv6 of the first interface that is not a loopback device.
+        If no IPv6 could be found then it will return :: .
+
         """
         def getIPofInterface( ifaceName ):
             cmd = 'get_if_addr("' + str( ifaceName ) + '")'
+            if IPv6:
+                cmd = 'get_if_raw_addr6("' + str( ifaceName ) + '")'
             self.handle.sendline( cmd )
             self.handle.expect( self.scapyPrompt )
 
             pattern = r'(((2[0-5]|1[0-9]|[0-9])?[0-9]\.){3}((2[0-5]|1[0-9]|[0-9])?[0-9]))'
+            if IPv6:
+                pattern = r'(\\x([0-9]|[a-f]|[A-F])([0-9]|[a-f]|[A-F])){16}'
             match = re.search( pattern, self.handle.before )
             if match:
                 # NOTE: The command will return 0.0.0.0 if the iface doesn't exist
-                if match.group() == '0.0.0.0':
-                    main.log.warn( 'iface {0} has no IPv4 address'.format( ifaceName ) )
+                if IPv6 != True:
+                    if match.group() == '0.0.0.0':
+                        main.log.warn( 'iface {0} has no IPv4 address'.format( ifaceName ) )
                 return match.group()
             else:
                 return None
@@ -882,13 +1038,33 @@
             if not ifaceName:
                 # Get list of interfaces
                 ifList = self.getIfList()
-                for ifaceName in ifList:
-                    if ifaceName == "lo":
-                        continue
-                    ip = getIPofInterface( ifaceName )
-                    if ip != "0.0.0.0":
-                        return ip
-                return "0.0.0.0"
+                if IPv6:
+                    for ifaceName in ifList:
+                        if ifaceName == "lo":
+                            continue
+                        ip = getIPofInterface( ifaceName )
+                        if ip != None:
+                            newip =ip
+                            tmp = newip.split( "\\x" )
+                            ip = ""
+                            counter = 0
+                            for i in tmp:
+                                if i != "":
+                                    counter = counter + 1;
+                                    if counter % 2 == 0 and counter < 16:
+                                        ip = ip + i + ":"
+                                    else:
+                                        ip = ip + i
+                            return ip
+                    return "::"
+                else:
+                    for ifaceName in ifList:
+                        if ifaceName == "lo":
+                            continue
+                        ip = getIPofInterface( ifaceName )
+                        if ip != "0.0.0.0":
+                            return ip
+                    return "0.0.0.0"
             else:
                 return getIPofInterface( ifaceName )
 
diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
index 8eb26ae..0c0df3c 100755
--- a/TestON/drivers/common/cli/onosclidriver.py
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -446,7 +446,7 @@
         the onos> prompt. Use this function if you have
         a very specific command to send.
 
-        if noExit is True, TestON will not exit, but clean up
+        if noExit is True, TestON will not exit, and return None
 
         Warning: There are no sanity checking to commands
         sent using this method.
@@ -465,8 +465,11 @@
                         main.log.info( self.name + ": onos cli session reconnected." )
                     else:
                         main.log.error( self.name + ": reconnection failed." )
-                        main.cleanup()
-                        main.exit()
+                        if noExit:
+                            return None
+                        else:
+                            main.cleanup()
+                            main.exit()
                 else:
                     main.cleanup()
                     main.exit()
@@ -534,7 +537,6 @@
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             if noExit:
-                main.cleanup()
                 return None
             else:
                 main.cleanup()
@@ -542,7 +544,6 @@
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             if noExit:
-                main.cleanup()
                 return None
             else:
                 main.cleanup()
@@ -2234,12 +2235,13 @@
             main.cleanup()
             main.exit()
 
-    def checkIntentSummary( self, timeout=60 ):
+    def checkIntentSummary( self, timeout=60, noExit=True ):
         """
         Description:
             Check the number of installed intents.
         Optional:
             timeout - the timeout for pexcept
+            noExit - If noExit, TestON will not exit if any except.
         Return:
             Returns main.TRUE only if the number of all installed intents are the same as total intents number
             , otherwise, returns main.FALSE.
@@ -2249,7 +2251,7 @@
             cmd = "intents -s -j"
 
             # Check response if something wrong
-            response = self.sendline( cmd, timeout=timeout )
+            response = self.sendline( cmd, timeout=timeout, noExit=noExit )
             if response == None:
                 return main.FALSE
             response = json.loads( response )
@@ -2268,12 +2270,18 @@
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
-            main.cleanup()
-            main.exit()
+            if noExit:
+                return main.FALSE
+            else:
+                main.cleanup()
+                main.exit()
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
-            main.cleanup()
-            main.exit()
+            if noExit:
+                return main.FALSE
+            else:
+                main.cleanup()
+                main.exit()
         except pexpect.TIMEOUT:
             main.log.error( self.name + ": ONOS timeout" )
             return None
@@ -2316,7 +2324,8 @@
             main.exit()
 
     def checkFlowCount(self, min=0, timeout=60 ):
-        count = int(self.getTotalFlowsNum( timeout=timeout ))
+        count = self.getTotalFlowsNum( timeout=timeout )
+        count = int (count) if count else 0
         return count if (count > min) else False
 
     def checkFlowsState( self, isPENDING=True, timeout=60,noExit=False ):
@@ -2452,71 +2461,55 @@
             Get the number of ADDED flows.
         Return:
             The number of ADDED flows
+            Or return None if any exceptions
         """
 
         try:
             # get total added flows number
-            cmd = "flows -s|grep ADDED|wc -l"
-            totalFlows = self.sendline( cmd, timeout=timeout, noExit=noExit )
-
-            if totalFlows == None:
-                # if timeout, we will get total number of all flows, and subtract other states
-                states = ["PENDING_ADD", "PENDING_REMOVE", "REMOVED", "FAILED"]
-                checkedStates = []
+            cmd = "flows -c added"
+            rawFlows = self.sendline( cmd, timeout=timeout, noExit=noExit )
+            if rawFlows:
+                rawFlows = rawFlows.split("\n")
                 totalFlows = 0
-                statesCount = [0, 0, 0, 0]
-
-                # get total flows from summary
-                response = json.loads( self.sendline( "summary -j", timeout=timeout, noExit=noExit ) )
-                totalFlows = int( response.get("flows") )
-
-                for s in states:
-                    rawFlows = self.flows( state=s, timeout = timeout )
-                    if rawFlows == None:
-                        # if timeout, return the total flows number from summary command
-                        return totalFlows
-                    checkedStates.append( json.loads( rawFlows ) )
-
-                # Calculate ADDED flows number, equal total subtracts others
-                for i in range( len( states ) ):
-                    for c in checkedStates[i]:
-                        try:
-                            statesCount[i] += int( c.get( "flowCount" ) )
-                        except TypeError:
-                            main.log.exception( "Json object not as expected" )
-                    totalFlows = totalFlows - int( statesCount[i] )
-                    main.log.info( states[i] + " flows: " + str( statesCount[i] ) )
-
-                return totalFlows
-
-            return int(totalFlows)
+                for l in rawFlows:
+                    totalFlows += int(l.split("Count=")[1])
+            else:
+                main.log.error("Response not as expected!")
+                return None
+            return totalFlows
 
         except ( TypeError, ValueError ):
-            main.log.exception( "{}: Object not as expected: {!r}".format( self.name, rawFlows ) )
+            main.log.exception( "{}: Object not as expected!".format( self.name ) )
             return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
-            main.cleanup()
-            main.exit()
+            if not noExit:
+                main.cleanup()
+                main.exit()
+            return None
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
-            main.cleanup()
-            main.exit()
+            if not noExit:
+                main.cleanup()
+                main.exit()
+            return None
         except pexpect.TIMEOUT:
             main.log.error( self.name + ": ONOS timeout" )
             return None
 
-    def getTotalIntentsNum( self, timeout=60 ):
+    def getTotalIntentsNum( self, timeout=60, noExit = False ):
         """
         Description:
             Get the total number of intents, include every states.
+        Optional:
+            noExit - If noExit, TestON will not exit if any except.
         Return:
             The number of intents
         """
         try:
             cmd = "summary -j"
-            response = self.sendline( cmd, timeout=timeout )
+            response = self.sendline( cmd, timeout=timeout, noExit=noExit )
             if response == None:
                 return  -1
             response = json.loads( response )
@@ -2527,12 +2520,18 @@
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
-            main.cleanup()
-            main.exit()
+            if noExit:
+                return -1
+            else:
+                main.cleanup()
+                main.exit()
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
-            main.cleanup()
-            main.exit()
+            if noExit:
+                return -1
+            else:
+                main.cleanup()
+                main.exit()
 
     def intentsEventsMetrics( self, jsonFormat=True ):
         """
@@ -2814,9 +2813,12 @@
         """
         import json
         try:
-            topology = self.getTopology( self.topology() )
             summary = json.loads( self.summary() )
-
+        except ( TypeError, ValueError ):
+            main.log.exception( "{}: Object not as expected: {!r}".format( self.name, summary ) )
+            return main.ERROR
+        try:
+            topology = self.getTopology( self.topology() )
             if topology == {} or topology == None or summary == {} or summary == None:
                 return main.ERROR
             output = ""
diff --git a/TestON/tests/CHOTestMonkey/CHOTestMonkey.params b/TestON/tests/CHOTestMonkey/CHOTestMonkey.params
index 0805112..6c9ef4b 100644
--- a/TestON/tests/CHOTestMonkey/CHOTestMonkey.params
+++ b/TestON/tests/CHOTestMonkey/CHOTestMonkey.params
@@ -15,9 +15,10 @@
     # 50. Set FlowObjective to True
     # 51. Set FlowObjective to False
     # 60. Rebalance devices across controllers
-    # 70. Randomly generate events
+    # 70. Run randomly generated events
+    # 80. Replay events from log file
     # 90. Sleep for some time
-    # 100. Do something else
+    # 100. Do nothing
     # Sample sequence: 0,1,2,3,[10,30,21,31,10,32,21,33,50,10,30,21,31,10,32,21,33,51,40,60,10,30,21,31,10,32,21,33,50,10,30,21,31,10,32,21,33,51,41,60]*500,100
     <testcases>
         0,1,2,3,70
@@ -391,6 +392,12 @@
         <deviceDownWeight>2</deviceDownWeight>
     </CASE70>
 
+    <CASE80>
+        <filePath>/home/admin/log-for-replay</filePath>
+        <sleepTime>0.1</sleepTime>
+        <skipChecks>on</skipChecks>
+    </CASE80>
+
     <CASE90>
         <sleepSec>60</sleepSec>
     </CASE90>
diff --git a/TestON/tests/CHOTestMonkey/CHOTestMonkey.py b/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
index 42c0ff7..8937a4a 100644
--- a/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
+++ b/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
@@ -794,7 +794,7 @@
                 events.append( 'device-down' )
             for i in range( int( pow( hostIntentNum, 1.5 ) / 100 ) ):
                 events.append( 'del-host-intent' )
-            for i in range( int( pow( pointIntentNum/2, 1.5 ) / 100 ) ):
+            for i in range( int( pow( pointIntentNum, 1.5 ) / 100 ) ):
                 events.append( 'del-point-intent' )
             for i in range( pow( 2, downLinkNum ) - 1 ):
                 events.append( 'link-up' )
@@ -819,13 +819,13 @@
                 for i in range( n ):
                     cliIndex = random.sample( upControllers, 1 )[ 0 ]
                     main.eventGenerator.triggerEvent( EventType().APP_INTENT_POINT_ADD, EventScheduleMethod().RUN_BLOCK, 'random', 'random', cliIndex, 'bidirectional' )
-                    pointIntentNum += 1
+                    pointIntentNum += 2
             elif event == 'del-point-intent':
-                n = random.randint( 5, pointIntentNum )
+                n = random.randint( 5, pointIntentNum / 2 )
                 for i in range( n ):
                     cliIndex = random.sample( upControllers, 1 )[ 0 ]
                     main.eventGenerator.triggerEvent( EventType().APP_INTENT_POINT_DEL, EventScheduleMethod().RUN_BLOCK, 'random', 'random', cliIndex, 'bidirectional' )
-                    pointIntentNum -= 1
+                    pointIntentNum -= 2
             elif event == 'link-down':
                 main.eventGenerator.triggerEvent( EventType().NETWORK_LINK_DOWN, EventScheduleMethod().RUN_BLOCK, 'random', 'random' )
                 downLinkNum += 1
@@ -855,6 +855,45 @@
                                  onfail="Randomly generate events test failed" )
         time.sleep( main.caseSleep )
 
+    def CASE80( self, main ):
+        """
+        Replay events from log file
+        """
+        import time
+        from tests.CHOTestMonkey.dependencies.events.Event import EventType
+        from tests.CHOTestMonkey.dependencies.EventScheduler import EventScheduleMethod
+
+        main.log.report( "Replay events from log file" )
+        main.log.report( "__________________________________________________" )
+        main.case( "Replay events from log file" )
+        main.step( "Replay events from log file" )
+        main.caseResult = main.TRUE
+        try:
+            f = open( main.params[ 'CASE80' ][ 'filePath' ], 'r' )
+            for line in f.readlines():
+                if 'CHOTestMonkey' in line and 'Event recorded' in line:
+                    line = line.split()
+                    eventIndex = int( line[ 9 ] )
+                    eventName = line[ 10 ]
+                    args = line[ 11: ]
+                    assert eventName.startswith( 'CHECK' )\
+                    or eventName.startswith( 'NETWORK' )\
+                    or eventName.startswith( 'APP' )\
+                    or eventName.startswith( 'ONOS' )
+                    if main.params[ 'CASE80' ][ 'skipChecks' ] == 'on' and eventName.startswith( 'CHECK' ):
+                        continue
+                    with main.eventScheduler.idleCondition:
+                        while not main.eventScheduler.isIdle():
+                            main.eventScheduler.idleCondition.wait()
+                    main.eventGenerator.triggerEvent( eventIndex, EventScheduleMethod().RUN_BLOCK, *args )
+                    time.sleep( float( main.params[ 'CASE80' ][ 'sleepTime' ] ) )
+        except Exception as e:
+            print e
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=main.caseResult,
+                                 onpass="Replay from log file passed",
+                                 onfail="Replay from log file failed" )
+
     def CASE90( self, main ):
         """
         Sleep for some time
diff --git a/TestON/tests/CHOTestMonkey/dependencies/EventTrigger.py b/TestON/tests/CHOTestMonkey/dependencies/EventTrigger.py
index 0c3e0e0..27b8166 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/EventTrigger.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/EventTrigger.py
@@ -15,7 +15,7 @@
     address = ( host, port )
     conn = Client( address )
     request = []
-    request.append( 2 )
+    request.append( 1 )
     request.append( type )
     request.append( scheduleMethod )
     for arg in args:
@@ -23,7 +23,9 @@
     conn.send( request )
     response = conn.recv()
     while response == 11:
+        conn.close()
         time.sleep( 1 )
+        conn = Client( address )
         conn.send( request )
         response = conn.recv()
     if response == 10:
@@ -64,5 +66,19 @@
         else:
             pass
 
+def replayFromFile( filePath='/home/admin/event-list', sleepTime=1 ):
+    try:
+        f = open( filePath, 'r' )
+        for line in f.readlines():
+            event = line.split()
+            if event[ 3 ].startswith( 'CHECK' ):
+                continue
+            triggerEvent( event[ 3 ], 'RUN_BLOCK', *event[ 4: ] )
+            time.sleep( sleepTime )
+        f.close()
+    except Exception as e:
+        print e
+
 if __name__ == '__main__':
-    testLoop( 2 )
+    #testLoop( 2 )
+    replayFromFile()
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/AppEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/AppEvent.py
index 07c8cb6..4283ff6 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/AppEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/AppEvent.py
@@ -63,7 +63,7 @@
 
     def startEvent( self, args ):
         with self.eventLock:
-            main.log.info( "%s - starting event" % ( self.typeString ) )
+            #main.log.info( "%s - starting event" % ( self.typeString ) )
             if self.typeIndex == EventType().APP_INTENT_HOST_ADD or self.typeIndex == EventType().APP_INTENT_HOST_DEL:
                 if len( args ) < 3:
                     main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
@@ -138,6 +138,7 @@
                 intent.hostB == self.hostA and intent.hostA == self.hostB:
                     main.log.warn( self.typeString + " - find an exiting intent for the host pair, abort installation" )
                     return EventStates().ABORT
+            main.log.info( "Event recorded: {} {} {} {} {}".format( self.typeIndex, self.typeString, self.hostA.name, self.hostB.name, self.CLIIndex ) )
             controller = main.controllers[ self.CLIIndex - 1 ]
             with controller.CLILock:
                 id = controller.CLI.addHostIntent( self.hostA.id, self.hostB.id )
@@ -179,6 +180,7 @@
             if targetIntent == None:
                 main.log.warn( self.typeString + " - intent does not exist" )
                 return EventStates().FAIL
+            main.log.info( "Event recorded: {} {} {} {} {}".format( self.typeIndex, self.typeString, self.hostA.name, self.hostB.name, self.CLIIndex ) )
             controller = main.controllers[ self.CLIIndex - 1 ]
             with controller.CLILock:
                 result = controller.CLI.removeIntent( targetIntent.id, purge=True )
@@ -204,7 +206,7 @@
 
     def startEvent( self, args ):
         with self.eventLock:
-            main.log.info( "%s - starting event" % ( self.typeString ) )
+            #main.log.info( "%s - starting event" % ( self.typeString ) )
             if self.typeIndex == EventType().APP_INTENT_POINT_ADD or self.typeIndex == EventType().APP_INTENT_POINT_DEL:
                 if len( args ) < 3:
                     main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
@@ -290,6 +292,7 @@
                 if intent.deviceA == self.deviceA and intent.deviceB == self.deviceB:
                     main.log.warn( self.typeString + " - find an exiting intent for the device pair, abort installation" )
                     return EventStates().ABORT
+            main.log.info( "Event recorded: {} {} {} {} {}".format( self.typeIndex, self.typeString, self.deviceA.name, self.deviceB.name, self.CLIIndex ) )
             controller = main.controllers[ self.CLIIndex - 1 ]
             with controller.CLILock:
                 srcMAC = ""
@@ -336,6 +339,7 @@
             if targetIntent == None:
                 main.log.warn( self.typeString + " - intent does not exist" )
                 return EventStates().FAIL
+            main.log.info( "Event recorded: {} {} {} {} {}".format( self.typeIndex, self.typeString, self.deviceA.name, self.deviceB.name, self.CLIIndex ) )
             controller = main.controllers[ self.CLIIndex - 1 ]
             with controller.CLILock:
                 result = controller.CLI.removeIntent( targetIntent.id, purge=True )
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
index fcbf23d..fa42e12 100755
--- a/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
@@ -13,7 +13,7 @@
 
     def startEvent( self, args ):
         with self.eventLock:
-            main.log.info( "%s - starting event" % ( self.typeString ) )
+            main.log.info( "Event recorded: {} {}".format( self.typeIndex, self.typeString ) )
             result = self.startCheckEvent()
             return result
 
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py
index 8ec62a1..ccab8a1 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py
@@ -19,7 +19,7 @@
         args are the names of the two link ends, e.g. ['s1', 's2']
         """
         with self.eventLock:
-            main.log.info( "%s - starting event" % ( self.typeString ) )
+            #main.log.info( "%s - starting event" % ( self.typeString ) )
             if len( args ) < 2:
                 main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
                 return EventStates().ABORT
@@ -84,6 +84,7 @@
             elif self.linkA.isRemoved() or self.linkB.isRemoved():
                 main.log.warn( "Link Down - link has been removed" )
                 return EventStates().ABORT
+        main.log.info( "Event recorded: {} {} {} {}".format( self.typeIndex, self.typeString, self.linkA.deviceA.name, self.linkA.deviceB.name ) )
         with main.mininetLock:
             '''
             result = main.Mininet1.link( END1=self.linkA.deviceA.name,
@@ -118,6 +119,7 @@
             if self.linkA.isRemoved() or self.linkB.isRemoved():
                 main.log.warn( "Link Up - link has been removed" )
                 return EventStates().ABORT
+        main.log.info( "Event recorded: {} {} {} {}".format( self.typeIndex, self.typeString, self.linkA.deviceA.name, self.linkA.deviceB.name ) )
         with main.mininetLock:
             '''
             result = main.Mininet1.link( END1=self.linkA.deviceA.name,
@@ -147,7 +149,7 @@
         args are the names of the device, e.g. 's1'
         """
         with self.eventLock:
-            main.log.info( "%s - starting event" % ( self.typeString ) )
+            #main.log.info( "%s - starting event" % ( self.typeString ) )
             if len( args ) < 1:
                 main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
                 return EventStates().ABORT
@@ -199,6 +201,7 @@
             if self.device.isRemoved():
                 main.log.warn( "Device Down - device has been removed" )
                 return EventStates().ABORT
+        main.log.info( "Event recorded: {} {} {}".format( self.typeIndex, self.typeString, self.device.name ) )
         with main.mininetLock:
             result = main.Mininet1.delSwitch( self.device.name )
         if not result:
@@ -232,6 +235,7 @@
                 main.log.warn( "Device Up - device already up" )
                 return EventStates().ABORT
         # Re-add the device
+        main.log.info( "Event recorded: {} {} {}".format( self.typeIndex, self.typeString, self.device.name ) )
         with main.mininetLock:
             result = main.Mininet1.addSwitch( self.device.name, dpid=self.device.dpid[3:] )
         if not result:
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/ONOSEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/ONOSEvent.py
index f4e2a89..28960d2 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/ONOSEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/ONOSEvent.py
@@ -11,7 +11,7 @@
 
     def startEvent( self, args ):
         with self.eventLock:
-            main.log.info( "%s - starting event" % ( self.typeString ) )
+            #main.log.info( "%s - starting event" % ( self.typeString ) )
             result = EventStates().PASS
             if self.typeIndex == EventType().ONOS_ONOS_DOWN or self.typeIndex == EventType().ONOS_ONOS_UP:
                 if len( args ) < 1:
@@ -42,6 +42,7 @@
             if not main.controllers[ self.ONOSIndex - 1 ].isUp():
                 main.log.warn( "ONOS Down - ONOS already down" )
                 return EventStates().ABORT
+        main.log.info( "Event recorded: {} {} {}".format( self.typeIndex, self.typeString, self.ONOSIndex ) )
         with main.ONOSbenchLock:
             result = main.ONOSbench.onosStop( main.controllers[ self.ONOSIndex - 1 ].ip )
         if not result:
@@ -63,6 +64,7 @@
             if main.controllers[ self.ONOSIndex - 1 ].isUp():
                 main.log.warn( "ONOS Up - ONOS already up" )
                 return EventStates().ABORT
+        main.log.info( "Event recorded: {} {} {}".format( self.typeIndex, self.typeString, self.ONOSIndex ) )
         with main.ONOSbenchLock:
             startResult = main.ONOSbench.onosStart( main.controllers[ self.ONOSIndex - 1 ].ip )
         if not startResult:
@@ -92,7 +94,7 @@
 
     def startEvent( self, args ):
         with self.eventLock:
-            main.log.info( "%s - starting event" % ( self.typeString ) )
+            #main.log.info( "%s - starting event" % ( self.typeString ) )
             result = self.startCfgEvent( args )
             return result
 
@@ -121,6 +123,7 @@
         if index == -1:
             main.log.warn( "%s - No available controllers" %s ( self.typeString ) )
             return EventStates().ABORT
+        main.log.info( "Event recorded: {} {} {} {} {}".format( self.typeIndex, self.typeString, self.component, self.propName, self.value ) )
         controller = main.controllers[ index - 1 ]
         with controller.CLILock:
             result = controller.CLI.setCfg( component=self.component,
@@ -158,6 +161,7 @@
         if index == -1:
             main.log.warn( "%s - No available controllers" %s ( self.typeString ) )
             return EventStates().ABORT
+        main.log.info( "Event recorded: {} {} {} {} {}".format( self.typeIndex, self.typeString, self.component, self.propName, self.value ) )
         controller = main.controllers[ index - 1 ]
         with controller.CLILock:
             result = controller.CLI.setCfg( component=self.component,
@@ -184,6 +188,7 @@
             if index == -1:
                 main.log.warn( "%s - No available controllers" %s ( self.typeString ) )
                 return EventStates().ABORT
+            main.log.info( "Event recorded: {} {}".format( self.typeIndex, self.typeString ) )
             controller = main.controllers[ index - 1 ]
             with controller.CLILock:
                 result = controller.CLI.balanceMasters()
diff --git a/TestON/tests/FUNC/FUNCflow/FUNCflow.params b/TestON/tests/FUNC/FUNCflow/FUNCflow.params
index aa7c358..c0ce79f 100755
--- a/TestON/tests/FUNC/FUNCflow/FUNCflow.params
+++ b/TestON/tests/FUNC/FUNCflow/FUNCflow.params
@@ -1,21 +1,27 @@
 
 <PARAMS>
     # CASE - Descritpion
-    # 1,2,10,1000,1100,2000,1200,2000,100
+    # Openflow 1.0: 1,2,10,1000,3000,1100,3000,1400,3000,1600,3000,1700,100
+    # Openflow 1.3: 1,2,10,1000,3000,1100,3000,1200,3000,1300,3000,1400,3000,1500,3000,1600,3000,1700,3000,1800,3000,1900,3000,2000,100
     # 1 - Variable initialization and optional pull and build ONOS package
     # 2 - install ONOS
     # 10 - Start mininet and verify topology
     # 66 - Testing Scapy
     # 100 - Check logs for Errors and Warnings
     # 1000 - Add flows with MAC selector
-    # 1100 - Add flows with IPv4 selector
-    # 1200 - Add flows with VLAN selector
+    # 1100 - Add flows with VLAN selector
+    # 1200 - Add flows with ARP selector
     # 1300 - Add flows with MPLS selector
-    # 1400 - Add flows with TCP selectors
-    # 1500 - Add flows with UDP selectors
-    # 2000 - Delete flows
+    # 1400 - Add flows with IPv4 selector
+    # 1500 - Add flows with IPv6 selector
+    # 1600 - Add flows with UDP selector
+    # 1700 - Add flows with TCP selector
+    # 1800 - Add flows with SCTP selector
+    # 1900 - Add flows with ICMPv4 selector
+    # 2000 - Add flows with ICMPv6 selector
+    # 3000 - Delete flows
 
-    <testcases>1,2,10,1000,2000,1100,2000,1200,2000,1300,2000,1400,2000,1500,100</testcases>
+    <testcases>1,2,10,1000,3000,1100,3000,1200,3000,1300,3000,1400,3000,1500,3000,1600,3000,1700,3000,1800,3000,1900,3000,2000,100</testcases>
 
     <SCALE>
         <max>1</max>
@@ -49,9 +55,16 @@
         <mpls>22</mpls>
         <tcpDst>40001</tcpDst>
         <udpDst>40051</udpDst>
+        <sctpDst>40001</sctpDst>
         <ip4Type>2048</ip4Type>
+        <ip6Type>34525</ip6Type>
+        <arpType>2054</arpType>
         <tcpProto>6</tcpProto>
         <udpProto>17</udpProto>
+        <sctpProto>132</sctpProto>
+        <icmpProto>1</icmpProto>
+        <icmp6Proto>58</icmp6Proto>
+        <sctpProto>132</sctpProto>
         <vlanType>33024</vlanType>
         <mplsType>34887</mplsType>
         <swDPID>of:0000000000000001</swDPID>
diff --git a/TestON/tests/FUNC/FUNCflow/FUNCflow.py b/TestON/tests/FUNC/FUNCflow/FUNCflow.py
index eeed451..80bd618 100644
--- a/TestON/tests/FUNC/FUNCflow/FUNCflow.py
+++ b/TestON/tests/FUNC/FUNCflow/FUNCflow.py
@@ -4,7 +4,6 @@
         self.default = ''
 
     def CASE1( self, main ):
-        import time
         import os
         import imp
 
@@ -20,7 +19,6 @@
 
         main.case( "Constructing test variables and building ONOS package" )
         main.step( "Constructing test variables" )
-        stepResult = main.FALSE
 
         # Test variables
         main.testOnDirectory = os.path.dirname( os.getcwd ( ) )
@@ -39,15 +37,15 @@
         main.startMNSleep = int( main.params[ 'SLEEP' ][ 'startMN' ] )
         main.addFlowSleep = int( main.params[ 'SLEEP' ][ 'addFlow' ] )
         main.delFlowSleep = int( main.params[ 'SLEEP' ][ 'delFlow' ] )
-        main.debug = main.params['DEBUG']
+        main.debug = main.params[ 'DEBUG' ]
         main.swDPID = main.params[ 'TEST' ][ 'swDPID' ]
-        main.cellData = {} # for creating cell file
-        main.CLIs = []
-        main.ONOSip = []
+        main.cellData = { } # for creating cell file
+        main.CLIs = [ ]
+        main.ONOSip = [ ]
 
         main.debug = True if "on" in main.debug else False
 
-        main.ONOSip = main.ONOSbench.getOnosIps()
+        main.ONOSip = main.ONOSbench.getOnosIps( )
 
         # Assigning ONOS cli handles to a list
         for i in range( 1,  main.maxNodes + 1 ):
@@ -66,10 +64,16 @@
 
 
         copyResult = main.ONOSbench.scp( main.Mininet1,
-                                         main.dependencyPath+main.topology,
-                                         main.Mininet1.home+'/custom/',
+                                         main.dependencyPath + main.topology,
+                                         main.Mininet1.home + '/custom/',
                                          direction="to" )
 
+        utilities.assert_equals( expect=main.TRUE,
+                                actual=copyResult,
+                                onpass="Successfully copy " + "test variables ",
+                                onfail="Failed to copy test variables" )
+
+
         if main.CLIs:
             stepResult = main.TRUE
         else:
@@ -78,8 +82,7 @@
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
-                                 onpass="Successfully construct " +
-                                        "test variables ",
+                                 onpass="Successfully construct " + "test variables ",
                                  onfail="Failed to construct test variables" )
 
         if gitPull == 'True':
@@ -88,10 +91,8 @@
             stepResult = onosBuildResult
             utilities.assert_equals( expect=main.TRUE,
                                      actual=stepResult,
-                                     onpass="Successfully compiled " +
-                                            "latest ONOS",
-                                     onfail="Failed to compile " +
-                                            "latest ONOS" )
+                                     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" )
@@ -108,6 +109,7 @@
         - Install ONOS cluster
         - Connect to cli
         """
+        import time
 
         main.numCtrls = int( main.maxNodes )
 
@@ -123,9 +125,9 @@
 
         main.log.info( "NODE COUNT = " + str( main.numCtrls ) )
 
-        tempOnosIp = []
+        tempOnosIp = [ ]
         for i in range( main.numCtrls ):
-            tempOnosIp.append( main.ONOSip[i] )
+            tempOnosIp.append( main.ONOSip[ i ] )
 
         main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
                                        "temp",
@@ -135,16 +137,15 @@
 
         main.step( "Apply cell to environment" )
         cellResult = main.ONOSbench.setCell( "temp" )
-        verifyResult = main.ONOSbench.verifyCell()
+        verifyResult = main.ONOSbench.verifyCell( )
         stepResult = cellResult and verifyResult
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
-                                 onpass="Successfully applied cell to " + \
-                                        "environment",
+                                 onpass="Successfully applied cell to " + "environment",
                                  onfail="Failed to apply cell to environment " )
 
         main.step( "Creating ONOS package" )
-        packageResult = main.ONOSbench.onosPackage()
+        packageResult = main.ONOSbench.onosPackage( )
         stepResult = packageResult
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -156,7 +157,7 @@
         onosUninstallResult = main.TRUE
         for ip in main.ONOSip:
             onosUninstallResult = onosUninstallResult and \
-                    main.ONOSbench.onosUninstall( nodeIp=ip )
+                    main.ONOSbench.onosUninstall( nodeIp = ip )
         stepResult = onosUninstallResult
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -167,7 +168,7 @@
         onosInstallResult = main.TRUE
         for i in range( main.numCtrls ):
             onosInstallResult = onosInstallResult and \
-                    main.ONOSbench.onosInstall( node=main.ONOSip[ i ] )
+                    main.ONOSbench.onosInstall( node = main.ONOSip[ i ] )
         stepResult = onosInstallResult
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -222,7 +223,7 @@
 
         main.step( "Setup Mininet Topology" )
         topology = main.Mininet1.home + '/custom/' + main.topology
-        stepResult = main.Mininet1.startNet( topoFile=topology )
+        stepResult = main.Mininet1.startNet( topoFile = topology )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -241,18 +242,14 @@
 
         main.step( "Comparing MN topology to ONOS topology" )
         main.log.info( "Gathering topology information" )
-        devicesResults = main.TRUE
-        linksResults = main.TRUE
-        hostsResults = main.TRUE
         devices = main.topo.getAllDevices( main )
         hosts = main.topo.getAllHosts( main )
         ports = main.topo.getAllPorts( main )
         links = main.topo.getAllLinks( main )
-        clusters = main.topo.getAllClusters( main )
 
-        mnSwitches = main.Mininet1.getSwitches()
-        mnLinks = main.Mininet1.getLinks()
-        mnHosts = main.Mininet1.getHosts()
+        mnSwitches = main.Mininet1.getSwitches( )
+        mnLinks = main.Mininet1.getLinks( )
+        mnHosts = main.Mininet1.getHosts( )
 
         for controller in range( main.numCtrls ):
             controllerStr = str( controller + 1 )
@@ -307,32 +304,32 @@
         main.step( "Creating Host1 component" )
         main.Scapy.createHostComponent( "h1" )
         main.Scapy.createHostComponent( "h2" )
-        hosts = [main.h1, main.h2]
+        hosts = [ main.h1, main.h2 ]
         for host in hosts:
-            host.startHostCli()
-            host.startScapy()
-            host.updateSelf()
+            host.startHostCli( )
+            host.startScapy( )
+            host.updateSelf( )
             main.log.debug( host.name )
             main.log.debug( host.hostIp )
             main.log.debug( host.hostMac )
 
         main.step( "Sending/Receiving Test packet - Filter doesn't match" )
         main.log.info( "Starting Filter..." )
-        main.h2.startFilter()
+        main.h2.startFilter( )
         main.log.info( "Building Ether frame..." )
         main.h1.buildEther( dst=main.h2.hostMac )
         main.log.info( "Sending Packet..." )
         main.h1.sendPacket( )
         main.log.info( "Checking Filter..." )
-        finished = main.h2.checkFilter()
+        finished = main.h2.checkFilter( )
         main.log.debug( finished )
         i = ""
         if finished:
-            a = main.h2.readPackets()
-            for i in a.splitlines():
+            a = main.h2.readPackets( )
+            for i in a.splitlines( ):
                 main.log.info( i )
         else:
-            kill = main.h2.killFilter()
+            kill = main.h2.killFilter( )
             main.log.debug( kill )
             main.h2.handle.sendline( "" )
             main.h2.handle.expect( main.h2.scapyPrompt )
@@ -343,18 +340,18 @@
                                  onfail="Fail" )
 
         main.step( "Sending/Receiving Test packet - Filter matches" )
-        main.h2.startFilter()
+        main.h2.startFilter( )
         main.h1.buildEther( dst=main.h2.hostMac )
         main.h1.buildIP( dst=main.h2.hostIp )
         main.h1.sendPacket( )
-        finished = main.h2.checkFilter()
+        finished = main.h2.checkFilter( )
         i = ""
         if finished:
-            a = main.h2.readPackets()
-            for i in a.splitlines():
+            a = main.h2.readPackets( )
+            for i in a.splitlines( ):
                 main.log.info( i )
         else:
-            kill = main.h2.killFilter()
+            kill = main.h2.killFilter( )
             main.log.debug( kill )
             main.h2.handle.sendline( "" )
             main.h2.handle.expect( main.h2.scapyPrompt )
@@ -368,9 +365,9 @@
 
         main.step( "Clean up host components" )
         for host in hosts:
-            host.stopScapy()
-        main.Mininet1.removeHostComponent("h1")
-        main.Mininet1.removeHostComponent("h2")
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h1" )
+        main.Mininet1.removeHostComponent( "h2" )
 
     def CASE1000( self, main ):
         '''
@@ -389,12 +386,11 @@
         main.log.info( "Creating host components" )
         main.Scapy.createHostComponent( "h1" )
         main.Scapy.createHostComponent( "h2" )
-        hosts = [main.h1, main.h2]
-        stepResult = main.TRUE
+        hosts = [ main.h1, main.h2 ]
         for host in hosts:
-            host.startHostCli()
-            host.startScapy()
-            host.updateSelf()
+            host.startHostCli( )
+            host.startScapy( )
+            host.updateSelf( )
 
         # Add a flow that connects host1 on port1 to host2 on port2
         # send output on port2
@@ -424,21 +420,21 @@
 
         main.log.info( "Get the flows from ONOS" )
         try:
-            flows = json.loads( main.ONOSrest.flows() )
+            flows = json.loads( main.ONOSrest.flows( ) )
 
             stepResult = main.TRUE
             for f in flows:
-                if "rest" in f.get("appId"):
-                    if "ADDED" not in f.get("state"):
+                if "rest" in f.get( "appId" ):
+                    if "ADDED" not in f.get( "state" ):
                         stepResult = main.FALSE
-                        main.log.error( "Flow: %s in state: %s" % (f.get("id"), f.get("state")) )
+                        main.log.error( "Flow: %s in state: %s" % ( f.get( "id" ), f.get( "state" ) ) )
         except TypeError:
             main.log.error( "No Flows found by the REST API" )
             stepResult = main.FALSE
         except ValueError:
             main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
-            main.cleanup()
-            main.exit()
+            main.cleanup( )
+            main.exit( )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -449,10 +445,10 @@
 
         # get the flow IDs that were added through rest
         main.log.info( "Getting the flow IDs from ONOS" )
-        flowIds = [ f.get("id") for f in flows if "rest" in f.get("appId") ]
+        flowIds = [ f.get( "id" ) for f in flows if "rest" in f.get( "appId" ) ]
         # convert the flowIDs to ints then hex and finally back to strings
-        flowIds = [str(hex(int(x))) for x in flowIds]
-        main.log.info( "ONOS flow IDs: {}".format(flowIds) )
+        flowIds = [ str( hex( int( x ) ) ) for x in flowIds ]
+        main.log.info( "ONOS flow IDs: {}".format( flowIds ) )
 
         stepResult = main.Mininet1.checkFlowId( "s1", flowIds, debug=False )
 
@@ -472,29 +468,30 @@
         # NOTE: I believe it doesn't matter which host name it is,
         # as long as the src and dst are both specified
         main.log.info( "Starting filter on host2" )
-        main.h2.startFilter( pktFilter="ether host %s" % main.h1.hostMac)
+        main.h2.startFilter( pktFilter="ether host %s" % main.h1.hostMac )
 
         main.log.info( "Sending packet to host2" )
         main.h1.sendPacket()
 
         main.log.info( "Checking filter for our packet" )
-        stepResult = main.h2.checkFilter()
+        stepResult = main.h2.checkFilter( )
         if stepResult:
-            main.log.info( "Packet: %s" % main.h2.readPackets() )
-        else: main.h2.killFilter()
+            main.log.info( "Packet: %s" % main.h2.readPackets( ) )
+        else:
+            main.h2.killFilter( )
 
         main.log.info( "Clean up host components" )
         for host in hosts:
-            host.stopScapy()
-        main.Mininet1.removeHostComponent("h1")
-        main.Mininet1.removeHostComponent("h2")
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h1" )
+        main.Mininet1.removeHostComponent( "h2" )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass="Successfully sent a packet",
                                  onfail="Failed to send a packet" )
 
-    def CASE1100( self, main ):
+    def CASE1400( self, main ):
         '''
             Add flows with IPv4 selectors and verify the flows
         '''
@@ -503,7 +500,7 @@
 
         main.case( "Verify flow IP selectors are correctly compiled" )
         main.caseExplanation = "Install two flows with only IP selectors " +\
-                "specified, then verify flows are added in ONOS, finally "+\
+                "specified, then verify flows are added in ONOS, finally " +\
                 "send a packet that only specifies the IP src and dst."
 
         main.step( "Add flows with IPv4 addresses as the only selectors" )
@@ -511,12 +508,11 @@
         main.log.info( "Creating host components" )
         main.Scapy.createHostComponent( "h1" )
         main.Scapy.createHostComponent( "h2" )
-        hosts = [main.h1, main.h2]
-        stepResult = main.TRUE
+        hosts = [ main.h1, main.h2 ]
         for host in hosts:
-            host.startHostCli()
-            host.startScapy()
-            host.updateSelf()
+            host.startHostCli( )
+            host.startScapy( )
+            host.updateSelf( )
 
         # Add a flow that connects host1 on port1 to host2 on port2
         # send output on port2
@@ -524,16 +520,16 @@
         egress = 2
         ingress = 1
         # IPv4 etherType = 0x800
-        IPv4=2048
+        ethType = main.params[ 'TEST' ][ 'ip4Type' ]
 
         # Add flows that connects host1 to host2
         main.log.info( "Add flow with port ingress 1 to port egress 2" )
         stepResult = main.ONOSrest.addFlow( deviceId=main.swDPID,
                                             egressPort=egress,
                                             ingressPort=ingress,
-                                            ethType=IPv4,
-                                            ipSrc=("IPV4_SRC", main.h1.hostIp+"/32"),
-                                            ipDst=("IPV4_DST", main.h2.hostIp+"/32"),
+                                            ethType=ethType,
+                                            ipSrc=( "IPV4_SRC", main.h1.hostIp+"/32" ),
+                                            ipDst=( "IPV4_DST", main.h2.hostIp+"/32" ),
                                             debug=main.debug )
 
         utilities.assert_equals( expect=main.TRUE,
@@ -548,21 +544,21 @@
 
         main.log.info( "Get the flows from ONOS" )
         try:
-            flows = json.loads( main.ONOSrest.flows() )
+            flows = json.loads( main.ONOSrest.flows( ) )
 
             stepResult = main.TRUE
             for f in flows:
-                if "rest" in f.get("appId"):
-                    if "ADDED" not in f.get("state"):
+                if "rest" in f.get( "appId" ):
+                    if "ADDED" not in f.get( "state" ):
                         stepResult = main.FALSE
-                        main.log.error( "Flow: %s in state: %s" % (f.get("id"), f.get("state")) )
+                        main.log.error( "Flow: %s in state: %s" % ( f.get( "id" ), f.get( "state" ) ) )
         except TypeError:
             main.log.error( "No Flows found by the REST API" )
             stepResult = main.FALSE
         except ValueError:
             main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
-            main.cleanup()
-            main.exit()
+            main.cleanup( )
+            main.exit( )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -573,10 +569,10 @@
 
         # get the flow IDs that were added through rest
         main.log.info( "Getting the flow IDs from ONOS" )
-        flowIds = [ f.get("id") for f in flows if "rest" in f.get("appId") ]
+        flowIds = [ f.get( "id" ) for f in flows if "rest" in f.get( "appId" ) ]
         # convert the flowIDs to ints then hex and finally back to strings
-        flowIds = [str(hex(int(x))) for x in flowIds]
-        main.log.info( "ONOS flow IDs: {}".format(flowIds) )
+        flowIds = [ str( hex( int( x ) ) ) for x in flowIds ]
+        main.log.info( "ONOS flow IDs: {}".format( flowIds ) )
 
         stepResult = main.Mininet1.checkFlowId( "s1", flowIds, debug=False )
 
@@ -594,29 +590,151 @@
 
         main.log.info( "Starting filter on host2" )
         # Defaults to ip
-        main.h2.startFilter()
+        main.h2.startFilter( )
 
         main.log.info( "Sending packet to host2" )
-        main.h1.sendPacket()
+        main.h1.sendPacket( )
 
         main.log.info( "Checking filter for our packet" )
-        stepResult = main.h2.checkFilter()
+        stepResult = main.h2.checkFilter( )
         if stepResult:
-            main.log.info( "Packet: %s" % main.h2.readPackets() )
-        else: main.h2.killFilter()
+            main.log.info( "Packet: %s" % main.h2.readPackets( ) )
+        else: main.h2.killFilter( )
 
         main.log.info( "Clean up host components" )
         for host in hosts:
-            host.stopScapy()
-        main.Mininet1.removeHostComponent("h1")
-        main.Mininet1.removeHostComponent("h2")
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h1" )
+        main.Mininet1.removeHostComponent( "h2" )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass="Successfully sent a packet",
                                  onfail="Failed to send a packet" )
 
-    def CASE1200( self, main ):
+    def CASE1500 (self, main ):
+        """
+        Add flow with IPv6 selector and verify the flow
+        """
+        import json
+        import time
+        main.case( "Verify IPv6 selector is correctly compiled" )
+        main.caseExplanation = "Install two flows with only IP selectors " + \
+                               "specified, then verify flows are added in ONOS, finally " + \
+                               "send a packet that only specifies the IP src and dst."
+
+        main.step( "Add flows with IPv6 addresses as the only selectors" )
+
+        main.log.info( "Creating host components" )
+        main.Scapy.createHostComponent( "h5" )
+        main.Scapy.createHostComponent( "h6" )
+        hosts = [ main.h5, main.h6 ]
+
+        for host in hosts:
+            host.startHostCli( )
+            host.startScapy( )
+            host.updateSelf( IPv6=True )
+
+        # Add a flow that connects host1 on port1 to host2 on port2
+        # send output on port2
+        # recieve input on port1
+        egress = 6
+        ingress = 5
+        # IPv6 etherType = 0x86DD
+        ethType = main.params[ 'TEST' ][ 'ip6Type' ]
+
+        # Add flows that connects host1 to host2
+        main.log.info( "Add flow with port ingress 5 to port egress 6" )
+        stepResult = main.ONOSrest.addFlow( deviceId=main.swDPID,
+                                            egressPort=egress,
+                                            ingressPort=ingress,
+                                            ethType=ethType,
+                                            ipSrc=( "IPV6_SRC", main.h5.hostIp + "/128" ),
+                                            ipDst=( "IPV6_DST", main.h6.hostIp + "/128" ),
+                                            debug=main.debug )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully added flows",
+                                 onfail="Failed add flows" )
+
+        # Giving ONOS time to add the flow
+        time.sleep( main.addFlowSleep )
+
+        main.step( "Check flow is in the ADDED state" )
+
+        main.log.info( "Get the flows from ONOS" )
+        try:
+            flows = json.loads( main.ONOSrest.flows( ) )
+
+            stepResult = main.TRUE
+            for f in flows:
+                if "rest" in f.get( "appId" ):
+                    if "ADDED" not in f.get( "state" ):
+                        stepResult = main.FALSE
+                        main.log.error( "Flow: %s in state: %s" % ( f.get( "id" ), f.get( "state" ) ) )
+        except TypeError:
+            main.log.error( "No Flows found by the REST API" )
+            stepResult = main.FALSE
+        except ValueError:
+            main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
+            main.cleanup( )
+            main.exit( )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in the ADDED state",
+                                 onfail="All flows are NOT in the ADDED state" )
+
+        main.step( "Check flows are in Mininet's flow table" )
+
+        # get the flow IDs that were added through rest
+        main.log.info( "Getting the flow IDs from ONOS" )
+        flowIds = [ f.get( "id" ) for f in flows if "rest" in f.get( "appId" ) ]
+        # convert the flowIDs to ints then hex and finally back to strings
+        flowIds = [ str( hex( int( x ) ) ) for x in flowIds ]
+        main.log.info( "ONOS flow IDs: {}".format( flowIds ) )
+
+        stepResult = main.Mininet1.checkFlowId( "s1", flowIds, debug=False )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in mininet",
+                                 onfail="All flows are NOT in mininet" )
+
+        main.step( "Send a packet to verify the flow is correct" )
+
+        main.log.info( "Constructing packet" )
+        # No need for the MAC src dst
+        main.h5.buildEther( dst=main.h6.hostMac )
+        main.h5.buildIPv6( src=main.h5.hostIp, dst=main.h6.hostIp )
+
+        main.log.info( "Starting filter on host6" )
+        # Defaults to ip
+        main.h6.startFilter( pktFilter="ip6" )
+        main.log.info( "Sending packet to host6" )
+        main.h5.sendPacket( )
+
+        main.log.info( "Checking filter for our packet" )
+        stepResult = main.h6.checkFilter( )
+        if stepResult:
+            main.log.info( "Packet: %s" % main.h6.readPackets( ) )
+        else:
+            main.h6.killFilter( )
+
+        main.log.info( "Clean up host components" )
+        for host in hosts:
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h5" )
+        main.Mininet1.removeHostComponent( "h6" )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully sent a packet",
+                                 onfail="Failed to send a packet" )
+
+
+    def CASE1100( self, main ):
         '''
             Add flow with VLAN selector and verify the flow
         '''
@@ -632,12 +750,11 @@
         main.log.info( "Creating host components" )
         main.Scapy.createHostComponent( "h3" )
         main.Scapy.createHostComponent( "h4" )
-        hosts = [main.h3, main.h4]
-        stepResult = main.TRUE
+        hosts = [ main.h3, main.h4 ]
         for host in hosts:
-            host.startHostCli()
-            host.startScapy()
-            host.updateSelf()
+            host.startHostCli( )
+            host.startScapy( )
+            host.updateSelf( )
 
 
         main.step( "Add a flow with the VLAN tag as the only selector" )
@@ -648,7 +765,7 @@
         egress = 4
         ingress = 3
         # VLAN ethType = 0x8100
-        ethType = 33024
+        ethType = main.params[ 'TEST' ][ 'vlanType' ]
 
         # Add only one flow because we don't need a response
         main.log.info( "Add flow with port ingress 1 to port egress 2" )
@@ -672,21 +789,21 @@
 
         main.log.info( "Get the flows from ONOS" )
         try:
-            flows = json.loads( main.ONOSrest.flows() )
+            flows = json.loads( main.ONOSrest.flows( ) )
 
             stepResult = main.TRUE
             for f in flows:
-                if "rest" in f.get("appId"):
-                    if "ADDED" not in f.get("state"):
+                if "rest" in f.get( "appId" ):
+                    if "ADDED" not in f.get( "state" ):
                         stepResult = main.FALSE
-                        main.log.error( "Flow: %s in state: %s" % (f.get("id"), f.get("state")) )
+                        main.log.error( "Flow: %s in state: %s" % ( f.get( "id" ), f.get( "state" ) ) )
         except TypeError:
             main.log.error( "No Flows found by the REST API" )
             stepResult = main.FALSE
         except ValueError:
             main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
-            main.cleanup()
-            main.exit()
+            main.cleanup( )
+            main.exit( )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -697,10 +814,10 @@
 
         # get the flow IDs that were added through rest
         main.log.info( "Getting the flow IDs from ONOS" )
-        flowIds = [ f.get("id") for f in flows if "rest" in f.get("appId") ]
+        flowIds = [ f.get( "id" ) for f in flows if "rest" in f.get( "appId" ) ]
         # convert the flowIDs to ints then hex and finally back to strings
-        flowIds = [str(hex(int(x))) for x in flowIds]
-        main.log.info( "ONOS flow IDs: {}".format(flowIds) )
+        flowIds = [ str( hex( int( x ) ) ) for x in flowIds ]
+        main.log.info( "ONOS flow IDs: {}".format( flowIds ) )
 
         stepResult = main.Mininet1.checkFlowId( "s1", flowIds, debug=False )
 
@@ -712,29 +829,29 @@
         main.step( "Send a packet to verify the flow are correct" )
 
         # The receiving interface
-        recIface = "{}-eth0.{}".format(main.h4.name, vlan)
+        recIface = "{}-eth0.{}".format( main.h4.name, vlan )
         main.log.info( "Starting filter on host2" )
         # Filter is setup to catch any packet on the vlan interface with the correct vlan tag
-        main.h4.startFilter( ifaceName=recIface, pktFilter="" )
+        main.h4.startFilter( ifaceName=recIface, pktFilter = "" )
 
         # Broadcast the packet on the vlan interface. We only care if the flow forwards
         # the packet with the correct vlan tag, not if the mac addr is correct
-        sendIface = "{}-eth0.{}".format(main.h3.name, vlan)
+        sendIface = "{}-eth0.{}".format( main.h3.name, vlan )
         main.log.info( "Broadcasting the packet with a vlan tag" )
         main.h3.sendPacket( iface=sendIface,
-                            packet="Ether()/Dot1Q(vlan={})".format(vlan) )
+                            packet="Ether()/Dot1Q(vlan={})".format( vlan ) )
 
         main.log.info( "Checking filter for our packet" )
-        stepResult = main.h4.checkFilter()
+        stepResult = main.h4.checkFilter( )
         if stepResult:
-            main.log.info( "Packet: %s" % main.h4.readPackets() )
-        else: main.h4.killFilter()
+            main.log.info( "Packet: %s" % main.h4.readPackets( ) )
+        else: main.h4.killFilter( )
 
         main.log.info( "Clean up host components" )
         for host in hosts:
-            host.stopScapy()
-        main.Mininet1.removeHostComponent("h3")
-        main.Mininet1.removeHostComponent("h4")
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h3" )
+        main.Mininet1.removeHostComponent( "h4" )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -750,7 +867,7 @@
 
         main.case( "Verify the MPLS selector is correctly compiled on the flow." )
         main.caseExplanation = "Install one flow with an MPLS selector, " +\
-                               "verify the flow is added in ONOS, and finally "+\
+                               "verify the flow is added in ONOS, and finally " +\
                                "send a packet via scapy that has a MPLS label."
 
         main.step( "Add a flow with a MPLS selector" )
@@ -758,12 +875,11 @@
         main.log.info( "Creating host components" )
         main.Scapy.createHostComponent( "h1" )
         main.Scapy.createHostComponent( "h2" )
-        hosts = [main.h1, main.h2]
-        stepResult = main.TRUE
+        hosts = [ main.h1, main.h2 ]
         for host in hosts:
-            host.startHostCli()
+            host.startHostCli( )
             host.startScapy( main.dependencyPath )
-            host.updateSelf()
+            host.updateSelf( )
 
         # ports
         egress = 2
@@ -794,21 +910,21 @@
 
         main.log.info( "Get the flows from ONOS" )
         try:
-            flows = json.loads( main.ONOSrest.flows() )
+            flows = json.loads( main.ONOSrest.flows( ) )
 
             stepResult = main.TRUE
             for f in flows:
-                if "rest" in f.get("appId"):
-                    if "ADDED" not in f.get("state"):
+                if "rest" in f.get( "appId" ):
+                    if "ADDED" not in f.get( "state" ):
                         stepResult = main.FALSE
-                        main.log.error( "Flow: %s in state: %s" % (f.get("id"), f.get("state")) )
+                        main.log.error( "Flow: %s in state: %s" % ( f.get( "id" ), f.get( "state" ) ) )
         except TypeError:
             main.log.error( "No Flows found by the REST API" )
             stepResult = main.FALSE
         except ValueError:
             main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
-            main.cleanup()
-            main.exit()
+            main.cleanup( )
+            main.exit( )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -819,10 +935,10 @@
 
         # get the flow IDs that were added through rest
         main.log.info( "Getting the flow IDs from ONOS" )
-        flowIds = [ f.get("id") for f in flows if "rest" in f.get("appId") ]
+        flowIds = [ f.get( "id" ) for f in flows if "rest" in f.get( "appId" ) ]
         # convert the flowIDs to ints then hex and finally back to strings
-        flowIds = [str(hex(int(x))) for x in flowIds]
-        main.log.info( "ONOS flow IDs: {}".format(flowIds) )
+        flowIds = [ str( hex( int( x ) ) ) for x in flowIds ]
+        main.log.info( "ONOS flow IDs: {}".format( flowIds ) )
 
         stepResult = main.Mininet1.checkFlowId( "s1", flowIds, debug=True )
 
@@ -838,26 +954,26 @@
 
         main.log.info( "Constructing packet" )
         main.log.info( "Sending packet to host2" )
-        main.h1.sendPacket( packet='Ether()/MPLS(label={})'.format(mplsLabel) )
+        main.h1.sendPacket( packet='Ether()/MPLS(label={})'.format( mplsLabel ) )
 
         main.log.info( "Checking filter for our packet" )
-        stepResult = main.h2.checkFilter()
+        stepResult = main.h2.checkFilter( )
         if stepResult:
-            main.log.info( "Packet: %s" % main.h2.readPackets() )
-        else: main.h2.killFilter()
+            main.log.info( "Packet: %s" % main.h2.readPackets( ) )
+        else: main.h2.killFilter( )
 
         main.log.info( "Clean up host components" )
         for host in hosts:
-            host.stopScapy()
-        main.Mininet1.removeHostComponent("h1")
-        main.Mininet1.removeHostComponent("h2")
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h1" )
+        main.Mininet1.removeHostComponent( "h2" )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass="Successfully sent a packet",
                                  onfail="Failed to send a packet" )
 
-    def CASE1400( self, main ):
+    def CASE1700( self, main ):
         '''
             Add flows with a TCP selector and verify the flow
         '''
@@ -866,7 +982,7 @@
 
         main.case( "Verify the TCP selector is correctly compiled on the flow" )
         main.caseExplanation = "Install a flow with only the TCP selector " +\
-                "specified, verify the flow is added in ONOS, and finally "+\
+                "specified, verify the flow is added in ONOS, and finally " +\
                 "send a TCP packet to verify the TCP selector is compiled correctly."
 
         main.step( "Add a flow with a TCP selector" )
@@ -874,12 +990,11 @@
         main.log.info( "Creating host components" )
         main.Scapy.createHostComponent( "h1" )
         main.Scapy.createHostComponent( "h2" )
-        hosts = [main.h1, main.h2]
-        stepResult = main.TRUE
+        hosts = [ main.h1, main.h2 ]
         for host in hosts:
-            host.startHostCli()
-            host.startScapy()
-            host.updateSelf()
+            host.startHostCli( )
+            host.startScapy( )
+            host.updateSelf( )
 
         # Add a flow that connects host1 on port1 to host2 on port2
         egress = 2
@@ -912,21 +1027,21 @@
 
         main.log.info( "Get the flows from ONOS" )
         try:
-            flows = json.loads( main.ONOSrest.flows() )
+            flows = json.loads( main.ONOSrest.flows( ) )
 
             stepResult = main.TRUE
             for f in flows:
-                if "rest" in f.get("appId"):
-                    if "ADDED" not in f.get("state"):
+                if "rest" in f.get( "appId" ):
+                    if "ADDED" not in f.get( "state" ):
                         stepResult = main.FALSE
-                        main.log.error( "Flow: %s in state: %s" % (f.get("id"), f.get("state")) )
+                        main.log.error( "Flow: %s in state: %s" % ( f.get( "id" ), f.get( "state" ) ) )
         except TypeError:
             main.log.error( "No Flows found by the REST API" )
             stepResult = main.FALSE
         except ValueError:
             main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
-            main.cleanup()
-            main.exit()
+            main.cleanup( )
+            main.exit( )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -937,10 +1052,10 @@
 
         # get the flow IDs that were added through rest
         main.log.info( "Getting the flow IDs from ONOS" )
-        flowIds = [ f.get("id") for f in flows if "rest" in f.get("appId") ]
+        flowIds = [ f.get( "id" ) for f in flows if "rest" in f.get( "appId" ) ]
         # convert the flowIDs to ints then hex and finally back to strings
-        flowIds = [str(hex(int(x))) for x in flowIds]
-        main.log.info( "ONOS flow IDs: {}".format(flowIds) )
+        flowIds = [ str( hex( int( x ) ) ) for x in flowIds ]
+        main.log.info( "ONOS flow IDs: {}".format( flowIds ) )
 
         stepResult = main.Mininet1.checkFlowId( "s1", flowIds, debug=False )
 
@@ -962,26 +1077,26 @@
         main.h2.startFilter( pktFilter="tcp" )
 
         main.log.info( "Sending packet to host2" )
-        main.h1.sendPacket()
+        main.h1.sendPacket( )
 
         main.log.info( "Checking filter for our packet" )
-        stepResult = main.h2.checkFilter()
+        stepResult = main.h2.checkFilter( )
         if stepResult:
-            main.log.info( "Packet: %s" % main.h2.readPackets() )
-        else: main.h2.killFilter()
+            main.log.info( "Packet: %s" % main.h2.readPackets( ) )
+        else: main.h2.killFilter( )
 
         main.log.info( "Clean up host components" )
         for host in hosts:
-            host.stopScapy()
-        main.Mininet1.removeHostComponent("h1")
-        main.Mininet1.removeHostComponent("h2")
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h1" )
+        main.Mininet1.removeHostComponent( "h2" )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass="Successfully sent a packet",
                                  onfail="Failed to send a packet" )
 
-    def CASE1500( self, main ):
+    def CASE1600( self, main ):
         '''
             Add flows with a UDP selector and verify the flow
         '''
@@ -990,7 +1105,7 @@
 
         main.case( "Verify the UDP selector is correctly compiled on the flow" )
         main.caseExplanation = "Install a flow with only the UDP selector " +\
-                "specified, verify the flow is added in ONOS, and finally "+\
+                "specified, verify the flow is added in ONOS, and finally " +\
                 "send a UDP packet to verify the UDP selector is compiled correctly."
 
         main.step( "Add a flow with a UDP selector" )
@@ -998,12 +1113,11 @@
         main.log.info( "Creating host components" )
         main.Scapy.createHostComponent( "h1" )
         main.Scapy.createHostComponent( "h2" )
-        hosts = [main.h1, main.h2]
-        stepResult = main.TRUE
+        hosts = [ main.h1, main.h2 ]
         for host in hosts:
-            host.startHostCli()
-            host.startScapy()
-            host.updateSelf()
+            host.startHostCli( )
+            host.startScapy( )
+            host.updateSelf( )
 
         # Add a flow that connects host1 on port1 to host2 on port2
         egress = 2
@@ -1036,21 +1150,21 @@
 
         main.log.info( "Get the flows from ONOS" )
         try:
-            flows = json.loads( main.ONOSrest.flows() )
+            flows = json.loads( main.ONOSrest.flows( ) )
 
             stepResult = main.TRUE
             for f in flows:
-                if "rest" in f.get("appId"):
-                    if "ADDED" not in f.get("state"):
+                if "rest" in f.get( "appId" ):
+                    if "ADDED" not in f.get( "state" ):
                         stepResult = main.FALSE
-                        main.log.error( "Flow: %s in state: %s" % (f.get("id"), f.get("state")) )
+                        main.log.error( "Flow: %s in state: %s" % ( f.get( "id" ), f.get( "state" ) ) )
         except TypeError:
             main.log.error( "No Flows found by the REST API" )
             stepResult = main.FALSE
         except ValueError:
             main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
-            main.cleanup()
-            main.exit()
+            main.cleanup( )
+            main.exit( )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -1061,10 +1175,10 @@
 
         # get the flow IDs that were added through rest
         main.log.info( "Getting the flow IDs from ONOS" )
-        flowIds = [ f.get("id") for f in flows if "rest" in f.get("appId") ]
+        flowIds = [ f.get( "id" ) for f in flows if "rest" in f.get( "appId" ) ]
         # convert the flowIDs to ints then hex and finally back to strings
-        flowIds = [str(hex(int(x))) for x in flowIds]
-        main.log.info( "ONOS flow IDs: {}".format(flowIds) )
+        flowIds = [ str( hex( int( x ) ) ) for x in flowIds ]
+        main.log.info( "ONOS flow IDs: {}".format( flowIds ) )
 
         stepResult = main.Mininet1.checkFlowId( "s1", flowIds, debug=False )
 
@@ -1086,48 +1200,290 @@
         main.h2.startFilter( pktFilter="udp" )
 
         main.log.info( "Sending packet to host2" )
-        main.h1.sendPacket()
+        main.h1.sendPacket( )
 
         main.log.info( "Checking filter for our packet" )
-        stepResult = main.h2.checkFilter()
+        stepResult = main.h2.checkFilter( )
         if stepResult:
-            main.log.info( "Packet: %s" % main.h2.readPackets() )
-        else: main.h2.killFilter()
+            main.log.info( "Packet: %s" % main.h2.readPackets( ) )
+        else: main.h2.killFilter( )
 
         main.log.info( "Clean up host components" )
         for host in hosts:
-            host.stopScapy()
-        main.Mininet1.removeHostComponent("h1")
-        main.Mininet1.removeHostComponent("h2")
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h1" )
+        main.Mininet1.removeHostComponent( "h2" )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass="Successfully sent a packet",
                                  onfail="Failed to send a packet" )
 
-
-    def CASE2000( self, main ):
+    def CASE1900( self, main ):
+        '''
+            Add flows with a ICMPv4 selector and verify the flow
+        '''
         import json
+        import time
 
-        main.case( "Delete flows that were added through rest" )
-        main.step("Deleting flows")
+        main.case( "Verify the ICMPv4 selector is correctly compiled on the flow" )
+        main.caseExplanation = "Install a flow with only the ICMPv4 selector " +\
+                "specified, verify the flow is added in ONOS, and finally " +\
+                "send a IMCPv4 packet to verify the ICMPv4 selector is compiled correctly."
 
-        main.log.info( "Getting flows" )
+        main.step( "Add a flow with a ICMPv4 selector" )
+
+        main.log.info( "Creating host components" )
+        main.Scapy.createHostComponent( "h1" )
+        main.Scapy.createHostComponent( "h2" )
+        hosts = [ main.h1, main.h2 ]
+        for host in hosts:
+            host.startHostCli( )
+            host.startScapy( )
+            host.updateSelf( )
+
+        # Add a flow that connects host1 on port1 to host2 on port2
+        egress = 2
+        ingress = 1
+        # IPv4 etherType
+        ethType = main.params[ 'TEST' ][ 'ip4Type' ]
+        # IP protocol
+        ipProto = main.params[ 'TEST' ][ 'icmpProto' ]
+
+        main.log.info( "Add a flow that connects host1 on port1 to host2 on port2" )
+        stepResult = main.ONOSrest.addFlow( deviceId=main.swDPID,
+                                            egressPort=egress,
+                                            ingressPort=ingress,
+                                            ethType=ethType,
+                                            ipProto=ipProto,
+                                            debug=main.debug )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully added flows",
+                                 onfail="Failed add flows" )
+
+        # Giving ONOS time to add the flow
+        time.sleep( main.addFlowSleep )
+
+        main.step( "Check flow is in the ADDED state" )
+
+        main.log.info( "Get the flows from ONOS" )
         try:
-            flows = json.loads( main.ONOSrest.flows() )
+            flows = json.loads( main.ONOSrest.flows( ) )
 
             stepResult = main.TRUE
             for f in flows:
-                if "rest" in f.get("appId"):
-                    if main.debug: main.log.debug( "Flow to be deleted:\n{}".format( main.ONOSrest.pprint(f) ) )
-                    stepResult = stepResult and main.ONOSrest.removeFlow( f.get("deviceId"), f.get("id") )
+                if "rest" in f.get( "appId" ):
+                    if "ADDED" not in f.get( "state" ):
+                        stepResult = main.FALSE
+                        main.log.error( "Flow: %s in state: %s" % ( f.get( "id" ), f.get( "state" ) ) )
         except TypeError:
             main.log.error( "No Flows found by the REST API" )
             stepResult = main.FALSE
         except ValueError:
             main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
-            main.cleanup()
-            main.exit()
+            main.cleanup( )
+            main.exit( )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in the ADDED state",
+                                 onfail="All flows are NOT in the ADDED state" )
+
+        main.step( "Check flows are in Mininet's flow table" )
+
+        # get the flow IDs that were added through rest
+        main.log.info( "Getting the flow IDs from ONOS" )
+        flowIds = [ f.get( "id" ) for f in flows if "rest" in f.get( "appId" ) ]
+        # convert the flowIDs to ints then hex and finally back to strings
+        flowIds = [ str( hex( int( x ) ) ) for x in flowIds ]
+        main.log.info( "ONOS flow IDs: {}".format( flowIds ) )
+
+        stepResult = main.Mininet1.checkFlowId( "s1", flowIds, debug=False )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in mininet",
+                                 onfail="All flows are NOT in mininet" )
+
+        main.step( "Send a packet to verify the flow is correct" )
+
+        main.log.info( "Constructing packet" )
+        # No need for the MAC src dst
+        main.h1.buildEther( dst=main.h2.hostMac )
+        main.h1.buildIP( dst=main.h2.hostIp )
+        main.h1.buildICMP( )
+
+        main.log.info( "Starting filter on host2" )
+        # Defaults to ip
+        main.h2.startFilter( pktFilter="icmp" )
+
+        main.log.info( "Sending packet to host2" )
+        main.h1.sendPacket( )
+
+        main.log.info( "Checking filter for our packet" )
+        stepResult = main.h2.checkFilter( )
+        if stepResult:
+            main.log.info( "Packet: %s" % main.h2.readPackets( ) )
+        else: main.h2.killFilter( )
+
+        main.log.info( "Clean up host components" )
+        for host in hosts:
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h1" )
+        main.Mininet1.removeHostComponent( "h2" )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully sent a packet",
+                                 onfail="Failed to send a packet" )
+
+    def CASE2000( self, main ):
+        '''
+            Add flows with a ICMPv6 selector and verify the flow
+        '''
+        import json
+        import time
+
+        main.case( "Verify the ICMPv6 selector is correctly compiled on the flow" )
+        main.caseExplanation = "Install a flow with only the ICMPv6 selector " +\
+                "specified, verify the flow is added in ONOS, and finally " +\
+                "send a IMCPv6 packet to verify the ICMPv6 selector is compiled correctly."
+
+        main.step( "Add a flow with a ICMPv6 selector" )
+
+        main.log.info( "Creating host components" )
+        main.Scapy.createHostComponent( "h5" )
+        main.Scapy.createHostComponent( "h6" )
+        hosts =[ main.h5, main.h6 ]
+        for host in hosts:
+            host.startHostCli( )
+            host.startScapy( )
+            host.updateSelf( IPv6=True )
+
+        # Add a flow that connects host1 on port1 to host2 on port2
+        egress =6
+        ingress =5
+        # IPv6 etherType
+        ethType = main.params[ 'TEST' ][ 'ip6Type' ]
+        # IP protocol
+        ipProto = main.params[ 'TEST' ][ 'icmp6Proto' ]
+
+        main.log.info( "Add a flow that connects host1 on port1 to host2 on port2" )
+        stepResult = main.ONOSrest.addFlow( deviceId=main.swDPID,
+                                            egressPort=egress,
+                                            ingressPort=ingress,
+                                            ethType=ethType,
+                                            ipProto=ipProto,
+                                            debug=main.debug )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully added flows",
+                                 onfail="Failed add flows" )
+
+        # Giving ONOS time to add the flow
+        time.sleep( main.addFlowSleep )
+
+        main.step( "Check flow is in the ADDED state" )
+
+        main.log.info( "Get the flows from ONOS" )
+        try:
+            flows = json.loads( main.ONOSrest.flows( ) )
+
+            stepResult = main.TRUE
+            for f in flows:
+                if "rest" in f.get( "appId" ):
+                    if "ADDED" not in f.get( "state" ):
+                        stepResult = main.FALSE
+                        main.log.error( "Flow: %s in state: %s" % ( f.get( "id" ), f.get( "state" ) ) )
+        except TypeError:
+            main.log.error( "No Flows found by the REST API" )
+            stepResult = main.FALSE
+        except ValueError:
+            main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
+            main.cleanup( )
+            main.exit( )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in the ADDED state",
+                                 onfail="All flows are NOT in the ADDED state" )
+
+        main.step( "Check flows are in Mininet's flow table" )
+
+        # get the flow IDs that were added through rest
+        main.log.info( "Getting the flow IDs from ONOS" )
+        flowIds = [ f.get( "id" ) for f in flows if "rest" in f.get( "appId" ) ]
+        # convert the flowIDs to ints then hex and finally back to strings
+        flowIds = [ str( hex( int( x ) ) ) for x in flowIds ]
+        main.log.info( "ONOS flow IDs: {}".format( flowIds ) )
+
+        stepResult = main.Mininet1.checkFlowId( "s1", flowIds, debug=False )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in mininet",
+                                 onfail="All flows are NOT in mininet" )
+
+        main.step( "Send a packet to verify the flow is correct" )
+
+        main.log.info( "Constructing packet" )
+        # No need for the MAC src dst
+        main.h5.buildEther( dst=main.h6.hostMac )
+        main.h5.buildIPv6( dst=main.h6.hostIp )
+        main.h5.buildICMP( ipVersion=6 )
+
+        main.log.info( "Starting filter on host2" )
+        # Defaults to ip
+        main.h6.startFilter( pktFilter="icmp6" )
+
+        main.log.info( "Sending packet to host2" )
+        main.h5.sendPacket( )
+
+        main.log.info( "Checking filter for our packet" )
+        stepResult = main.h6.checkFilter( )
+        if stepResult:
+            main.log.info( "Packet: %s" % main.h6.readPackets( ) )
+        else: main.h6.killFilter( )
+
+        main.log.info( "Clean up host components" )
+        for host in hosts:
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h5" )
+        main.Mininet1.removeHostComponent( "h6" )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully sent a packet",
+                                 onfail="Failed to send a packet" )
+
+    def CASE3000( self, main ):
+        '''
+            Delete flow
+        '''
+        import json
+
+        main.case( "Delete flows that were added through rest" )
+        main.step( "Deleting flows" )
+
+        main.log.info( "Getting flows" )
+        try:
+            flows = json.loads( main.ONOSrest.flows( ) )
+
+            stepResult = main.TRUE
+            for f in flows:
+                if "rest" in f.get( "appId" ):
+                    if main.debug: main.log.debug( "Flow to be deleted:\n{}".format( main.ONOSrest.pprint( f ) ) )
+                    stepResult = stepResult and main.ONOSrest.removeFlow( f.get( "deviceId" ), f.get( "id" ) )
+        except TypeError:
+            main.log.error( "No Flows found by the REST API" )
+            stepResult = main.FALSE
+        except ValueError:
+            main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
+            main.cleanup( )
+            main.exit( )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -1136,11 +1492,254 @@
 
         time.sleep( main.delFlowSleep )
 
+
+    def CASE1200(self, main ):
+        '''
+            Add flows with a ARP selector and verify the flow
+        '''
+        import json
+        import time
+
+        main.case( "Verify flow IP selectors are correctly compiled" )
+        main.caseExplanation = "Install two flows with only IP selectors " + \
+                               "specified, then verify flows are added in ONOS, finally " + \
+                               "send a packet that only specifies the IP src and dst."
+
+        main.step( "Add flows with ARP addresses as the only selectors" )
+
+        main.log.info( "Creating host components" )
+        main.Scapy.createHostComponent( "h1" )
+        main.Scapy.createHostComponent( "h2" )
+        hosts = [ main.h1, main.h2 ]
+        for host in hosts:
+            host.startHostCli( )
+            host.startScapy( )
+            host.updateSelf( )
+
+        # Add a flow that connects host1 on port1 to host2 on port2
+        # send output on port2
+        # recieve input on port1
+        egress = 2
+        ingress = 1
+        # ARP etherType = 0x0806
+        ethType = main.params[ 'TEST' ][ 'arpType' ]
+
+        # Add flows that connects host1 to host2
+        main.log.info( "Add flow with port ingress 1 to port egress 2" )
+        stepResult = main.ONOSrest.addFlow(deviceId=main.swDPID,
+                                           egressPort=egress,
+                                           ingressPort=ingress,
+                                           ethType=ethType,
+                                           priority=40001,
+                                           debug=main.debug )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully added flows",
+                                 onfail="Failed add flows" )
+
+        # Giving ONOS time to add the flow
+        time.sleep( main.addFlowSleep )
+
+        main.step( "Check flow is in the ADDED state" )
+
+        main.log.info( "Get the flows from ONOS" )
+        try:
+            flows = json.loads( main.ONOSrest.flows( ) )
+
+            stepResult = main.TRUE
+            for f in flows:
+                if "rest" in f.get( "appId" ):
+                    if "ADDED" not in f.get( "state" ):
+                        stepResult = main.FALSE
+                        main.log.error("Flow: %s in state: %s" % ( f.get("id"), f.get( "state" ) ) )
+        except TypeError:
+            main.log.error( "No Flows found by the REST API" )
+            stepResult = main.FALSE
+        except ValueError:
+            main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
+            main.cleanup( )
+            main.exit( )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in the ADDED state",
+                                 onfail="All flows are NOT in the ADDED state" )
+
+        main.step( "Check flows are in Mininet's flow table" )
+
+        # get the flow IDs that were added through rest
+        main.log.info( "Getting the flow IDs from ONOS" )
+        flowIds = [f.get( "id" ) for f in flows if "rest" in f.get( "appId" ) ]
+        # convert the flowIDs to ints then hex and finally back to strings
+        flowIds = [ str( hex( int( x ) ) ) for x in flowIds ]
+        main.log.info("ONOS flow IDs: {}".format( flowIds ) )
+
+        stepResult = main.Mininet1.checkFlowId( "s1", flowIds, debug=False )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in mininet",
+                                 onfail="All flows are NOT in mininet" )
+
+        main.step( "Send a packet to verify the flow is correct" )
+
+        main.log.info( "Constructing packet" )
+        # No need for the MAC src dst
+        main.h1.buildEther( src=main.h1.hostMac, dst=main.h2.hostMac )
+        main.h1.buildARP( pdst=main.h2.hostIp )
+
+        main.log.info( "Starting filter on host2" )
+        # Defaults to ip
+        main.h2.startFilter( pktFilter="arp" )
+
+        main.log.info( "Sending packet to host2" )
+        main.h1.sendPacket( )
+
+        main.log.info( "Checking filter for our packet" )
+        stepResult = main.h2.checkFilter( )
+        if stepResult:
+            main.log.info( "Packet: %s" % main.h2.readPackets( ) )
+        else:
+            main.h2.killFilter( )
+
+        main.log.info( "Clean up host components" )
+        for host in hosts:
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h1" )
+        main.Mininet1.removeHostComponent( "h2" )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully sent a packet",
+                                 onfail="Failed to send a packet" )
+
+    def CASE1800( self, main ):
+        '''
+           Add flows with a SCTP selector and verify the flow
+        '''
+        import json
+        import time
+
+        main.case( "Verify the UDP selector is correctly compiled on the flow" )
+        main.caseExplanation = "Install a flow with only the UDP selector " + \
+                               "specified, verify the flow is added in ONOS, and finally " + \
+                               "send a UDP packet to verify the UDP selector is compiled correctly."
+
+        main.step( "Add a flow with a SCTP selector" )
+
+        main.log.info( "Creating host components" )
+        main.Scapy.createHostComponent( "h1" )
+        main.Scapy.createHostComponent( "h2" )
+        hosts = [ main.h1, main.h2 ]
+        for host in hosts:
+            host.startHostCli( )
+            host.startScapy( )
+            host.updateSelf( )
+
+        # Add a flow that connects host1 on port1 to host2 on port2
+        egress = 2
+        ingress = 1
+        # IPv4 etherType
+        ethType = main.params[ 'TEST' ][ 'ip4Type' ]
+        # IP protocol
+        ipProto = main.params[ 'TEST' ][ 'sctpProto' ]
+
+        main.log.info("Add a flow that connects host1 on port1 to host2 on port2")
+        stepResult = main.ONOSrest.addFlow( deviceId=main.swDPID,
+                                            egressPort=egress,
+                                            ingressPort=ingress,
+                                            ethType=ethType,
+                                            ipProto=ipProto,
+                                            debug=main.debug )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully added flows",
+                                 onfail="Failed add flows" )
+
+        # Giving ONOS time to add the flow
+        time.sleep( main.addFlowSleep )
+
+        main.step( "Check flow is in the ADDED state" )
+
+        main.log.info( "Get the flows from ONOS" )
+        try:
+            flows = json.loads( main.ONOSrest.flows( ) )
+
+            stepResult = main.TRUE
+            for f in flows:
+                if "rest" in f.get( "appId" ):
+                    if "ADDED" not in f.get( "state" ):
+                        stepResult = main.FALSE
+                        main.log.error("Flow: %s in state: %s" % ( f.get( "id" ), f.get( "state" ) ) )
+        except TypeError:
+            main.log.error( "No Flows found by the REST API" )
+            stepResult = main.FALSE
+        except ValueError:
+            main.log.error( "Problem getting Flows state from REST API.  Exiting test" )
+            main.cleanup( )
+            main.exit( )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in the ADDED state",
+                                 onfail="All flows are NOT in the ADDED state" )
+
+        main.step( "Check flows are in Mininet's flow table" )
+
+        # get the flow IDs that were added through rest
+        main.log.info( "Getting the flow IDs from ONOS" )
+        flowIds = [ f.get( "id" ) for f in flows if "rest" in f.get( "appId" ) ]
+        # convert the flowIDs to ints then hex and finally back to strings
+        flowIds = [ str( hex( int( x ) ) ) for x in flowIds ]
+        main.log.info( "ONOS flow IDs: {}".format( flowIds ) )
+
+        stepResult = main.Mininet1.checkFlowId( "s1", flowIds, debug=False )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in mininet",
+                                 onfail="All flows are NOT in mininet" )
+
+        main.step( "Send a packet to verify the flow is correct" )
+
+        main.log.info( "Constructing packet" )
+        # No need for the MAC src dst
+        main.h1.buildEther( dst=main.h2.hostMac )
+        main.h1.buildIP( dst=main.h2.hostIp )
+        main.h1.buildSCTP( )
+
+        main.log.info( "Starting filter on host2" )
+        # Defaults to ip
+        main.h2.startFilter( pktFilter="sctp" )
+
+        main.log.info( "Sending packet to host2" )
+        main.h1.sendPacket( )
+
+        main.log.info( "Checking filter for our packet" )
+        stepResult = main.h2.checkFilter( )
+        if stepResult:
+            main.log.info( "Packet: %s" % main.h2.readPackets( ) )
+        else:
+            main.h2.killFilter( )
+
+        main.log.info( "Clean up host components" )
+        for host in hosts:
+            host.stopScapy( )
+        main.Mininet1.removeHostComponent( "h1" )
+        main.Mininet1.removeHostComponent( "h2" )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully sent a packet",
+                                 onfail="Failed to send a packet" )
+
     def CASE100( self, main ):
         '''
             Report errors/warnings/exceptions
         '''
-        main.log.info("Error report: \n" )
+        main.log.info( "Error report: \n" )
         main.ONOSbench.logReport( main.ONOSip[ 0 ],
                                   [ "INFO",
                                     "FOLLOWER",
diff --git a/TestON/tests/FUNC/FUNCflow/dependencies/flow-2sw.py b/TestON/tests/FUNC/FUNCflow/dependencies/flow-2sw.py
deleted file mode 100755
index 2299d9e..0000000
--- a/TestON/tests/FUNC/FUNCflow/dependencies/flow-2sw.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/python
-
-"""
-Custom topology for Mininet
-"""
-from mininet.topo import Topo
-from mininet.net import Mininet
-from mininet.node import Host, RemoteController
-from mininet.node import Node
-from mininet.node import CPULimitedHost
-from mininet.link import TCLink
-from mininet.cli import CLI
-from mininet.log import setLogLevel
-from mininet.util import dumpNodeConnections
-from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
-
-class MyTopo( Topo ):
-
-    def __init__( self ):
-        # Initialize topology
-        Topo.__init__( self )
-        # Switch S5 Hosts
-        host1=self.addHost( 'h1', ip='10.1.0.1/24' )
-        host2=self.addHost( 'h2', ip='10.1.0.2/24' )
-        #host3=self.addHost( 'h3', ip='10.1.0.3/24', v6Addr='1000::3/64' )
-        #host4=self.addHost( 'h4', ip='10.1.0.4/24', v6Addr='1000::4/64' )
-
-        s1 = self.addSwitch( 's1' )
-        #s2 = self.addSwitch( 's2' )
-
-        self.addLink(s1, host1)
-        self.addLink(s1, host2)
-        #self.addLink(s1, host3)
-        #self.addLink(s1, host4)
-
-
-        topos = { 'mytopo': ( lambda: MyTopo() ) }
-
-def setupNetwork():
-    "Create network"
-    topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
-    network.start()
-    CLI( network )
-    network.stop()
-
-if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
-    setupNetwork()
diff --git a/TestON/tests/FUNC/FUNCflow/dependencies/topo-flow.py b/TestON/tests/FUNC/FUNCflow/dependencies/topo-flow.py
index f9d58c1..6222d75 100755
--- a/TestON/tests/FUNC/FUNCflow/dependencies/topo-flow.py
+++ b/TestON/tests/FUNC/FUNCflow/dependencies/topo-flow.py
@@ -48,6 +48,9 @@
         host3=self.addHost( 'h3', ip='10.0.0.3/24', cls=VLANHost, vlan=10 )
         host4=self.addHost( 'h4', ip='10.0.0.4/24', cls=VLANHost, vlan=10 )
 
+        #IPv6 hosts
+        host5=self.addHost( 'h5', ip='10.0.0.5/24', cls=IPv6Host, v6Addr='1000::5/64')
+        host6=self.addHost( 'h6', ip='10.0.0.6/24', cls=IPv6Host, v6Addr='1000::6/64')
 
         s1 = self.addSwitch( 's1' )
 
@@ -55,6 +58,8 @@
         self.addLink(s1, host2)
         self.addLink(s1, host3)
         self.addLink(s1, host4)
+        self.addLink(s1, host5)
+        self.addLink(s1, host6)
 
 
         topos = { 'mytopo': ( lambda: MyTopo() ) }
diff --git a/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.py b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.py
index 967dea5..9135daf 100644
--- a/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.py
+++ b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.py
@@ -270,7 +270,7 @@
         scpResult = main.TRUE
         copyResult = main.TRUE
         for i in range( main.numCtrls ):
-            main.node = main.CLIs[ i ]
+            main.node = main.CLIs2[ i ]
             ip = main.ONOSip[ i ]
             main.node.ip_address = ip
             scpResult = scpResult and main.ONOSbench.scp( main.node ,
diff --git a/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.py b/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.py
index 4aff74d..d47b317 100755
--- a/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.py
+++ b/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.py
@@ -372,7 +372,7 @@
         #pprint(main.addedBatchList)
         resp = main.FALSE
         while resp != main.TRUE and ( tAllAdded - tLastPostEnd < int (main.params['CASE2100']['chkFlowTO']) ):
-            if main.params['CASE2100']['RESTchkFlow'] == main.TRUE:
+            if main.params['CASE2100']['RESTchkFlow'] == 'main.TRUE':
                 resp = main.ONOSrest.checkFlowsState()
             else:
                 handle = main.CLIs[0].flows(state = " |grep PEND|wc -l", jsonFormat=False)
@@ -443,7 +443,7 @@
         #pprint(main.addedBatchList)
         resp = main.FALSE
         while resp != main.TRUE and ( tAllRemoved - tLastDeleteEnd < int (main.params['CASE3100']['chkFlowTO']) ):
-            if main.params['CASE3100']['RESTchkFlow'] == main.TRUE:
+            if main.params['CASE3100']['RESTchkFlow'] == 'main.TRUE':
                 resp = main.ONOSrest.checkFlowsState()
             else:
                 handle = main.CLIs[0].flows(state = " |grep PEND|wc -l", jsonFormat=False)
diff --git a/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.params b/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.params
index 8510204..4485f0f 100644
--- a/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.params
+++ b/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.params
@@ -64,10 +64,10 @@
     <NULL>
         # CASE20
         <PUSH>
-            <batch_size>1000</batch_size>
-            <min_intents>10000</min_intents>
-            <max_intents>70000</max_intents>
-            <check_interval>10000</check_interval>
+            <batch_size>500</batch_size>
+            <min_intents>2500</min_intents>
+            <max_intents>1000000</max_intents>
+            <check_interval>2500</check_interval>
         </PUSH>
 
         # if reroute is true
@@ -83,10 +83,10 @@
     <OVS>
         # CASE20
         <PUSH>
-            <batch_size>1000</batch_size>
-            <min_intents>10000</min_intents>
-            <max_intents>500000</max_intents>
-            <check_interval>10000</check_interval>
+            <batch_size>500</batch_size>
+            <min_intents>2500</min_intents>
+            <max_intents>1000000</max_intents>
+            <check_interval>2500</check_interval>
         </PUSH>
 
         # if reroute is true
diff --git a/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py b/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py
index c688207..00f28b1 100644
--- a/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py
+++ b/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py
@@ -7,9 +7,9 @@
 Push test Intents to onos
 CASE10: set up Null Provider
 CASE11: set up Open Flows
+Check flows number, if flows number is not as except, finished this test iteration
 Scale up when reach the Limited
 Start from 1 nodes, 8 devices. Then Scale up to 3,5,7 nodes
-Recommand batch size: 100, check interval: 100
 '''
 class SCPFscalingMaxIntents:
     def __init__( self ):
@@ -429,6 +429,7 @@
         # make sure the checkInterval divisible batchSize
         main.checkInterval = int( int( main.checkInterval / main.batchSize ) * main.batchSize )
         flowTemp=0
+        intentVerifyTemp = 0
         totalFlows=0
         for i in range(limit):
 
@@ -467,32 +468,53 @@
                 main.log.info("Verify Intents states")
                 # k is a control variable for verify retry attempts
                 k = 1
-
                 while k <= main.verifyAttempts:
-                    # while loop for check intents by using REST api
+                    # while loop for check intents by using CLI driver
                     time.sleep(5)
-                    temp = 0
-                    intentsState = main.CLIs[0].checkIntentSummary(timeout=600)
+                    intentsState = main.CLIs[0].checkIntentSummary(timeout=600, noExit=True)
                     if intentsState:
-                        verifyTotalIntents = main.CLIs[0].getTotalIntentsNum(timeout=600)
-                        if temp < verifyTotalIntents:
-                            temp = verifyTotalIntents 
+                        verifyTotalIntents = main.CLIs[0].getTotalIntentsNum(timeout=600, noExit=True)
+                        if intentVerifyTemp < verifyTotalIntents:
+                            intentVerifyTemp = verifyTotalIntents
                         else:
-                            verifytotalIntents = temp
-                        main.log.info("Total Intents: {}".format( verifyTotalIntents ) )
+                            verifyTotalIntents = intentVerifyTemp
+                            intentsState = False
+                        main.log.info("Total Installed Intents: {}".format( verifyTotalIntents ) )
                         break
                     k = k+1
 
-                totalFlows = main.CLIs[0].getTotalFlowsNum( timeout=600, noExit=True )
-                if flowTemp < totalFlows:
-                    flowTemp = totalFlows
-                else:
-                    totalFlows = flowTemp 
+                k = 1
+                flowVerify = True
+                while k <= main.verifyAttempts:
+                    time.sleep(5)
+                    totalFlows = main.CLIs[0].getTotalFlowsNum( timeout=600, noExit=True )
+                    expectFlows = totalIntents * 7 + main.defaultFlows
+                    if totalFlows == expectFlows:
+                        main.log.info("Total Flows Added: {}".format(totalFlows))
+                        break
+                    else:
+                        main.log.info("Some Flows are not added, retry...")
+                        main.log.info("Total Flows Added: {} Expect Flows: {}".format(totalFlows, expectFlows))
+                        flowVerify = False
 
-                if not intentsState:
+                    k += 1
+                    if flowTemp < totalFlows:
+                        flowTemp = totalFlows
+                    else:
+                        totalFlows = flowTemp
+
+                if not intentsState or not flowVerify:
                     # If some intents are not installed, grep the previous flows list, and finished this test case
-                    main.log.warn( "Some intens did not install" )
-                    verifyTotalIntents = main.CLIs[0].getTotalIntentsNum(timeout=600)
+                    main.log.warn( "Intents or flows are not installed" )
+                    verifyTotalIntents = main.CLIs[0].getTotalIntentsNum(timeout=600, noExit=True)
+                    if intentVerifyTemp < verifyTotalIntents:
+                        intentVerifyTemp = verifyTotalIntents
+                    else:
+                        verifyTotalIntents = intentVerifyTemp
+                    if flowTemp < totalFlows:
+                        flowTemp = totalFlows
+                    else:
+                        totalFlows = flowTemp
                     main.log.info("Total Intents: {}".format( verifyTotalIntents) )
                     break
 
diff --git a/TestON/tests/USECASE/SegmentRouting/SRDynamic/README.md b/TestON/tests/USECASE/SegmentRouting/SRDynamic/README.md
new file mode 100755
index 0000000..e84af0b
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRDynamic/README.md
@@ -0,0 +1,22 @@
+This test verifies connectivity in face of dynamic configuration and Onos failures using SegmentRouting
+
+It consists of
+
+1) Configure and Install ONOS
+2) Start Mininet and check flow state
+3) Connectivity test
+4) Add Hosts dynamically
+5) Connectivity test
+6) Onos Failure
+7) Remove host configuration
+
+Requirements
+
+ - An updated version of the CPQD switch has to be running to make sure it supports group chaining.
+
+The test is executed using the netcfg subsystem:
+    1) APPS=openflow-base,netcfghostprovider,netcfglinksprovider
+The test runs for different topologies:
+ - 2x2 Leaf-Spine and 3-node ONOS cluster
+ - 4x4 Leaf-Spine and 3-node ONOS cluster
+ - Single switch and 3-node ONOS cluster
\ No newline at end of file
diff --git a/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.params b/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.params
new file mode 100755
index 0000000..a757a48
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.params
@@ -0,0 +1,46 @@
+<PARAMS>
+
+    <testcases>1,2,3,4,5,6</testcases>
+
+    <SCALE>
+        <size>3</size>
+        <max>3</max>
+    </SCALE>
+
+    <DEPENDENCY>
+        <wrapper1>startUp</wrapper1>
+        <topology>cord_fabric.py</topology>
+    </DEPENDENCY>
+
+    <ENV>
+        <cellName>productionCell</cellName>
+        <cellApps>drivers,segmentrouting</cellApps>
+        <diffApps>openflow-base,netcfghostprovider,netcfglinksprovider</diffApps>
+        <cellUser>sdn</cellUser>
+    </ENV>
+
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <CTRL>
+        <port>6653</port>
+    </CTRL>
+
+    <timers>
+        <LinkDiscovery>12</LinkDiscovery>
+        <SwitchDiscovery>12</SwitchDiscovery>
+    </timers>
+
+    <kill>
+        <switch> spine101 </switch>
+        <dpid> 000000000101 </dpid>
+        <links> leaf1 leaf2 </links>
+    </kill>
+
+    <SLEEP>
+        <startup>10</startup>
+    </SLEEP>
+
+</PARAMS>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.py b/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.py
new file mode 100755
index 0000000..9d84bb4
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.py
@@ -0,0 +1,173 @@
+# CASE1: 2x2 Leaf-Spine topo and test IP connectivity
+# CASE2: 4x4 topo + IP connectivity test
+# CASE3: Single switch topo + IP connectivity test
+# CASE4: 2x2 topo + 3-node ONOS CLUSTER + IP connectivity test
+# CASE5: 4x4 topo + 3-node ONOS CLUSTER + IP connectivity test
+# CASE6: Single switch + 3-node ONOS CLUSTER + IP connectivity test
+
+class SRDynamic:
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        """
+        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 )
+
+        description = "Bridging and Routing sanity test with 2x2 Leaf-spine "
+        main.case( description )
+
+        main.cfgName = '2x2'
+        main.numCtrls = 1
+        run.installOnos( main, vlanCfg=False )
+        run.startMininet( main, 'cord_fabric.py' )
+        # pre-configured routing and bridging test
+        run.checkFlows( main, minFlowCount=116 )
+        run.pingAll( main, dumpflows=False, )
+        run.addHostCfg( main )
+        run.checkFlows( main, minFlowCount=140, dumpflows=False )
+        run.pingAll( main, "CASE1" )
+        run.cleanup( main )
+
+    def CASE2( self, main ):
+        """
+        Sets up 1-node Onos-cluster
+        Start 4x4 Leaf-Spine topology
+        Pingall
+        """
+        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, vlanCfg=False )
+        run.startMininet( main, 'cord_fabric.py',
+                          args="--leaf=4 --spine=4" )
+        # pre-configured routing and bridging test
+        run.checkFlows( main, minFlowCount=350 )
+        run.pingAll( main, dumpflows=False )
+        run.addHostCfg( main )
+        run.checkFlows( main, minFlowCount=380, dumpflows=False )
+        run.pingAll( main, 'CASE2' )
+        run.cleanup( main )
+
+    def CASE3( self, main ):
+        """
+        Sets up 1-node Onos-cluster
+        Start single switch topology
+        Pingall
+        """
+        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 single switch "
+        main.case( description )
+        main.cfgName = '0x1'
+        main.numCtrls = 1
+        run.installOnos( main, vlanCfg=False )
+        run.startMininet( main, 'cord_fabric.py',
+                          args="--leaf=1 --spine=0" )
+        # pre-configured routing and bridging test
+        run.checkFlows( main, minFlowCount=15 )
+        run.pingAll( main, dumpflows=False )
+        run.addHostCfg( main )
+        run.checkFlows( main, minFlowCount=18, dumpflows=False )
+        run.pingAll( main, 'CASE3' )
+        run.cleanup( main )
+
+    def CASE4( self, main ):
+        """
+        Sets up 3-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 )
+        description = "Bridging and Routing sanity test with 2x2 Leaf-spine "
+        main.case( description )
+
+        main.cfgName = '2x2'
+        main.numCtrls = 3
+        run.installOnos( main, vlanCfg=False )
+        run.startMininet( main, 'cord_fabric.py' )
+        # pre-configured routing and bridging test
+        run.checkFlows( main, minFlowCount=116 )
+        run.pingAll( main, dumpflows=False )
+        run.addHostCfg( main )
+        run.checkFlows( main, minFlowCount=140, dumpflows=False )
+        run.pingAll( main, "CASE4" )
+        run.killOnos( main, [ 0 ], '4', '8', '2' )
+        run.delHostCfg( main )
+        run.checkFlows( main, minFlowCount=116, dumpflows=False )
+        run.pingAll( main, "CASE4_after" )
+        run.cleanup( main )
+
+    def CASE5( self, main ):
+        """
+        Sets up 3-node Onos-cluster
+        Start 4x4 Leaf-Spine topology
+        Pingall
+        """
+        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 = 3
+        run.installOnos( main, vlanCfg=False )
+        run.startMininet( main, 'cord_fabric.py',
+                          args="--leaf=4 --spine=4" )
+        # pre-configured routing and bridging test
+        run.checkFlows( main, minFlowCount=350 )
+        run.pingAll( main, dumpflows=False )
+        run.addHostCfg( main )
+        run.checkFlows( main, minFlowCount=380, dumpflows=False )
+        run.pingAll( main, 'CASE5' )
+        run.killOnos( main, [ 0 ], '8', '32', '2' )
+        run.delHostCfg( main )
+        run.checkFlows( main, minFlowCount=350, dumpflows=False )
+        run.pingAll( main, "CASE5_After" )
+        run.cleanup( main )
+
+    def CASE6( self, main ):
+        """
+        Sets up 3-node Onos-cluster
+        Start single switch topology
+        Pingall
+        """
+        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 single switch "
+        main.case( description )
+        main.cfgName = '0x1'
+        main.numCtrls = 3
+        run.installOnos( main, vlanCfg=False )
+        run.startMininet( main, 'cord_fabric.py',
+                          args="--leaf=1 --spine=0" )
+        # pre-configured routing and bridging test
+        run.checkFlows( main, minFlowCount=15 )
+        run.pingAll( main, dumpflows=False )
+        run.addHostCfg( main )
+        run.checkFlows( main, minFlowCount=20, dumpflows=False )
+        run.pingAll( main, 'CASE6' )
+        run.killOnos( main, [ 0 ], '1', '0', '2' )
+        run.delHostCfg( main )
+        run.checkFlows( main, minFlowCount=15, dumpflows=False )
+        run.pingAll( main, "CASE6_After" )
+        run.cleanup( main )
diff --git a/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.topo b/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.topo
new file mode 100755
index 0000000..c531f7d
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.topo
@@ -0,0 +1,90 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+                <nodes>1</nodes>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOScli1>
+            <host>OC1</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOScli1>
+        
+        <ONOScli2>
+            <host>OC2</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOScli2>
+
+        <ONOScli3>
+            <host>OC3</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOScli3>
+
+        <ONOSrest1>
+            <host>OC1</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest1>
+
+        <ONOSrest2>
+            <host>OC2</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest2>
+
+        <ONOSrest3>
+            <host>OC3</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest3>
+
+        <Mininet1>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>MininetCliDriver</type>
+            <connect_order>7</connect_order>
+            <COMPONENTS>
+                <home>~/mininet/custom/</home>
+            </COMPONENTS>
+        </Mininet1>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRDynamic/__init__.py b/TestON/tests/USECASE/SegmentRouting/SRDynamic/__init__.py
new file mode 100755
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRDynamic/__init__.py
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py b/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
index c1efd93..38e013e 100755
--- a/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
@@ -2,7 +2,7 @@
 import imp

 import time

 import json

-

+import urllib

 from core import utilities

 

 

@@ -66,7 +66,7 @@
                                  onfail="Failed to construct test variables" )

 

     @staticmethod

-    def installOnos( main ):

+    def installOnos( main, vlanCfg=True ):

         """

         - Set up cell

             - Create cell file

@@ -87,6 +87,7 @@
         print "NODE COUNT = ", main.numCtrls

         print main.ONOSip

         tempOnosIp = [ ]

+        main.dynamicHosts = [ 'in1', 'out1' ]

         for i in range( main.numCtrls ):

             tempOnosIp.append( main.ONOSip[ i ] )

         onosUser = main.params[ 'ENV' ][ 'cellUser' ]

@@ -167,9 +168,12 @@
                                  onpass="ONOS summary command succeded",

                                  onfail="ONOS summary command failed" )

 

-        with open( main.dependencyPath + "/" + main.cfgName + ".json" ) as cfg:

+        with open( "%s/json/%s.json" % (

+                main.dependencyPath, main.cfgName) ) as cfg:

             main.RESTs[ main.active ].setNetCfg( json.load( cfg ) )

-

+        with open( "%s/json/%s.chart" % (

+                main.dependencyPath, main.cfgName) ) as chart:

+            main.pingChart = json.load( chart )

         if not ready:

             main.log.error( "ONOS startup failed!" )

             main.cleanup( )

@@ -200,7 +204,7 @@
             main.exit( )

 

     @staticmethod

-    def checkFlows( main, minFlowCount ):

+    def checkFlows( main, minFlowCount, dumpflows=True ):

         main.step(

                 " Check whether the flow count is bigger than %s" % minFlowCount )

         count = utilities.retry( main.CLIs[ main.active ].checkFlowCount,

@@ -218,36 +222,34 @@
         flowCheck = utilities.retry( main.CLIs[ main.active ].checkFlowsState,

                                      main.FALSE,

                                      kwargs={ 'isPENDING': False },

-                                     attempts=10,

+                                     attempts=2,

                                      sleep=10 )

         utilities.assertEquals( \

                 expect=main.TRUE,

                 actual=flowCheck,

                 onpass="Flow status is correct!",

                 onfail="Flow status is wrong!" )

-        main.ONOSbench.dumpFlows( main.ONOSip[ main.active ],

-                                  main.logdir, "flowsBefore" + main.cfgName )

-        main.ONOSbench.dumpGroups( main.ONOSip[ 0 ],

-                                   main.logdir, "groupsBefore" + main.cfgName )

+        if dumpflows:

+            main.ONOSbench.dumpFlows( main.ONOSip[ main.active ],

+                                      main.logdir,

+                                      "flowsBefore" + main.cfgName )

+            main.ONOSbench.dumpGroups( main.ONOSip[ main.active ],

+                                       main.logdir,

+                                       "groupsBefore" + main.cfgName )

 

     @staticmethod

     def pingAll( main, tag="", dumpflows=True ):

         main.log.report( "Check full connectivity" )

-        main.step("Check IP connectivity %s" %tag)

-        hosts = main.Mininet1.getHosts().keys()

-        vlan10 = [ '%s10' % s for s in [ 'olt', 'vsg' ] ]

-        vlan5 = [ '%s5' % s for s in [ 'olt', 'vsg' ] ]

-        IPHosts = [ host for host in hosts if host not in ( vlan10 + vlan5 ) ]

-        pa = main.Mininet1.pingallHosts(IPHosts)

-        utilities.assert_equals( expect=main.TRUE, actual=pa,

-                                 onpass="IP connectivity successfully tested",

-                                 onfail="IP connectivity failed" )

-        main.step("Check VLAN  connectivity %s" %tag)

-        p1 = main.Mininet1.pingallHosts(vlan5)

-        p2 = main.Mininet1.pingallHosts(vlan10)

-        utilities.assert_equals( expect=main.TRUE, actual=p1&p2,

-                             onpass="Vlan connectivity successfully tested",

-                             onfail="Vlan connectivity failed" )

+        print main.pingChart

+        for entry in main.pingChart.itervalues( ):

+            print entry

+            hosts, expect = entry[ 'hosts' ], entry[ 'expect' ]

+            expect = main.TRUE if expect else main.FALSE

+            main.step( "Connectivity for %s %s" % (str( hosts ), tag) )

+            pa = main.Mininet1.pingallHosts( hosts )

+            utilities.assert_equals( expect=expect, actual=pa,

+                                     onpass="IP connectivity successfully tested",

+                                     onfail="IP connectivity failed" )

         if dumpflows:

             main.ONOSbench.dumpFlows( main.ONOSip[ main.active ],

                                       main.logdir, "flowsOn" + tag )

@@ -439,7 +441,6 @@
         utilities.assert_equals( expect=main.TRUE, actual=topology,

                                  onpass="ONOS Instance down successful",

                                  onfail="Failed to turn off ONOS Instance" )

-

         for i in range( 10 ):

             ready = True

             output = main.CLIs[ main.active ].summary( )

@@ -455,3 +456,72 @@
             main.log.error( "ONOS startup failed!" )

             main.cleanup( )

             main.exit( )

+

+    @staticmethod

+    def addHostCfg( main ):

+        """

+        Adds Host Configuration to ONOS

+        Updates expected state of the network (pingChart)

+        """

+        import json

+        hostCfg = { }

+        with open( main.dependencyPath + "/json/extra.json" ) as template:

+            hostCfg = json.load( template )

+        main.pingChart[ 'ip' ][ 'hosts' ] += [ 'in1' ]

+        main.step( "Pushing new configuration" )

+        mac, cfg = hostCfg[ 'hosts' ].popitem( )

+        main.RESTs[ main.active ].setNetCfg( cfg[ 'basic' ],

+                                             subjectClass="hosts",

+                                             subjectKey=urllib.quote( mac,

+                                                                      safe='' ),

+                                             configKey="basic" )

+        main.pingChart[ 'ip' ][ 'hosts' ] += [ 'out1' ]

+        main.step( "Pushing new configuration" )

+        mac, cfg = hostCfg[ 'hosts' ].popitem( )

+        main.RESTs[ main.active ].setNetCfg( cfg[ 'basic' ],

+                                             subjectClass="hosts",

+                                             subjectKey=urllib.quote( mac,

+                                                                      safe='' ),

+                                             configKey="basic" )

+        main.pingChart.update( { 'vlan1': { "expect": "True",

+                                            "hosts": [ "olt1", "vsg1" ] } } )

+        main.pingChart[ 'vlan5' ][ 'expect' ] = 0

+        main.pingChart[ 'vlan10' ][ 'expect' ] = 0

+        ports = "[%s,%s]" % (5, 6)

+        cfg = '{"of:0000000000000001":[{"vlan":1,"ports":%s,"name":"OLT 1"}]}' % ports

+        main.RESTs[ main.active ].setNetCfg( json.loads( cfg ),

+                                             subjectClass="apps",

+                                             subjectKey="org.onosproject.segmentrouting",

+                                             configKey="xconnect" )

+

+    @staticmethod

+    def delHostCfg( main ):

+        """

+        Removest Host Configuration from ONOS

+        Updates expected state of the network (pingChart)

+        """

+        import json

+        hostCfg = { }

+        with open( main.dependencyPath + "/json/extra.json" ) as template:

+            hostCfg = json.load( template )

+        main.step( "Removing host configuration" )

+        main.pingChart[ 'ip' ][ 'expect' ] = 0

+        mac, cfg = hostCfg[ 'hosts' ].popitem( )

+        main.RESTs[ main.active ].removeNetCfg( subjectClass="hosts",

+                                                subjectKey=urllib.quote(

+                                                        mac,

+                                                        safe='' ),

+                                                configKey="basic" )

+        main.step( "Removing configuration" )

+        main.pingChart[ 'ip' ][ 'expect' ] = 0

+        mac, cfg = hostCfg[ 'hosts' ].popitem( )

+        main.RESTs[ main.active ].removeNetCfg( subjectClass="hosts",

+                                                subjectKey=urllib.quote(

+                                                        mac,

+                                                        safe='' ),

+                                                configKey="basic" )

+        main.step( "Removing vlan configuration" )

+        main.pingChart[ 'vlan1' ][ 'expect' ] = 0

+        main.RESTs[ main.active ].removeNetCfg( subjectClass="apps",

+                                                subjectKey="org.onosproject.segmentrouting",

+                                                configKey="xconnect" )

diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/cord_fabric.py b/TestON/tests/USECASE/SegmentRouting/dependencies/cord_fabric.py
index 4f52689..6348632 100755
--- a/TestON/tests/USECASE/SegmentRouting/dependencies/cord_fabric.py
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/cord_fabric.py
@@ -1,6 +1,7 @@
 #!/usr/bin/python
 
 import os
+import re
 from optparse import OptionParser
 
 from mininet.net import Mininet
@@ -23,6 +24,8 @@
                        help='number of hosts per leaf switch, default=2' )
     parser.add_option( '--onos', dest='onos', type='int', default=0,
                        help='number of ONOS Instances, default=0, 0 means localhost, 1 will use OC1 and so on' )
+    parser.add_option( '--vlan', dest='vlan', type='int', default=-1,
+                       help='vid of cross connect, default=-1, -1 means utilize default value' )
     (options, args) = parser.parse_args( )
     return options, args
 
@@ -46,10 +49,6 @@
         for ls in range( leaf ):
             leafs[ ls ] = self.addSwitch( 'leaf%s' % (ls + 1),
                                           dpid="00000000000%s" % (1 + ls) )
-            # Connect leaf to all spines
-            for s in range( spine ):
-                switch = spines[ s ]
-                self.addLink( leafs[ ls ], switch, **linkopts )
             # Add hosts under a leaf, fanout hosts per leaf switch
             for f in range( fanout ):
                 host = self.addHost( 'h%s' % (ls * fanout + f + 1),
@@ -58,23 +57,34 @@
                                      gateway='10.0.%s.254' % (ls + 1) )
                 self.addLink( host, leafs[ ls ], **linkopts )
                 # Add Xconnect simulation
-        br1 = self.addSwitch( 'br1', cls=OVSBridge )
-        self.addLink( br1, leafs[ 0 ], **linkopts )
-        for vid in [ 5, 10 ]:
-            olt = self.addHost( 'olt%s' % vid, cls=VLANHost, vlan=vid,
-                                ip="10.%s.0.1/24" % vid
-                                , mac="00:00:%02d:00:00:01" % vid )
-            vsg = self.addHost( 'vsg%s' % vid, cls=VLANHost, vlan=vid,
-                                ip="10.%s.0.2/24" % vid
-                                , mac="00:00:%02d:00:00:02" % vid )
-            self.addLink( olt, leafs[ 0 ], **linkopts )
-            self.addLink( vsg, br1, **linkopts )
-
+            if ls is 0:
+                in1 = self.addHost( 'in1', cls=IpHost, ip='10.0.1.9/24', mac="00:00:00:00:00:09" )
+                self.addLink( in1, leafs[0], **linkopts )
+                out1 = self.addHost( 'out1', cls=IpHost, ip='10.0.9.1/24', mac="00:00:00:00:09:01" )
+                self.addLink( out1, leafs[0], **linkopts )
+                br1 = self.addSwitch( 'br1', cls=OVSBridge )
+                self.addLink( br1, leafs[ 0 ], **linkopts )
+                vlans = [ 1, 5, 10 ]
+                for vid in vlans:
+                    olt = self.addHost( 'olt%s' % vid, cls=VLANHost, vlan=vid,
+                                        ip="10.%s.0.1/24" % vid
+                                        , mac="00:00:%02d:00:00:01" % vid )
+                    vsg = self.addHost( 'vsg%s' % vid, cls=VLANHost, vlan=vid,
+                                        ip="10.%s.0.2/24" % vid
+                                        , mac="00:00:%02d:00:00:02" % vid )
+                    self.addLink( olt, leafs[ 0 ], **linkopts )
+                    self.addLink( vsg, br1, **linkopts )
+            # Connect leaf to all spines
+            for s in range( spine ):
+                switch = spines[ s ]
+                self.addLink( leafs[ ls ], switch, **linkopts )
 
 class IpHost( Host ):
-    def __init__( self, name, gateway, *args, **kwargs ):
+    def __init__( self, name, *args, **kwargs ):
         super( IpHost, self ).__init__( name, *args, **kwargs )
-        self.gateway = gateway
+        gateway = re.split('\.|/', kwargs['ip'])
+        gateway[3] = '254'
+        self.gateway = '.'.join(gateway[0:4])
 
     def config( self, **kwargs ):
         Host.config( self, **kwargs )
@@ -105,15 +115,43 @@
         # add VLAN interface to host's name to intf map
         self.nameToIntf[ newName ] = intf
 
+class ExtendedCLI( CLI ):
+    """
+    Extends mininet CLI with the following commands:
+    addvlanhost
+    addiphost
+    """
+    def do_addhost( self, line ):
+        #Parsing args from CLI
+        args = line.split( )
+        if len( args ) < 3 or len( args ) :
+            "usage: addhost hostname switch **params"
+        hostname, switch = args[0],  args[1]
+        params = eval(line.split( ' ', 3 )[2])
+        if 'cls' in params:
+            params['cls'] = eval( params[ 'cls' ] )
+        if hostname in self.mn:
+            #error( '%s already exists!\n' % hostname )
+            return
+        if switch not in self.mn:
+            #error( '%s does not exist!\n' % switch )
+            return
+        print params
+        host = self.mn.addHostCfg( hostname, **params )
+        #switch.attach( link.intf2 )
+        #host.config()
+        link = self.mn.addLink( host, switch )
+        host.config(**params)
 
 def config( opts ):
     spine = opts.spine
     leaf = opts.leaf
     fanout = opts.fanout
+    vlan = opts.vlan
     controllers = [ os.environ[ 'OC%s' % i ] for i in
                     range( 1, opts.onos + 1 ) ] if (opts.onos) else [
         '127.0.0.1' ]
-    topo = LeafAndSpine( spine=spine, leaf=leaf, fanout=fanout )
+    topo = LeafAndSpine( spine=spine, leaf=leaf, fanout=fanout, vlan=vlan )
     net = Mininet( topo=topo, link=TCLink, build=False,
                    switch=UserSwitch, controller=None, autoSetMacs=True )
     i = 0
@@ -122,7 +160,9 @@
         i += 1;
     net.build( )
     net.start( )
-    CLI( net )
+    out1 = net.get( 'out1' )
+    out1.cmd( "arp -s 10.0.9.254 10:00:00:00:00:01 -i %s " % (out1.intf()) )
+    CLI(net)
     net.stop( )
 
 
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/json/0x1.chart b/TestON/tests/USECASE/SegmentRouting/dependencies/json/0x1.chart
new file mode 100755
index 0000000..0714893
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/json/0x1.chart
@@ -0,0 +1,8 @@
+{

+  "ip": {"expect": "True",

+    "hosts":["h1", "h2"]},

+  "vlan5": {"expect":"True",

+    "hosts":["olt5", "vsg5"]},

+  "vlan10": {"expect":"True",

+    "hosts":["olt10", "vsg10"]}

+}
\ No newline at end of file
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/0x1.json b/TestON/tests/USECASE/SegmentRouting/dependencies/json/0x1.json
similarity index 62%
rename from TestON/tests/USECASE/SegmentRouting/dependencies/0x1.json
rename to TestON/tests/USECASE/SegmentRouting/dependencies/json/0x1.json
index 867785a..36955e1 100755
--- a/TestON/tests/USECASE/SegmentRouting/dependencies/0x1.json
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/json/0x1.json
@@ -13,6 +13,20 @@
             "ips" : [ "10.0.1.254/24" ]
         }
         ]
+    },
+    "of:0000000000000001/3" : {
+      "interfaces" : [
+        {
+          "ips" : [ "10.0.1.254/24" ]
+        }
+      ]
+    },
+    "of:0000000000000001/4" : {
+      "interfaces" : [
+        {
+          "ips" : [ "10.0.1.254/24" ]
+        }
+      ]
     }
     },
     "devices" : {
@@ -44,21 +58,20 @@
     },
     "apps": {
         "org.onosproject.segmentrouting": {
-          "xconnect": {
-            "of:0000000000000001": [
-              {
-                "vlan": 5,
-                "ports": [3, 4],
-                "name": "OLT 1"
-              },
-              {
-                "vlan": 10,
-                "ports": [3, 5],
-                "name": "OLT 2"
-              }
-            ]
-          }
+            "xconnect": {
+                "of:0000000000000001": [
+                    {
+                        "vlan": 5,
+                        "ports": [5, 7],
+                        "name": "OLT 1"
+                    },
+                    {
+                        "vlan": 10,
+                        "ports": [5, 8],
+                        "name": "OLT 2"
+                    }
+                ]
+            }
         }
     }
-
 }
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/json/2x2.chart b/TestON/tests/USECASE/SegmentRouting/dependencies/json/2x2.chart
new file mode 100755
index 0000000..572f85a
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/json/2x2.chart
@@ -0,0 +1,8 @@
+{

+  "ip": {"expect": "True",

+    "hosts":["h1", "h2", "h3", "h4"]},

+  "vlan5": {"expect":"True",

+    "hosts":["olt5", "vsg5"]},

+  "vlan10": {"expect":"True",

+    "hosts":["olt10", "vsg10"]}

+}
\ No newline at end of file
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/2x2.json b/TestON/tests/USECASE/SegmentRouting/dependencies/json/2x2.json
similarity index 73%
rename from TestON/tests/USECASE/SegmentRouting/dependencies/2x2.json
rename to TestON/tests/USECASE/SegmentRouting/dependencies/json/2x2.json
index d4fa3fb..433b594 100755
--- a/TestON/tests/USECASE/SegmentRouting/dependencies/2x2.json
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/json/2x2.json
@@ -1,5 +1,19 @@
 {
     "ports" : {
+    "of:0000000000000001/1" : {
+        "interfaces" : [
+        {
+            "ips" : [ "10.0.1.254/24" ]
+        }
+        ]
+    },
+    "of:0000000000000001/2" : {
+        "interfaces" : [
+        {
+            "ips" : [ "10.0.1.254/24" ]
+        }
+        ]
+    },
     "of:0000000000000001/3" : {
         "interfaces" : [
         {
@@ -14,14 +28,14 @@
         }
         ]
     },
-    "of:0000000000000002/3" : {
+    "of:0000000000000002/1" : {
         "interfaces" : [
         {
             "ips" : [ "10.0.2.254/24" ]
         }
         ]
     },
-    "of:0000000000000002/4" : {
+    "of:0000000000000002/2" : {
         "interfaces" : [
         {
             "ips" : [ "10.0.2.254/24" ]
@@ -79,44 +93,44 @@
         "00:00:00:00:00:01/-1" : {
             "basic": {
                 "ips": ["10.0.1.1"],
-                "location": "of:0000000000000001/3"
+                "location": "of:0000000000000001/1"
             }
         },
         "00:00:00:00:00:02/-1" : {
             "basic": {
                 "ips": ["10.0.1.2"],
-                "location": "of:0000000000000001/4"
+                "location": "of:0000000000000001/2"
             }
         },
         "00:00:00:00:00:03/-1" : {
             "basic": {
                 "ips": ["10.0.2.1"],
-                "location": "of:0000000000000002/3"
+                "location": "of:0000000000000002/1"
             }
         },
         "00:00:00:00:00:04/-1" : {
             "basic": {
                 "ips": ["10.0.2.2"],
-                "location": "of:0000000000000002/4"
+                "location": "of:0000000000000002/2"
             }
         }
     },
     "apps": {
         "org.onosproject.segmentrouting": {
-          "xconnect": {
-            "of:0000000000000001": [
-              {
-                "vlan": 5,
-                "ports": [5, 6],
-                "name": "OLT 1"
-              },
-              {
-                "vlan": 10,
-                "ports": [5, 7],
-                "name": "OLT 2"
-              }
-            ]
-          }
+            "xconnect": {
+                "of:0000000000000001": [
+                    {
+                        "vlan": 5,
+                        "ports": [5,7],
+                        "name": "OLT 1"
+                    },
+                    {
+                        "vlan": 10,
+                        "ports": [5,8],
+                        "name": "OLT 2"
+                    }
+                ]
+            }
         }
     }
 }
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/json/4x4.chart b/TestON/tests/USECASE/SegmentRouting/dependencies/json/4x4.chart
new file mode 100755
index 0000000..31fada0
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/json/4x4.chart
@@ -0,0 +1,8 @@
+{

+  "ip": {"expect": "True",

+    "hosts":["h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8"]},

+  "vlan5": {"expect":"True",

+    "hosts":["olt5", "vsg5"]},

+  "vlan10": {"expect":"True",

+    "hosts":["olt10", "vsg10"]}

+}
\ No newline at end of file
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/4x4.json b/TestON/tests/USECASE/SegmentRouting/dependencies/json/4x4.json
similarity index 78%
rename from TestON/tests/USECASE/SegmentRouting/dependencies/4x4.json
rename to TestON/tests/USECASE/SegmentRouting/dependencies/json/4x4.json
index 55f3225..8230261 100755
--- a/TestON/tests/USECASE/SegmentRouting/dependencies/4x4.json
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/json/4x4.json
@@ -1,55 +1,69 @@
 {
     "ports" : {
-    "of:0000000000000001/5" : {
+    "of:0000000000000001/1" : {
         "interfaces" : [
         {
             "ips" : [ "10.0.1.254/24" ]
         }
         ]
     },
-    "of:0000000000000001/6" : {
+    "of:0000000000000001/2" : {
         "interfaces" : [
         {
             "ips" : [ "10.0.1.254/24" ]
         }
         ]
     },
-    "of:0000000000000002/5" : {
+    "of:0000000000000001/3" : {
+        "interfaces" : [
+            {
+                "ips" : [ "10.0.1.254/24" ]
+            }
+        ]
+    },
+    "of:0000000000000001/4" : {
+        "interfaces" : [
+            {
+                "ips" : [ "10.0.1.254/24" ]
+            }
+        ]
+    },
+    "of:0000000000000002/1" : {
         "interfaces" : [
         {
             "ips" : [ "10.0.2.254/24" ]
         }
         ]
     },
-    "of:0000000000000002/6" : {
+    "of:0000000000000002/2" : {
         "interfaces" : [
         {
             "ips" : [ "10.0.2.254/24" ]
         }
         ]
     },
-    "of:0000000000000003/5" : {
+    "of:0000000000000003/1" : {
         "interfaces" : [
         {
             "ips" : [ "10.0.3.254/24" ]
         }
         ]
     },
-    "of:0000000000000003/6" : {
+    "of:0000000000000003/2" : {
         "interfaces" : [
         {
             "ips" : [ "10.0.3.254/24" ]
         }
         ]
     },
-    "of:0000000000000004/5" : {
+    "of:0000000000000004/1" : {
         "interfaces" : [
         {
             "ips" : [ "10.0.4.254/24" ]
         }
         ]
     },
-    "of:0000000000000004/6" : {
+    "of:0000000000000004/2" : {
         "interfaces" : [
         {
             "ips" : [ "10.0.4.254/24"]
@@ -151,68 +165,68 @@
         "00:00:00:00:00:01/-1" : {
             "basic": {
                 "ips": ["10.0.1.1"],
-                "location": "of:0000000000000001/5"
+                "location": "of:0000000000000001/1"
             }
         },
         "00:00:00:00:00:02/-1" : {
             "basic": {
                 "ips": ["10.0.1.2"],
-                "location": "of:0000000000000001/6"
+                "location": "of:0000000000000001/2"
             }
         },
         "00:00:00:00:00:03/-1" : {
             "basic": {
                 "ips": ["10.0.2.1"],
-                "location": "of:0000000000000002/5"
+                "location": "of:0000000000000002/1"
             }
         },
         "00:00:00:00:00:04/-1" : {
             "basic": {
                 "ips": ["10.0.2.2"],
-                "location": "of:0000000000000002/6"
+                "location": "of:0000000000000002/2"
             }
         },
         "00:00:00:00:00:05/-1" : {
             "basic": {
                 "ips": ["10.0.3.1"],
-                "location": "of:0000000000000003/5"
+                "location": "of:0000000000000003/1"
             }
         },
         "00:00:00:00:00:06/-1" : {
             "basic": {
                 "ips": ["10.0.3.2"],
-                "location": "of:0000000000000003/6"
+                "location": "of:0000000000000003/2"
             }
         },
         "00:00:00:00:00:07/-1" : {
             "basic": {
                 "ips": ["10.0.4.1"],
-                "location": "of:0000000000000004/5"
+                "location": "of:0000000000000004/1"
             }
         },
         "00:00:00:00:00:08/-1" : {
             "basic": {
                 "ips": ["10.0.4.2"],
-                "location": "of:0000000000000004/6"
+                "location": "of:0000000000000004/2"
             }
         }
     },
     "apps": {
         "org.onosproject.segmentrouting": {
-          "xconnect": {
-            "of:0000000000000001": [
-              {
-                "vlan": 5,
-                "ports": [7, 8],
-                "name": "OLT 1"
-              },
-              {
-                "vlan": 10,
-                "ports": [7, 9],
-                "name": "OLT 2"
-              }
-            ]
-          }
+            "xconnect": {
+                "of:0000000000000001": [
+                    {
+                        "vlan": 5,
+                        "ports": [5,7],
+                        "name": "OLT 1"
+                    },
+                    {
+                        "vlan": 10,
+                        "ports": [5,8],
+                        "name": "OLT 2"
+                    }
+                ]
+            }
         }
     }
 }
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/json/extra.json b/TestON/tests/USECASE/SegmentRouting/dependencies/json/extra.json
new file mode 100755
index 0000000..992a04c
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/json/extra.json
@@ -0,0 +1,16 @@
+{
+    "hosts" : {
+        "00:00:00:00:00:09/-1" : {
+            "basic": {
+                "ips": ["10.0.1.9"],
+                "location": "of:0000000000000001/3"
+            }
+        },
+        "00:00:00:00:09:01/-1" : {
+            "basic": {
+                "ips": ["10.0.9.1"],
+                "location": "of:0000000000000001/4"
+            }
+        }
+    }
+}