Creating subfolders for test suites

allow teston to look in subfolders
create subfolders for current test suites
move tests into sub folders
create HA suite dependencies folder and moved all common files there
minor driver and test updates
standardize on the name dependencies for the directory
change from admin to sdn users

Conflicts:
	TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.topo

Change-Id: I849e45ab67da8b285c36c5fdf43b34323876e741
diff --git a/TestON/tests/FUNC/FUNCflow/FUNCflow.params b/TestON/tests/FUNC/FUNCflow/FUNCflow.params
new file mode 100755
index 0000000..5defc95
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCflow/FUNCflow.params
@@ -0,0 +1,68 @@
+
+<PARAMS>
+    # CASE - Descritpion
+    # 1,2,10,1000,1100,2000,1200,2000,100
+    # 1 - Variable initialization and optional pull and build ONOS package
+    # 2 - install ONOS
+    # 8 - Compare topology
+    # 9 - Report logs
+    # 10 - Start mininet and verify topology
+    # 66 - Testing Scapy
+    # 1000 - Add flows with MAC selector
+    # 1100 - Add flows with IPv4 selector
+    # 1200 - Add flows with VLAN selector
+    # 1300 - Add flows with MPLS selector
+    # 1400 - Add flows with TCP selectors
+    # 1500 - Add flows with UDP selectors
+    # 2000 - Delete flows
+
+    <testcases>1,2,10,1000,2000,1100,2000,1200,2000,1300,2000,1400,2000,1500,100</testcases>
+
+    <SCALE>
+        <max>1</max>
+    </SCALE>
+
+    <DEBUG>on</DEBUG>
+
+    <DEPENDENCY>
+        <path>/tests/FUNC/FUNCflow/dependencies/</path>
+        <wrapper1>startUp</wrapper1>
+        <wrapper2>topo</wrapper2>
+        <topology>topo-flow.py</topology>
+    </DEPENDENCY>
+
+    <ENV>
+        <cellName>productionCell</cellName>
+        <cellApps>drivers,openflow</cellApps>
+    </ENV>
+
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <CTRL>
+        <port>6653</port>
+    </CTRL>
+
+    <TEST>
+        <vlan>10</vlan>
+        <mpls>22</mpls>
+        <tcpDst>40001</tcpDst>
+        <udpDst>40051</udpDst>
+        <ip4Type>2048</ip4Type>
+        <tcpProto>6</tcpProto>
+        <udpProto>17</udpProto>
+        <vlanType>33024</vlanType>
+        <mplsType>34887</mplsType>
+        <swDPID>of:0000000000000001</swDPID>
+    </TEST>
+
+    <SLEEP>
+        <startup>15</startup>
+        <startMN>5</startMN>
+        <addFlow>10</addFlow>
+        <delFlow>10</delFlow>
+    </SLEEP>
+
+</PARAMS>
diff --git a/TestON/tests/FUNC/FUNCflow/FUNCflow.py b/TestON/tests/FUNC/FUNCflow/FUNCflow.py
new file mode 100644
index 0000000..7851d51
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCflow/FUNCflow.py
@@ -0,0 +1,1146 @@
+class FUNCflow:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        import time
+        import os
+        import imp
+
+        """
+        - Construct tests variables
+        - GIT ( optional )
+            - Checkout ONOS master branch
+            - Pull latest ONOS code
+        - Building ONOS ( optional )
+            - Install ONOS package
+            - Build ONOS package
+        """
+
+        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 ( ) )
+        main.cellName = main.params[ 'ENV' ][ 'cellName' ]
+        main.apps = main.params[ 'ENV' ][ 'cellApps' ]
+        gitBranch = main.params[ 'GIT' ][ 'branch' ]
+        gitPull = main.params[ 'GIT' ][ 'pull' ]
+        main.ONOSport = main.params[ 'CTRL' ][ 'port' ]
+        main.dependencyPath = main.testOnDirectory + \
+                              main.params[ 'DEPENDENCY' ][ 'path' ]
+        wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
+        wrapperFile2 = main.params[ 'DEPENDENCY' ][ 'wrapper2' ]
+        main.topology = main.params[ 'DEPENDENCY' ][ 'topology' ]
+        main.maxNodes = int( main.params[ 'SCALE' ][ 'max' ] )
+        main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+        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.swDPID = main.params[ 'TEST' ][ 'swDPID' ]
+        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()
+
+        # Assigning ONOS cli handles to a list
+        for i in range( 1,  main.maxNodes + 1 ):
+            main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
+
+        # -- INIT SECTION, ONLY RUNS ONCE -- #
+        main.startUp = imp.load_source( wrapperFile1,
+                                        main.dependencyPath +
+                                        wrapperFile1 +
+                                        ".py" )
+
+        main.topo = imp.load_source( wrapperFile2,
+                                     main.dependencyPath +
+                                     wrapperFile2 +
+                                     ".py" )
+
+
+        copyResult = main.ONOSbench.scp( main.Mininet1,
+                                         main.dependencyPath+main.topology,
+                                         main.Mininet1.home+'/custom/',
+                                         direction="to" )
+
+        if main.CLIs:
+            stepResult = main.TRUE
+        else:
+            main.log.error( "Did not properly created list of ONOS CLI handle" )
+            stepResult = main.FALSE
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully construct " +
+                                        "test variables ",
+                                 onfail="Failed to construct test variables" )
+
+        if gitPull == 'True':
+            main.step( "Building ONOS in " + gitBranch + " branch" )
+            onosBuildResult = main.startUp.onosBuild( main, gitBranch )
+            stepResult = onosBuildResult
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=stepResult,
+                                     onpass="Successfully compiled " +
+                                            "latest ONOS",
+                                     onfail="Failed to compile " +
+                                            "latest ONOS" )
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+
+    def CASE2( self, main ):
+        """
+        - Set up cell
+            - Create cell file
+            - Set cell file
+            - Verify cell file
+        - Kill ONOS process
+        - Uninstall ONOS cluster
+        - Verify ONOS start up
+        - Install ONOS cluster
+        - Connect to cli
+        """
+
+        main.numCtrls = int( main.maxNodes )
+
+        main.case( "Starting up " + str( main.numCtrls ) +
+                   " node(s) ONOS cluster" )
+
+        #kill off all onos processes
+        main.log.info( "Safety check, killing all ONOS processes" +
+                       " before initiating environment setup" )
+
+        for i in range( main.maxNodes ):
+            main.ONOSbench.onosDie( main.ONOSip[ i ] )
+
+        main.log.info( "NODE COUNT = " + str( main.numCtrls ) )
+
+        tempOnosIp = []
+        for i in range( main.numCtrls ):
+            tempOnosIp.append( main.ONOSip[i] )
+
+        main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
+                                       "temp",
+                                       main.Mininet1.ip_address,
+                                       main.apps,
+                                       tempOnosIp )
+
+        main.step( "Apply cell to environment" )
+        cellResult = main.ONOSbench.setCell( "temp" )
+        verifyResult = main.ONOSbench.verifyCell()
+        stepResult = cellResult and verifyResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully applied cell to " + \
+                                        "environment",
+                                 onfail="Failed to apply cell to environment " )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+        stepResult = packageResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully created ONOS package",
+                                 onfail="Failed to create ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Uninstalling ONOS package" )
+        onosUninstallResult = main.TRUE
+        for ip in main.ONOSip:
+            onosUninstallResult = onosUninstallResult and \
+                    main.ONOSbench.onosUninstall( nodeIp=ip )
+        stepResult = onosUninstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully uninstalled ONOS package",
+                                 onfail="Failed to uninstall ONOS package" )
+        time.sleep( main.startUpSleep )
+        main.step( "Installing ONOS package" )
+        onosInstallResult = main.TRUE
+        for i in range( main.numCtrls ):
+            onosInstallResult = onosInstallResult and \
+                    main.ONOSbench.onosInstall( node=main.ONOSip[ i ] )
+        stepResult = onosInstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully installed ONOS package",
+                                 onfail="Failed to install ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Starting ONOS service" )
+        stopResult = main.TRUE
+        startResult = main.TRUE
+        onosIsUp = main.TRUE
+
+        for i in range( main.numCtrls ):
+            onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
+        if onosIsUp == main.TRUE:
+            main.log.report( "ONOS instance is up and ready" )
+        else:
+            main.log.report( "ONOS instance may not be up, stop and " +
+                             "start ONOS again " )
+            for i in range( main.numCtrls ):
+                stopResult = stopResult and \
+                        main.ONOSbench.onosStop( main.ONOSip[ i ] )
+            for i in range( main.numCtrls ):
+                startResult = startResult and \
+                        main.ONOSbench.onosStart( main.ONOSip[ i ] )
+        stepResult = onosIsUp and stopResult and startResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ONOS service is ready",
+                                 onfail="ONOS service did not start properly" )
+
+        main.step( "Start ONOS cli" )
+        cliResult = main.TRUE
+        for i in range( main.numCtrls ):
+            cliResult = cliResult and \
+                        main.CLIs[ i ].startOnosCli( main.ONOSip[ i ] )
+        stepResult = cliResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully start ONOS cli",
+                                 onfail="Failed to start ONOS cli" )
+
+    def CASE10( self, main ):
+        '''
+            Start Mininet
+        '''
+        import json
+
+        main.case( "Setup mininet and compare ONOS topology view to Mininet topology" )
+        main.caseExplanation = "Start mininet with custom topology and compare topology " +\
+                "elements between Mininet and ONOS"
+
+        main.step( "Setup Mininet Topology" )
+        topology = main.Mininet1.home + '/custom/' + main.topology
+        stepResult = main.Mininet1.startNet( topoFile=topology )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully loaded topology",
+                                 onfail="Failed to load topology" )
+
+        main.step( "Assign switch to controller" )
+        stepResult = main.Mininet1.assignSwController( "s1", main.ONOSip[0] )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully assigned switch to controller",
+                                 onfail="Failed to assign switch to controller" )
+
+        time.sleep( main.startMNSleep )
+
+        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()
+
+        for controller in range( main.numCtrls ):
+            controllerStr = str( controller + 1 )
+            if devices[ controller ] and ports[ controller ] and\
+                "Error" not in devices[ controller ] and\
+                "Error" not in ports[ controller ]:
+
+                currentDevicesResult = main.Mininet1.compareSwitches(
+                        mnSwitches,
+                        json.loads( devices[ controller ] ),
+                        json.loads( ports[ controller ] ) )
+            else:
+                currentDevicesResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentDevicesResult,
+                                     onpass="ONOS" + controllerStr +
+                                            " Switches view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                            " Switches view is incorrect" )
+            if links[ controller ] and "Error" not in links[ controller ]:
+                currentLinksResult = main.Mininet1.compareLinks(
+                        mnSwitches, mnLinks,
+                        json.loads( links[ controller ] ) )
+            else:
+                currentLinksResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentLinksResult,
+                                     onpass="ONOS" + controllerStr +
+                                            " links view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                            " links view is incorrect" )
+
+            if hosts[ controller ] or "Error" not in hosts[ controller ]:
+                currentHostsResult = main.Mininet1.compareHosts(
+                        mnHosts,
+                        json.loads( hosts[ controller ] ) )
+            else:
+                currentHostsResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentHostsResult,
+                                     onpass="ONOS" + controllerStr +
+                                            " hosts exist in Mininet",
+                                     onfail="ONOS" + controllerStr +
+                                            " hosts don't match Mininet")
+
+
+    def CASE66( self, main ):
+        '''
+        Testing scapy
+        '''
+        main.case( "Testing scapy" )
+        main.step( "Creating Host1 component" )
+        main.Mininet1.createHostComponent( "h1" )
+        main.Mininet1.createHostComponent( "h2" )
+        hosts = [main.h1, main.h2]
+        for host in hosts:
+            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.h2.startFilter()
+        main.h1.buildEther( dst=main.h2.hostMac )
+        main.h1.sendPacket( )
+        finished = main.h2.checkFilter()
+        i = ""
+        if finished:
+            a = main.h2.readPackets()
+            for i in a.splitlines():
+                main.log.info( i )
+        else:
+            kill = main.h2.killFilter()
+            main.log.debug( kill )
+            main.h2.handle.sendline( "" )
+            main.h2.handle.expect( main.h2.scapyPrompt )
+            main.log.debug( main.h2.handle.before )
+        utilities.assert_equals( expect=True,
+                                 actual="dst=00:00:00:00:00:02 src=00:00:00:00:00:01" in i,
+                                 onpass="Pass",
+                                 onfail="Fail" )
+
+        main.step( "Sending/Receiving Test packet - Filter matches" )
+        main.h2.startFilter()
+        main.h1.buildEther( dst=main.h2.hostMac )
+        main.h1.buildIP( dst=main.h2.hostIp )
+        main.h1.sendPacket( )
+        finished = main.h2.checkFilter()
+        i = ""
+        if finished:
+            a = main.h2.readPackets()
+            for i in a.splitlines():
+                main.log.info( i )
+        else:
+            kill = main.h2.killFilter()
+            main.log.debug( kill )
+            main.h2.handle.sendline( "" )
+            main.h2.handle.expect( main.h2.scapyPrompt )
+            main.log.debug( main.h2.handle.before )
+        utilities.assert_equals( expect=True,
+                                 actual="dst=00:00:00:00:00:02 src=00:00:00:00:00:01" in i,
+                                 onpass="Pass",
+                                 onfail="Fail" )
+
+
+
+        main.step( "Clean up host components" )
+        for host in hosts:
+            host.stopScapy()
+        main.Mininet1.removeHostComponent("h1")
+        main.Mininet1.removeHostComponent("h2")
+
+    def CASE1000( self, main ):
+        '''
+            Add flows with MAC selectors and verify the flows
+        '''
+        import json
+        import time
+
+        main.case( "Verify flow MAC selectors are correctly compiled" )
+        main.caseExplanation = "Install two flows with only MAC selectors " +\
+                "specified, then verify flows are added in ONOS, finally "+\
+                "send a packet that only specifies the MAC src and dst."
+
+        main.step( "Add flows with MAC addresses as the only selectors" )
+
+        main.log.info( "Creating host components" )
+        main.Mininet1.createHostComponent( "h1" )
+        main.Mininet1.createHostComponent( "h2" )
+        hosts = [main.h1, main.h2]
+        stepResult = main.TRUE
+        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
+
+        # Add flows that sends packets from port1 to port2 with correct
+        # MAC src and dst addresses
+        main.log.info( "Adding flow with MAC selectors" )
+        stepResult = main.ONOSrest.addFlow( deviceId=main.swDPID,
+                                            egressPort=egress,
+                                            ingressPort=ingress,
+                                            ethSrc=main.h1.hostMac,
+                                            ethDst=main.h2.hostMac,
+                                            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 flows
+        time.sleep( main.addFlowSleep )
+
+        main.step( "Check flows are 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 flows are correct" )
+
+        # Specify the src and dst MAC addr
+        main.log.info( "Constructing packet" )
+        main.h1.buildEther( src=main.h1.hostMac, dst=main.h2.hostMac )
+
+        # Filter for packets with the correct host name. Otherwise,
+        # the filter we catch any packet that is sent to host2
+        # 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.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 CASE1100( self, main ):
+        '''
+            Add flows with IPv4 selectors and verify the flows
+        '''
+        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 IPv4 addresses as the only selectors" )
+
+        main.log.info( "Creating host components" )
+        main.Mininet1.createHostComponent( "h1" )
+        main.Mininet1.createHostComponent( "h2" )
+        hosts = [main.h1, main.h2]
+        stepResult = main.TRUE
+        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
+        # IPv4 etherType = 0x800
+        IPv4=2048
+
+        # 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"),
+                                            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( src=main.h1.hostIp, dst=main.h2.hostIp )
+
+        main.log.info( "Starting filter on host2" )
+        # Defaults to ip
+        main.h2.startFilter()
+
+        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 CASE1200( self, main ):
+        '''
+            Add flow with VLAN selector and verify the flow
+        '''
+        import json
+        import time
+
+        main.case( "Verify VLAN selector is correctly compiled" )
+        main.caseExplanation = "Install one flow with only the VLAN selector " +\
+                "specified, then verify the flow is added in ONOS, and finally "+\
+                "broadcast a packet with the correct VLAN tag."
+
+        # We do this here to utilize the hosts information
+        main.log.info( "Creating host components" )
+        main.Mininet1.createHostComponent( "h3" )
+        main.Mininet1.createHostComponent( "h4" )
+        hosts = [main.h3, main.h4]
+        stepResult = main.TRUE
+        for host in hosts:
+            host.startHostCli()
+            host.startScapy()
+            host.updateSelf()
+
+
+        main.step( "Add a flow with the VLAN tag as the only selector" )
+
+        # Add flows that connects the two vlan hosts h3 and h4
+        # Host 3 is on port 3 and host 4 is on port 4
+        vlan = main.params[ 'TEST' ][ 'vlan' ]
+        egress = 4
+        ingress = 3
+        # VLAN ethType = 0x8100
+        ethType = 33024
+
+        # Add only one flow because we don't need a response
+        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,
+                                            vlan=vlan,
+                                            debug=main.debug )
+
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully added flow",
+                                 onfail="Failed add flows" )
+
+        # Giving ONOS time to add the flows
+        time.sleep( main.addFlowSleep )
+
+        main.step( "Check flows  are 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 are correct" )
+
+        # The receiving interface
+        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="" )
+
+        # 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)
+        main.log.info( "Broadcasting the packet with a vlan tag" )
+        main.h3.sendPacket( iface=sendIface,
+                            packet="Ether()/Dot1Q(vlan={})".format(vlan) )
+
+        main.log.info( "Checking filter for our packet" )
+        stepResult = main.h4.checkFilter()
+        if stepResult:
+            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")
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully sent a packet",
+                                 onfail="Failed to send a packet" )
+
+    def CASE1300( self, main ):
+        '''
+            Add flows with MPLS selector and verify the flows
+        '''
+        import json
+        import time
+
+        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 "+\
+                               "send a packet via scapy that has a MPLS label."
+
+        main.step( "Add a flow with a MPLS selector" )
+
+        main.log.info( "Creating host components" )
+        main.Mininet1.createHostComponent( "h1" )
+        main.Mininet1.createHostComponent( "h2" )
+        hosts = [main.h1, main.h2]
+        stepResult = main.TRUE
+        for host in hosts:
+            host.startHostCli()
+            host.startScapy( main.dependencyPath )
+            host.updateSelf()
+
+        # ports
+        egress = 2
+        ingress = 1
+        # MPLS etherType
+        ethType = main.params[ 'TEST' ][ 'mplsType' ]
+        # MPLS label
+        mplsLabel = main.params[ 'TEST' ][ 'mpls' ]
+
+        # Add a flow that connects host1 on port1 to host2 on port2
+        main.log.info( "Adding flow with MPLS selector" )
+        stepResult = main.ONOSrest.addFlow( deviceId=main.swDPID,
+                                            egressPort=egress,
+                                            ingressPort=ingress,
+                                            ethType=ethType,
+                                            mpls=mplsLabel,
+                                            debug=main.debug )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully added flow",
+                                 onfail="Failed add flow" )
+
+        # 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=True )
+
+        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( "Starting filter on host2" )
+        main.h2.startFilter( pktFilter="mpls" )
+
+        main.log.info( "Constructing packet" )
+        main.log.info( "Sending packet to host2" )
+        main.h1.sendPacket( packet='Ether()/MPLS(label={})'.format(mplsLabel) )
+
+        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 CASE1400( self, main ):
+        '''
+            Add flows with a TCP selector and verify the flow
+        '''
+        import json
+        import time
+
+        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 "+\
+                "send a TCP packet to verify the TCP selector is compiled correctly."
+
+        main.step( "Add a flow with a TCP selector" )
+
+        main.log.info( "Creating host components" )
+        main.Mininet1.createHostComponent( "h1" )
+        main.Mininet1.createHostComponent( "h2" )
+        hosts = [main.h1, main.h2]
+        stepResult = main.TRUE
+        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' ][ 'tcpProto' ]
+        # TCP port destination
+        tcpDst = main.params[ 'TEST' ][ 'tcpDst' ]
+
+        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,
+                                            tcpDst=tcpDst,
+                                            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.buildTCP( dport=tcpDst )
+
+        main.log.info( "Starting filter on host2" )
+        # Defaults to ip
+        main.h2.startFilter( pktFilter="tcp" )
+
+        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 CASE1500( self, main ):
+        '''
+            Add flows with a UDP 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 UDP selector" )
+
+        main.log.info( "Creating host components" )
+        main.Mininet1.createHostComponent( "h1" )
+        main.Mininet1.createHostComponent( "h2" )
+        hosts = [main.h1, main.h2]
+        stepResult = main.TRUE
+        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' ][ 'udpProto' ]
+        # UDP port destination
+        udpDst = main.params[ 'TEST' ][ 'udpDst' ]
+
+        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,
+                                            udpDst=udpDst,
+                                            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.buildUDP( dport=udpDst )
+
+        main.log.info( "Starting filter on host2" )
+        # Defaults to ip
+        main.h2.startFilter( pktFilter="udp" )
+
+        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 ):
+        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,
+                                 onpass="Successfully deleting flows",
+                                 onfail="Failed to delete flows" )
+
+        time.sleep( main.delFlowSleep )
+
+    def CASE100( self, main ):
+        '''
+            Report errors/warnings/exceptions
+        '''
+        main.log.info("Error report: \n" )
+        main.ONOSbench.logReport( main.ONOSip[ 0 ],
+                                  [ "INFO",
+                                    "FOLLOWER",
+                                    "WARN",
+                                    "flow",
+                                    "ERROR",
+                                    "Except" ],
+                                  "s" )
diff --git a/TestON/tests/FUNC/FUNCflow/FUNCflow.topo b/TestON/tests/FUNC/FUNCflow/FUNCflow.topo
new file mode 100755
index 0000000..d910446
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCflow/FUNCflow.topo
@@ -0,0 +1,46 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+                <nodes>3</nodes>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOScli1>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOScli1>
+
+        <Mininet1>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>MininetCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </Mininet1>
+
+        <ONOSrest>
+            <host>OC1</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNC/FUNCflow/README b/TestON/tests/FUNC/FUNCflow/README
new file mode 100644
index 0000000..4af83ae
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCflow/README
@@ -0,0 +1,49 @@
+FUNCflow test suite
+
+Summary:
+        This test suite consists of basic flow-rule based functionality testing.
+        The main goal of this test suite is to verify that the flow subsytem is
+        compiling flows correctly. We verify each flow by utilizing Scapy, a
+        Python library for generating and sending packets. The following is an
+        overview of the test.
+        Steps:
+            - Discover hosts
+            - add specific flow
+            - verify flow
+            - remove flow
+
+        Each repetion of the steps tests a specific selector. Here is a list
+        of the selectors that are being tested:
+        Selectors:
+            - MAC
+            - IPv4
+            - VLAN
+            - MPLS
+            - TCP
+            - UDP
+
+        We verify the selectors by sending a tailor made packet through the
+        two hosts. If the packet was recieved, then the flow was compiled
+        correctly.
+
+Topology:
+        The topology consists of one switch with four hosts connected to it.
+        Two hosts are regular IPv4 hosts, while the other two are hosts with
+        vlan interfaces to test the vlan selector.
+
+Required:
+        This test requires Mininet topology file topo-flow.py located in the
+        dependencies folder. The topology consistes of VLAN hosts, so you will
+        need to install the VLAN module. You will also need to install the
+        Python module, Scapy.
+
+VLAN configuration:
+        Execute command:
+            $ sudo apt-get install vlan
+        Configuration:
+            $ sudo modprobe 8021q
+        NOTE:To make this configuration permanent
+            $ sudo su -c 'echo "8021q" >> /etc/modules'
+
+Scapy install:
+    sudo apt-get install Scapy
diff --git a/TestON/tests/FUNC/FUNCflow/__init__.py b/TestON/tests/FUNC/FUNCflow/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCflow/__init__.py
diff --git a/TestON/tests/FUNC/FUNCflow/dependencies/flow-2sw.py b/TestON/tests/FUNC/FUNCflow/dependencies/flow-2sw.py
new file mode 100755
index 0000000..2299d9e
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCflow/dependencies/flow-2sw.py
@@ -0,0 +1,50 @@
+#!/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/mplsClass.py b/TestON/tests/FUNC/FUNCflow/dependencies/mplsClass.py
new file mode 100644
index 0000000..30b27e8
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCflow/dependencies/mplsClass.py
@@ -0,0 +1,10 @@
+import scapy
+
+class MPLS(Packet):
+        name = "MPLS"
+        fields_desc =  [
+                BitField("label", 3, 20),
+                BitField("experimental_bits", 0, 3),
+                BitField("bottom_of_label_stack", 1, 1), # Now we're at the bottom
+                ByteField("TTL", 255)
+        ]
diff --git a/TestON/tests/FUNC/FUNCflow/dependencies/startUp.py b/TestON/tests/FUNC/FUNCflow/dependencies/startUp.py
new file mode 100644
index 0000000..bf2a2b6
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCflow/dependencies/startUp.py
@@ -0,0 +1,38 @@
+"""
+    This wrapper function is use for starting up onos instance
+"""
+
+import time
+import os
+import json
+
+def onosBuild( main, gitBranch ):
+    """
+        This includes pulling ONOS and building it using maven install
+    """
+
+    buildResult = main.FALSE
+
+    # Git checkout a branch of ONOS
+    checkOutResult = main.ONOSbench.gitCheckout( gitBranch )
+    # Does the git pull on the branch that was checked out
+    if not checkOutResult:
+        main.log.warn( "Failed to checked out " + gitBranch +
+                                           " branch")
+    else:
+        main.log.info( "Successfully checked out " + gitBranch +
+                                           " branch")
+    gitPullResult = main.ONOSbench.gitPull()
+    if gitPullResult == main.ERROR:
+        main.log.error( "Error pulling git branch" )
+    else:
+        main.log.info( "Successfully pulled " + gitBranch + " branch" )
+
+    # Maven clean install
+    buildResult = main.ONOSbench.cleanInstall()
+
+    return buildResult
+
+
+
+
diff --git a/TestON/tests/FUNC/FUNCflow/dependencies/topo-flow.py b/TestON/tests/FUNC/FUNCflow/dependencies/topo-flow.py
new file mode 100755
index 0000000..f9d58c1
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCflow/dependencies/topo-flow.py
@@ -0,0 +1,73 @@
+#!/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 VLANHost( Host ):
+    def config( self, vlan=100, **params ):
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ifconfig %s inet 0' % intf )
+        self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        newName = '%s.%d' % ( intf, vlan )
+        intf.name = newName
+        self.nameToIntf[ newName ] = intf
+        return r
+
+class IPv6Host( Host ):
+    def config( self, v6Addr='1000:1/64', **params ):
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ifconfig %s inet 0' % intf )
+        self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
+        return r
+
+class MyTopo( Topo ):
+
+    def __init__( self, **opts ):
+        # Initialize topology
+        Topo.__init__( self, **opts)
+
+        # IPv4 hosts
+        host1=self.addHost( 'h1', ip='10.0.0.1/24' )
+        host2=self.addHost( 'h2', ip='10.0.0.2/24' )
+
+        # VLAN hosts
+        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 )
+
+
+        s1 = self.addSwitch( 's1' )
+
+        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, autoStaticArp=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.py b/TestON/tests/FUNC/FUNCflow/dependencies/topo.py
new file mode 100644
index 0000000..b44e3fc
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCflow/dependencies/topo.py
@@ -0,0 +1,100 @@
+"""
+    These functions can be used for topology comparisons
+"""
+
+import time
+import os
+import json
+
+def getAllDevices( main ):
+    """
+        Return a list containing the devices output from each ONOS node
+    """
+    devices = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].devices,
+                         name="devices-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        devices.append( t.result )
+    return devices
+
+def getAllHosts( main ):
+    """
+        Return a list containing the hosts output from each ONOS node
+    """
+    hosts = []
+    ipResult = main.TRUE
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].hosts,
+                         name="hosts-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        hosts.append( t.result )
+    return hosts
+
+def getAllPorts( main ):
+    """
+        Return a list containing the ports output from each ONOS node
+    """
+    ports = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].ports,
+                         name="ports-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        ports.append( t.result )
+    return ports
+
+def getAllLinks( main ):
+    """
+        Return a list containing the links output from each ONOS node
+    """
+    links = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].links,
+                         name="links-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        links.append( t.result )
+    return links
+
+def getAllClusters( main ):
+    """
+        Return a list containing the clusters output from each ONOS node
+    """
+    clusters = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].clusters,
+                         name="clusters-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        clusters.append( t.result )
+    return clusters
+
+
diff --git a/TestON/tests/FUNC/FUNCintent/FUNCintent.params b/TestON/tests/FUNC/FUNCintent/FUNCintent.params
new file mode 100644
index 0000000..d0fcfa8
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintent/FUNCintent.params
@@ -0,0 +1,71 @@
+<PARAMS>
+    # CASE - Description
+    # 1 - Variable initialization and optional pull and build ONOS package
+    # 2 - Install ONOS
+    # 8 - Compare Topology
+    # 9 - Report logs
+    # 10 - Start Mininet with Openflow 1.0
+    # 11 - Start Mininet with Openflow 1.3
+    # 12 - Assign switch to controller
+    # 13 - Create Scapy Components
+    # 14 - Discover hosts with Mininet Pingall
+    # 15 - Discover hosts with Scapy arping ( only discovers scapy hosts )
+    # 16 - Balance ownership of switches
+    # 17 - Activate Flow Objectives
+    # 18 - Stop Mininet
+    # 1000 - Test host intents
+    # 2000 - Test point intents
+    # 3000 - Test single to multi point intents
+    # 4000 - Test multi to single point intents
+    # 5000 - Test host mobility
+    # 6000 - Test Multi Point intent End Point Failure
+
+    <testcases>1,[2,10,12,13,15,16,1000,2000,3000,4000,5000,6000,18]*2,[2,10,12,13,15,16,17,1000,2000,3000,4000,5000,6000,18]*2,[2,11,12,13,15,16,1000,2000,3000,4000,5000,6000,18]*2,[2,11,12,13,15,16,17,1000,2000,3000,4000,5000,6000,18]*2</testcases>
+
+    <SCALE>
+        <size>1,3,1,3,1,3,1,3</size>
+    </SCALE>
+
+    <DEPENDENCY>
+        <path>/tests/FUNC/FUNCintent/dependencies/</path>
+        <wrapper1>startUp</wrapper1>
+        <wrapper2>FuncIntentFunction</wrapper2>
+        <wrapper3>topo</wrapper3>
+        <topology>newFuncTopo.py</topology>
+    </DEPENDENCY>
+
+    <ENV>
+        <cellApps>drivers,openflow,proxyarp,mobility</cellApps>
+    </ENV>
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <SLEEP>
+        <startup>15</startup>
+        <reroute>5</reroute>
+        <removeintent>10</removeintent>
+        <checkintent>5</checkintent>
+        <fwd>10</fwd>
+        <topoAttempts>3</topoAttempts>
+    </SLEEP>
+
+    <MININET>
+        <switch>7</switch>
+        <links>20</links>
+    </MININET>
+
+    <SCAPY>
+        <HOSTNAMES>h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13,h14,h15,h16,h17,h18,h19,h20,h21,h22,h23,h24</HOSTNAMES>
+    </SCAPY>
+
+    # Intent tests params
+    <SDNIP>
+        <tcpProto>6</tcpProto>
+        <ipPrototype>6</ipPrototype>
+        <srcPort>5001</srcPort>
+        <dstPort>5001</dstPort>
+    </SDNIP>
+
+</PARAMS>
diff --git a/TestON/tests/FUNC/FUNCintent/FUNCintent.py b/TestON/tests/FUNC/FUNCintent/FUNCintent.py
new file mode 100644
index 0000000..0855dc1
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintent/FUNCintent.py
@@ -0,0 +1,2057 @@
+# Testing the basic intent functionality of ONOS
+
+class FUNCintent:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        import time
+        import imp
+        import re
+
+        """
+        - Construct tests variables
+        - GIT ( optional )
+            - Checkout ONOS master branch
+            - Pull latest ONOS code
+        - Building ONOS ( optional )
+            - Install ONOS package
+            - Build ONOS package
+        """
+
+        main.case( "Constructing test variables and building ONOS package" )
+        main.step( "Constructing test variables" )
+        main.caseExplanation = "This test case is mainly for loading " +\
+                               "from params file, and pull and build the " +\
+                               " latest ONOS package"
+        stepResult = main.FALSE
+
+        # Test variables
+        try:
+            main.testOnDirectory = re.sub( "(/tests)$", "", main.testDir )
+            main.apps = main.params[ 'ENV' ][ 'cellApps' ]
+            gitBranch = main.params[ 'GIT' ][ 'branch' ]
+            main.dependencyPath = main.testOnDirectory + \
+                                  main.params[ 'DEPENDENCY' ][ 'path' ]
+            main.topology = main.params[ 'DEPENDENCY' ][ 'topology' ]
+            main.scale = ( main.params[ 'SCALE' ][ 'size' ] ).split( "," )
+            if main.ONOSbench.maxNodes:
+                main.maxNodes = int( main.ONOSbench.maxNodes )
+            else:
+                main.maxNodes = 0
+            wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
+            wrapperFile2 = main.params[ 'DEPENDENCY' ][ 'wrapper2' ]
+            wrapperFile3 = main.params[ 'DEPENDENCY' ][ 'wrapper3' ]
+            main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+            main.checkIntentSleep = int( main.params[ 'SLEEP' ][ 'checkintent' ] )
+            main.removeIntentSleep = int( main.params[ 'SLEEP' ][ 'removeintent' ] )
+            main.rerouteSleep = int( main.params[ 'SLEEP' ][ 'reroute' ] )
+            main.fwdSleep = int( main.params[ 'SLEEP' ][ 'fwd' ] )
+            main.checkTopoAttempts = int( main.params[ 'SLEEP' ][ 'topoAttempts' ] )
+            gitPull = main.params[ 'GIT' ][ 'pull' ]
+            main.numSwitch = int( main.params[ 'MININET' ][ 'switch' ] )
+            main.numLinks = int( main.params[ 'MININET' ][ 'links' ] )
+            main.cellData = {} # for creating cell file
+            main.hostsData = {}
+            main.CLIs = []
+            main.ONOSip = []
+            main.scapyHostNames = main.params[ 'SCAPY' ][ 'HOSTNAMES' ].split( ',' )
+            main.scapyHosts = []  # List of scapy hosts for iterating
+            main.assertReturnString = ''  # Assembled assert return string
+
+            main.ONOSip = main.ONOSbench.getOnosIps()
+            print main.ONOSip
+
+            # Assigning ONOS cli handles to a list
+            for i in range( 1,  main.maxNodes + 1 ):
+                main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
+
+            # -- INIT SECTION, ONLY RUNS ONCE -- #
+            main.startUp = imp.load_source( wrapperFile1,
+                                            main.dependencyPath +
+                                            wrapperFile1 +
+                                            ".py" )
+
+            main.intentFunction = imp.load_source( wrapperFile2,
+                                            main.dependencyPath +
+                                            wrapperFile2 +
+                                            ".py" )
+
+            main.topo = imp.load_source( wrapperFile3,
+                                         main.dependencyPath +
+                                         wrapperFile3 +
+                                         ".py" )
+
+            copyResult1 = main.ONOSbench.scp( main.Mininet1,
+                                              main.dependencyPath +
+                                              main.topology,
+                                              main.Mininet1.home + "custom/",
+                                              direction="to" )
+            if main.CLIs:
+                stepResult = main.TRUE
+            else:
+                main.log.error( "Did not properly created list of ONOS CLI handle" )
+                stepResult = main.FALSE
+        except Exception as e:
+            main.log.exception(e)
+            main.cleanup()
+            main.exit()
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully construct " +
+                                        "test variables ",
+                                 onfail="Failed to construct test variables" )
+
+        if gitPull == 'True':
+            main.step( "Building ONOS in " + gitBranch + " branch" )
+            onosBuildResult = main.startUp.onosBuild( main, gitBranch )
+            stepResult = onosBuildResult
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=stepResult,
+                                     onpass="Successfully compiled " +
+                                            "latest ONOS",
+                                     onfail="Failed to compile " +
+                                            "latest ONOS" )
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+        main.ONOSbench.getVersion( report=True )
+
+    def CASE2( self, main ):
+        """
+        - Set up cell
+            - Create cell file
+            - Set cell file
+            - Verify cell file
+        - Kill ONOS process
+        - Uninstall ONOS cluster
+        - Verify ONOS start up
+        - Install ONOS cluster
+        - Connect to cli
+        """
+
+        # main.scale[ 0 ] determines the current number of ONOS controller
+        main.numCtrls = int( main.scale[ 0 ] )
+        main.flowCompiler = "Flow Rules"
+
+        main.case( "Starting up " + str( main.numCtrls ) +
+                   " node(s) ONOS cluster" )
+        main.caseExplanation = "Set up ONOS with " + str( main.numCtrls ) +\
+                                " node(s) ONOS cluster"
+
+        #kill off all onos processes
+        main.log.info( "Safety check, killing all ONOS processes" +
+                       " before initiating environment setup" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Uninstalling ONOS package" )
+        onosUninstallResult = main.TRUE
+        for ip in main.ONOSip:
+            onosUninstallResult = onosUninstallResult and \
+                    main.ONOSbench.onosUninstall( nodeIp=ip )
+        stepResult = onosUninstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully uninstalled ONOS package",
+                                 onfail="Failed to uninstall ONOS package" )
+        time.sleep( main.startUpSleep )
+
+        for i in range( main.maxNodes ):
+            main.ONOSbench.onosDie( main.ONOSip[ i ] )
+
+        print "NODE COUNT = ", main.numCtrls
+
+        tempOnosIp = []
+        for i in range( main.numCtrls ):
+            tempOnosIp.append( main.ONOSip[i] )
+
+        main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
+                                       "temp", main.Mininet1.ip_address,
+                                       main.apps, tempOnosIp )
+
+        main.step( "Apply cell to environment" )
+        cellResult = main.ONOSbench.setCell( "temp" )
+        verifyResult = main.ONOSbench.verifyCell()
+        stepResult = cellResult and verifyResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully applied cell to " + \
+                                        "environment",
+                                 onfail="Failed to apply cell to environment " )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+        stepResult = packageResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully created ONOS package",
+                                 onfail="Failed to create ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Installing ONOS package" )
+        onosInstallResult = main.TRUE
+        for i in range( main.numCtrls ):
+            onosInstallResult = onosInstallResult and \
+                    main.ONOSbench.onosInstall( node=main.ONOSip[ i ] )
+        stepResult = onosInstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully installed ONOS package",
+                                 onfail="Failed to install ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Starting ONOS service" )
+        stopResult = main.TRUE
+        startResult = main.TRUE
+        onosIsUp = main.TRUE
+
+        for i in range( main.numCtrls ):
+            onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
+        if onosIsUp == main.TRUE:
+            main.log.report( "ONOS instance is up and ready" )
+        else:
+            main.log.report( "ONOS instance may not be up, stop and " +
+                             "start ONOS again " )
+
+            for i in range( main.numCtrls ):
+                stopResult = stopResult and \
+                        main.ONOSbench.onosStop( main.ONOSip[ i ] )
+            for i in range( main.numCtrls ):
+                startResult = startResult and \
+                        main.ONOSbench.onosStart( main.ONOSip[ i ] )
+        stepResult = onosIsUp and stopResult and startResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ONOS service is ready",
+                                 onfail="ONOS service did not start properly" )
+
+        main.step( "Start ONOS cli" )
+        cliResult = main.TRUE
+        for i in range( main.numCtrls ):
+            cliResult = cliResult and \
+                        main.CLIs[ i ].startOnosCli( main.ONOSip[ i ] )
+        stepResult = cliResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully start ONOS cli",
+                                 onfail="Failed to start ONOS cli" )
+
+        # Remove the first element in main.scale list
+        main.scale.remove( main.scale[ 0 ] )
+
+        main.intentFunction.report( main )
+
+    def CASE8( self, main ):
+        """
+        Compare ONOS Topology to Mininet Topology
+        """
+        import json
+
+        main.case( "Compare ONOS Topology view to Mininet topology" )
+        main.caseExplanation = "Compare topology elements between Mininet" +\
+                                " and ONOS"
+
+        main.log.info( "Gathering topology information from Mininet" )
+        devicesResults = main.FALSE  # Overall Boolean for device correctness
+        linksResults = main.FALSE  # Overall Boolean for link correctness
+        hostsResults = main.FALSE  # Overall Boolean for host correctness
+        deviceFails = []  # Nodes where devices are incorrect
+        linkFails = []  # Nodes where links are incorrect
+        hostFails = []  # Nodes where hosts are incorrect
+        attempts = main.checkTopoAttempts  # Remaining Attempts
+
+        mnSwitches = main.Mininet1.getSwitches()
+        mnLinks = main.Mininet1.getLinks()
+        mnHosts = main.Mininet1.getHosts()
+
+        main.step( "Comparing Mininet topology to ONOS topology" )
+
+        while ( attempts >= 0 ) and\
+            ( not devicesResults or not linksResults or not hostsResults ):
+            time.sleep( 2 )
+            if not devicesResults:
+                devices = main.topo.getAllDevices( main )
+                ports = main.topo.getAllPorts( main )
+                devicesResults = main.TRUE
+                deviceFails = []  # Reset for each failed attempt
+            if not linksResults:
+                links = main.topo.getAllLinks( main )
+                linksResults = main.TRUE
+                linkFails = []  # Reset for each failed attempt
+            if not hostsResults:
+                hosts = main.topo.getAllHosts( main )
+                hostsResults = main.TRUE
+                hostFails = []  # Reset for each failed attempt
+
+            #  Check for matching topology on each node
+            for controller in range( main.numCtrls ):
+                controllerStr = str( controller + 1 )  # ONOS node number
+                # Compare Devices
+                if devices[ controller ] and ports[ controller ] and\
+                    "Error" not in devices[ controller ] and\
+                    "Error" not in ports[ controller ]:
+
+                    try:
+                        deviceData = json.loads( devices[ controller ] )
+                        portData = json.loads( ports[ controller ] )
+                    except (TypeError,ValueError):
+                        main.log.error( "Could not load json: {0} or {1}".format( str( devices[ controller ] ), str( ports[ controller ] ) ) )
+                        currentDevicesResult = main.FALSE
+                    else:
+                        currentDevicesResult = main.Mininet1.compareSwitches(
+                            mnSwitches,deviceData,portData )
+                else:
+                    currentDevicesResult = main.FALSE
+                if not currentDevicesResult:
+                    deviceFails.append( controllerStr )
+                devicesResults = devicesResults and currentDevicesResult
+                # Compare Links
+                if links[ controller ] and "Error" not in links[ controller ]:
+                    try:
+                        linkData = json.loads( links[ controller ] )
+                    except (TypeError,ValueError):
+                        main.log.error("Could not load json:" + str( links[ controller ] ) )
+                        currentLinksResult = main.FALSE
+                    else:
+                        currentLinksResult = main.Mininet1.compareLinks(
+                            mnSwitches, mnLinks,linkData )
+                else:
+                    currentLinksResult = main.FALSE
+                if not currentLinksResult:
+                    linkFails.append( controllerStr )
+                linksResults = linksResults and currentLinksResult
+                # Compare Hosts
+                if hosts[ controller ] and "Error" not in hosts[ controller ]:
+                    try:
+                        hostData = json.loads( hosts[ controller ] )
+                    except (TypeError,ValueError):
+                        main.log.error("Could not load json:" + str( hosts[ controller ] ) )
+                        currentHostsResult = main.FALSE
+                    else:
+                        currentHostsResult = main.Mininet1.compareHosts(
+                                mnHosts,hostData )
+                else:
+                    currentHostsResult = main.FALSE
+                if not currentHostsResult:
+                    hostFails.append( controllerStr )
+                hostsResults = hostsResults and currentHostsResult
+            # Decrement Attempts Remaining
+            attempts -= 1
+
+
+        utilities.assert_equals( expect=[],
+                                 actual=deviceFails,
+                                 onpass="ONOS correctly discovered all devices",
+                                 onfail="ONOS incorrectly discovered devices on nodes: " +
+                                 str( deviceFails ) )
+        utilities.assert_equals( expect=[],
+                                 actual=linkFails,
+                                 onpass="ONOS correctly discovered all links",
+                                 onfail="ONOS incorrectly discovered links on nodes: " +
+                                 str( linkFails ) )
+        utilities.assert_equals( expect=[],
+                                 actual=hostFails,
+                                 onpass="ONOS correctly discovered all hosts",
+                                 onfail="ONOS incorrectly discovered hosts on nodes: " +
+                                 str( hostFails ) )
+        topoResults = hostsResults and linksResults and devicesResults
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=topoResults,
+                                 onpass="ONOS correctly discovered the topology",
+                                 onfail="ONOS incorrectly discovered the topology" )
+
+    def CASE10( self, main ):
+        """
+            Start Mininet topology with OF 1.0 switches
+        """
+        main.OFProtocol = "1.0"
+        main.log.report( "Start Mininet topology with OF 1.0 switches" )
+        main.case( "Start Mininet topology with OF 1.0 switches" )
+        main.caseExplanation = "Start mininet topology with OF 1.0 " +\
+                                "switches to test intents, exits out if " +\
+                                "topology did not start correctly"
+
+        main.step( "Starting Mininet topology with OF 1.0 switches" )
+        args = "--switch ovs,protocols=OpenFlow10"
+        topoResult = main.Mininet1.startNet( topoFile=main.dependencyPath +
+                                                      main.topology,
+                                             args=args )
+        stepResult = topoResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully loaded topology",
+                                 onfail="Failed to load topology" )
+        # Exit if topology did not load properly
+        if not topoResult:
+            main.cleanup()
+            main.exit()
+
+    def CASE11( self, main ):
+        """
+            Start Mininet topology with OF 1.3 switches
+        """
+        main.OFProtocol = "1.3"
+        main.log.report( "Start Mininet topology with OF 1.3 switches" )
+        main.case( "Start Mininet topology with OF 1.3 switches" )
+        main.caseExplanation = "Start mininet topology with OF 1.3 " +\
+                                "switches to test intents, exits out if " +\
+                                "topology did not start correctly"
+
+        main.step( "Starting Mininet topology with OF 1.3 switches" )
+        args = "--switch ovs,protocols=OpenFlow13"
+        topoResult = main.Mininet1.startNet( topoFile=main.dependencyPath +
+                                                      main.topology,
+                                             args=args )
+        stepResult = topoResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully loaded topology",
+                                 onfail="Failed to load topology" )
+        # Exit if topology did not load properly
+        if not topoResult:
+            main.cleanup()
+            main.exit()
+
+    def CASE12( self, main ):
+        """
+            Assign mastership to controllers
+        """
+        import re
+
+        main.case( "Assign switches to controllers" )
+        main.step( "Assigning switches to controllers" )
+        main.caseExplanation = "Assign OF " + main.OFProtocol +\
+                                " switches to ONOS nodes"
+
+        assignResult = main.TRUE
+        switchList = []
+
+        # Creates a list switch name, use getSwitch() function later...
+        for i in range( 1, ( main.numSwitch + 1 ) ):
+            switchList.append( 's' + str( i ) )
+
+        tempONOSip = []
+        for i in range( main.numCtrls ):
+            tempONOSip.append( main.ONOSip[ i ] )
+
+        assignResult = main.Mininet1.assignSwController( sw=switchList,
+                                                         ip=tempONOSip,
+                                                         port='6653' )
+        if not assignResult:
+            main.cleanup()
+            main.exit()
+
+        for i in range( 1, ( main.numSwitch + 1 ) ):
+            response = main.Mininet1.getSwController( "s" + str( i ) )
+            print( "Response is " + str( response ) )
+            if re.search( "tcp:" + main.ONOSip[ 0 ], response ):
+                assignResult = assignResult and main.TRUE
+            else:
+                assignResult = main.FALSE
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully assigned switches" +
+                                        "to controller",
+                                 onfail="Failed to assign switches to " +
+                                        "controller" )
+
+    def CASE13( self,main ):
+        """
+            Create Scapy components
+        """
+        main.case( "Create scapy components" )
+        main.step( "Create scapy components" )
+        import json
+        scapyResult = main.TRUE
+        for hostName in main.scapyHostNames:
+            main.Scapy1.createHostComponent( hostName )
+            main.scapyHosts.append( getattr( main, hostName ) )
+
+        main.step( "Start scapy components" )
+        for host in main.scapyHosts:
+            host.startHostCli()
+            host.startScapy()
+            host.updateSelf()
+            main.log.debug( host.name )
+            main.log.debug( host.hostIp )
+            main.log.debug( host.hostMac )
+
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=scapyResult,
+                                 onpass="Successfully created Scapy Components",
+                                 onfail="Failed to discover Scapy Components" )
+
+    def CASE14( self, main ):
+        """
+            Discover all hosts with fwd and pingall and store its data in a dictionary
+        """
+        main.case( "Discover all hosts" )
+        main.step( "Pingall hosts and confirm ONOS discovery" )
+        utilities.retry( f=main.intentFunction.fwdPingall, retValue=main.FALSE, args=[ main ] )
+
+        utilities.retry( f=main.intentFunction.confirmHostDiscovery, retValue=main.FALSE,
+                         args=[ main ], attempts=main.checkTopoAttempts, sleep=2 )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully discovered hosts",
+                                 onfail="Failed to discover hosts" )
+
+        main.step( "Populate hostsData" )
+        stepResult = main.intentFunction.populateHostData( main )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully populated hostsData",
+                                 onfail="Failed to populate hostsData" )
+
+    def CASE15( self, main ):
+        """
+            Discover all hosts with scapy arp packets and store its data to a dictionary
+        """
+        main.case( "Discover all hosts using scapy" )
+        main.step( "Send packets from each host to the first host and confirm onos discovery" )
+
+        import collections
+        if len( main.scapyHosts ) < 1:
+            main.log.error( "No scapy hosts have been created" )
+            main.skipCase()
+
+        # Send ARP packets from each scapy host component
+        main.intentFunction.sendDiscoveryArp( main, main.scapyHosts )
+
+        stepResult = utilities.retry( f=main.intentFunction.confirmHostDiscovery,
+                                      retValue=main.FALSE, args=[ main ],
+                                      attempts=main.checkTopoAttempts, sleep=2 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ONOS correctly discovered all hosts",
+                                 onfail="ONOS incorrectly discovered hosts" )
+
+        main.step( "Populate hostsData" )
+        stepResult = main.intentFunction.populateHostData( main )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully populated hostsData",
+                                 onfail="Failed to populate hostsData" )
+
+    def CASE16( self, main ):
+        """
+            Balance Masters
+        """
+        main.case( "Balance mastership of switches" )
+        main.step( "Balancing mastership of switches" )
+
+        balanceResult = main.FALSE
+        balanceResult = utilities.retry( f=main.CLIs[ 0 ].balanceMasters, retValue=main.FALSE, args=[] )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=balanceResult,
+                                 onpass="Successfully balanced mastership of switches",
+                                 onfail="Failed to balance mastership of switches" )
+
+    def CASE17( self, main ):
+        """
+            Use Flow Objectives
+        """
+        main.case( "Enable intent compilation using Flow Objectives" )
+        main.step( "Enabling Flow Objectives" )
+
+        main.flowCompiler = "Flow Objectives"
+
+        cmd = "org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator"
+
+        stepResult = main.CLIs[ 0 ].setCfg( component=cmd,
+                                            propName="useFlowObjectives", value="true" )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully activated Flow Objectives",
+                                 onfail="Failed to activate Flow Objectives" )
+
+    def CASE18( self, main ):
+        """
+            Stop mininet and remove scapy host
+        """
+        main.log.report( "Stop Mininet and Scapy" )
+        main.case( "Stop Mininet and Scapy" )
+        main.caseExplanation = "Stopping the current mininet topology " +\
+                                "to start up fresh"
+        main.step( "Stopping and Removing Scapy Host Components" )
+        scapyResult = main.TRUE
+        for host in main.scapyHosts:
+            scapyResult = scapyResult and host.stopScapy()
+            main.log.info( "Stopped Scapy Host: {0}".format( host.name ) )
+
+        for host in main.scapyHosts:
+            scapyResult = scapyResult and main.Scapy1.removeHostComponent( host.name )
+            main.log.info( "Removed Scapy Host Component: {0}".format( host.name ) )
+
+        main.scapyHosts = []
+        main.scapyHostIPs = []
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=scapyResult,
+                                 onpass="Successfully stopped scapy and removed host components",
+                                 onfail="Failed to stop mininet and scapy" )
+
+        main.step( "Stopping Mininet Topology" )
+        mininetResult = main.Mininet1.stopNet( )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=mininetResult,
+                                 onpass="Successfully stopped mininet and scapy",
+                                 onfail="Failed to stop mininet and scapy" )
+        # Exit if topology did not load properly
+        if not ( mininetResult and scapyResult ):
+            main.cleanup()
+            main.exit()
+
+    def CASE1000( self, main ):
+        """
+            Add host intents between 2 host:
+                - Discover hosts
+                - Add host intents
+                - Check intents
+                - Verify flows
+                - Ping hosts
+                - Reroute
+                    - Link down
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                    - Link up
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                - Remove intents
+        """
+        import time
+        import json
+        import re
+
+        # Assert variables - These variable's name|format must be followed
+        # if you want to use the wrapper function
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+
+        # Save leader candidates
+        intentLeadersOld = main.CLIs[ 0 ].leaderCandidates()
+
+        main.testName = "Host Intents"
+        main.case( main.testName + " Test - " + str( main.numCtrls ) +
+                   " NODE(S) - OF " + main.OFProtocol + " - Using " + main.flowCompiler )
+        main.caseExplanation = "This test case tests Host intents using " +\
+                                str( main.numCtrls ) + " node(s) cluster;\n" +\
+                                "Different type of hosts will be tested in " +\
+                                "each step such as IPV4, Dual stack, VLAN " +\
+                                "etc;\nThe test will use OF " + main.OFProtocol +\
+                                " OVS running in Mininet and compile intents" +\
+                               " using " + main.flowCompiler
+
+        main.step( "IPV4: Add host intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for IPV4 host intent with mac addresses\n"
+        host1 = { "name":"h1","id":"00:00:00:00:00:01/-1" }
+        host2 = { "name":"h9","id":"00:00:00:00:00:09/-1" }
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='IPV4',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2)
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='IPV4',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString)
+
+        main.step( "DUALSTACK1: Add host intents between h3 and h11" )
+        main.assertReturnString = "Assertion Result for dualstack IPV4 with MAC addresses\n"
+        host1 = { "name":"h3","id":"00:00:00:00:00:03/-1" }
+        host2 = { "name":"h11","id":"00:00:00:00:00:0B/-1 "}
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='DUALSTACK',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2)
+
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='DUALSTACK',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18)
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString)
+
+        main.step( "DUALSTACK2: Add host intents between h1 and h11" )
+        main.assertReturnString = "Assertion Result for dualstack2 host intent\n"
+        host1 = { "name":"h1" }
+        host2 = { "name":"h11" }
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='DUALSTACK2',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2)
+
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='DUALSTACK2',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString)
+
+        main.step( "1HOP: Add host intents between h1 and h3" )
+        main.assertReturnString = "Assertion Result for 1HOP for IPV4 same switch\n"
+        host1 = { "name":"h1" }
+        host2 = { "name":"h3" }
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='1HOP',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2)
+
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='1HOP',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString)
+
+        main.step( "VLAN1: Add vlan host intents between h4 and h12" )
+        main.assertReturnString = "Assertion Result vlan IPV4\n"
+        host1 = { "name":"h4","id":"00:00:00:00:00:04/100" }
+        host2 = { "name":"h12","id":"00:00:00:00:00:0C/100 "}
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='VLAN1',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2)
+
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='VLAN1',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString)
+
+        main.step( "VLAN2: Add inter vlan host intents between h13 and h20" )
+        main.assertReturnString = "Assertion Result different VLAN negative test\n"
+        host1 = { "name":"h13" }
+        host2 = { "name":"h20" }
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='VLAN2',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2)
+
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='VLAN2',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString)
+
+        main.step( "Confirm that ONOS leadership is unchanged")
+        intentLeadersNew = main.CLIs[ 0 ].leaderCandidates()
+        main.intentFunction.checkLeaderChange( intentLeadersOld,
+                                                intentLeadersNew )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass="ONOS Leaders Unchanged",
+                                 onfail="ONOS Leader Mismatch")
+
+        main.intentFunction.report( main )
+
+    def CASE2000( self, main ):
+        """
+            Add point intents between 2 hosts:
+                - Get device ids | ports
+                - Add point intents
+                - Check intents
+                - Verify flows
+                - Ping hosts
+                - Reroute
+                    - Link down
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                    - Link up
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                - Remove intents
+        """
+        import time
+        import json
+        import re
+
+        # Assert variables - These variable's name|format must be followed
+        # if you want to use the wrapper function
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+
+        main.testName = "Point Intents"
+        main.case( main.testName + " Test - " + str( main.numCtrls ) +
+                   " NODE(S) - OF " + main.OFProtocol + " - Using " + main.flowCompiler )
+        main.caseExplanation = "This test case will test point to point" +\
+                               " intents using " + str( main.numCtrls ) +\
+                               " node(s) cluster;\n" +\
+                               "Different type of hosts will be tested in " +\
+                               "each step such as IPV4, Dual stack, VLAN etc" +\
+                               ";\nThe test will use OF " + main.OFProtocol +\
+                               " OVS running in Mininet and compile intents" +\
+                               " using " + main.flowCompiler
+
+        # No option point intents
+        main.step( "NOOPTION: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for NOOPTION point intent\n"
+        senders = [
+            { "name":"h1","device":"of:0000000000000005/1" }
+        ]
+        recipients = [
+            { "name":"h9","device":"of:0000000000000006/1" }
+        ]
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="NOOPTION",
+                                       senders=senders,
+                                       recipients=recipients )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="NOOPTION",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        stepResult = main.TRUE
+        main.step( "IPV4: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for IPV4 point intent\n"
+        senders = [
+            { "name":"h1","device":"of:0000000000000005/1","mac":"00:00:00:00:00:01" }
+        ]
+        recipients = [
+            { "name":"h9","device":"of:0000000000000006/1","mac":"00:00:00:00:00:09" }
+        ]
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="IPV4",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4" )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "IPV4_2: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for IPV4 no mac address point intents\n"
+        senders = [
+            { "name":"h1","device":"of:0000000000000005/1" }
+        ]
+        recipients = [
+            { "name":"h9","device":"of:0000000000000006/1" }
+        ]
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="IPV4_2",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4" )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4_2",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "SDNIP-ICMP: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for SDNIP-ICMP IPV4 using TCP point intents\n"
+        senders = [
+            { "name":"h1","device":"of:0000000000000005/1","mac":"00:00:00:00:00:01",
+              "ip":( main.h1.hostIp + "/24" ) }
+        ]
+        recipients = [
+            { "name":"h9","device":"of:0000000000000006/1","mac":"00:00:00:00:00:09",
+              "ip":( main.h9.hostIp + "/24" ) }
+        ]
+        ipProto = main.params[ 'SDNIP' ][ 'ipPrototype' ]
+        # Uneccessary, not including this in the selectors
+        tcpSrc = main.params[ 'SDNIP' ][ 'srcPort' ]
+        tcpDst = main.params[ 'SDNIP' ][ 'dstPort' ]
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="SDNIP-ICMP",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4",
+                                       ipProto=ipProto,
+                                       tcpSrc=tcpSrc,
+                                       tcpDst=tcpDst )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="SDNIP_ICMP",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "SDNIP-TCP: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for SDNIP-TCP IPV4 using ICMP point intents\n"
+        mac1 = main.hostsData[ 'h1' ][ 'mac' ]
+        mac2 = main.hostsData[ 'h9' ][ 'mac' ]
+        ip1 = str( main.hostsData[ 'h1' ][ 'ipAddresses' ][ 0 ] ) + "/32"
+        ip2 = str( main.hostsData[ 'h9' ][ 'ipAddresses' ][ 0 ] ) + "/32"
+        ipProto = main.params[ 'SDNIP' ][ 'tcpProto' ]
+        tcp1 = main.params[ 'SDNIP' ][ 'srcPort' ]
+        tcp2 = main.params[ 'SDNIP' ][ 'dstPort' ]
+
+        stepResult = main.intentFunction.pointIntentTcp(
+                                           main,
+                                           name="SDNIP-TCP",
+                                           host1="h1",
+                                           host2="h9",
+                                           deviceId1="of:0000000000000005/1",
+                                           deviceId2="of:0000000000000006/1",
+                                           mac1=mac1,
+                                           mac2=mac2,
+                                           ethType="IPV4",
+                                           ipProto=ipProto,
+                                           ip1=ip1,
+                                           ip2=ip2,
+                                           tcp1=tcp1,
+                                           tcp2=tcp2 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "DUALSTACK1: Add point intents between h3 and h11" )
+        main.assertReturnString = "Assertion Result for Dualstack1 IPV4 with mac address point intents\n"
+        senders = [
+            { "name":"h3","device":"of:0000000000000005/3","mac":"00:00:00:00:00:03" }
+        ]
+        recipients = [
+            { "name":"h11","device":"of:0000000000000006/3","mac":"00:00:00:00:00:0B" }
+        ]
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="DUALSTACK1",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4" )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="DUALSTACK1",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "VLAN: Add point intents between h5 and h21" )
+        main.assertReturnString = "Assertion Result for VLAN IPV4 with mac address point intents\n"
+        senders = [
+            { "name":"h5","device":"of:0000000000000005/5","mac":"00:00:00:00:00:05" }
+        ]
+        recipients = [
+            { "name":"h21","device":"of:0000000000000007/5","mac":"00:00:00:00:00:15" }
+        ]
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="DUALSTACK1",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4" )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="DUALSTACK1",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "1HOP: Add point intents between h1 and h3" )
+        main.assertReturnString = "Assertion Result for 1HOP IPV4 with no mac address point intents\n"
+        senders = [
+            { "name":"h1","device":"of:0000000000000005/1","mac":"00:00:00:00:00:01" }
+        ]
+        recipients = [
+            { "name":"h3","device":"of:0000000000000005/3","mac":"00:00:00:00:00:03" }
+        ]
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="1HOP IPV4",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4" )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="1HOP IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.intentFunction.report( main )
+
+    def CASE3000( self, main ):
+        """
+            Add single point to multi point intents
+                - Get device ids
+                - Add single point to multi point intents
+                - Check intents
+                - Verify flows
+                - Ping hosts
+                - Reroute
+                    - Link down
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                    - Link up
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                - Remove intents
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+
+        main.testName = "Single to Multi Point Intents"
+        main.case( main.testName + " Test - " + str( main.numCtrls ) +
+                   " NODE(S) - OF " + main.OFProtocol + " - Using " + main.flowCompiler )
+        main.caseExplanation = "This test case will test single point to" +\
+                               " multi point intents using " +\
+                               str( main.numCtrls ) + " node(s) cluster;\n" +\
+                               "Different type of hosts will be tested in " +\
+                               "each step such as IPV4, Dual stack, VLAN etc" +\
+                               ";\nThe test will use OF " + main.OFProtocol +\
+                               " OVS running in Mininet and compile intents" +\
+                               " using " + main.flowCompiler
+
+        main.step( "NOOPTION: Install and test single point to multi point intents" )
+        main.assertReturnString = "Assertion results for IPV4 single to multi point intent with no options set\n"
+        senders = [
+            { "name":"h8", "device":"of:0000000000000005/8" }
+        ]
+        recipients = [
+            { "name":"h16", "device":"of:0000000000000006/8" },
+            { "name":"h24", "device":"of:0000000000000007/8" }
+        ]
+        badSenders=[ { "name":"h9" } ]  # Senders that are not in the intent
+        badRecipients=[ { "name":"h17" } ]  # Recipients that are not in the intent
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installSingleToMultiIntent(
+                                         main,
+                                         name="NOOPTION",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="NOOPTION",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         badSenders=badSenders,
+                                         badRecipients=badRecipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "IPV4: Install and test single point to multi point intents" )
+        main.assertReturnString = "Assertion results for IPV4 single to multi point intent with IPV4 type and MAC addresses\n"
+        senders = [
+            { "name":"h8", "device":"of:0000000000000005/8","mac":"00:00:00:00:00:08" }
+        ]
+        recipients = [
+            { "name":"h16", "device":"of:0000000000000006/8", "mac":"00:00:00:00:00:10" },
+            { "name":"h24", "device":"of:0000000000000007/8", "mac":"00:00:00:00:00:18" }
+        ]
+        badSenders=[ { "name":"h9" } ]  # Senders that are not in the intent
+        badRecipients=[ { "name":"h17" } ]  # Recipients that are not in the intent
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installSingleToMultiIntent(
+                                         main,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         badSenders=badSenders,
+                                         badRecipients=badRecipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "IPV4_2: Add single point to multi point intents" )
+        main.assertReturnString = "Assertion results for IPV4 single to multi point intent with IPV4 type and no MAC addresses\n"
+        senders = [
+            { "name":"h8", "device":"of:0000000000000005/8" }
+        ]
+        recipients = [
+            { "name":"h16", "device":"of:0000000000000006/8" },
+            { "name":"h24", "device":"of:0000000000000007/8" }
+        ]
+        badSenders=[ { "name":"h9" } ]  # Senders that are not in the intent
+        badRecipients=[ { "name":"h17" } ]  # Recipients that are not in the intent
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installSingleToMultiIntent(
+                                         main,
+                                         name="IPV4_2",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4_2",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         badSenders=badSenders,
+                                         badRecipients=badRecipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "VLAN: Add single point to multi point intents" )
+        main.assertReturnString = "Assertion results for IPV4 single to multi point intent with IPV4 type and MAC addresses in the same VLAN\n"
+        senders = [
+            { "name":"h4", "device":"of:0000000000000005/4", "mac":"00:00:00:00:00:04" }
+        ]
+        recipients = [
+            { "name":"h12", "device":"of:0000000000000006/4", "mac":"00:00:00:00:00:0C" },
+            { "name":"h20", "device":"of:0000000000000007/4", "mac":"00:00:00:00:00:14" }
+        ]
+        badSenders=[ { "name":"h13" } ]  # Senders that are not in the intent
+        badRecipients=[ { "name":"h21" } ]  # Recipients that are not in the intent
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installSingleToMultiIntent(
+                                         main,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         badSenders=badSenders,
+                                         badRecipients=badRecipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.intentFunction.report( main )
+
+    def CASE4000( self, main ):
+        """
+            Add multi point to single point intents
+                - Get device ids
+                - Add multi point to single point intents
+                - Check intents
+                - Verify flows
+                - Ping hosts
+                - Reroute
+                    - Link down
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                    - Link up
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+             - Remove intents
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+
+        main.testName = "Multi To Single Point Intents"
+        main.case( main.testName + " Test - " + str( main.numCtrls ) +
+                   " NODE(S) - OF " + main.OFProtocol + " - Using " + main.flowCompiler )
+        main.caseExplanation = "This test case will test single point to" +\
+                               " multi point intents using " +\
+                               str( main.numCtrls ) + " node(s) cluster;\n" +\
+                               "Different type of hosts will be tested in " +\
+                               "each step such as IPV4, Dual stack, VLAN etc" +\
+                               ";\nThe test will use OF " + main.OFProtocol +\
+                               " OVS running in Mininet and compile intents" +\
+                               " using " + main.flowCompiler
+
+        main.step( "NOOPTION: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for NOOPTION multi to single point intent\n"
+        senders = [
+            { "name":"h16", "device":"of:0000000000000006/8" },
+            { "name":"h24", "device":"of:0000000000000007/8" }
+        ]
+        recipients = [
+            { "name":"h8", "device":"of:0000000000000005/8" }
+        ]
+        badSenders=[ { "name":"h17" } ]  # Senders that are not in the intent
+        badRecipients=[ { "name":"h9" } ]  # Recipients that are not in the intent
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installMultiToSingleIntent(
+                                         main,
+                                         name="NOOPTION",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2" )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="NOOPTION",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         badSenders=badSenders,
+                                         badRecipients=badRecipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18 )
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "IPV4: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for IPV4 multi to single point intent with IPV4 type and MAC addresses\n"
+        senders = [
+            { "name":"h16", "device":"of:0000000000000006/8", "mac":"00:00:00:00:00:10" },
+            { "name":"h24", "device":"of:0000000000000007/8", "mac":"00:00:00:00:00:18" }
+        ]
+        recipients = [
+            { "name":"h8", "device":"of:0000000000000005/8", "mac":"00:00:00:00:00:08" }
+        ]
+        badSenders=[ { "name":"h17" } ]  # Senders that are not in the intent
+        badRecipients=[ { "name":"h9" } ]  # Recipients that are not in the intent
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installMultiToSingleIntent(
+                                         main,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         badSenders=badSenders,
+                                         badRecipients=badRecipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "IPV4_2: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for IPV4 multi to single point intent with IPV4 type and no MAC addresses\n"
+        senders = [
+            { "name":"h16", "device":"of:0000000000000006/8" },
+            { "name":"h24", "device":"of:0000000000000007/8" }
+        ]
+        recipients = [
+            { "name":"h8", "device":"of:0000000000000005/8" }
+        ]
+        badSenders=[ { "name":"h17" } ]  # Senders that are not in the intent
+        badRecipients=[ { "name":"h9" } ]  # Recipients that are not in the intent
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installMultiToSingleIntent(
+                                         main,
+                                         name="IPV4_2",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4_2",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         badSenders=badSenders,
+                                         badRecipients=badRecipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "VLAN: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for IPV4 multi to single point intent with IPV4 type and no MAC addresses in the same VLAN\n"
+        senders = [
+            { "name":"h13", "device":"of:0000000000000006/5" },
+            { "name":"h21", "device":"of:0000000000000007/5" }
+        ]
+        recipients = [
+            { "name":"h5", "device":"of:0000000000000005/5" }
+        ]
+        badSenders=[ { "name":"h12" } ]  # Senders that are not in the intent
+        badRecipients=[ { "name":"h20" } ]  # Recipients that are not in the intent
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installMultiToSingleIntent(
+                                         main,
+                                         name="VLAN",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="VLAN",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         badSenders=badSenders,
+                                         badRecipients=badRecipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.intentFunction.report( main )
+
+    def CASE5000( self, main ):
+        """
+        Tests Host Mobility
+        Modifies the topology location of h1
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+        main.case( "Test host mobility with host intents " )
+        main.step( "Testing host mobility by moving h1 from s5 to s6" )
+        h1PreMove = main.hostsData[ "h1" ][ "location" ][ 0:19 ]
+
+        main.log.info( "Moving h1 from s5 to s6")
+        main.Mininet1.moveHost( "h1","s5","s6" )
+
+        # Send discovery ping from moved host
+        # Moving the host brings down the default interfaces and creates a new one.
+        # Scapy is restarted on this host to detect the new interface
+        main.h1.stopScapy()
+        main.h1.startScapy()
+
+        # Discover new host location in ONOS and populate host data.
+        # Host 1 IP and MAC should be unchanged
+        main.intentFunction.sendDiscoveryArp( main, [ main.h1 ] )
+        main.intentFunction.populateHostData( main )
+
+        h1PostMove = main.hostsData[ "h1" ][ "location" ][ 0:19 ]
+
+        utilities.assert_equals( expect="of:0000000000000006",
+                                 actual=h1PostMove,
+                                 onpass="Mobility: Successfully moved h1 to s6",
+                                 onfail="Mobility: Failed to move h1 to s6" +
+                                        " to single point intents" +
+                                        " with IPV4 type and MAC addresses" +
+                                        " in the same VLAN" )
+
+        main.step( "IPV4: Add host intents between h1 and h9" )
+        main.assertReturnString = "Assert result for IPV4 host intent between h1, moved, and h9\n"
+        host1 = { "name":"h1","id":"00:00:00:00:00:01/-1" }
+        host2 = { "name":"h9","id":"00:00:00:00:00:09/-1" }
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='IPV4 Mobility IPV4',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2 )
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                                  name='Host Mobility IPV4',
+                                                  intentId = installResult,
+                                                  onosNode='0',
+                                                  host1=host1,
+                                                  host2=host2,
+                                                  sw1="s6",
+                                                  sw2="s2",
+                                                  expectedLink=18 )
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.intentFunction.report( main )
+
+    def CASE6000( self, main ):
+        """
+        Tests Multi to Single Point Intent and Single to Multi Point Intent End Point Failure
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+        main.case( "Test Multi to Single End Point Failure" )
+        main.step( "Installing Multi to Single Point intents" )
+
+        main.assertReturnString = "Assertion results for IPV4 multi to single \
+                                  point intent end point failure with no options set\n"
+        senders = [
+            { "name":"h16", "device":"of:0000000000000006/8" },
+            { "name":"h24", "device":"of:0000000000000007/8" }
+        ]
+        recipients = [
+            { "name":"h8", "device":"of:0000000000000005/8" }
+        ]
+        isolatedSenders = [
+            { "name":"h24"}
+        ]
+        isolatedRecipients = []
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installMultiToSingleIntent(
+                                         main,
+                                         name="NOOPTION",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2" )
+
+        if installResult:
+            testResult = main.intentFunction.testEndPointFail(
+                                         main,
+                                         intentId=installResult,
+                                         name="NOOPTION",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         isolatedSenders=isolatedSenders,
+                                         isolatedRecipients=isolatedRecipients,
+                                         sw1="s6",
+                                         sw2="s2",
+                                         sw3="s4",
+                                         sw4="s1",
+                                         sw5="s3",
+                                         expectedLink1=16,
+                                         expectedLink2=14 )
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "IPV4: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for IPV4 multi to single \
+                                  point intent end point failure with IPV4 type and MAC addresses\n"
+        senders = [
+            { "name":"h16", "device":"of:0000000000000006/8", "mac":"00:00:00:00:00:10" },
+            { "name":"h24", "device":"of:0000000000000007/8", "mac":"00:00:00:00:00:18" }
+        ]
+        recipients = [
+            { "name":"h8", "device":"of:0000000000000005/8", "mac":"00:00:00:00:00:08" }
+        ]
+        isolatedSenders = [
+            { "name":"h24"}
+        ]
+        isolatedRecipients = []
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installMultiToSingleIntent(
+                                         main,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testEndPointFail(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         isolatedSenders=isolatedSenders,
+                                         isolatedRecipients=isolatedRecipients,
+                                         sw1="s6",
+                                         sw2="s2",
+                                         sw3="s4",
+                                         sw4="s1",
+                                         sw5="s3",
+                                         expectedLink1=16,
+                                         expectedLink2=14 )
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "IPV4_2: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for IPV4 multi to single \
+                                  point intent end point failure with IPV4 type and no MAC addresses\n"
+        senders = [
+            { "name":"h16", "device":"of:0000000000000006/8" },
+            { "name":"h24", "device":"of:0000000000000007/8" }
+        ]
+        recipients = [
+            { "name":"h8", "device":"of:0000000000000005/8" }
+        ]
+        isolatedSenders = [
+            { "name":"h24"}
+        ]
+        isolatedRecipients = []
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installMultiToSingleIntent(
+                                         main,
+                                         name="IPV4_2",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testEndPointFail(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4_2",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         isolatedSenders=isolatedSenders,
+                                         isolatedRecipients=isolatedRecipients,
+                                         sw1="s6",
+                                         sw2="s2",
+                                         sw3="s4",
+                                         sw4="s1",
+                                         sw5="s3",
+                                         expectedLink1=16,
+                                         expectedLink2=14 )
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "VLAN: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for IPV4 multi to single \
+                                  point intent end point failure with IPV4 type and no MAC addresses in the same VLAN\n"
+        senders = [
+            { "name":"h13", "device":"of:0000000000000006/5" },
+            { "name":"h21", "device":"of:0000000000000007/5" }
+        ]
+        recipients = [
+            { "name":"h5", "device":"of:0000000000000005/5" }
+        ]
+        isolatedSenders = [
+            { "name":"h21"}
+        ]
+        isolatedRecipients = []
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installMultiToSingleIntent(
+                                         main,
+                                         name="VLAN",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testEndPointFail(
+                                         main,
+                                         intentId=installResult,
+                                         name="VLAN",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         isolatedSenders=isolatedSenders,
+                                         isolatedRecipients=isolatedRecipients,
+                                         sw1="s6",
+                                         sw2="s2",
+                                         sw3="s4",
+                                         sw4="s1",
+                                         sw5="s3",
+                                         expectedLink1=16,
+                                         expectedLink2=14 )
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "NOOPTION: Install and test single point to multi point intents" )
+        main.assertReturnString = "Assertion results for IPV4 single to multi \
+                                  point intent end point failure with no options set\n"
+        senders = [
+            { "name":"h8", "device":"of:0000000000000005/8" }
+        ]
+        recipients = [
+            { "name":"h16", "device":"of:0000000000000006/8" },
+            { "name":"h24", "device":"of:0000000000000007/8" }
+        ]
+        isolatedSenders = []
+        isolatedRecipients = [
+            { "name":"h24" }
+        ]
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installSingleToMultiIntent(
+                                         main,
+                                         name="NOOPTION",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testEndPointFail(
+                                         main,
+                                         intentId=installResult,
+                                         name="NOOPTION",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         isolatedSenders=isolatedSenders,
+                                         isolatedRecipients=isolatedRecipients,
+                                         sw1="s6",
+                                         sw2="s2",
+                                         sw3="s4",
+                                         sw4="s1",
+                                         sw5="s3",
+                                         expectedLink1=16,
+                                         expectedLink2=14 )
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "IPV4: Install and test single point to multi point intents" )
+        main.assertReturnString = "Assertion results for IPV4 single to multi \
+                                  point intent end point failure with IPV4 type and no MAC addresses\n"
+        senders = [
+            { "name":"h8", "device":"of:0000000000000005/8","mac":"00:00:00:00:00:08" }
+        ]
+        recipients = [
+            { "name":"h16", "device":"of:0000000000000006/8", "mac":"00:00:00:00:00:10" },
+            { "name":"h24", "device":"of:0000000000000007/8", "mac":"00:00:00:00:00:18" }
+        ]
+        isolatedSenders = []
+        isolatedRecipients = [
+            { "name":"h24" }
+        ]
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installSingleToMultiIntent(
+                                         main,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testEndPointFail(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         isolatedSenders=isolatedSenders,
+                                         isolatedRecipients=isolatedRecipients,
+                                         sw1="s6",
+                                         sw2="s2",
+                                         sw3="s4",
+                                         sw4="s1",
+                                         sw5="s3",
+                                         expectedLink1=16,
+                                         expectedLink2=14 )
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "IPV4_2: Add single point to multi point intents" )
+        main.assertReturnString = "Assertion results for IPV4 single to multi\
+                                  point intent endpoint failure with IPV4 type and no MAC addresses\n"
+        senders = [
+            { "name":"h8", "device":"of:0000000000000005/8" }
+        ]
+        recipients = [
+            { "name":"h16", "device":"of:0000000000000006/8" },
+            { "name":"h24", "device":"of:0000000000000007/8" }
+        ]
+        isolatedSenders = []
+        isolatedRecipients = [
+            { "name":"h24" }
+        ]
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installSingleToMultiIntent(
+                                         main,
+                                         name="IPV4_2",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testEndPointFail(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4_2",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         isolatedSenders=isolatedSenders,
+                                         isolatedRecipients=isolatedRecipients,
+                                         sw1="s6",
+                                         sw2="s2",
+                                         sw3="s4",
+                                         sw4="s1",
+                                         sw5="s3",
+                                         expectedLink1=16,
+                                         expectedLink2=14 )
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "VLAN: Add single point to multi point intents" )
+        main.assertReturnString = "Assertion results for IPV4 single to multi point\
+                                  intent endpoint failure with IPV4 type and MAC addresses in the same VLAN\n"
+        senders = [
+            { "name":"h4", "device":"of:0000000000000005/4", "mac":"00:00:00:00:00:04" }
+        ]
+        recipients = [
+            { "name":"h12", "device":"of:0000000000000006/4", "mac":"00:00:00:00:00:0C" },
+            { "name":"h20", "device":"of:0000000000000007/4", "mac":"00:00:00:00:00:14" }
+        ]
+        isolatedSenders = []
+        isolatedRecipients = [
+            { "name":"h20" }
+        ]
+        testResult = main.FALSE
+        installResult = main.FALSE
+        installResult = main.intentFunction.installSingleToMultiIntent(
+                                         main,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         ethType="IPV4",
+                                         sw1="s5",
+                                         sw2="s2")
+
+        if installResult:
+            testResult = main.intentFunction.testEndPointFail(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         isolatedSenders=isolatedSenders,
+                                         isolatedRecipients=isolatedRecipients,
+                                         sw1="s6",
+                                         sw2="s2",
+                                         sw3="s4",
+                                         sw4="s1",
+                                         sw5="s3",
+                                         expectedLink1=16,
+                                         expectedLink2=14 )
+        else:
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.intentFunction.report( main )
\ No newline at end of file
diff --git a/TestON/tests/FUNC/FUNCintent/FUNCintent.topo b/TestON/tests/FUNC/FUNCintent/FUNCintent.topo
new file mode 100755
index 0000000..500fc3c
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintent/FUNCintent.topo
@@ -0,0 +1,62 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+                <nodes>3</nodes>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOScli1>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli1>
+
+        <ONOScli2>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli2>
+
+         <ONOScli3>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli3>
+
+        <Mininet1>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>MininetCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+                <home>~/mininet/</home>
+            </COMPONENTS>
+        </Mininet1>
+
+        <Scapy1>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>ScapyCliDriver</type>
+            <connect_order>6</connect_order>
+        </Scapy1>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNC/FUNCintent/README b/TestON/tests/FUNC/FUNCintent/README
new file mode 100644
index 0000000..c05562f
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintent/README
@@ -0,0 +1,46 @@
+Summary:
+        This test suite consist of basic intent functionality testing.
+        The following is an overview of how host intents is being tested.
+        Steps:
+            - Discover hosts
+            - Add host intents
+            - Check intents
+            - Verify flows
+            - Ping hosts
+            - Reroute
+                - Link down
+                - Verify flows
+                - Check topology
+                - Ping hosts
+                - Link up
+                - Verify flows
+                - Check topology
+                - Ping hosts
+            - Remove intents
+        This test suite includes testing of different types of intents such as
+        host, point, single-to-multi and multi-to-single ( More intent types to
+        add later ). The same steps above is being performed to other type of
+        intents.
+
+Required:
+        This test requires Mininet topology file newFuncIntent.py that is in the
+        dependencies folder. You should run the topology file to check for any
+        missing packages. The mininet topology file has different type of hosts
+        including VLAN hosts. Therefore you need to install VLAN module to build
+        the topology correctly.
+
+NOTE:
+    This test is being updated to use Scapy for host discovery and verification of flows.
+    So, Scapy will be required to run the test in the future.
+
+VLAN configuration:
+        Execute command:
+            $ sudo apt-get install vlan
+        Configuration:
+            $ sudo modprobe 8021q
+        NOTE:To make this configuration permanent
+            $ sudo su -c 'echo "8021q" >> /etc/modules'
+
+Scapy install:
+    sudo apt-get install Scapy
+
diff --git a/TestON/tests/FUNC/FUNCintent/__init__.py b/TestON/tests/FUNC/FUNCintent/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintent/__init__.py
diff --git a/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py b/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
new file mode 100644
index 0000000..976838c
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
@@ -0,0 +1,1734 @@
+"""
+    Wrapper functions for FuncIntent
+    This functions include Onosclidriver and Mininetclidriver driver functions
+    Author: kelvin@onlab.us
+"""
+import time
+import copy
+import json
+
+def __init__( self ):
+    self.default = ''
+
+def installHostIntent( main,
+                       name,
+                       host1,
+                       host2,
+                       onosNode=0,
+                       ethType="",
+                       bandwidth="",
+                       lambdaAlloc=False,
+                       ipProto="",
+                       ipAddresses="",
+                       tcp="",
+                       sw1="",
+                       sw2=""):
+    """
+    Installs a Host Intent
+
+    Description:
+        Install a host intent using
+        add-host-intent
+
+    Steps:
+        - Fetch host data if not given
+        - Add host intent
+            - Ingress device is the first sender host
+            - Egress devices are the recipient devices
+            - Ports if defined in senders or recipients
+            - MAC address ethSrc loaded from Ingress device
+        - Check intent state with retry
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        host1 - Dictionary for host1
+            { "name":"h8", "id":"of:0000000000000005/8" }
+        host2 - Dictionary for host2
+            { "name":"h16", "id":"of:0000000000000006/8" }
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        ethType - Ethernet type eg. IPV4, IPV6
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        tcp - TCP ports in the same order as the hosts in hostNames
+    """
+
+    assert main, "There is no main variable"
+    assert host1, "You must specify host1"
+    assert host2, "You must specify host2"
+
+    global itemName  # The name of this run. Used for logs.
+    itemName = name
+    onosNode = int( onosNode )
+
+    main.log.info( itemName + ": Adding single point to multi point intents" )
+
+    if not host1.get( "id" ):
+        main.log.warn( "ID not given for host1 {0}. Loading from main.hostData".format( host1.get( "name" ) ) )
+        main.log.debug( main.hostsData.get( host1.get( "name" ) ) )
+        host1[ "id" ] = main.hostsData.get( host1.get( "name" ) ).get( "id" )
+
+    if not host2.get( "id" ):
+        main.log.warn( "ID not given for host2 {0}. Loading from main.h ostData".format( host2.get( "name" ) ) )
+        host2[ "id" ] = main.hostsData.get( host2.get( "name" ) ).get( "id" )
+
+    # Adding point intent
+    intentId = main.CLIs[ onosNode ].addHostIntent( hostIdOne=host1.get( "id" ),
+                                                    hostIdTwo=host2.get( "id" ) )
+
+    # Check intents state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE,
+                        args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+        return intentId
+    else:
+        main.log.error( "Host Intent did not install correctly" )
+        return main.FALSE
+
+def testHostIntent( main,
+                    name,
+                    intentId,
+                    host1,
+                    host2,
+                    onosNode=0,
+                    sw1="s5",
+                    sw2="s2",
+                    expectedLink=0):
+    """
+    Test a Host Intent
+
+    Description:
+        Test a host intent of given ID between given hosts
+
+    Steps:
+        - Fetch host data if not given
+        - Check Intent State
+        - Check Flow State
+        - Check Connectivity
+        - Check Lack of Connectivity Between Hosts not in the Intent
+        - Reroute
+            - Take Expected Link Down
+            - Check Intent State
+            - Check Flow State
+            - Check Topology
+            - Check Connectivity
+            - Bring Expected Link Up
+            - Check Intent State
+            - Check Flow State
+            - Check Topology
+            - Check Connectivity
+        - Remove Topology
+
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        intentId - intent ID to be tested ( and removed )
+        host1 - Dictionary for host1
+            { "name":"h8", "id":"of:0000000000000005/8" }
+        host2 - Dictionary for host2
+            { "name":"h16", "id":"of:0000000000000006/8" }
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+
+    """
+
+    # Parameter Validity Check
+    assert main, "There is no main variable"
+    assert host1, "You must specify host1"
+    assert host2, "You must specify host2"
+
+    global itemName
+    itemName = name
+    tempHostsData = {}
+    onosNode = int( onosNode )
+
+    main.log.info( itemName + ": Testing Host Intent" )
+
+    if not host1.get( "id" ):
+        main.log.warn( "Id not given for host1 {0}. Loading from main.hostData".format( host1.get( "name" ) ) )
+        host1[ "id" ] = main.hostsData.get( host1.get( "name" ) ).get( "location" )
+
+    if not host2.get( "id" ):
+        main.log.warn( "Id not given for host2 {0}. Loading from main.hostData".format( host2.get( "name" ) ) )
+        host2[ "id" ] = main.hostsData.get( host2.get( "name" ) ).get( "location" )
+
+    senderNames = [ host1.get( "name" ), host2.get( "name" ) ]
+    recipientNames = [ host1.get( "name" ), host2.get( "name" ) ]
+
+    testResult = main.TRUE
+    main.log.info( itemName + ": Adding single point to multi point intents" )
+
+    # Check intent state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+        main.assertReturnString += 'Initial Intent State Passed\n'
+    else:
+        main.assertReturnString += 'Initial Intent State Failed\n'
+        testResult = main.FALSE
+
+    # Check flows count in each node
+    if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+        main.assertReturnString += 'Initial Flow State Passed\n'
+    else:
+        main.assertReturnString += 'Intial Flow State Failed\n'
+        testResult = main.FALSE
+
+    # Check Connectivity
+    if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+        main.assertReturnString += 'Initial Ping Passed\n'
+    else:
+        main.assertReturnString += 'Initial Ping Failed\n'
+        testResult = main.FALSE
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # Take link down
+        if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw1, sw2, "down" ) ):
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+            testResult = main.FALSE
+
+        # Check intent state
+        if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+            testResult = main.FALSE
+
+        # Check flows count in each node
+        if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+            main.assertReturnString += 'Link Down Flow State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Flow State Failed\n'
+            testResult = main.FALSE
+
+        # Check OnosTopology
+        if utilities.retry( f=checkTopology, retValue=main.FALSE, args=( main, expectedLink ) ):
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+            testResult = main.FALSE
+
+        # Check Connection
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+            main.assertReturnString += 'Link Down Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Pingall Failed\n'
+            testResult = main.FALSE
+
+        # Bring link up
+        if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw1, sw2, "up" ) ):
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+            testResult = main.FALSE
+
+        # Wait for reroute
+        time.sleep( main.rerouteSleep )
+
+        # Check Intents
+        if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+            testResult = main.FALSE
+
+        # Check flows count in each node
+        if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+            main.assertReturnString += 'Link Up Flow State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Flow State Failed\n'
+            testResult = main.FALSE
+
+        # Check OnosTopology
+        if utilities.retry( f=checkTopology, retValue=main.FALSE, args=( main, main.numLinks ) ):
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+            testResult = main.FALSE
+
+        # Check Connection
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+            main.assertReturnString += 'Link Up Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Pingall Failed\n'
+            testResult = main.FALSE
+
+    # Remove all intents
+    if utilities.retry( f=removeAllIntents, retValue=main.FALSE, args=( main, [ intentId ] ) ):
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+        testResult = main.FALSE
+
+    return testResult
+
+def installPointIntent( main,
+                        name,
+                        senders,
+                        recipients,
+                        onosNode=0,
+                        ethType="",
+                        bandwidth="",
+                        lambdaAlloc=False,
+                        ipProto="",
+                        ipSrc="",
+                        ipDst="",
+                        tcpSrc="",
+                        tcpDst=""):
+    """
+    Installs a Single to Single Point Intent
+
+    Description:
+        Install a single to single point intent
+
+    Steps:
+        - Fetch host data if not given
+        - Add point intent
+            - Ingress device is the first sender device
+            - Egress device is the first recipient device
+            - Ports if defined in senders or recipients
+            - MAC address ethSrc loaded from Ingress device
+        - Check intent state with retry
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        senders - List of host dictionaries i.e.
+            [ { "name":"h8", "device":"of:0000000000000005/8","mac":"00:00:00:00:00:08" } ]
+        recipients - List of host dictionaries i.e.
+            [ { "name":"h16", "device":"of:0000000000000006/8", "mac":"00:00:00:00:00:10" } ]
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        ethType - Ethernet type eg. IPV4, IPV6
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        tcp - TCP ports in the same order as the hosts in hostNames
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert senders, "You must specify a sender"
+    assert recipients, "You must specify a recipient"
+    # Assert devices or main.hostsData, "You must specify devices"
+
+    global itemName  # The name of this run. Used for logs.
+    itemName = name
+    onosNode = int( onosNode )
+
+    main.log.info( itemName + ": Adding point to point intents" )
+
+    for sender in senders:
+        if not sender.get( "device" ):
+            main.log.warn( "Device not given for sender {0}. Loading from main.hostData".format( sender.get( "name" ) ) )
+            sender[ "device" ] = main.hostsData.get( sender.get( "name" ) ).get( "location" )
+
+    for recipient in recipients:
+        if not recipient.get( "device" ):
+            main.log.warn( "Device not given for recipient {0}. Loading from main.hostData".format( recipient.get( "name" ) ) )
+            recipient[ "device" ] = main.hostsData.get( recipient.get( "name" ) ).get( "location" )
+
+
+    ingressDevice = senders[ 0 ].get( "device" )
+    egressDevice = recipients[ 0 ].get( "device" )
+
+    portIngress = senders[ 0 ].get( "port", "" )
+    portEgress = recipients[ 0 ].get( "port", "" )
+
+    dstMac = recipients[ 0 ].get( "mac" )
+
+    ipSrc = senders[ 0 ].get( "ip" )
+    ipDst = recipients[ 0 ].get( "ip" )
+
+    # Adding point intent
+    intentId = main.CLIs[ onosNode ].addPointIntent(
+                                        ingressDevice=ingressDevice,
+                                        egressDevice=egressDevice,
+                                        portIngress=portIngress,
+                                        portEgress=portEgress,
+                                        ethType=ethType,
+                                        ethDst=dstMac,
+                                        bandwidth=bandwidth,
+                                        lambdaAlloc=lambdaAlloc,
+                                        ipProto=ipProto,
+                                        ipSrc=ipSrc,
+                                        ipDst=ipDst,
+                                        tcpSrc=tcpSrc,
+                                        tcpDst=tcpDst )
+
+    # Check intents state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+        return intentId
+    else:
+        main.log.error( "Point Intent did not install correctly" )
+        return main.FALSE
+
+def pointIntentTcp( main,
+                    name,
+                    host1,
+                    host2,
+                    onosNode=0,
+                    deviceId1="",
+                    deviceId2="",
+                    port1="",
+                    port2="",
+                    ethType="",
+                    mac1="",
+                    mac2="",
+                    bandwidth="",
+                    lambdaAlloc=False,
+                    ipProto="",
+                    ip1="",
+                    ip2="",
+                    tcp1="",
+                    tcp2="",
+                    sw1="",
+                    sw2="",
+                    expectedLink=0 ):
+
+    """
+    Description:
+        Verify add-point-intent only for TCP
+    Steps:
+        - Get device ids | ports
+        - Add point intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        host1 - Name of first host
+        host2 - Name of second host
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        deviceId1 - ONOS device id of the first switch, the same as the
+                    location of the first host eg. of:0000000000000001/1,
+                    located at device 1 port 1
+        deviceId2 - ONOS device id of the second switch
+        port1 - The port number where the first host is attached
+        port2 - The port number where the second host is attached
+        ethType - Ethernet type eg. IPV4, IPV6
+        mac1 - Mac address of first host
+        mac2 - Mac address of the second host
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        ip1 - IP address of first host
+        ip2 - IP address of second host
+        tcp1 - TCP port of first host
+        tcp2 - TCP port of second host
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert name, "variable name is empty"
+    assert host1 and host2, "You must specify hosts"
+
+    global itemName
+    itemName = name
+    host1 = host1
+    host2 = host2
+    hostNames = [ host1, host2 ]
+    intentsId = []
+
+    iperfResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+    onosNode = int( onosNode )
+
+    # Adding bidirectional point  intents
+    main.log.info( itemName + ": Adding point intents" )
+    intent1 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+                                                    egressDevice=deviceId2,
+                                                    portIngress=port1,
+                                                    portEgress=port2,
+                                                    ethType=ethType,
+                                                    ethSrc=mac1,
+                                                    ethDst=mac2,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip1,
+                                                    ipDst=ip2,
+                                                    tcpSrc=tcp1,
+                                                    tcpDst="" )
+
+    intent2 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+                                                    egressDevice=deviceId1,
+                                                    portIngress=port2,
+                                                    portEgress=port1,
+                                                    ethType=ethType,
+                                                    ethSrc=mac2,
+                                                    ethDst=mac1,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip2,
+                                                    ipDst=ip1,
+                                                    tcpSrc=tcp2,
+                                                    tcpDst="" )
+
+    intent3 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+                                                    egressDevice=deviceId2,
+                                                    portIngress=port1,
+                                                    portEgress=port2,
+                                                    ethType=ethType,
+                                                    ethSrc=mac1,
+                                                    ethDst=mac2,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip1,
+                                                    ipDst=ip2,
+                                                    tcpSrc="",
+                                                    tcpDst=tcp2 )
+
+    intent4 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+                                                    egressDevice=deviceId1,
+                                                    portIngress=port2,
+                                                    portEgress=port1,
+                                                    ethType=ethType,
+                                                    ethSrc=mac2,
+                                                    ethDst=mac1,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip2,
+                                                    ipDst=ip1,
+                                                    tcpSrc="",
+                                                    tcpDst=tcp1 )
+    intentsId.append( intent1 )
+    intentsId.append( intent2 )
+    intentsId.append( intent3 )
+    intentsId.append( intent4 )
+
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Verify flows
+    checkFlowsState( main )
+
+    # Run iperf to both host
+    iperfTemp = main.Mininet1.iperftcp( host1,host2,10 )
+    iperfResult = iperfResult and iperfTemp
+    if iperfTemp:
+        main.assertReturnString += 'Initial Iperf Passed\n'
+    else:
+        main.assertReturnString += 'Initial Iperf Failed\n'
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+
+        if linkDownResult:
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+        if topoResult:
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+
+        # Run iperf to both host
+        iperfTemp = main.Mininet1.iperftcp( host1,host2,10 )
+        iperfResult = iperfResult and iperfTemp
+        if iperfTemp:
+            main.assertReturnString += 'Link Down Iperf Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Iperf Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and iperfResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        if linkUpTemp:
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+
+        if topoResult:
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+
+        # Run iperf to both host
+        iperfTemp = main.Mininet1.iperftcp( host1,host2,10 )
+        iperfResult = iperfResult and iperfTemp
+        if iperfTemp:
+            main.assertReturnString += 'Link Up Iperf Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Iperf Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and iperfResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+    if removeIntentResult:
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+
+    stepResult = iperfResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def installSingleToMultiIntent( main,
+                                name,
+                                senders,
+                                recipients,
+                                onosNode=0,
+                                ethType="",
+                                bandwidth="",
+                                lambdaAlloc=False,
+                                ipProto="",
+                                ipAddresses="",
+                                tcp="",
+                                sw1="",
+                                sw2=""):
+    """
+    Installs a Single to Multi Point Intent
+
+    Description:
+        Install a single to multi point intent using
+        add-single-to-multi-intent
+
+    Steps:
+        - Fetch host data if not given
+        - Add single to multi intent
+            - Ingress device is the first sender host
+            - Egress devices are the recipient devices
+            - Ports if defined in senders or recipients
+            - MAC address ethSrc loaded from Ingress device
+        - Check intent state with retry
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        senders - List of host dictionaries i.e.
+            { "name":"h8", "device":"of:0000000000000005/8","mac":"00:00:00:00:00:08" }
+        recipients - List of host dictionaries i.e.
+            { "name":"h16", "device":"of:0000000000000006/8", "mac":"00:00:00:00:00:10" }
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        ethType - Ethernet type eg. IPV4, IPV6
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        tcp - TCP ports in the same order as the hosts in hostNames
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert senders, "You must specify a sender"
+    assert recipients, "You must specify a recipient"
+    # Assert devices or main.hostsData, "You must specify devices"
+
+    global itemName  # The name of this run. Used for logs.
+    itemName = name
+    onosNode = int( onosNode )
+
+    main.log.info( itemName + ": Adding single point to multi point intents" )
+
+    for sender in senders:
+        if not sender.get( "device" ):
+            main.log.warn( "Device not given for sender {0}. Loading from main.hostData".format( sender.get( "name" ) ) )
+            sender[ "device" ] = main.hostsData.get( sender.get( "name" ) ).get( "location" )
+
+    for recipient in recipients:
+        if not recipient.get( "device" ):
+            main.log.warn( "Device not given for recipient {0}. Loading from main.hostData".format( recipient.get( "name" ) ) )
+            recipient[ "device" ] = main.hostsData.get( recipient.get( "name" ) ).get( "location" )
+
+
+    ingressDevice = senders[ 0 ].get( "device" )
+    egressDeviceList = [ x.get( "device" ) for x in recipients if x.get( "device" ) ]
+
+    portIngress = senders[ 0 ].get( "port", "" )
+    portEgressList = [ x.get( "port" ) for x in recipients if x.get( "port" ) ]
+    if not portEgressList:
+        portEgressList = None
+
+    srcMac = senders[ 0 ].get( "mac" )
+
+    # Adding point intent
+    intentId = main.CLIs[ onosNode ].addSinglepointToMultipointIntent(
+                                        ingressDevice=ingressDevice,
+                                        egressDeviceList=egressDeviceList,
+                                        portIngress=portIngress,
+                                        portEgressList=portEgressList,
+                                        ethType=ethType,
+                                        ethSrc=srcMac,
+                                        bandwidth=bandwidth,
+                                        lambdaAlloc=lambdaAlloc,
+                                        ipProto=ipProto,
+                                        ipSrc="",
+                                        ipDst="",
+                                        tcpSrc="",
+                                        tcpDst="" )
+
+    # Check intents state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+        return intentId
+    else:
+        main.log.error( "Single to Multi Intent did not install correctly" )
+        return main.FALSE
+
+def installMultiToSingleIntent( main,
+                                name,
+                                senders,
+                                recipients,
+                                onosNode=0,
+                                ethType="",
+                                bandwidth="",
+                                lambdaAlloc=False,
+                                ipProto="",
+                                ipAddresses="",
+                                tcp="",
+                                sw1="",
+                                sw2=""):
+    """
+    Installs a Multi to Single Point Intent
+
+    Description:
+        Install a multi to single point intent using
+        add-multi-to-single-intent
+
+    Steps:
+        - Fetch host data if not given
+        - Add multi to single intent
+            - Ingress devices are the senders devices
+            - Egress device is the first recipient host
+            - Ports if defined in senders or recipients
+            - MAC address ethSrc loaded from Ingress device
+        - Check intent state with retry
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        senders - List of host dictionaries i.e.
+            [ { "name":"h8", "device":"of:0000000000000005/8","mac":"00:00:00:00:00:08" } ]
+        recipients - List of host dictionaries i.e.
+            [ { "name":"h16", "device":"of:0000000000000006/8", "mac":"00:00:00:00:00:10" } ]
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        ethType - Ethernet type eg. IPV4, IPV6
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        tcp - TCP ports in the same order as the hosts in hostNames
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert senders, "You must specify a sender"
+    assert recipients, "You must specify a recipient"
+    # Assert devices or main.hostsData, "You must specify devices"
+
+    global itemName  # The name of this run. Used for logs.
+    itemName = name
+    onosNode = int( onosNode )
+
+    main.log.info( itemName + ": Adding mutli to single point intents" )
+
+    for sender in senders:
+        if not sender.get( "device" ):
+            main.log.warn( "Device not given for sender {0}. Loading from main.hostData".format( sender.get( "name" ) ) )
+            sender[ "device" ] = main.hostsData.get( sender.get( "name" ) ).get( "location" )
+
+    for recipient in recipients:
+        if not recipient.get( "device" ):
+            main.log.warn( "Device not given for recipient {0}. Loading from main.hostData".format( recipient.get( "name" ) ) )
+            recipient[ "device" ] = main.hostsData.get( recipient.get( "name" ) ).get( "location" )
+
+
+    ingressDeviceList = [ x.get( "device" ) for x in senders if x.get( "device" ) ]
+    egressDevice = recipients[ 0 ].get( "device" )
+
+    portIngressList = [ x.get( "port" ) for x in senders if x.get( "port" ) ]
+    portEgress = recipients[ 0 ].get( "port", "" )
+    if not portIngressList:
+        portIngressList = None
+
+    dstMac = recipients[ 0 ].get( "mac" )
+
+    # Adding point intent
+    intentId = main.CLIs[ onosNode ].addMultipointToSinglepointIntent(
+                                        ingressDeviceList=ingressDeviceList,
+                                        egressDevice=egressDevice,
+                                        portIngressList=portIngressList,
+                                        portEgress=portEgress,
+                                        ethType=ethType,
+                                        ethDst=dstMac,
+                                        bandwidth=bandwidth,
+                                        lambdaAlloc=lambdaAlloc,
+                                        ipProto=ipProto,
+                                        ipSrc="",
+                                        ipDst="",
+                                        tcpSrc="",
+                                        tcpDst="" )
+
+    # Check intents state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+        return intentId
+    else:
+        main.log.error( "Multi to Single Intent did not install correctly" )
+        return main.FALSE
+
+def testPointIntent( main,
+                     name,
+                     intentId,
+                     senders,
+                     recipients,
+                     badSenders={},
+                     badRecipients={},
+                     onosNode=0,
+                     ethType="",
+                     bandwidth="",
+                     lambdaAlloc=False,
+                     ipProto="",
+                     ipAddresses="",
+                     tcp="",
+                     sw1="s5",
+                     sw2="s2",
+                     expectedLink=0):
+    """
+    Test a Point Intent
+
+    Description:
+        Test a point intent
+
+    Steps:
+        - Fetch host data if not given
+        - Check Intent State
+        - Check Flow State
+        - Check Connectivity
+        - Check Lack of Connectivity Between Hosts not in the Intent
+        - Reroute
+            - Take Expected Link Down
+            - Check Intent State
+            - Check Flow State
+            - Check Topology
+            - Check Connectivity
+            - Bring Expected Link Up
+            - Check Intent State
+            - Check Flow State
+            - Check Topology
+            - Check Connectivity
+        - Remove Topology
+
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+
+        senders - List of host dictionaries i.e.
+            { "name":"h8", "device":"of:0000000000000005/8","mac":"00:00:00:00:00:08" }
+        recipients - List of host dictionaries i.e.
+            { "name":"h16", "device":"of:0000000000000006/8", "mac":"00:00:00:00:00:10" }
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        ethType - Ethernet type eg. IPV4, IPV6
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        tcp - TCP ports in the same order as the hosts in hostNames
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+
+    """
+
+    # Parameter Validity Check
+    assert main, "There is no main variable"
+    assert senders, "You must specify a sender"
+    assert recipients, "You must specify a recipient"
+
+    global itemName
+    itemName = name
+    tempHostsData = {}
+    onosNode = int( onosNode )
+
+    main.log.info( itemName + ": Testing Point Intent" )
+
+    # Names for scapy
+    senderNames = [ x.get( "name" ) for x in senders ]
+    recipientNames = [ x.get( "name" ) for x in recipients ]
+    badSenderNames = [ x.get( "name" ) for x in badSenders ]
+    badRecipientNames = [ x.get( "name" ) for x in badRecipients ]
+
+    for sender in senders:
+        if not sender.get( "device" ):
+            main.log.warn( "Device not given for sender {0}. Loading from main.hostData".format( sender.get( "name" ) ) )
+            sender[ "device" ] = main.hostsData.get( sender.get( "name" ) ).get( "location" )
+
+    for recipient in recipients:
+        if not recipient.get( "device" ):
+            main.log.warn( "Device not given for recipient {0}. Loading from main.hostData".format( recipient.get( "name" ) ) )
+            recipient[ "device" ] = main.hostsData.get( recipient.get( "name" ) ).get( "location" )
+
+    testResult = main.TRUE
+    main.log.info( itemName + ": Adding single point to multi point intents" )
+
+    # Check intent state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+        main.assertReturnString += 'Initial Intent State Passed\n'
+    else:
+        main.assertReturnString += 'Initial Intent State Failed\n'
+        testResult = main.FALSE
+
+    # Check flows count in each node
+    if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+        main.assertReturnString += 'Initial Flow State Passed\n'
+    else:
+        main.assertReturnString += 'Intial Flow State Failed\n'
+        testResult = main.FALSE
+
+    # Check Connectivity
+    if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+        main.assertReturnString += 'Initial Ping Passed\n'
+    else:
+        main.assertReturnString += 'Initial Ping Failed\n'
+        testResult = main.FALSE
+
+    # Check connections that shouldn't work
+    if badSenderNames:
+        main.log.info( "Checking that packets from incorrect sender do not go through" )
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, badSenderNames, recipientNames ), kwargs={ "expectFailure":True } ):
+            main.assertReturnString += 'Bad Sender Ping Passed\n'
+        else:
+            main.assertReturnString += 'Bad Sender Ping Failed\n'
+            testResult = main.FALSE
+
+    if badRecipientNames:
+        main.log.info( "Checking that packets to incorrect recipients do not go through" )
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, badRecipientNames ), kwargs={ "expectFailure":True } ):
+            main.assertReturnString += 'Bad Recipient Ping Passed\n'
+        else:
+            main.assertReturnString += 'Bad Recipient Ping Failed\n'
+            testResult = main.FALSE
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # Take link down
+        if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw1, sw2, "down" ) ):
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+            testResult = main.FALSE
+
+        # Check intent state
+        if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+            testResult = main.FALSE
+
+        # Check flows count in each node
+        if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+            main.assertReturnString += 'Link Down Flow State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Flow State Failed\n'
+            testResult = main.FALSE
+
+        # Check OnosTopology
+        if utilities.retry( f=checkTopology, retValue=main.FALSE, args=( main, expectedLink ) ):
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+            testResult = main.FALSE
+
+        # Check Connection
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+            main.assertReturnString += 'Link Down Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Pingall Failed\n'
+            testResult = main.FALSE
+
+        # Bring link up
+        if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw1, sw2, "up" ) ):
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+            testResult = main.FALSE
+
+        # Wait for reroute
+        time.sleep( main.rerouteSleep )
+
+        # Check Intents
+        if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+            testResult = main.FALSE
+
+        # Check flows count in each node
+        if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+            main.assertReturnString += 'Link Up Flow State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Flow State Failed\n'
+            testResult = main.FALSE
+
+        # Check OnosTopology
+        if utilities.retry( f=checkTopology, retValue=main.FALSE, args=( main, main.numLinks ) ):
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+            testResult = main.FALSE
+
+        # Check Connection
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+            main.assertReturnString += 'Link Up Scapy Packet Received Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Scapy Packet Recieved Failed\n'
+            testResult = main.FALSE
+
+    # Remove all intents
+    if utilities.retry( f=removeAllIntents, retValue=main.FALSE, args=( main, [ intentId ] ) ):
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+        testResult = main.FALSE
+
+    return testResult
+
+def testEndPointFail( main,
+                      name,
+                      intentId,
+                      senders,
+                      recipients,
+                      isolatedSenders,
+                      isolatedRecipients,
+                      onosNode=0,
+                      ethType="",
+                      bandwidth="",
+                      lambdaAlloc=False,
+                      ipProto="",
+                      ipAddresses="",
+                      tcp="",
+                      sw1="",
+                      sw2="",
+                      sw3="",
+                      sw4="",
+                      sw5="",
+                      expectedLink1=0,
+                      expectedLink2=0 ):
+    """
+    Test Single to Multipoint Topology for Endpoint failures
+    """
+
+    # Parameter Validity Check
+    assert main, "There is no main variable"
+    assert senders, "You must specify a sender"
+    assert recipients, "You must specify a recipient"
+
+    global itemName
+    itemName = name
+    tempHostsData = {}
+    onosNode = int( onosNode )
+
+    main.log.info( itemName + ": Testing Point Intent" )
+
+    # Names for scapy
+    senderNames = [ x.get( "name" ) for x in senders ]
+    recipientNames = [ x.get( "name" ) for x in recipients ]
+    isolatedSenderNames = [ x.get( "name" ) for x in isolatedSenders ]
+    isolatedRecipientNames = [ x.get( "name" ) for x in isolatedRecipients ]
+    connectedSenderNames = [x.get("name") for x in senders if x.get("name") not in isolatedSenderNames]
+    connectedRecipientNames = [x.get("name") for x in recipients if x.get("name") not in isolatedRecipientNames]
+
+    for sender in senders:
+        if not sender.get( "device" ):
+            main.log.warn( "Device not given for sender {0}. Loading from main.hostData".format( sender.get( "name" ) ) )
+            sender[ "device" ] = main.hostsData.get( sender.get( "name" ) ).get( "location" )
+
+    for recipient in recipients:
+        if not recipient.get( "device" ):
+            main.log.warn( "Device not given for recipient {0}. Loading from\
+                            main.hostData".format( recipient.get( "name" ) ) )
+            recipient[ "device" ] = main.hostsData.get( recipient.get( "name" ) ).get( "location" )
+
+    testResult = main.TRUE
+    main.log.info( itemName + ": Adding multi point to single point intents" )
+
+    # Check intent state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE,
+                        args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+        main.assertReturnString += 'Initial Intent State Passed\n'
+    else:
+        main.assertReturnString += 'Initial Intent State Failed\n'
+        testResult = main.FALSE
+
+    # Check flows count in each node
+    if utilities.retry( f=checkFlowsCount, retValue=main.FALSE,
+                        args=[ main ] ) and utilities.retry( f=checkFlowsState,
+                                                             retValue=main.FALSE,
+                                                             args=[ main ] ):
+        main.assertReturnString += 'Initial Flow State Passed\n'
+    else:
+        main.assertReturnString += 'Intial Flow State Failed\n'
+        testResult = main.FALSE
+
+    # Check Connectivity
+    if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE,
+                        args=( main, senderNames, recipientNames ) ):
+        main.assertReturnString += 'Initial Connectivity Check Passed\n'
+    else:
+        main.assertReturnString += 'Initial Connectivity Check Failed\n'
+        testResult = main.FALSE
+
+    # Take two links down
+    # Take first link down
+    if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw1, sw2, "down" ) ):
+        main.assertReturnString += 'Link Down Passed\n'
+    else:
+        main.assertReturnString += 'Link Down Failed\n'
+        testResult = main.FALSE
+
+    # Take second link down
+    if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw3, sw4, "down" ) ):
+        main.assertReturnString += 'Link Down Passed\n'
+    else:
+        main.assertReturnString += 'Link Down Failed\n'
+        testResult = main.FALSE
+
+    # Check intent state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE,
+                        args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+        main.assertReturnString += 'Link Down Intent State Passed\n'
+    else:
+        main.assertReturnString += 'Link Down Intent State Failed\n'
+        testResult = main.FALSE
+
+    # Check flows count in each node
+    if utilities.retry( f=checkFlowsCount, retValue=main.FALSE,
+                        args=[ main ] ) and utilities.retry( f=checkFlowsState,
+                                                             retValue=main.FALSE, args=[ main ] ):
+        main.assertReturnString += 'Link Down Flow State Passed\n'
+    else:
+        main.assertReturnString += 'Link Down Flow State Failed\n'
+        testResult = main.FALSE
+
+    # Check OnosTopology
+    if utilities.retry( f=checkTopology, retValue=main.FALSE, args=( main, expectedLink1 ) ):
+        main.assertReturnString += 'Link Down Topology State Passed\n'
+    else:
+        main.assertReturnString += 'Link Down Topology State Failed\n'
+        testResult = main.FALSE
+
+    # Check Connection
+    if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE,
+                        args=( main, senderNames, recipientNames ) ):
+        main.assertReturnString += 'Link Down Connectivity Check Passed\n'
+    else:
+        main.assertReturnString += 'Link Down Connectivity Check Failed\n'
+        testResult = main.FALSE
+
+    # Take a third link down to isolate one node
+    if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw3, sw5, "down" ) ):
+        main.assertReturnString += 'Isolation link Down Passed\n'
+    else:
+        main.assertReturnString += 'Isolation link Down Failed\n'
+        testResult = main.FALSE
+
+    # Check intent state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE,
+                        args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+        main.assertReturnString += 'Isolation link Down Intent State Passed\n'
+    else:
+        main.assertReturnString += 'Isolation link Down Intent State Failed\n'
+        testResult = main.FALSE
+
+    # Check flows count in each node
+    if utilities.retry( f=checkFlowsCount, retValue=main.FALSE,
+                        args=[ main ] ) and utilities.retry( f=checkFlowsState,
+                                                             retValue=main.FALSE, args=[ main ] ):
+        main.assertReturnString += 'Isolation link Down Flow State Passed\n'
+    else:
+        main.assertReturnString += 'Isolation link Down Flow State Failed\n'
+        testResult = main.FALSE
+
+    # Check OnosTopology
+    if utilities.retry( f=checkTopology, retValue=main.FALSE, args=( main, expectedLink2 ) ):
+        main.assertReturnString += 'Isolation link Down Topology State Passed\n'
+    else:
+        main.assertReturnString += 'Isolation link Down Topology State Failed\n'
+        testResult = main.FALSE
+
+    # Check Connectivity
+    # First check connectivity of any isolated senders to recipients
+    if isolatedSenderNames:
+        if scapyCheckConnection( main, isolatedSenderNames, recipientNames, None, None, main.TRUE ):
+            main.assertReturnString += 'Isolation link Down Connectivity Check Passed\n'
+        else:
+            main.assertReturnString += 'Isolation link Down Connectivity Check Failed\n'
+            testResult = main.FALSE
+
+    # Next check connectivity of senders to any isolated recipients
+    if isolatedRecipientNames:
+        if scapyCheckConnection( main, senderNames, isolatedRecipientNames, None, None, main.TRUE ):
+            main.assertReturnString += 'Isolation link Down Connectivity Check Passed\n'
+        else:
+            main.assertReturnString += 'Isolation link Down Connectivity Check Failed\n'
+            testResult = main.FALSE
+
+    # Next check connectivity of connected senders and recipients
+    if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE,
+                        args=( main, connectedSenderNames , connectedRecipientNames ) ):
+        main.assertReturnString += 'Isolation link Down Connectivity Check Passed\n'
+    else:
+        main.assertReturnString += 'Isolation link Down Connectivity Check Failed\n'
+        testResult = main.FALSE
+
+    # Bring the links back up
+    # Bring first link up
+    if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw1, sw2, "up" ) ):
+        main.assertReturnString += 'Link Up Passed\n'
+    else:
+        main.assertReturnString += 'Link Up Failed\n'
+        testResult = main.FALSE
+
+    # Bring second link up
+    if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw3, sw5, "up" ) ):
+        main.assertReturnString += 'Link Up Passed\n'
+    else:
+        main.assertReturnString += 'Link Up Failed\n'
+        testResult = main.FALSE
+
+    # Bring third link up
+    if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw3, sw4, "up" ) ):
+        main.assertReturnString += 'Link Up Passed\n'
+    else:
+        main.assertReturnString += 'Link Up Failed\n'
+        testResult = main.FALSE
+
+    # Wait for reroute
+    time.sleep( main.rerouteSleep )
+
+    # Check Intents
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE,
+                        args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+        main.assertReturnString += 'Link Up Intent State Passed\n'
+    else:
+        main.assertReturnString += 'Link Up Intent State Failed\n'
+        testResult = main.FALSE
+
+    # Check flows count in each node
+    if utilities.retry( f=checkFlowsCount, retValue=main.FALSE,
+                        args=[ main ] ) and utilities.retry( f=checkFlowsState,
+                                                             retValue=main.FALSE, args=[ main ] ):
+        main.assertReturnString += 'Link Up Flow State Passed\n'
+    else:
+        main.assertReturnString += 'Link Up Flow State Failed\n'
+        testResult = main.FALSE
+
+    # Check OnosTopology
+    if utilities.retry( f=checkTopology, retValue=main.FALSE, args=( main, main.numLinks ) ):
+        main.assertReturnString += 'Link Up Topology State Passed\n'
+    else:
+        main.assertReturnString += 'Link Up Topology State Failed\n'
+        testResult = main.FALSE
+
+    # Check Connection
+    if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE,
+                        args=( main, senderNames, recipientNames ) ):
+        main.assertReturnString += 'Link Up Scapy Packet Received Passed\n'
+    else:
+        main.assertReturnString += 'Link Up Scapy Packet Recieved Failed\n'
+        testResult = main.FALSE
+
+    # Remove all intents
+    if utilities.retry( f=removeAllIntents, retValue=main.FALSE, args=( main, [ intentId ] ) ):
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+        testResult = main.FALSE
+
+    return testResult
+
+
+def pingallHosts( main, hostList ):
+    """
+        Ping all host in the hosts list variable
+    """
+    main.log.info( "Pinging: " + str( hostList ) )
+    return main.Mininet1.pingallHosts( hostList )
+
+def fwdPingall( main ):
+    """
+        Use fwd app and pingall to discover all the hosts
+    """
+    activateResult = main.TRUE
+    appCheck = main.TRUE
+    getDataResult = main.TRUE
+    main.log.info( "Activating reactive forwarding app " )
+    activateResult = main.CLIs[ 0 ].activateApp( "org.onosproject.fwd" )
+
+    # Wait for forward app activation to propagate
+    time.sleep( main.fwdSleep )
+
+    # Check that forwarding is enabled on all nodes
+    for i in range( main.numCtrls ):
+        appCheck = appCheck and main.CLIs[ i ].appToIDCheck()
+        if appCheck != main.TRUE:
+            main.log.warn( main.CLIs[ i ].apps() )
+            main.log.warn( main.CLIs[ i ].appIDs() )
+
+    # Send pingall in mininet
+    main.log.info( "Run Pingall" )
+    pingResult = main.Mininet1.pingall( timeout = 600 )
+
+    main.log.info( "Deactivating reactive forwarding app " )
+    deactivateResult = main.CLIs[ 0 ].deactivateApp( "org.onosproject.fwd" )
+    if activateResult and deactivateResult:
+        main.log.info( "Successfully used fwd app to discover hosts" )
+        getDataResult = main.TRUE
+    else:
+        main.log.info( "Failed to use fwd app to discover hosts" )
+        getDataResult = main.FALSE
+    return getDataResult
+
+def confirmHostDiscovery( main ):
+    """
+        Confirms that all ONOS nodes have discovered all scapy hosts
+    """
+    import collections
+    scapyHostCount = len( main.scapyHosts )
+    hosts = main.topo.getAllHosts( main )  # Get host data from each ONOS node
+    hostFails = []  # Reset for each failed attempt
+
+    #  Check for matching hosts on each node
+    scapyHostIPs = [ x.hostIp for x in main.scapyHosts if x.hostIp != "0.0.0.0" ]
+    for controller in range( main.numCtrls ):
+        controllerStr = str( controller + 1 )  # ONOS node number
+        # Compare Hosts
+        # Load hosts data for controller node
+        if hosts[ controller ] and "Error" not in hosts[ controller ]:
+            try:
+                hostData = json.loads( hosts[ controller ] )
+            except ( TypeError, ValueError ):
+                main.log.error( "Could not load json:" + str( hosts[ controller ] ) )
+                hostFails.append( controllerStr )
+            else:
+                onosHostIPs = [ x.get( "ipAddresses" )[ 0 ]
+                                for x in hostData
+                                if len( x.get( "ipAddresses" ) ) > 0 ]
+                if not set( collections.Counter( scapyHostIPs ) ).issubset( set ( collections.Counter( onosHostIPs ) ) ):
+                    main.log.warn( "Controller {0} only sees nodes with {1} IPs. It should see all of the following: {2}".format( controllerStr, onosHostIPs, scapyHostIPs ) )
+                    hostFails.append( controllerStr )
+        else:
+            main.log.error( "Hosts returned nothing or an error." )
+            hostFails.append( controllerStr )
+
+    if hostFails:
+        main.log.error( "List of failed ONOS Nodes:" + ', '.join(map(str, hostFails )) )
+        return main.FALSE
+    else:
+        return main.TRUE
+
+def sendDiscoveryArp( main, hosts=None ):
+    """
+        Sends Discovery ARP packets from each host provided
+        Defaults to each host in main.scapyHosts
+    """
+    # Send an arp ping from each host
+    if not hosts:
+        hosts = main.scapyHosts
+    for host in hosts:
+        pkt = 'Ether( src="{0}")/ARP( psrc="{1}")'.format( host.hostMac ,host.hostIp )
+        # Send from the VLAN interface if there is one so ONOS discovers the VLAN correctly
+        iface = None
+        for interface in host.getIfList():
+            if '.' in interface:
+                main.log.debug( "Detected VLAN interface {0}. Sending ARP packet from {0}".format( interface ) )
+                iface = interface
+                break
+        host.sendPacket( packet=pkt, iface=iface )
+        main.log.info( "Sending ARP packet from {0}".format( host.name ) )
+
+def populateHostData( main ):
+    """
+        Populates hostsData
+    """
+    import json
+    try:
+        hostsJson = json.loads( main.CLIs[ 0 ].hosts() )
+        hosts = main.Mininet1.getHosts().keys()
+        # TODO: Make better use of new getHosts function
+        for host in hosts:
+            main.hostsData[ host ] = {}
+            main.hostsData[ host ][ 'mac' ] =  \
+                main.Mininet1.getMacAddress( host ).upper()
+            for hostj in hostsJson:
+                if main.hostsData[ host ][ 'mac' ] == hostj[ 'mac' ]:
+                    main.hostsData[ host ][ 'id' ] = hostj[ 'id' ]
+                    main.hostsData[ host ][ 'vlan' ] = hostj[ 'vlan' ]
+                    main.hostsData[ host ][ 'location' ] = \
+                                hostj[ 'location' ][ 'elementId' ] + '/' + \
+                                hostj[ 'location' ][ 'port' ]
+                    main.hostsData[ host ][ 'ipAddresses' ] = hostj[ 'ipAddresses' ]
+        return main.TRUE
+    except KeyError:
+        main.log.error( "KeyError while populating hostsData")
+        return main.FALSE
+
+def checkTopology( main, expectedLink ):
+    statusResult = main.TRUE
+    # Check onos topology
+    main.log.info( itemName + ": Checking ONOS topology " )
+
+    for i in range( main.numCtrls ):
+        topologyResult = main.CLIs[ i ].topology()
+        statusResult = main.ONOSbench.checkStatus( topologyResult,
+                                                   main.numSwitch,
+                                                   expectedLink )\
+                       and statusResult
+    if not statusResult:
+        main.log.error( itemName + ": Topology mismatch" )
+    else:
+        main.log.info( itemName + ": Topology match" )
+    return statusResult
+
+def checkIntentState( main, intentsId ):
+    """
+        This function will check intent state to make sure all the intents
+        are in INSTALLED state
+    """
+
+    intentResult = main.TRUE
+    results = []
+
+    main.log.info( itemName + ": Checking intents state" )
+    # First check of intents
+    for i in range( main.numCtrls ):
+        tempResult = main.CLIs[ i ].checkIntentState( intentsId=intentsId )
+        results.append( tempResult )
+
+    expectedState = [ 'INSTALLED', 'INSTALLING' ]
+
+    if all( result == main.TRUE for result in results ):
+        main.log.info( itemName + ": Intents are installed correctly" )
+    else:
+        # Wait for at least 5 second before checking the intents again
+        main.log.error( "Intents are not installed correctly. Waiting 5 sec" )
+        time.sleep( 5 )
+        results = []
+        # Second check of intents since some of the intents may be in
+        # INSTALLING state, they should be in INSTALLED at this time
+        for i in range( main.numCtrls ):
+            tempResult = main.CLIs[ i ].checkIntentState( intentsId=intentsId )
+            results.append( tempResult )
+        if all( result == main.TRUE for result in results ):
+            main.log.info( itemName + ": Intents are installed correctly" )
+            intentResult = main.TRUE
+        else:
+            main.log.error( itemName + ": Intents are NOT installed correctly" )
+            intentResult = main.FALSE
+
+    return intentResult
+
+def checkFlowsState( main ):
+
+    main.log.info( itemName + ": Check flows state" )
+    checkFlowsResult = main.CLIs[ 0 ].checkFlowsState()
+    return checkFlowsResult
+
+def link( main, sw1, sw2, option):
+
+    # link down
+    main.log.info( itemName + ": Bring link " + option + "between " +
+                       sw1 + " and " + sw2 )
+    linkResult = main.Mininet1.link( end1=sw1, end2=sw2, option=option )
+    return linkResult
+
+def scapyCheckConnection( main, senders, recipients, packet=None, packetFilter=None, expectFailure=False ):
+    """
+        Checks the connectivity between all given sender hosts and all given recipient hosts
+        Packet may be specified. Defaults to Ether/IP packet
+        Packet Filter may be specified. Defaults to Ether/IP from current sender MAC
+            Todo: Optional packet and packet filter attributes for sender and recipients
+        Expect Failure when the sender and recipient are not supposed to have connectivity
+            Timeout of 1 second, returns main.TRUE if the filter is not triggered and kills the filter
+
+    """
+    connectionsFunctional = main.TRUE
+
+    if not packetFilter:
+        packetFilter = 'ether host {}'
+
+    if expectFailure:
+        timeout = 1
+    else:
+        timeout = 10
+
+    for sender in senders:
+        try:
+            senderComp = getattr( main, sender )
+        except AttributeError:
+            main.log.error( "main has no attribute {}".format( sender ) )
+            connectionsFunctional = main.FALSE
+            continue
+
+        for recipient in recipients:
+            # Do not send packets to self since recipient CLI will already be busy
+            if recipient == sender:
+                continue
+            try:
+                recipientComp = getattr( main, recipient )
+            except AttributeError:
+                main.log.error( "main has no attribute {}".format( recipient ) )
+                connectionsFunctional = main.FALSE
+                continue
+
+            recipientComp.startFilter( pktFilter = packetFilter.format( senderComp.hostMac ) )
+
+            if not packet:
+                pkt = 'Ether( src="{0}", dst="{2}" )/IP( src="{1}", dst="{3}" )'.format(
+                    senderComp.hostMac,
+                    senderComp.hostIp,
+                    recipientComp.hostMac,
+                    recipientComp.hostIp )
+            else:
+                pkt = packet
+            senderComp.sendPacket( packet = pkt )
+
+            if recipientComp.checkFilter( timeout ):
+                if expectFailure:
+                    main.log.error( "Packet from {0} successfully received by {1} when it should not have been".format( sender , recipient ) )
+                    connectionsFunctional = main.FALSE
+                else:
+                    main.log.info( "Packet from {0} successfully received by {1}".format( sender , recipient ) )
+            else:
+                recipientComp.killFilter()
+                if expectFailure:
+                    main.log.info( "As expected, packet from {0} was not received by {1}".format( sender , recipient ) )
+                else:
+                    main.log.error( "Packet from {0} was not received by {1}".format( sender , recipient ) )
+                    connectionsFunctional = main.FALSE
+
+        return connectionsFunctional
+
+def removeAllIntents( main, intentsId ):
+    """
+        Remove all intents in the intentsId
+    """
+
+    onosSummary = []
+    removeIntentResult = main.TRUE
+    # Remove intents
+    for intent in intentsId:
+        main.CLIs[ 0 ].removeIntent( intentId=intent, purge=True )
+
+    time.sleep( main.removeIntentSleep )
+
+    # If there is remianing intents then remove intents should fail
+    for i in range( main.numCtrls ):
+        onosSummary.append( json.loads( main.CLIs[ i ].summary() ) )
+
+    for summary in onosSummary:
+        if summary.get( 'intents' ) != 0:
+            main.log.warn( itemName + ": There are " +
+                           str( summary.get( 'intents' ) ) +
+                           " intents remaining in node " +
+                           str( summary.get( 'node' ) ) +
+                           ", failed to remove all the intents " )
+            removeIntentResult = main.FALSE
+
+    if removeIntentResult:
+        main.log.info( itemName + ": There are no more intents remaining, " +
+                       "successfully removed all the intents." )
+
+    return removeIntentResult
+
+def checkFlowsCount( main ):
+    """
+        Check flows count in each node
+    """
+    flowsCount = []
+    main.log.info( itemName + ": Checking flows count in each ONOS node" )
+    for i in range( main.numCtrls ):
+        summaryResult = main.CLIs[ i ].summary()
+        if not summaryResult:
+            main.log.error( itemName + ": There is something wrong with " +
+                            "summary command" )
+            return main.FALSE
+        else:
+            summaryJson = json.loads( summaryResult )
+            flowsCount.append( summaryJson.get( 'flows' ) )
+
+    if flowsCount:
+        if all( flows==flowsCount[ 0 ] for flows in flowsCount ):
+            main.log.info( itemName + ": There are " + str( flowsCount[ 0 ] ) +
+                           " flows in all ONOS node" )
+        else:
+            for i in range( main.numCtrls ):
+                main.log.debug( itemName + ": ONOS node " + str( i ) + " has " +
+                                str( flowsCount[ i ] ) + " flows" )
+    else:
+        main.log.error( "Checking flows count failed, check summary command" )
+        return main.FALSE
+
+    return main.TRUE
+
+def checkLeaderChange( leaders1, leaders2 ):
+    """
+        Checks for a change in intent partition leadership.
+
+        Takes the output of leaders -c in json string format before and after
+        a potential change as input
+
+        Returns main.TRUE if no mismatches are detected
+        Returns main.FALSE if there is a mismatch or on error loading the input
+    """
+    try:
+        leaders1 = json.loads( leaders1 )
+        leaders2 = json.loads( leaders2 )
+    except ( AttributeError, TypeError):
+        main.log.exception( self.name + ": Object not as expected" )
+        return main.FALSE
+    except Exception:
+        main.log.exception( self.name + ": Uncaught exception!" )
+        main.cleanup()
+        main.exit()
+    main.log.info( "Checking Intent Paritions for Change in Leadership" )
+    mismatch = False
+    for dict1 in leaders1:
+        if "intent" in dict1.get( "topic", [] ):
+            for dict2 in leaders2:
+                if dict1.get( "topic", 0 ) == dict2.get( "topic", 0 ) and \
+                    dict1.get( "leader", 0 ) != dict2.get( "leader", 0 ):
+                    mismatch = True
+                    main.log.error( "{0} changed leader from {1} to {2}".\
+                        format( dict1.get( "topic", "no-topic" ),\
+                            dict1.get( "leader", "no-leader" ),\
+                            dict2.get( "leader", "no-leader" ) ) )
+    if mismatch:
+        return main.FALSE
+    else:
+        return main.TRUE
+
+def report( main ):
+    """
+        Report errors/warnings/exceptions
+    """
+    main.ONOSbench.logReport( main.ONOSip[ 0 ],
+                              [ "INFO",
+                                "FOLLOWER",
+                                "WARN",
+                                "flow",
+                                "ERROR",
+                                "Except" ],
+                              "s" )
+
+    main.log.info( "ERROR report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "ERROR" ],
+                "d" )
+
+    main.log.info( "EXCEPTIONS report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "Except" ],
+                "d" )
+
+    main.log.info( "WARNING report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "WARN" ],
+                "d" )
diff --git a/TestON/tests/FUNC/FUNCintent/dependencies/newFuncTopo.py b/TestON/tests/FUNC/FUNCintent/dependencies/newFuncTopo.py
new file mode 100755
index 0000000..df808a7
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintent/dependencies/newFuncTopo.py
@@ -0,0 +1,158 @@
+#!/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 VLANHost( Host ):
+    def config( self, vlan=100, v6Addr='3000::1/64', **params ):
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ifconfig %s inet 0' % intf )
+        self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ip -6 addr add %s dev %s.%d' % ( v6Addr, intf, vlan ) )
+        newName = '%s.%d' % ( intf, vlan )
+        intf.name = newName
+        self.nameToIntf[ newName ] = intf
+        return r
+
+class IPv6Host( Host ):
+    def config( self, v6Addr='1000::1/64', **params ):
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ifconfig %s inet 0' % intf )
+        self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
+        return r
+
+class dualStackHost( Host ):
+    def config( self, v6Addr='2000:1/64', **params ):
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
+        return r
+
+class MyTopo( Topo ):
+
+    def __init__( self ):
+        # Initialize topology
+        Topo.__init__( self )
+        # Switch S5 Hosts
+        # IPv4 only Host
+        host1=self.addHost( 'h1', ip='10.1.0.2/24' )
+        # IPv6 only Host
+        host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
+        # Dual Stack Host
+        host3=self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
+        # VLAN hosts
+        host4=self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100, v6Addr='3000::2/64' )
+        host5=self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200, v6Addr='4000::2/64' )
+        # VPN-1 and VPN-2 Hosts
+        host6=self.addHost( 'h6', ip='11.1.0.2/24' )
+        host7=self.addHost( 'h7', ip='12.1.0.2/24' )
+        # Multicast Sender
+        host8=self.addHost( 'h8', ip='10.1.0.4/24' )
+
+        # Switch S6 Hosts
+        # IPv4 only Host
+        host9=self.addHost( 'h9', ip='10.1.0.5/24' )
+        # IPv6 only Host
+        host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
+        # Dual Stack Host
+        host11=self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
+        # VLAN hosts
+        host12=self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100, v6Addr='3000::3/64' )
+        host13=self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200, v6Addr='4000::3/64' )
+        # VPN-1 and VPN-2 Hosts
+        host14=self.addHost( 'h14', ip='11.1.0.3/24' )
+        host15=self.addHost( 'h15', ip='12.1.0.3/24' )
+        # Multicast Receiver
+        host16=self.addHost( 'h16', ip='10.1.0.7/24' )
+
+        # Switch S7 Hosts
+        # IPv4 only Host
+        host17=self.addHost( 'h17', ip='10.1.0.8/24' )
+        # IPv6 only Host
+        host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
+        # Dual Stack Host
+        host19=self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
+        # VLAN hosts
+        host20=self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100, v6Addr='3000::4/64' )
+        host21=self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200, v6Addr='4000::4/64' )
+        # VPN-1 and VPN-2 Hosts
+        host22=self.addHost( 'h22', ip='11.1.0.4/24' )
+        host23=self.addHost( 'h23', ip='12.1.0.4/24' )
+        # Multicast Receiver
+        host24=self.addHost( 'h24', ip='10.1.0.10/24' )
+
+        s1 = self.addSwitch( 's1' )
+        s2 = self.addSwitch( 's2' )
+        s3 = self.addSwitch( 's3' )
+        s4 = self.addSwitch( 's4' )
+        s5 = self.addSwitch( 's5' )
+        s6 = self.addSwitch( 's6' )
+        s7 = self.addSwitch( 's7' )
+
+        self.addLink(s5,host1)
+        self.addLink(s5,host2)
+        self.addLink(s5,host3)
+        self.addLink(s5,host4)
+        self.addLink(s5,host5)
+        self.addLink(s5,host6)
+        self.addLink(s5,host7)
+        self.addLink(s5,host8)
+
+        self.addLink(s6,host9)
+        self.addLink(s6,host10)
+        self.addLink(s6,host11)
+        self.addLink(s6,host12)
+        self.addLink(s6,host13)
+        self.addLink(s6,host14)
+        self.addLink(s6,host15)
+        self.addLink(s6,host16)
+
+        self.addLink(s7,host17)
+        self.addLink(s7,host18)
+        self.addLink(s7,host19)
+        self.addLink(s7,host20)
+        self.addLink(s7,host21)
+        self.addLink(s7,host22)
+        self.addLink(s7,host23)
+        self.addLink(s7,host24)
+
+        self.addLink(s1,s2)
+        self.addLink(s1,s3)
+        self.addLink(s1,s4)
+        self.addLink(s1,s5)
+        self.addLink(s2,s3)
+        self.addLink(s2,s5)
+        self.addLink(s2,s6)
+        self.addLink(s3,s4)
+        self.addLink(s3,s6)
+        self.addLink(s4,s7)
+        topos = { 'mytopo': ( lambda: MyTopo() ) }
+
+# HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
+
+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/FUNCintent/dependencies/startUp.py b/TestON/tests/FUNC/FUNCintent/dependencies/startUp.py
new file mode 100644
index 0000000..bf2a2b6
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintent/dependencies/startUp.py
@@ -0,0 +1,38 @@
+"""
+    This wrapper function is use for starting up onos instance
+"""
+
+import time
+import os
+import json
+
+def onosBuild( main, gitBranch ):
+    """
+        This includes pulling ONOS and building it using maven install
+    """
+
+    buildResult = main.FALSE
+
+    # Git checkout a branch of ONOS
+    checkOutResult = main.ONOSbench.gitCheckout( gitBranch )
+    # Does the git pull on the branch that was checked out
+    if not checkOutResult:
+        main.log.warn( "Failed to checked out " + gitBranch +
+                                           " branch")
+    else:
+        main.log.info( "Successfully checked out " + gitBranch +
+                                           " branch")
+    gitPullResult = main.ONOSbench.gitPull()
+    if gitPullResult == main.ERROR:
+        main.log.error( "Error pulling git branch" )
+    else:
+        main.log.info( "Successfully pulled " + gitBranch + " branch" )
+
+    # Maven clean install
+    buildResult = main.ONOSbench.cleanInstall()
+
+    return buildResult
+
+
+
+
diff --git a/TestON/tests/FUNC/FUNCintent/dependencies/topo.py b/TestON/tests/FUNC/FUNCintent/dependencies/topo.py
new file mode 100644
index 0000000..b44e3fc
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintent/dependencies/topo.py
@@ -0,0 +1,100 @@
+"""
+    These functions can be used for topology comparisons
+"""
+
+import time
+import os
+import json
+
+def getAllDevices( main ):
+    """
+        Return a list containing the devices output from each ONOS node
+    """
+    devices = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].devices,
+                         name="devices-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        devices.append( t.result )
+    return devices
+
+def getAllHosts( main ):
+    """
+        Return a list containing the hosts output from each ONOS node
+    """
+    hosts = []
+    ipResult = main.TRUE
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].hosts,
+                         name="hosts-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        hosts.append( t.result )
+    return hosts
+
+def getAllPorts( main ):
+    """
+        Return a list containing the ports output from each ONOS node
+    """
+    ports = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].ports,
+                         name="ports-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        ports.append( t.result )
+    return ports
+
+def getAllLinks( main ):
+    """
+        Return a list containing the links output from each ONOS node
+    """
+    links = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].links,
+                         name="links-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        links.append( t.result )
+    return links
+
+def getAllClusters( main ):
+    """
+        Return a list containing the clusters output from each ONOS node
+    """
+    clusters = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].clusters,
+                         name="clusters-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        clusters.append( t.result )
+    return clusters
+
+
diff --git a/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.params b/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.params
new file mode 100644
index 0000000..b3d3df3
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.params
@@ -0,0 +1,71 @@
+<PARAMS>
+    # CASE - Description
+    # 1 - Variable initialization and optional pull and build ONOS package
+    # 2 - Install ONOS
+    # 8 - Compare Topology
+    # 9 - Report logs
+    # 10 - Start Mininet with Openflow 1.0
+    # 11 - Start Mininet with Openflow 1.3
+    # 12 - Assign switch to controller
+    # 13 - Create Scapy Components
+    # 14 - Discover all hosts and Create a dictionary of hosts information
+    # 15 - Discover hosts with scapy arping ( only discovers scapy hosts )
+    # 16 - Balance ownership of switches
+    # 17 - Activate Flow Objectives
+    # 18 - Stop Mininet
+    # 1000 - Test host intents
+    # 2000 - Test point intents
+    # 3000 - Test single to multi point intents
+    # 4000 - Test multi to single point intents
+    # 5000 - Test host mobility
+
+    <testcases>1,[2,10,12,13,15,16,1000,2000,5000,18]*2,[2,10,12,13,15,16,17,1000,2000,5000,18]*2,[2,11,12,13,15,16,1000,2000,5000,18]*2,[2,11,12,13,15,16,17,1000,2000,5000,18]*2</testcases>
+
+    <SCALE>
+        <size>1,3,1,3,1,3,1,3</size>
+    </SCALE>
+
+    <DEPENDENCY>
+        <path>/tests/FUNC/FUNCintentRest/dependencies/</path>
+        <wrapper1>startUp</wrapper1>
+        <wrapper2>FuncIntentFunction</wrapper2>
+        <wrapper3>topo</wrapper3>
+        <topology>newFuncTopo.py</topology>
+    </DEPENDENCY>
+
+    <ENV>
+        <cellApps>drivers,openflow,proxyarp,mobility</cellApps>
+    </ENV>
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <SLEEP>
+        <startup>15</startup>
+        <reroute>5</reroute>
+        <checkintent>5</checkintent>
+        <removeintent>10</removeintent>
+        <fwd>10</fwd>
+        <addIntent>10</addIntent>
+        <topoAttempts>3</topoAttempts>
+    </SLEEP>
+
+    <MININET>
+        <switch>7</switch>
+        <links>20</links>
+    </MININET>
+
+    <SCAPY>
+        <HOSTNAMES>h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13,h14,h15,h16,h17,h18,h19,h20,h21,h22,h23,h24</HOSTNAMES>
+    </SCAPY>
+
+    # Intent tests params
+    <SDNIP>
+        <tcpProto>6</tcpProto>
+        <icmpProto>1</icmpProto>
+        <srcPort>5001</srcPort>
+        <dstPort>5001</dstPort>
+    </SDNIP>
+
+</PARAMS>
diff --git a/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.py b/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.py
new file mode 100644
index 0000000..8c6c8d5
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.py
@@ -0,0 +1,1642 @@
+
+# Testing the basic intent functionality of ONOS
+# TODO: Replace the CLI calls with REST API equivalents as they become available.
+#           - May need to write functions in the onosrestdriver.py file to do this
+# TODO: Complete implementation of case 3000, 4000, and 6000 as REST API allows
+#           -Currently there is no support in the REST API for Multi to Single and Single to Multi point intents
+#            As such, these cases are incomplete and should not be enabled in the .params file
+
+import time
+import json
+
+class FUNCintentRest:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        import time
+        import imp
+        import re
+
+        """
+        - Construct tests variables
+        - GIT ( optional )
+            - Checkout ONOS master branch
+            - Pull latest ONOS code
+        - Building ONOS ( optional )
+            - Install ONOS package
+            - Build ONOS package
+        """
+
+        main.case( "Constructing test variables and building ONOS package" )
+        main.step( "Constructing test variables" )
+        main.caseExplanation = "This test case is mainly for loading " +\
+                               "from params file, and pull and build the " +\
+                               " latest ONOS package"
+        stepResult = main.FALSE
+
+        # Test variables
+        try:
+            main.testOnDirectory = re.sub( "(/tests)$", "", main.testDir )
+            main.apps = main.params[ 'ENV' ][ 'cellApps' ]
+            gitBranch = main.params[ 'GIT' ][ 'branch' ]
+            main.dependencyPath = main.testOnDirectory + \
+                                  main.params[ 'DEPENDENCY' ][ 'path' ]
+            main.topology = main.params[ 'DEPENDENCY' ][ 'topology' ]
+            main.scale = ( main.params[ 'SCALE' ][ 'size' ] ).split( "," )
+            if main.ONOSbench.maxNodes:
+                main.maxNodes = int( main.ONOSbench.maxNodes )
+            else:
+                main.maxNodes = 0
+            wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
+            wrapperFile2 = main.params[ 'DEPENDENCY' ][ 'wrapper2' ]
+            wrapperFile3 = main.params[ 'DEPENDENCY' ][ 'wrapper3' ]
+            main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+            main.checkIntentSleep = int( main.params[ 'SLEEP' ][ 'checkintent' ] )
+            main.removeIntentsleeo = int( main.params[ 'SLEEP' ][ 'removeintent' ] )
+            main.rerouteSleep = int( main.params[ 'SLEEP' ][ 'reroute' ] )
+            main.fwdSleep = int( main.params[ 'SLEEP' ][ 'fwd' ] )
+            main.addIntentSleep = int( main.params[ 'SLEEP' ][ 'addIntent' ] )
+            main.checkTopoAttempts = int( main.params[ 'SLEEP' ][ 'topoAttempts' ] )
+            gitPull = main.params[ 'GIT' ][ 'pull' ]
+            main.numSwitch = int( main.params[ 'MININET' ][ 'switch' ] )
+            main.numLinks = int( main.params[ 'MININET' ][ 'links' ] )
+            main.cellData = {} # for creating cell file
+            main.hostsData = {}
+            main.CLIs = []
+            main.CLIs2 = []
+            main.ONOSip = []
+            main.scapyHostNames = main.params[ 'SCAPY' ][ 'HOSTNAMES' ].split( ',' )
+            main.scapyHosts = []  # List of scapy hosts for iterating
+            main.assertReturnString = ''  # Assembled assert return string
+
+            main.ONOSip = main.ONOSbench.getOnosIps()
+            print main.ONOSip
+
+            # Assigning ONOS cli handles to a list
+            try:
+                for i in range( 1,  main.maxNodes + 1 ):
+                    main.CLIs.append( getattr( main, 'ONOSrest' + str( i ) ) )
+                    main.CLIs2.append( getattr( main, 'ONOScli' + str( i ) ) )
+            except AttributeError:
+                main.log.warn( "A " + str( main.maxNodes ) + " node cluster " +
+                               "was defined in env variables, but only " +
+                               str( len( main.CLIs ) ) +
+                               " nodes were defined in the .topo file. " +
+                               "Using " + str( len( main.CLIs ) ) +
+                               " nodes for the test." )
+
+            # -- INIT SECTION, ONLY RUNS ONCE -- #
+            main.startUp = imp.load_source( wrapperFile1,
+                                            main.dependencyPath +
+                                            wrapperFile1 +
+                                            ".py" )
+
+            main.intentFunction = imp.load_source( wrapperFile2,
+                                            main.dependencyPath +
+                                            wrapperFile2 +
+                                            ".py" )
+
+            main.topo = imp.load_source( wrapperFile3,
+                                         main.dependencyPath +
+                                         wrapperFile3 +
+                                         ".py" )
+
+            copyResult1 = main.ONOSbench.scp( main.Mininet1,
+                                              main.dependencyPath +
+                                              main.topology,
+                                              main.Mininet1.home + "custom/",
+                                              direction="to" )
+            if main.CLIs and main.CLIs2:
+                stepResult = main.TRUE
+            else:
+                main.log.error( "Did not properly created list of ONOS CLI handle" )
+                stepResult = main.FALSE
+        except Exception as e:
+            main.log.exception(e)
+            main.cleanup()
+            main.exit()
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully construct " +
+                                        "test variables ",
+                                 onfail="Failed to construct test variables" )
+
+        if gitPull == 'True':
+            main.step( "Building ONOS in " + gitBranch + " branch" )
+            onosBuildResult = main.startUp.onosBuild( main, gitBranch )
+            stepResult = onosBuildResult
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=stepResult,
+                                     onpass="Successfully compiled " +
+                                            "latest ONOS",
+                                     onfail="Failed to compile " +
+                                            "latest ONOS" )
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+        main.ONOSbench.getVersion( report=True )
+
+    def CASE2( self, main ):
+        """
+        - Set up cell
+            - Create cell file
+            - Set cell file
+            - Verify cell file
+        - Kill ONOS process
+        - Uninstall ONOS cluster
+        - Verify ONOS start up
+        - Install ONOS cluster
+        - Connect to cli
+        """
+
+        # main.scale[ 0 ] determines the current number of ONOS controller
+        main.numCtrls = int( main.scale[ 0 ] )
+        main.flowCompiler = "Flow Rules"
+
+        main.case( "Starting up " + str( main.numCtrls ) +
+                   " node(s) ONOS cluster" )
+        main.caseExplanation = "Set up ONOS with " + str( main.numCtrls ) +\
+                                " node(s) ONOS cluster"
+
+
+
+        #kill off all onos processes
+        main.log.info( "Safety check, killing all ONOS processes" +
+                       " before initiating environment setup" )
+
+        time.sleep( main.startUpSleep )
+
+        main.step( "Uninstalling ONOS package" )
+        onosUninstallResult = main.TRUE
+        for ip in main.ONOSip:
+            onosUninstallResult = onosUninstallResult and \
+                    main.ONOSbench.onosUninstall( nodeIp=ip )
+        stepResult = onosUninstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully uninstalled ONOS package",
+                                 onfail="Failed to uninstall ONOS package" )
+
+        time.sleep( main.startUpSleep )
+
+        for i in range( main.maxNodes ):
+            main.ONOSbench.onosDie( main.ONOSip[ i ] )
+
+        print "NODE COUNT = ", main.numCtrls
+
+        tempOnosIp = []
+        for i in range( main.numCtrls ):
+            tempOnosIp.append( main.ONOSip[i] )
+
+        main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
+                                       "temp", main.Mininet1.ip_address,
+                                       main.apps, tempOnosIp )
+
+        main.step( "Apply cell to environment" )
+        cellResult = main.ONOSbench.setCell( "temp" )
+        verifyResult = main.ONOSbench.verifyCell()
+        stepResult = cellResult and verifyResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully applied cell to " + \
+                                        "environment",
+                                 onfail="Failed to apply cell to environment " )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+        stepResult = packageResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully created ONOS package",
+                                 onfail="Failed to create ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Installing ONOS package" )
+        onosInstallResult = main.TRUE
+        for i in range( main.numCtrls ):
+            onosInstallResult = onosInstallResult and \
+                    main.ONOSbench.onosInstall( node=main.ONOSip[ i ] )
+        stepResult = onosInstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully installed ONOS package",
+                                 onfail="Failed to install ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Starting ONOS service" )
+        stopResult = main.TRUE
+        startResult = main.TRUE
+        onosIsUp = main.TRUE
+
+        for i in range( main.numCtrls ):
+            onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
+        if onosIsUp == main.TRUE:
+            main.log.report( "ONOS instance is up and ready" )
+        else:
+            main.log.report( "ONOS instance may not be up, stop and " +
+                             "start ONOS again " )
+            for i in range( main.numCtrls ):
+                stopResult = stopResult and \
+                        main.ONOSbench.onosStop( main.ONOSip[ i ] )
+            for i in range( main.numCtrls ):
+                startResult = startResult and \
+                        main.ONOSbench.onosStart( main.ONOSip[ i ] )
+        stepResult = onosIsUp and stopResult and startResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ONOS service is ready",
+                                 onfail="ONOS service did not start properly" )
+
+        # Start an ONOS cli to provide functionality that is not currently
+        # supported by the Rest API remove this when Leader Checking is supported
+        # by the REST API
+
+        main.step( "Start ONOS cli" )
+        cliResult = main.TRUE
+        for i in range( main.numCtrls ):
+            cliResult = cliResult and \
+                        main.CLIs2[ i ].startOnosCli( main.ONOSip[ i ] )
+        stepResult = cliResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully start ONOS cli",
+                                 onfail="Failed to start ONOS cli" )
+
+        # Remove the first element in main.scale list
+        main.scale.remove( main.scale[ 0 ] )
+
+        main.intentFunction.report( main )
+
+    def CASE8( self, main ):
+        # OLD FUNCintentRest CASE 8
+        # This remains here for archiving and reference purposes and will be
+        # removed when the new FUNCintentRest is verified to work.
+        # """
+        # Compare Topo
+        # """
+        # import json
+
+        # main.case( "Compare ONOS Topology view to Mininet topology" )
+        # main.caseExplanation = "Compare topology elements between Mininet" +\
+        #                         " and ONOS"
+
+        # main.step( "Gathering topology information" )
+        # # TODO: add a paramaterized sleep here
+        # devicesResults = main.TRUE  # Overall Boolean for device correctness
+        # linksResults = main.TRUE  # Overall Boolean for link correctness
+        # hostsResults = main.TRUE  # Overall Boolean for host correctness
+        # 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()
+
+        # main.step( "Comparing MN topology to ONOS topology" )
+        # for controller in range( main.numCtrls ):
+        #     controllerStr = str( controller + 1 )
+        #     if devices[ controller ] and ports[ controller ] and\
+        #         "Error" not in devices[ controller ] and\
+        #         "Error" not in ports[ controller ]:
+
+        #         currentDevicesResult = main.Mininet1.compareSwitches(
+        #                 mnSwitches,
+        #                 json.loads( devices[ controller ] ),
+        #                 json.loads( ports[ controller ] ) )
+        #     else:
+        #         currentDevicesResult = main.FALSE
+        #     utilities.assert_equals( expect=main.TRUE,
+        #                              actual=currentDevicesResult,
+        #                              onpass="ONOS" + controllerStr +
+        #                              " Switches view is correct",
+        #                              onfail="ONOS" + controllerStr +
+        #                              " Switches view is incorrect" )
+
+        #     if links[ controller ] and "Error" not in links[ controller ]:
+        #         currentLinksResult = main.Mininet1.compareLinks(
+        #                 mnSwitches, mnLinks,
+        #                 json.loads( links[ controller ] ) )
+        #     else:
+        #         currentLinksResult = main.FALSE
+        #     utilities.assert_equals( expect=main.TRUE,
+        #                              actual=currentLinksResult,
+        #                              onpass="ONOS" + controllerStr +
+        #                              " links view is correct",
+        #                              onfail="ONOS" + controllerStr +
+        #                              " links view is incorrect" )
+
+        #     if hosts[ controller ] or "Error" not in hosts[ controller ]:
+        #         currentHostsResult = main.Mininet1.compareHosts(
+        #                 mnHosts,
+        #                 json.loads( hosts[ controller ] ) )
+        #     else:
+        #         currentHostsResult = main.FALSE
+        #     utilities.assert_equals( expect=main.TRUE,
+        #                              actual=currentHostsResult,
+        #                              onpass="ONOS" + controllerStr +
+        #                              " hosts exist in Mininet",
+        #                              onfail="ONOS" + controllerStr +
+        #                              " hosts don't match Mininet" )
+
+        # NEW FUNCintentRest Case 8 as based off of the CASE 8 from FUNCintent
+        """
+        Compare ONOS Topology to Mininet Topology
+        """
+        import json
+
+        main.case( "Compare ONOS Topology view to Mininet topology" )
+        main.caseExplanation = "Compare topology elements between Mininet" +\
+                                " and ONOS"
+
+        main.log.info( "Gathering topology information from Mininet" )
+        devicesResults = main.FALSE  # Overall Boolean for device correctness
+        linksResults = main.FALSE  # Overall Boolean for link correctness
+        hostsResults = main.FALSE  # Overall Boolean for host correctness
+        deviceFails = []  # Nodes where devices are incorrect
+        linkFails = []  # Nodes where links are incorrect
+        hostFails = []  # Nodes where hosts are incorrect
+        attempts = main.checkTopoAttempts  # Remaining Attempts
+
+        mnSwitches = main.Mininet1.getSwitches()
+        mnLinks = main.Mininet1.getLinks()
+        mnHosts = main.Mininet1.getHosts()
+
+        main.step( "Comparing Mininet topology to ONOS topology" )
+
+        while ( attempts >= 0 ) and\
+            ( not devicesResults or not linksResults or not hostsResults ):
+            time.sleep( 2 )
+            if not devicesResults:
+                devices = main.topo.getAllDevices( main )
+                ports = main.topo.getAllPorts( main )
+                devicesResults = main.TRUE
+                deviceFails = []  # Reset for each failed attempt
+            if not linksResults:
+                links = main.topo.getAllLinks( main )
+                linksResults = main.TRUE
+                linkFails = []  # Reset for each failed attempt
+            if not hostsResults:
+                hosts = main.topo.getAllHosts( main )
+                hostsResults = main.TRUE
+                hostFails = []  # Reset for each failed attempt
+
+            #  Check for matching topology on each node
+            for controller in range( main.numCtrls ):
+                controllerStr = str( controller + 1 )  # ONOS node number
+                # Compare Devices
+                if devices[ controller ] and ports[ controller ] and\
+                    "Error" not in devices[ controller ] and\
+                    "Error" not in ports[ controller ]:
+
+                    try:
+                        deviceData = json.loads( devices[ controller ] )
+                        portData = json.loads( ports[ controller ] )
+                    except (TypeError,ValueError):
+                        main.log.error( "Could not load json: {0} or {1}".format( str( devices[ controller ] ), str( ports[ controller ] ) ) )
+                        currentDevicesResult = main.FALSE
+                    else:
+                        currentDevicesResult = main.Mininet1.compareSwitches(
+                            mnSwitches,deviceData,portData )
+                else:
+                    currentDevicesResult = main.FALSE
+                if not currentDevicesResult:
+                    deviceFails.append( controllerStr )
+                devicesResults = devicesResults and currentDevicesResult
+                # Compare Links
+                if links[ controller ] and "Error" not in links[ controller ]:
+                    try:
+                        linkData = json.loads( links[ controller ] )
+                    except (TypeError,ValueError):
+                        main.log.error("Could not load json:" + str( links[ controller ] ) )
+                        currentLinksResult = main.FALSE
+                    else:
+                        currentLinksResult = main.Mininet1.compareLinks(
+                            mnSwitches, mnLinks,linkData )
+                else:
+                    currentLinksResult = main.FALSE
+                if not currentLinksResult:
+                    linkFails.append( controllerStr )
+                linksResults = linksResults and currentLinksResult
+                # Compare Hosts
+                if hosts[ controller ] and "Error" not in hosts[ controller ]:
+                    try:
+                        hostData = json.loads( hosts[ controller ] )
+                    except (TypeError,ValueError):
+                        main.log.error("Could not load json:" + str( hosts[ controller ] ) )
+                        currentHostsResult = main.FALSE
+                    else:
+                        currentHostsResult = main.Mininet1.compareHosts(
+                                mnHosts,hostData )
+                else:
+                    currentHostsResult = main.FALSE
+                if not currentHostsResult:
+                    hostFails.append( controllerStr )
+                hostsResults = hostsResults and currentHostsResult
+            # Decrement Attempts Remaining
+            attempts -= 1
+
+
+        utilities.assert_equals( expect=[],
+                                 actual=deviceFails,
+                                 onpass="ONOS correctly discovered all devices",
+                                 onfail="ONOS incorrectly discovered devices on nodes: " +
+                                 str( deviceFails ) )
+        utilities.assert_equals( expect=[],
+                                 actual=linkFails,
+                                 onpass="ONOS correctly discovered all links",
+                                 onfail="ONOS incorrectly discovered links on nodes: " +
+                                 str( linkFails ) )
+        utilities.assert_equals( expect=[],
+                                 actual=hostFails,
+                                 onpass="ONOS correctly discovered all hosts",
+                                 onfail="ONOS incorrectly discovered hosts on nodes: " +
+                                 str( hostFails ) )
+        topoResults = hostsResults and linksResults and devicesResults
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=topoResults,
+                                 onpass="ONOS correctly discovered the topology",
+                                 onfail="ONOS incorrectly discovered the topology" )
+
+    def CASE9( self, main ):
+        '''
+            Report errors/warnings/exceptions
+        '''
+        main.log.info( "Error report: \n" )
+        main.ONOSbench.logReport( globalONOSip[0],
+                [ "INFO", "FOLLOWER", "WARN", "flow", "ERROR" , "Except" ],
+                "s" )
+        #main.ONOSbench.logReport( globalONOSip[1], [ "INFO" ], "d" )
+
+    def CASE10( self, main ):
+        """
+            Start Mininet topology with OF 1.0 switches
+        """
+        main.OFProtocol = "1.0"
+        main.log.report( "Start Mininet topology with OF 1.0 switches" )
+        main.case( "Start Mininet topology with OF 1.0 switches" )
+        main.caseExplanation = "Start mininet topology with OF 1.0 " +\
+                                "switches to test intents, exits out if " +\
+                                "topology did not start correctly"
+
+        main.step( "Starting Mininet topology with OF 1.0 switches" )
+        args = "--switch ovs,protocols=OpenFlow10"
+        topoResult = main.Mininet1.startNet( topoFile=main.dependencyPath +
+                                                      main.topology,
+                                             args=args )
+        stepResult = topoResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully loaded topology",
+                                 onfail="Failed to load topology" )
+        # Exit if topology did not load properly
+        if not topoResult:
+            main.cleanup()
+            main.exit()
+
+    def CASE11( self, main ):
+        """
+            Start Mininet topology with OF 1.3 switches
+        """
+        main.OFProtocol = "1.3"
+        main.log.report( "Start Mininet topology with OF 1.3 switches" )
+        main.case( "Start Mininet topology with OF 1.3 switches" )
+        main.caseExplanation = "Start mininet topology with OF 1.3 " +\
+                                "switches to test intents, exits out if " +\
+                                "topology did not start correctly"
+
+        main.step( "Starting Mininet topology with OF 1.3 switches" )
+        args = "--switch ovs,protocols=OpenFlow13"
+        topoResult = main.Mininet1.startNet( topoFile=main.dependencyPath +
+                                                      main.topology,
+                                             args=args )
+        stepResult = topoResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully loaded topology",
+                                 onfail="Failed to load topology" )
+        # Exit if topology did not load properly
+        if not topoResult:
+            main.cleanup()
+            main.exit()
+
+    def CASE12( self, main ):
+        """
+            Assign mastership to controllers
+        """
+        import re
+
+        main.case( "Assign switches to controllers" )
+        main.step( "Assigning switches to controllers" )
+        main.caseExplanation = "Assign OF " + main.OFProtocol +\
+                                " switches to ONOS nodes"
+
+        assignResult = main.TRUE
+        switchList = []
+
+        # Creates a list switch name, use getSwitch() function later...
+        for i in range( 1, ( main.numSwitch + 1 ) ):
+            switchList.append( 's' + str( i ) )
+
+        tempONOSip = []
+        for i in range( main.numCtrls ):
+            tempONOSip.append( main.ONOSip[ i ] )
+
+        assignResult = main.Mininet1.assignSwController( sw=switchList,
+                                                         ip=tempONOSip,
+                                                         port='6653' )
+        if not assignResult:
+            main.cleanup()
+            main.exit()
+
+        for i in range( 1, ( main.numSwitch + 1 ) ):
+            response = main.Mininet1.getSwController( "s" + str( i ) )
+            print( "Response is " + str( response ) )
+            if re.search( "tcp:" + main.ONOSip[ 0 ], response ):
+                assignResult = assignResult and main.TRUE
+            else:
+                assignResult = main.FALSE
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully assigned switches" +
+                                        "to controller",
+                                 onfail="Failed to assign switches to " +
+                                        "controller" )
+
+    def CASE13( self,main ):
+        """
+            Create Scapy components
+        """
+        main.case( "Create scapy components" )
+        main.step( "Create scapy components" )
+        import json
+        scapyResult = main.TRUE
+        for hostName in main.scapyHostNames:
+            main.Scapy1.createHostComponent( hostName )
+            main.scapyHosts.append( getattr( main, hostName ) )
+
+        main.step( "Start scapy components" )
+        for host in main.scapyHosts:
+            host.startHostCli()
+            host.startScapy()
+            host.updateSelf()
+            main.log.debug( host.name )
+            main.log.debug( host.hostIp )
+            main.log.debug( host.hostMac )
+
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=scapyResult,
+                                 onpass="Successfully created Scapy Components",
+                                 onfail="Failed to discover Scapy Components" )
+
+    def CASE14( self, main ):
+        """
+            Discover all hosts and store its data to a dictionary
+        """
+        main.case( "Discover all hosts" )
+
+        stepResult = main.TRUE
+        main.step( "Discover all ipv4 host hosts " )
+        hostList = []
+        # List of host with default vlan
+        defaultHosts = [ "h1", "h3", "h8", "h9", "h11", "h16", "h17", "h19", "h24" ]
+        # Lists of host with unique vlan
+        vlanHosts1 = [ "h4", "h12", "h20" ]
+        vlanHosts2 = [ "h5", "h13", "h21" ]
+        vlanHosts3 = [ "h6", "h14", "h22" ]
+        vlanHosts4 = [ "h7", "h15", "h23" ]
+        hostList.append( defaultHosts )
+        hostList.append( vlanHosts1 )
+        hostList.append( vlanHosts2 )
+        hostList.append( vlanHosts3 )
+        hostList.append( vlanHosts4 )
+
+        stepResult = main.intentFunction.getHostsData( main, hostList )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully discovered hosts",
+                                 onfail="Failed to discover hosts" )
+
+    def CASE15( self, main ):
+        """
+            Discover all hosts with scapy arp packets and store its data to a dictionary
+        """
+        main.case( "Discover all hosts using scapy" )
+        main.step( "Send packets from each host to the first host and confirm onos discovery" )
+
+        import collections
+        if len( main.scapyHosts ) < 1:
+            main.log.error( "No scapy hosts have been created" )
+            main.skipCase()
+
+        # Send ARP packets from each scapy host component
+        main.intentFunction.sendDiscoveryArp( main, main.scapyHosts )
+
+        stepResult = utilities.retry( f=main.intentFunction.confirmHostDiscovery,
+                                      retValue=main.FALSE, args=[ main ],
+                                      attempts=main.checkTopoAttempts, sleep=2 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ONOS correctly discovered all hosts",
+                                 onfail="ONOS incorrectly discovered hosts" )
+
+        main.step( "Populate hostsData" )
+        stepResult = main.intentFunction.populateHostData( main )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully populated hostsData",
+                                 onfail="Failed to populate hostsData" )
+
+    def CASE16( self, main ):
+        """
+            Balance Masters
+        """
+        main.case( "Balance mastership of switches" )
+        main.step( "Balancing mastership of switches" )
+
+        balanceResult = main.FALSE
+        balanceResult = utilities.retry( f=main.CLIs2[ 0 ].balanceMasters, retValue=main.FALSE, args=[] )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully balanced mastership of switches",
+                                 onfail="Failed to balance mastership of switches" )
+
+    def CASE17( self, main ):
+        """
+            Use Flow Objectives
+        """
+        main.case( "Enable intent compilation using Flow Objectives" )
+        main.step( "Enabling Flow Objectives" )
+
+        main.flowCompiler = "Flow Objectives"
+
+        cmd = "org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator"
+
+        stepResult = main.CLIs2[ 0 ].setCfg( component=cmd,
+                                            propName="useFlowObjectives", value="true" )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully activated Flow Objectives",
+                                 onfail="Failed to activate Flow Objectives" )
+
+    def CASE18( self, main ):
+        """
+            Stop mininet and remove scapy hosts
+        """
+        main.log.report( "Stop Mininet and Scapy" )
+        main.case( "Stop Mininet and Scapy" )
+        main.caseExplanation = "Stopping the current mininet topology " +\
+                                "to start up fresh"
+
+        main.step( "Stopping and Removing Scapy Host Components" )
+        scapyResult = main.TRUE
+        for host in main.scapyHosts:
+            scapyResult = scapyResult and host.stopScapy()
+            main.log.info( "Stopped Scapy Host: {0}".format( host.name ) )
+
+        for host in main.scapyHosts:
+            scapyResult = scapyResult and main.Scapy1.removeHostComponent( host.name )
+            main.log.info( "Removed Scapy Host Component: {0}".format( host.name ) )
+
+        main.scapyHosts = []
+        main.scapyHostIPs = []
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=scapyResult,
+                                 onpass="Successfully stopped scapy and removed host components",
+                                 onfail="Failed to stop mininet and scapy" )
+
+        main.step( "Stopping Mininet Topology" )
+        mininetResult = main.Mininet1.stopNet( )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully stop mininet",
+                                 onfail="Failed to stop mininet" )
+        # Exit if topology did not load properly
+        if not (mininetResult and scapyResult ):
+            main.cleanup()
+            main.exit()
+
+    def CASE1000( self, main ):
+        """
+            Add host intents between 2 host:
+                - Discover hosts
+                - Add host intents
+                - Check intents
+                - Verify flows
+                - Ping hosts
+                - Reroute
+                    - Link down
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                    - Link up
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                - Remove intents
+        """
+        import time
+        import json
+        import re
+
+        # Assert variables - These variable's name|format must be followed
+        # if you want to use the wrapper function
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+
+        # Save leader candidates
+        intentLeadersOld = main.CLIs2[ 0 ].leaderCandidates()
+
+        main.case( "Host Intents Test - " + str( main.numCtrls ) +
+                   " NODE(S) - OF " + main.OFProtocol + " - Using " + main.flowCompiler )
+        main.caseExplanation = "This test case tests Host intents using " +\
+                                str( main.numCtrls ) + " node(s) cluster;\n" +\
+                                "Different type of hosts will be tested in " +\
+                                "each step such as IPV4, Dual stack, VLAN " +\
+                                "etc;\nThe test will use OF " + main.OFProtocol +\
+                                " OVS running in Mininet and compile intents" +\
+                                " using " + main.flowCompiler
+
+        main.step( "IPV4: Add and test host intents between h1 and h9" )
+        main.assertReturnString = "Assertion result for IPV4 host intent with mac addresses\n"
+        host1 = { "name":"h1","id":"00:00:00:00:00:01/-1" }
+        host2 = { "name":"h9","id":"00:00:00:00:00:09/-1" }
+        testResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='IPV4',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2 )
+
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='IPV4',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "DUALSTACK1: Add host intents between h3 and h11" )
+        main.assertReturnString = "Assertion Result for dualstack IPV4 with MAC addresses\n"
+        host1 = { "name":"h3", "id":"00:00:00:00:00:03/-1" }
+        host2 = { "name":"h11","id":"00:00:00:00:00:0B/-1"}
+        testResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='DUALSTACK1',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2 )
+
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='DUALSTACK1',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString)
+
+        main.step( "DUALSTACK2: Add host intents between h1 and h11" )
+        main.assertReturnString = "Assertion Result for dualstack2 host intent\n"
+        host1 = { "name":"h1" }
+        host2 = { "name":"h11" }
+        testResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='DUALSTACK2',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2 )
+
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='DUALSTACK2',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "1HOP: Add host intents between h1 and h3" )
+        main.assertReturnString = "Assertion Result for 1HOP for IPV4 same switch\n"
+        host1 = { "name":"h1" }
+        host2 = { "name":"h3" }
+        testResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='1HOP',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2 )
+
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='1HOP',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "VLAN1: Add vlan host intents between h4 and h12" )
+        main.assertReturnString = "Assertion Result vlan IPV4\n"
+        host1 = { "name":"h4","id":"00:00:00:00:00:04/100" }
+        host2 = { "name":"h12","id":"00:00:00:00:00:0C/100" }
+        testResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='VLAN1',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2 )
+
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='VLAN1',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "VLAN2: Add inter vlan host intents between h13 and h20" )
+        main.assertReturnString = "Assertion Result different VLAN negative test\n"
+        host1 = { "name":"h13" }
+        host2 = { "name":"h20" }
+        testResult = main.FALSE
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='VLAN2',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2 )
+
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                              name='VLAN2',
+                                              intentId = installResult,
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2,
+                                              sw1='s5',
+                                              sw2='s2',
+                                              expectedLink = 18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        # Change the following to use the REST API when leader checking is
+        # supported by it
+
+        main.step( "Confirm that ONOS leadership is unchanged")
+        intentLeadersNew = main.CLIs2[ 0 ].leaderCandidates()
+        main.intentFunction.checkLeaderChange( intentLeadersOld,
+                                                intentLeadersNew )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass="ONOS Leaders Unchanged",
+                                 onfail="ONOS Leader Mismatch")
+
+        main.intentFunction.report( main )
+
+    def CASE2000( self, main ):
+        """
+            Add point intents between 2 hosts:
+                - Get device ids | ports
+                - Add point intents
+                - Check intents
+                - Verify flows
+                - Ping hosts
+                - Reroute
+                    - Link down
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                    - Link up
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                - Remove intents
+        """
+        import time
+        import json
+        import re
+
+        # Assert variables - These variable's name|format must be followed
+        # if you want to use the wrapper function
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+
+        main.case( "Point Intents Test - " + str( main.numCtrls ) +
+                   " NODE(S) - OF " + main.OFProtocol + " - Using " + main.flowCompiler )
+        main.caseExplanation = "This test case will test point to point" +\
+                               " intents using " + str( main.numCtrls ) +\
+                               " node(s) cluster;\n" +\
+                               "Different type of hosts will be tested in " +\
+                               "each step such as IPV4, Dual stack, VLAN etc" +\
+                               ";\nThe test will use OF " + main.OFProtocol +\
+                               " OVS running in Mininet and compile intents" +\
+                               " using " + main.flowCompiler
+
+        # No option point intents
+        main.step( "NOOPTION: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for NOOPTION point intent\n"
+        senders = [
+            { "name":"h1","device":"of:0000000000000005/1" }
+        ]
+        recipients = [
+            { "name":"h9","device":"of:0000000000000006/1" }
+        ]
+        testResult = main.FALSE
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="NOOPTION",
+                                       senders=senders,
+                                       recipients=recipients )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="NOOPTION",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "IPV4: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for IPV4 point intent\n"
+        senders = [
+            { "name":"h1","device":"of:0000000000000005/1","mac":"00:00:00:00:00:01" }
+        ]
+        recipients = [
+            { "name":"h9","device":"of:0000000000000006/1","mac":"00:00:00:00:00:09" }
+        ]
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="IPV4",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4" )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "IPV4_2: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for IPV4 no mac address point intents\n"
+        senders = [
+            { "name":"h1","device":"of:0000000000000005/1" }
+        ]
+        recipients = [
+            { "name":"h9","device":"of:0000000000000006/1" }
+        ]
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="IPV4_2",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4" )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="IPV4_2",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "SDNIP-ICMP: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for SDNIP-ICMP IPV4 using TCP point intents\n"
+        senders = [
+            { "name":"h1","device":"of:0000000000000005/1","mac":"00:00:00:00:00:01",
+              "ip":main.h1.hostIp }
+        ]
+        recipients = [
+            { "name":"h9","device":"of:0000000000000006/1","mac":"00:00:00:00:00:09",
+              "ip":main.h9.hostIp }
+        ]
+        ipProto = main.params[ 'SDNIP' ][ 'icmpProto' ]
+        # Uneccessary, not including this in the selectors
+        tcpSrc = main.params[ 'SDNIP' ][ 'srcPort' ]
+        tcpDst = main.params[ 'SDNIP' ][ 'dstPort' ]
+
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="SDNIP-ICMP",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4",
+                                       ipProto=ipProto,
+                                       tcpSrc=tcpSrc,
+                                       tcpDst=tcpDst )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="SDNIP_ICMP",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "SDNIP-TCP: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for SDNIP-TCP IPV4 using ICMP point intents\n"
+        mac1 = main.hostsData[ 'h1' ][ 'mac' ]
+        mac2 = main.hostsData[ 'h9' ][ 'mac' ]
+        ip1 = str( main.hostsData[ 'h1' ][ 'ipAddresses' ][ 0 ] ) + "/32"
+        ip2 = str( main.hostsData[ 'h9' ][ 'ipAddresses' ][ 0 ] ) + "/32"
+        ipProto = main.params[ 'SDNIP' ][ 'tcpProto' ]
+        tcp1 = main.params[ 'SDNIP' ][ 'srcPort' ]
+        tcp2 = main.params[ 'SDNIP' ][ 'dstPort' ]
+
+        stepResult = main.intentFunction.pointIntentTcp(
+                                           main,
+                                           name="SDNIP-TCP",
+                                           host1="h1",
+                                           host2="h9",
+                                           deviceId1="of:0000000000000005/1",
+                                           deviceId2="of:0000000000000006/1",
+                                           mac1=mac1,
+                                           mac2=mac2,
+                                           ethType="IPV4",
+                                           ipProto=ipProto,
+                                           ip1=ip1,
+                                           ip2=ip2,
+                                           tcp1=tcp1,
+                                           tcp2=tcp2 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                             actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "DUALSTACK1: Add point intents between h3 and h11" )
+        main.assertReturnString = "Assertion Result for Dualstack1 IPV4 with mac address point intents\n"
+        senders = [
+            { "name":"h3","device":"of:0000000000000005/3","mac":"00:00:00:00:00:03" }
+        ]
+        recipients = [
+            { "name":"h11","device":"of:0000000000000006/3","mac":"00:00:00:00:00:0B" }
+        ]
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="DUALSTACK1",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4" )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="DUALSTACK1",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "VLAN: Add point intents between h5 and h21" )
+        main.assertReturnString = "Assertion Result for VLAN IPV4 with mac address point intents\n"
+        senders = [
+            { "name":"h5","device":"of:0000000000000005/5","mac":"00:00:00:00:00:05" }
+        ]
+        recipients = [
+            { "name":"h21","device":"of:0000000000000007/5","mac":"00:00:00:00:00:15" }
+        ]
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="DUALSTACK1",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4" )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="DUALSTACK1",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "1HOP: Add point intents between h1 and h3" )
+        main.assertReturnString = "Assertion Result for 1HOP IPV4 with no mac address point intents\n"
+        senders = [
+            { "name":"h1","device":"of:0000000000000005/1","mac":"00:00:00:00:00:01" }
+        ]
+        recipients = [
+            { "name":"h3","device":"of:0000000000000005/3","mac":"00:00:00:00:00:03" }
+        ]
+        installResult = main.intentFunction.installPointIntent(
+                                       main,
+                                       name="1HOP IPV4",
+                                       senders=senders,
+                                       recipients=recipients,
+                                       ethType="IPV4" )
+
+        if installResult:
+            testResult = main.intentFunction.testPointIntent(
+                                         main,
+                                         intentId=installResult,
+                                         name="1HOP IPV4",
+                                         senders=senders,
+                                         recipients=recipients,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.intentFunction.report( main )
+
+    def CASE3000( self, main ):
+        """
+            Add single point to multi point intents
+                - Get device ids
+                - Add single point to multi point intents
+                - Check intents
+                - Verify flows
+                - Ping hosts
+                - Reroute
+                    - Link down
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                    - Link up
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                - Remove intents
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+
+        main.case( "Single To Multi Point Intents Test - " +
+                   str( main.numCtrls ) + " NODE(S) - OF " + main.OFProtocol + " - Using " + main.flowCompiler )
+        main.caseExplanation = "This test case will test single point to" +\
+                               " multi point intents using " +\
+                               str( main.numCtrls ) + " node(s) cluster;\n" +\
+                               "Different type of hosts will be tested in " +\
+                               "each step such as IPV4, Dual stack, VLAN etc" +\
+                               ";\nThe test will use OF " + main.OFProtocol +\
+                               " OVS running in Mininet and compile intents" +\
+                               " using " + main.flowCompiler
+
+        main.step( "NOOPTION: Add single point to multi point intents" )
+        stepResult = main.TRUE
+        hostNames = [ 'h8', 'h16', 'h24' ]
+        devices = [ 'of:0000000000000005/8', 'of:0000000000000006/8', \
+                    'of:0000000000000007/8' ]
+        macs = [ '00:00:00:00:00:08', '00:00:00:00:00:10', '00:00:00:00:00:18' ]
+        stepResult = main.intentFunction.singleToMultiIntent(
+                                         main,
+                                         name="NOOPTION",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="NOOPTION: Successfully added single "
+                                        + " point to multi point intents" +
+                                        " with no match action",
+                                 onfail="NOOPTION: Failed to add single point"
+                                        + " point to multi point intents" +
+                                        " with no match action" )
+
+        main.step( "IPV4: Add single point to multi point intents" )
+        stepResult = main.TRUE
+        stepResult = main.intentFunction.singleToMultiIntent(
+                                         main,
+                                         name="IPV4",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         ports=None,
+                                         ethType="IPV4",
+                                         macs=macs,
+                                         bandwidth="",
+                                         lambdaAlloc=False,
+                                         ipProto="",
+                                         ipAddresses="",
+                                         tcp="",
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="IPV4: Successfully added single "
+                                        + " point to multi point intents" +
+                                        " with IPV4 type and MAC addresses",
+                                 onfail="IPV4: Failed to add single point"
+                                        + " point to multi point intents" +
+                                        " with IPV4 type and MAC addresses" )
+
+        main.step( "IPV4_2: Add single point to multi point intents" )
+        stepResult = main.TRUE
+        hostNames = [ 'h8', 'h16', 'h24' ]
+        stepResult = main.intentFunction.singleToMultiIntent(
+                                         main,
+                                         name="IPV4",
+                                         hostNames=hostNames,
+                                         ethType="IPV4",
+                                         lambdaAlloc=False )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="IPV4_2: Successfully added single "
+                                        + " point to multi point intents" +
+                                        " with IPV4 type and no MAC addresses",
+                                 onfail="IPV4_2: Failed to add single point"
+                                        + " point to multi point intents" +
+                                        " with IPV4 type and no MAC addresses" )
+
+        main.step( "VLAN: Add single point to multi point intents" )
+        stepResult = main.TRUE
+        hostNames = [ 'h4', 'h12', 'h20' ]
+        devices = [ 'of:0000000000000005/4', 'of:0000000000000006/4', \
+                    'of:0000000000000007/4' ]
+        macs = [ '00:00:00:00:00:04', '00:00:00:00:00:0C', '00:00:00:00:00:14' ]
+        stepResult = main.intentFunction.singleToMultiIntent(
+                                         main,
+                                         name="VLAN",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         ports=None,
+                                         ethType="IPV4",
+                                         macs=macs,
+                                         bandwidth="",
+                                         lambdaAlloc=False,
+                                         ipProto="",
+                                         ipAddresses="",
+                                         tcp="",
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="VLAN: Successfully added single "
+                                        + " point to multi point intents" +
+                                        " with IPV4 type and MAC addresses" +
+                                        " in the same VLAN",
+                                 onfail="VLAN: Failed to add single point"
+                                        + " point to multi point intents" +
+                                        " with IPV4 type and MAC addresses" +
+                                        " in the same VLAN")
+
+    def CASE4000( self, main ):
+        """
+            Add multi point to single point intents
+                - Get device ids
+                - Add multi point to single point intents
+                - Check intents
+                - Verify flows
+                - Ping hosts
+                - Reroute
+                    - Link down
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                    - Link up
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+             - Remove intents
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+
+        main.case( "Multi To Single Point Intents Test - " +
+                   str( main.numCtrls ) + " NODE(S) - OF " + main.OFProtocol + " - Using " + main.flowCompiler )
+        main.caseExplanation = "This test case will test single point to" +\
+                               " multi point intents using " +\
+                               str( main.numCtrls ) + " node(s) cluster;\n" +\
+                               "Different type of hosts will be tested in " +\
+                               "each step such as IPV4, Dual stack, VLAN etc" +\
+                               ";\nThe test will use OF " + main.OFProtocol +\
+                               " OVS running in Mininet and compile intents" +\
+                               " using " + main.flowCompiler
+
+        main.step( "NOOPTION: Add multi point to single point intents" )
+        stepResult = main.TRUE
+        hostNames = [ 'h8', 'h16', 'h24' ]
+        devices = [ 'of:0000000000000005/8', 'of:0000000000000006/8', \
+                    'of:0000000000000007/8' ]
+        macs = [ '00:00:00:00:00:08', '00:00:00:00:00:10', '00:00:00:00:00:18' ]
+        stepResult = main.intentFunction.multiToSingleIntent(
+                                         main,
+                                         name="NOOPTION",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="NOOPTION: Successfully added multi "
+                                        + " point to single point intents" +
+                                        " with no match action",
+                                 onfail="NOOPTION: Failed to add multi point" +
+                                        " to single point intents" +
+                                        " with no match action" )
+
+        main.step( "IPV4: Add multi point to single point intents" )
+        stepResult = main.TRUE
+        stepResult = main.intentFunction.multiToSingleIntent(
+                                         main,
+                                         name="IPV4",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         ports=None,
+                                         ethType="IPV4",
+                                         macs=macs,
+                                         bandwidth="",
+                                         lambdaAlloc=False,
+                                         ipProto="",
+                                         ipAddresses="",
+                                         tcp="",
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="IPV4: Successfully added multi point"
+                                        + " to single point intents" +
+                                        " with IPV4 type and MAC addresses",
+                                 onfail="IPV4: Failed to add multi point" +
+                                        " to single point intents" +
+                                        " with IPV4 type and MAC addresses" )
+
+        main.step( "IPV4_2: Add multi point to single point intents" )
+        stepResult = main.TRUE
+        hostNames = [ 'h8', 'h16', 'h24' ]
+        stepResult = main.intentFunction.multiToSingleIntent(
+                                         main,
+                                         name="IPV4",
+                                         hostNames=hostNames,
+                                         ethType="IPV4",
+                                         lambdaAlloc=False )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="IPV4_2: Successfully added multi point"
+                                        + " to single point intents" +
+                                        " with IPV4 type and no MAC addresses",
+                                 onfail="IPV4_2: Failed to add multi point" +
+                                        " to single point intents" +
+                                        " with IPV4 type and no MAC addresses" )
+
+        main.step( "VLAN: Add multi point to single point intents" )
+        stepResult = main.TRUE
+        hostNames = [ 'h5', 'h13', 'h21' ]
+        devices = [ 'of:0000000000000005/5', 'of:0000000000000006/5', \
+                    'of:0000000000000007/5' ]
+        macs = [ '00:00:00:00:00:05', '00:00:00:00:00:0D', '00:00:00:00:00:15' ]
+        stepResult = main.intentFunction.multiToSingleIntent(
+                                         main,
+                                         name="VLAN",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         ports=None,
+                                         ethType="IPV4",
+                                         macs=macs,
+                                         bandwidth="",
+                                         lambdaAlloc=False,
+                                         ipProto="",
+                                         ipAddresses="",
+                                         tcp="",
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="VLAN: Successfully added multi point"
+                                        + " to single point intents" +
+                                        " with IPV4 type and MAC addresses" +
+                                        " in the same VLAN",
+                                 onfail="VLAN: Failed to add multi point" +
+                                        " to single point intents" )
+
+    def CASE5000( self, main ):
+        # """
+        # Will add description in next patch set
+        # """
+        # assert main, "There is no main"
+        # assert main.CLIs, "There is no main.CLIs"
+        # assert main.Mininet1, "Mininet handle should be named Mininet1"
+        # assert main.numSwitch, "Placed the total number of switch topology in \
+        #                         main.numSwitch"
+        # main.case( "Test host mobility with host intents " )
+        # main.step( " Testing host mobility by moving h1 from s5 to s6" )
+        # h1PreMove = main.hostsData[ "h1" ][ "location" ][ 0:19 ]
+
+        # main.log.info( "Moving h1 from s5 to s6")
+
+        # main.Mininet1.moveHost( "h1","s5","s6" )
+
+        # main.intentFunction.getHostsData( main )
+        # h1PostMove = main.hostsData[ "h1" ][ "location" ][ 0:19 ]
+
+        # utilities.assert_equals( expect="of:0000000000000006",
+        #                          actual=h1PostMove,
+        #                          onpass="Mobility: Successfully moved h1 to s6",
+        #                          onfail="Mobility: Failed to moved h1 to s6" +
+        #                                 " to single point intents" +
+        #                                 " with IPV4 type and MAC addresses" +
+        #                                 " in the same VLAN" )
+
+        # main.step( "IPV4: Add host intents between h1 and h9" )
+        # stepResult = main.TRUE
+        # stepResult = main.intentFunction.hostIntent( main,
+        #                                       onosNode='0',
+        #                                       name='IPV4',
+        #                                       host1='h1',
+        #                                       host2='h9',
+        #                                       host1Id='00:00:00:00:00:01/-1',
+        #                                       host2Id='00:00:00:00:00:09/-1' )
+
+        # utilities.assert_equals( expect=main.TRUE,
+        #                          actual=stepResult,
+        #                          onpass="IPV4: Host intent test successful " +
+        #                                 "between two IPV4 hosts",
+        #                          onfail="IPV4: Host intent test failed " +
+        #                                 "between two IPV4 hosts")
+        """
+        Tests Host Mobility
+        Modifies the topology location of h1
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+        main.case( "Test host mobility with host intents " )
+        main.step( "Testing host mobility by moving h1 from s5 to s6" )
+        h1PreMove = main.hostsData[ "h1" ][ "location" ][ 0:19 ]
+
+        main.log.info( "Moving h1 from s5 to s6")
+        main.Mininet1.moveHost( "h1","s5","s6" )
+
+        # Send discovery ping from moved host
+        # Moving the host brings down the default interfaces and creates a new one.
+        # Scapy is restarted on this host to detect the new interface
+        main.h1.stopScapy()
+        main.h1.startScapy()
+
+        # Discover new host location in ONOS and populate host data.
+        # Host 1 IP and MAC should be unchanged
+        main.intentFunction.sendDiscoveryArp( main, [ main.h1 ] )
+        main.intentFunction.populateHostData( main )
+
+        h1PostMove = main.hostsData[ "h1" ][ "location" ][ 0:19 ]
+
+        utilities.assert_equals( expect="of:0000000000000006",
+                                 actual=h1PostMove,
+                                 onpass="Mobility: Successfully moved h1 to s6",
+                                 onfail="Mobility: Failed to move h1 to s6" +
+                                        " to single point intents" +
+                                        " with IPV4 type and MAC addresses" +
+                                        " in the same VLAN" )
+
+        main.step( "IPV4: Add host intents between h1 and h9" )
+        main.assertReturnString = "Assert result for IPV4 host intent between h1, moved, and h9\n"
+        host1 = { "name":"h1","id":"00:00:00:00:00:01/-1" }
+        host2 = { "name":"h9","id":"00:00:00:00:00:09/-1" }
+
+        installResult = main.intentFunction.installHostIntent( main,
+                                              name='IPV4 Mobility IPV4',
+                                              onosNode='0',
+                                              host1=host1,
+                                              host2=host2)
+        if installResult:
+            testResult = main.intentFunction.testHostIntent( main,
+                                                  name='Host Mobility IPV4',
+                                                  intentId = installResult,
+                                                  onosNode='0',
+                                                  host1=host1,
+                                                  host2=host2,
+                                                  sw1="s6",
+                                                  sw2="s2",
+                                                  expectedLink=18 )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.intentFunction.report( main )
+
diff --git a/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.topo b/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.topo
new file mode 100755
index 0000000..29c38a3
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.topo
@@ -0,0 +1,94 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOSrest1>
+            <host>OC1</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest1>
+
+        <ONOSrest2>
+            <host>OC2</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest2>
+
+        <ONOSrest3>
+            <host>OC3</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest3>
+
+        <ONOScli1>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli1>
+
+        <ONOScli2>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli2>
+
+         <ONOScli3>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli3>
+
+        <Mininet1>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>MininetCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+                <home>~/mininet/</home>
+            </COMPONENTS>
+        </Mininet1>
+
+        <Scapy1>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>ScapyCliDriver</type>
+            <connect_order>6</connect_order>
+        </Scapy1>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNC/FUNCintentRest/README b/TestON/tests/FUNC/FUNCintentRest/README
new file mode 100644
index 0000000..a7d5342
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintentRest/README
@@ -0,0 +1,39 @@
+Summary:
+        This test suite consist of basic intent functionality testing.
+        The following is an overview of how host intents is being tested.
+        Steps:
+            - Discover hosts
+            - Add host intents
+            - Check intents
+            - Verify flows
+            - Ping hosts
+            - Reroute
+                - Link down
+                - Verify flows
+                - Check topology
+                - Ping hosts
+                - Link up
+                - Verify flows
+                - Check topology
+                - Ping hosts
+            - Remove intents
+        This test suite includes testing of different types of intents such as
+        host, point, single-to-multi and multi-to-single ( More intent types to
+        add later ). The same steps above is being performed to other type of
+        intents.
+
+Required:
+        This test requires Mininet topology file newFuncIntent.py that is in the
+        dependencies folder. You should run the topology file to check for any
+        missing packages. The mininet topology file has different type of hosts
+        including VLAN hosts. Therefore you need to install VLAN module to build
+        the topology correctly.
+
+VLAN configuration:
+        Execute command:
+            $ sudo apt-get install vlan
+        Configuration:
+            $ sudo modprobe 8021q
+        NOTE:To make this configuration permanent
+            $ sudo su -c 'echo "8021q" >> /etc/modules'
+
diff --git a/TestON/tests/FUNC/FUNCintentRest/__init__.py b/TestON/tests/FUNC/FUNCintentRest/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintentRest/__init__.py
diff --git a/TestON/tests/FUNC/FUNCintentRest/dependencies/FuncIntentFunction.py b/TestON/tests/FUNC/FUNCintentRest/dependencies/FuncIntentFunction.py
new file mode 100644
index 0000000..900abd5
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintentRest/dependencies/FuncIntentFunction.py
@@ -0,0 +1,1720 @@
+"""
+    Wrapper functions for FuncIntent
+    This functions include Onosclidriver and Mininetclidriver driver functions
+    Author: kelvin@onlab.us
+"""
+import time
+import copy
+import json
+import types
+
+def __init__( self ):
+    self.default = ''
+
+def installHostIntent( main,
+                       name,
+                       host1,
+                       host2,
+                       onosNode=0,
+                       ethType="",
+                       bandwidth="",
+                       lambdaAlloc=False,
+                       ipProto="",
+                       ipAddresses="",
+                       tcp="",
+                       sw1="",
+                       sw2=""):
+    """
+    Installs a Host Intent
+
+    Description:
+        Install a host intent using
+        add-host-intent
+
+    Steps:
+        - Fetch host data if not given
+        - Add host intent
+            - Ingress device is the first sender host
+            - Egress devices are the recipient devices
+            - Ports if defined in senders or recipients
+            - MAC address ethSrc loaded from Ingress device
+        - Check intent state with retry
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        host1 - Dictionary for host1
+            { "name":"h8", "id":"of:0000000000000005/8" }
+        host2 - Dictionary for host2
+            { "name":"h16", "id":"of:0000000000000006/8" }
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        ethType - Ethernet type eg. IPV4, IPV6
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        tcp - TCP ports in the same order as the hosts in hostNames
+    """
+
+    assert main, "There is no main variable"
+    assert host1, "You must specify host1"
+    assert host2, "You must specify host2"
+
+    global itemName  # The name of this run. Used for logs.
+    itemName = name
+    onosNode = int( onosNode )
+
+    main.log.info( itemName + ": Adding single point to multi point intents" )
+
+    if not host1.get( "id" ):
+        main.log.warn( "ID not given for host1 {0}. Loading from main.hostData".format( host1.get( "name" ) ) )
+        main.log.debug( main.hostsData.get( host1.get( "name" ) ) )
+        host1[ "id" ] = main.hostsData.get( host1.get( "name" ) ).get( "id" )
+
+    if not host2.get( "id" ):
+        main.log.warn( "ID not given for host2 {0}. Loading from main.hostData".format( host2.get( "name" ) ) )
+        host2[ "id" ] = main.hostsData.get( host2.get( "name" ) ).get( "id" )
+
+    # Adding host intents
+    main.log.info( itemName + ": Adding host intents" )
+
+    intent1 = main.CLIs[ onosNode ].addHostIntent( hostIdOne=host1.get( "id" ),
+                                                   hostIdTwo=host2.get( "id" ) )
+
+    # Get all intents ID in the system, time delay right after intents are added
+    time.sleep( main.addIntentSleep )
+    intentsId = main.CLIs[ 0 ].getIntentsId()
+
+    if utilities.retry ( f=checkIntentState, retValue=main.FALSE,
+                         args = (main, intentsId ), sleep=main.checkIntentSleep ):
+        return intentsId
+    else:
+        main.log.error( "Host Intent did not install correctly" )
+        return main.FALSE
+
+def testHostIntent( main,
+                    name,
+                    intentId,
+                    host1,
+                    host2,
+                    onosNode=0,
+                    sw1="s5",
+                    sw2="s2",
+                    expectedLink=0):
+    """
+    Test a Host Intent
+
+    Description:
+        Test a host intent of given ID between given hosts
+
+    Steps:
+        - Fetch host data if not given
+        - Check Intent State
+        - Check Flow State
+        - Check Connectivity
+        - Check Lack of Connectivity Between Hosts not in the Intent
+        - Reroute
+            - Take Expected Link Down
+            - Check Intent State
+            - Check Flow State
+            - Check Topology
+            - Check Connectivity
+            - Bring Expected Link Up
+            - Check Intent State
+            - Check Flow State
+            - Check Topology
+            - Check Connectivity
+        - Remove Topology
+
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        intentId - intent ID to be tested ( and removed )
+        host1 - Dictionary for host1
+            { "name":"h8", "id":"of:0000000000000005/8" }
+        host2 - Dictionary for host2
+            { "name":"h16", "id":"of:0000000000000006/8" }
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+
+    """
+
+    # Parameter Validity Check
+    assert main, "There is no main variable"
+    assert host1, "You must specify host1"
+    assert host2, "You must specify host2"
+
+    global itemName
+    itemName = name
+    tempHostsData = {}
+    onosNode = int( onosNode )
+
+    main.log.info( itemName + ": Testing Host Intent" )
+
+    if not host1.get( "id" ):
+        main.log.warn( "Id not given for host1 {0}. Loading from main.hostData".format( host1.get( "name" ) ) )
+        host1[ "id" ] = main.hostsData.get( host1.get( "name" ) ).get( "location" )
+
+    if not host2.get( "id" ):
+        main.log.warn( "Id not given for host2 {0}. Loading from main.hostData".format( host2.get( "name" ) ) )
+        host2[ "id" ] = main.hostsData.get( host2.get( "name" ) ).get( "location" )
+
+    senderNames = [ host1.get( "name" ), host2.get( "name" ) ]
+    recipientNames = [ host1.get( "name" ), host2.get( "name" ) ]
+
+    testResult = main.TRUE
+    main.log.info( itemName + ": Adding single point to multi point intents" )
+
+    # Check intent state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, intentId ), sleep=main.checkIntentSleep ):
+        main.assertReturnString += 'Initial Intent State Passed\n'
+    else:
+        main.assertReturnString += 'Initial Intent State Failed\n'
+        testResult = main.FALSE
+
+    # Check flows count in each node
+    if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+        main.assertReturnString += 'Initial Flow State Passed\n'
+    else:
+        main.assertReturnString += 'Intial Flow State Failed\n'
+        testResult = main.FALSE
+
+    # Check Connectivity
+    if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+        main.assertReturnString += 'Initial Ping Passed\n'
+    else:
+        main.assertReturnString += 'Initial Ping Failed\n'
+        testResult = main.FALSE
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # Take link down
+        if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw1, sw2, "down" ) ):
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+            testResult = main.FALSE
+
+        # Check intent state
+        if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, intentId ), sleep=main.checkIntentSleep ):
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+            testResult = main.FALSE
+
+        # Check flows count in each node
+        if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+            main.assertReturnString += 'Link Down Flow State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Flow State Failed\n'
+            testResult = main.FALSE
+
+        # Check OnosTopology
+        if utilities.retry( f=checkTopology, retValue=main.FALSE, args=( main, expectedLink ), sleep=10 ):
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+            testResult = main.FALSE
+
+        # Check Connection
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+            main.assertReturnString += 'Link Down Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Pingall Failed\n'
+            testResult = main.FALSE
+
+        # Bring link up
+        if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw1, sw2, "up" ) ):
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+            testResult = main.FALSE
+
+        # Wait for reroute
+        time.sleep( main.rerouteSleep )
+
+        # Check Intents
+        if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, intentId ), sleep=main.checkIntentSleep ):
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+            testResult = main.FALSE
+
+        # Check flows count in each node
+        if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+            main.assertReturnString += 'Link Up Flow State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Flow State Failed\n'
+            testResult = main.FALSE
+
+        # Check OnosTopology
+        if utilities.retry( f=checkTopology, retValue=main.FALSE, args=( main, main.numLinks ) ):
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+            testResult = main.FALSE
+
+        # Check Connection
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+            main.assertReturnString += 'Link Up Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Pingall Failed\n'
+            testResult = main.FALSE
+
+    # Remove all intents
+    if utilities.retry( f=removeAllIntents, retValue=main.FALSE, args=( main, ) ):
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+        testResult = main.FALSE
+
+    return testResult
+
+def installPointIntent( main,
+                        name,
+                        senders,
+                        recipients,
+                        onosNode=0,
+                        ethType="",
+                        bandwidth="",
+                        lambdaAlloc=False,
+                        ipProto="",
+                        ipSrc="",
+                        ipDst="",
+                        tcpSrc="",
+                        tcpDst=""):
+    """
+    Installs a Single to Single Point Intent
+
+    Description:
+        Install a single to single point intent
+
+    Steps:
+        - Fetch host data if not given
+        - Add point intent
+            - Ingress device is the first sender device
+            - Egress device is the first recipient device
+            - Ports if defined in senders or recipients
+            - MAC address ethSrc loaded from Ingress device
+        - Check intent state with retry
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        senders - List of host dictionaries i.e.
+            [ { "name":"h8", "device":"of:0000000000000005/8","mac":"00:00:00:00:00:08" } ]
+        recipients - List of host dictionaries i.e.
+            [ { "name":"h16", "device":"of:0000000000000006/8", "mac":"00:00:00:00:00:10" } ]
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        ethType - Ethernet type eg. IPV4, IPV6
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        tcp - TCP ports in the same order as the hosts in hostNames
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert senders, "You must specify a sender"
+    assert recipients, "You must specify a recipient"
+    # Assert devices or main.hostsData, "You must specify devices"
+
+    global itemName  # The name of this run. Used for logs.
+    itemName = name
+    onosNode = int( onosNode )
+
+    main.log.info( itemName + ": Adding single to single point intents" )
+
+    for sender in senders:
+        if not sender.get( "device" ):
+            main.log.warn( "Device not given for sender {0}. Loading from main.hostData".format( sender.get( "name" ) ) )
+            sender[ "device" ] = main.hostsData.get( sender.get( "name" ) ).get( "location" )
+
+    for recipient in recipients:
+        if not recipient.get( "device" ):
+            main.log.warn( "Device not given for recipient {0}. Loading from main.hostData".format( recipient.get( "name" ) ) )
+            recipient[ "device" ] = main.hostsData.get( recipient.get( "name" ) ).get( "location" )
+
+
+    ingressDevice = senders[ 0 ].get( "device" )
+    egressDevice = recipients[ 0 ].get( "device" )
+
+    portIngress = senders[ 0 ].get( "port", "" )
+    portEgress = recipients[ 0 ].get( "port", "" )
+    main.log.debug( ingressDevice )
+    main.log.debug( egressDevice )
+
+    srcMac = senders[ 0 ].get( "mac" )
+    dstMac = recipients[ 0 ].get( "mac" )
+
+    ipSrc = senders[ 0 ].get( "ip" )
+    ipDst = recipients[ 0 ].get( "ip" )
+
+    intent1 = main.CLIs[ onosNode ].addPointIntent(
+                                        ingressDevice=ingressDevice,
+                                        egressDevice=egressDevice,
+                                        ingressPort=portIngress,
+                                        egressPort=portEgress,
+                                        ethType=ethType,
+                                        ethSrc=srcMac,
+                                        ethDst=dstMac,
+                                        bandwidth=bandwidth,
+                                        lambdaAlloc=lambdaAlloc,
+                                        ipProto=ipProto,
+                                        ipSrc=ipSrc,
+                                        ipDst=ipDst,
+                                        tcpSrc=tcpSrc,
+                                        tcpDst=tcpDst )
+
+    time.sleep( main.addIntentSleep )
+    intentsId = main.CLIs[ 0 ].getIntentsId()
+
+    if utilities.retry ( f=checkIntentState, retValue=main.FALSE,
+                         args = (main, intentsId ), sleep=main.checkIntentSleep ):
+        return intentsId
+    else:
+        main.log.error( "Single to Single point intent did not install correctly" )
+        return main.FALSE
+
+    # Check intents state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, intentsId ), sleep=main.checkIntentSleep ):
+        return intentsId
+    else:
+        main.log.error( "Point Intent did not install correctly" )
+        return main.FALSE
+
+def testPointIntent( main,
+                     name,
+                     intentId,
+                     senders,
+                     recipients,
+                     badSenders={},
+                     badRecipients={},
+                     onosNode=0,
+                     ethType="",
+                     bandwidth="",
+                     lambdaAlloc=False,
+                     ipProto="",
+                     ipAddresses="",
+                     tcp="",
+                     sw1="s5",
+                     sw2="s2",
+                     expectedLink=0):
+    """
+    Test a Point Intent
+
+    Description:
+        Test a point intent
+
+    Steps:
+        - Fetch host data if not given
+        - Check Intent State
+        - Check Flow State
+        - Check Connectivity
+        - Check Lack of Connectivity Between Hosts not in the Intent
+        - Reroute
+            - Take Expected Link Down
+            - Check Intent State
+            - Check Flow State
+            - Check Topology
+            - Check Connectivity
+            - Bring Expected Link Up
+            - Check Intent State
+            - Check Flow State
+            - Check Topology
+            - Check Connectivity
+        - Remove Topology
+
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+
+        senders - List of host dictionaries i.e.
+            { "name":"h8", "device":"of:0000000000000005/8","mac":"00:00:00:00:00:08" }
+        recipients - List of host dictionaries i.e.
+            { "name":"h16", "device":"of:0000000000000006/8", "mac":"00:00:00:00:00:10" }
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        ethType - Ethernet type eg. IPV4, IPV6
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        tcp - TCP ports in the same order as the hosts in hostNames
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+
+    """
+
+    # Parameter Validity Check
+    assert main, "There is no main variable"
+    assert senders, "You must specify a sender"
+    assert recipients, "You must specify a recipient"
+
+    global itemName
+    itemName = name
+    tempHostsData = {}
+    onosNode = int( onosNode )
+
+    main.log.info( itemName + ": Testing Point Intent" )
+
+    # Names for scapy
+    senderNames = [ x.get( "name" ) for x in senders ]
+    recipientNames = [ x.get( "name" ) for x in recipients ]
+    badSenderNames = [ x.get( "name" ) for x in badSenders ]
+    badRecipientNames = [ x.get( "name" ) for x in badRecipients ]
+
+    for sender in senders:
+        if not sender.get( "device" ):
+            main.log.warn( "Device not given for sender {0}. Loading from main.hostData".format( sender.get( "name" ) ) )
+            sender[ "device" ] = main.hostsData.get( sender.get( "name" ) ).get( "location" )
+
+    for recipient in recipients:
+        if not recipient.get( "device" ):
+            main.log.warn( "Device not given for recipient {0}. Loading from main.hostData".format( recipient.get( "name" ) ) )
+            recipient[ "device" ] = main.hostsData.get( recipient.get( "name" ) ).get( "location" )
+
+    testResult = main.TRUE
+    main.log.info( itemName + ": Testing point intents" )
+
+    # Check intent state
+    if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, intentId ), sleep=main.checkIntentSleep ):
+        main.assertReturnString += 'Initial Intent State Passed\n'
+    else:
+        main.assertReturnString += 'Initial Intent State Failed\n'
+        testResult = main.FALSE
+
+    # Check flows count in each node
+    if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+        main.assertReturnString += 'Initial Flow State Passed\n'
+    else:
+        main.assertReturnString += 'Intial Flow State Failed\n'
+        testResult = main.FALSE
+
+    # Check Connectivity
+    if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+        main.assertReturnString += 'Initial Ping Passed\n'
+    else:
+        main.assertReturnString += 'Initial Ping Failed\n'
+        testResult = main.FALSE
+
+    # Check connections that shouldn't work
+    if badSenderNames:
+        main.log.info( "Checking that packets from incorrect sender do not go through" )
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, badSenderNames, recipientNames ), kwargs={ "expectFailure":True } ):
+            main.assertReturnString += 'Bad Sender Ping Passed\n'
+        else:
+            main.assertReturnString += 'Bad Sender Ping Failed\n'
+            testResult = main.FALSE
+
+    if badRecipientNames:
+        main.log.info( "Checking that packets to incorrect recipients do not go through" )
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, badRecipientNames ), kwargs={ "expectFailure":True } ):
+            main.assertReturnString += 'Bad Recipient Ping Passed\n'
+        else:
+            main.assertReturnString += 'Bad Recipient Ping Failed\n'
+            testResult = main.FALSE
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # Take link down
+        if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw1, sw2, "down" ) ):
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+            testResult = main.FALSE
+
+        # Check intent state
+        if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, intentId ), sleep=main.checkIntentSleep ):
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+            testResult = main.FALSE
+
+        # Check flows count in each node
+        if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+            main.assertReturnString += 'Link Down Flow State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Flow State Failed\n'
+            testResult = main.FALSE
+
+        # Check OnosTopology
+        if utilities.retry( f=checkTopology, retValue=main.FALSE, args=( main, expectedLink ), sleep=10 ):
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+            testResult = main.FALSE
+
+        # Check Connection
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+            main.assertReturnString += 'Link Down Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Pingall Failed\n'
+            testResult = main.FALSE
+
+        # Bring link up
+        if utilities.retry( f=link, retValue=main.FALSE, args=( main, sw1, sw2, "up" ) ):
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+            testResult = main.FALSE
+
+        # Wait for reroute
+        time.sleep( main.rerouteSleep )
+
+        # Check Intents
+        if utilities.retry( f=checkIntentState, retValue=main.FALSE, args=( main, intentId ), sleep=main.checkIntentSleep ):
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+            testResult = main.FALSE
+
+        # Check flows count in each node
+        if utilities.retry( f=checkFlowsCount, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ) and utilities.retry( f=checkFlowsState, retValue=main.FALSE, args=[ main ], sleep=20, attempts=3 ):
+            main.assertReturnString += 'Link Up Flow State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Flow State Failed\n'
+            testResult = main.FALSE
+
+        # Check OnosTopology
+        if utilities.retry( f=checkTopology, retValue=main.FALSE, args=( main, main.numLinks ) ):
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+            testResult = main.FALSE
+
+        # Check Connection
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames ) ):
+            main.assertReturnString += 'Link Up Scapy Packet Received Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Scapy Packet Recieved Failed\n'
+            testResult = main.FALSE
+
+    # Remove all intents
+    if utilities.retry( f=removeAllIntents, retValue=main.FALSE, args=( main, ) ):
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+        testResult = main.FALSE
+
+    return testResult
+
+def pointIntentTcp( main,
+                    name,
+                    host1,
+                    host2,
+                    onosNode=0,
+                    deviceId1="",
+                    deviceId2="",
+                    port1="",
+                    port2="",
+                    ethType="",
+                    mac1="",
+                    mac2="",
+                    bandwidth="",
+                    lambdaAlloc=False,
+                    ipProto="",
+                    ip1="",
+                    ip2="",
+                    tcp1="",
+                    tcp2="",
+                    sw1="",
+                    sw2="",
+                    expectedLink=0 ):
+
+    """
+    Description:
+        Verify add-point-intent only for TCP
+    Steps:
+        - Get device ids | ports
+        - Add point intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        host1 - Name of first host
+        host2 - Name of second host
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        deviceId1 - ONOS device id of the first switch, the same as the
+                    location of the first host eg. of:0000000000000001/1,
+                    located at device 1 port 1
+        deviceId2 - ONOS device id of the second switch
+        port1 - The port number where the first host is attached
+        port2 - The port number where the second host is attached
+        ethType - Ethernet type eg. IPV4, IPV6
+        mac1 - Mac address of first host
+        mac2 - Mac address of the second host
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        ip1 - IP address of first host
+        ip2 - IP address of second host
+        tcp1 - TCP port of first host
+        tcp2 - TCP port of second host
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert name, "variable name is empty"
+    assert host1 and host2, "You must specify hosts"
+
+    global itemName
+    itemName = name
+    host1 = host1
+    host2 = host2
+    hostNames = [ host1, host2 ]
+    intentsId = []
+
+    iperfResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+    onosNode = int( onosNode )
+
+    # Adding bidirectional point  intents
+    main.log.info( itemName + ": Adding point intents" )
+    intent1 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+                                                    egressDevice=deviceId2,
+                                                    ingressPort=port1,
+                                                    egressPort=port2,
+                                                    ethType=ethType,
+                                                    ethSrc=mac1,
+                                                    ethDst=mac2,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip1,
+                                                    ipDst=ip2,
+                                                    tcpSrc=tcp1,
+                                                    tcpDst="" )
+
+    intent2 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+                                                    egressDevice=deviceId1,
+                                                    ingressPort=port2,
+                                                    egressPort=port1,
+                                                    ethType=ethType,
+                                                    ethSrc=mac2,
+                                                    ethDst=mac1,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip2,
+                                                    ipDst=ip1,
+                                                    tcpSrc=tcp2,
+                                                    tcpDst="" )
+
+    intent3 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+                                                    egressDevice=deviceId2,
+                                                    ingressPort=port1,
+                                                    egressPort=port2,
+                                                    ethType=ethType,
+                                                    ethSrc=mac1,
+                                                    ethDst=mac2,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip1,
+                                                    ipDst=ip2,
+                                                    tcpSrc="",
+                                                    tcpDst=tcp2 )
+
+    intent4 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+                                                    egressDevice=deviceId1,
+                                                    ingressPort=port2,
+                                                    egressPort=port1,
+                                                    ethType=ethType,
+                                                    ethSrc=mac2,
+                                                    ethDst=mac1,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip2,
+                                                    ipDst=ip1,
+                                                    tcpSrc="",
+                                                    tcpDst=tcp1 )
+
+    # Get all intents ID in the system, time delay right after intents are added
+    time.sleep( main.addIntentSleep )
+    intentsId = main.CLIs[ 0 ].getIntentsId()
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Verify flows
+    checkFlowsState( main )
+
+    # Run iperf to both host
+    iperfResult = iperfResult and main.Mininet1.iperftcp( host1,
+                                                          host2, 10 )
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+        intentResult = intentResult and checkIntentState( main, intentsId )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+
+        # Run iperf to both host
+        iperfResult = iperfResult and main.Mininet1.iperftcp( host1,
+                                                              host2, 10 )
+
+        intentResult = checkIntentState( main, intentsId )
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and iperfResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+
+        # Run iperf to both host
+        iperfResult = iperfResult and main.Mininet1.iperftcp( host1,
+                                                              host2, 10 )
+
+        intentResult = checkIntentState( main, intentsId )
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and iperfResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main )
+
+    stepResult = iperfResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def singleToMultiIntent( main,
+                         name,
+                         hostNames,
+                         onosNode=0,
+                         devices="",
+                         ports=None,
+                         ethType="",
+                         macs=None,
+                         bandwidth="",
+                         lambdaAlloc=False,
+                         ipProto="",
+                         ipAddresses="",
+                         tcp="",
+                         sw1="",
+                         sw2="",
+                         expectedLink=0 ):
+    """
+        Verify Single to Multi Point intents
+        NOTE:If main.hostsData is not defined, variables data should be passed
+        in the same order index wise. All devices in the list should have the
+        same format, either all the devices have its port or it doesn't.
+        eg. hostName = [ 'h1', 'h2' ,..  ]
+            devices = [ 'of:0000000000000001', 'of:0000000000000002', ...]
+            ports = [ '1', '1', ..]
+            ...
+        Description:
+            Verify add-single-to-multi-intent iterates through the list of given
+            host | devices and add intents
+        Steps:
+            - Get device ids | ports
+            - Add single to multi point intents
+            - Check intents
+            - Verify flows
+            - Ping hosts
+            - Reroute
+                - Link down
+                - Verify flows
+                - Check topology
+                - Ping hosts
+                - Link up
+                - Verify flows
+                - Check topology
+                - Ping hosts
+            - Remove intents
+        Required:
+            name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+            hostNames - List of host names
+        Optional:
+            onosNode - ONOS node to install the intents in main.CLIs[ ]
+                       0 by default so that it will always use the first
+                       ONOS node
+            devices - List of device ids in the same order as the hosts
+                      in hostNames
+            ports - List of port numbers in the same order as the device in
+                    devices
+            ethType - Ethernet type eg. IPV4, IPV6
+            macs - List of hosts mac address in the same order as the hosts in
+                   hostNames
+            bandwidth - Bandwidth capacity
+            lambdaAlloc - Allocate lambda, defaults to False
+            ipProto - IP protocol
+            ipAddresses - IP addresses of host in the same order as the hosts in
+                          hostNames
+            tcp - TCP ports in the same order as the hosts in hostNames
+            sw1 - First switch to bring down & up for rerouting purpose
+            sw2 - Second switch to bring down & up for rerouting purpose
+            expectedLink - Expected link when the switches are down, it should
+                           be two links lower than the links before the two
+                           switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert hostNames, "You must specify hosts"
+    assert devices or main.hostsData, "You must specify devices"
+
+    global itemName
+    itemName = name
+    tempHostsData = {}
+    intentsId = []
+    onosNode = int( onosNode )
+
+    macsDict = {}
+    ipDict = {}
+    if hostNames and devices:
+        if len( hostNames ) != len( devices ):
+            main.log.debug( "hosts and devices does not have the same length" )
+            #print "len hostNames = ", len( hostNames )
+            #print "len devices = ", len( devices )
+            return main.FALSE
+        if ports:
+            if len( ports ) != len( devices ):
+                main.log.error( "Ports and devices does " +
+                                "not have the same length" )
+                #print "len devices = ", len( devices )
+                #print "len ports = ", len( ports )
+                return main.FALSE
+        else:
+            main.log.info( "Device Ports are not specified" )
+        if macs:
+            for i in range( len( devices ) ):
+                macsDict[ devices[ i ] ] = macs[ i ]
+
+    elif hostNames and not devices and main.hostsData:
+        devices = []
+        main.log.info( "singleToMultiIntent function is using main.hostsData" )
+        for host in hostNames:
+               devices.append( main.hostsData.get( host ).get( 'location' ) )
+               macsDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'mac' )
+               ipDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'ipAddresses' )
+        #print main.hostsData
+
+    #print 'host names = ', hostNames
+    #print 'devices = ', devices
+    #print "macsDict = ", macsDict
+
+    pingResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+
+    devicesCopy = copy.copy( devices )
+    if ports:
+        portsCopy = copy.copy( ports )
+    main.log.info( itemName + ": Adding single point to multi point intents" )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Adding bidirectional point  intents
+    for i in range( len( devices ) ):
+        ingressDevice = devicesCopy[ i ]
+        egressDeviceList = copy.copy( devicesCopy )
+        egressDeviceList.remove( ingressDevice )
+        if ports:
+            portIngress = portsCopy[ i ]
+            portEgressList = copy.copy( portsCopy )
+            del portEgressList[ i ]
+        else:
+            portIngress = ""
+            portEgressList = None
+        if not macsDict:
+            srcMac = ""
+        else:
+            srcMac = macsDict[ ingressDevice ]
+            if srcMac == None:
+                main.log.debug( "There is no MAC in device - " + ingressDevice )
+                srcMac = ""
+
+        intentsId.append(
+                        main.CLIs[ onosNode ].addSinglepointToMultipointIntent(
+                                            ingressDevice=ingressDevice,
+                                            egressDeviceList=egressDeviceList,
+                                            portIngress=portIngress,
+                                            portEgressList=portEgressList,
+                                            ethType=ethType,
+                                            ethSrc=srcMac,
+                                            bandwidth=bandwidth,
+                                            lambdaAlloc=lambdaAlloc,
+                                            ipProto=ipProto,
+                                            ipSrc="",
+                                            ipDst="",
+                                            tcpSrc="",
+                                            tcpDst="" ) )
+
+    # Wait some time for the flow to go through when using multi instance
+    pingResult = pingallHosts( main, hostNames )
+
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+    # Verify flows
+    checkFlowsState( main )
+
+    pingResult = pingResult and pingallHosts( main, hostNames )
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+        intentResult = intentResult and checkIntentState( main, intentsId )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+
+        # Ping hosts
+        pingResult = pingResult and pingallHosts( main, hostNames )
+
+        intentResult = checkIntentState( main, intentsId )
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+
+        # Ping hosts
+        pingResult = pingResult and pingallHosts( main, hostNames )
+
+        intentResult = checkIntentState( main, intentsId )
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+
+    stepResult = pingResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def multiToSingleIntent( main,
+                         name,
+                         hostNames,
+                         onosNode=0,
+                         devices="",
+                         ports=None,
+                         ethType="",
+                         macs=None,
+                         bandwidth="",
+                         lambdaAlloc=False,
+                         ipProto="",
+                         ipAddresses="",
+                         tcp="",
+                         sw1="",
+                         sw2="",
+                         expectedLink=0 ):
+    """
+        Verify Single to Multi Point intents
+        NOTE:If main.hostsData is not defined, variables data should be passed in the
+        same order index wise. All devices in the list should have the same
+        format, either all the devices have its port or it doesn't.
+        eg. hostName = [ 'h1', 'h2' ,..  ]
+            devices = [ 'of:0000000000000001', 'of:0000000000000002', ...]
+            ports = [ '1', '1', ..]
+            ...
+        Description:
+            Verify add-multi-to-single-intent
+        Steps:
+            - Get device ids | ports
+            - Add multi to single point intents
+            - Check intents
+            - Verify flows
+            - Ping hosts
+            - Reroute
+                - Link down
+                - Verify flows
+                - Check topology
+                - Ping hosts
+                - Link up
+                - Verify flows
+                - Check topology
+                - Ping hosts
+            - Remove intents
+        Required:
+            name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+            hostNames - List of host names
+        Optional:
+            onosNode - ONOS node to install the intents in main.CLIs[ ]
+                       0 by default so that it will always use the first
+                       ONOS node
+            devices - List of device ids in the same order as the hosts
+                      in hostNames
+            ports - List of port numbers in the same order as the device in
+                    devices
+            ethType - Ethernet type eg. IPV4, IPV6
+            macs - List of hosts mac address in the same order as the hosts in
+                   hostNames
+            bandwidth - Bandwidth capacity
+            lambdaAlloc - Allocate lambda, defaults to False
+            ipProto - IP protocol
+            ipAddresses - IP addresses of host in the same order as the hosts in
+                          hostNames
+            tcp - TCP ports in the same order as the hosts in hostNames
+            sw1 - First switch to bring down & up for rerouting purpose
+            sw2 - Second switch to bring down & up for rerouting purpose
+            expectedLink - Expected link when the switches are down, it should
+                           be two links lower than the links before the two
+                           switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert hostNames, "You must specify hosts"
+    assert devices or main.hostsData, "You must specify devices"
+
+    global itemName
+    itemName = name
+    tempHostsData = {}
+    intentsId = []
+    onosNode = int( onosNode )
+
+    macsDict = {}
+    ipDict = {}
+    if hostNames and devices:
+        if len( hostNames ) != len( devices ):
+            main.log.debug( "hosts and devices does not have the same length" )
+            #print "len hostNames = ", len( hostNames )
+            #print "len devices = ", len( devices )
+            return main.FALSE
+        if ports:
+            if len( ports ) != len( devices ):
+                main.log.error( "Ports and devices does " +
+                                "not have the same length" )
+                #print "len devices = ", len( devices )
+                #print "len ports = ", len( ports )
+                return main.FALSE
+        else:
+            main.log.info( "Device Ports are not specified" )
+        if macs:
+            for i in range( len( devices ) ):
+                macsDict[ devices[ i ] ] = macs[ i ]
+    elif hostNames and not devices and main.hostsData:
+        devices = []
+        main.log.info( "multiToSingleIntent function is using main.hostsData" )
+        for host in hostNames:
+               devices.append( main.hostsData.get( host ).get( 'location' ) )
+               macsDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'mac' )
+               ipDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'ipAddresses' )
+        #print main.hostsData
+
+    #print 'host names = ', hostNames
+    #print 'devices = ', devices
+    #print "macsDict = ", macsDict
+
+    pingResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+
+    devicesCopy = copy.copy( devices )
+    if ports:
+        portsCopy = copy.copy( ports )
+    main.log.info( itemName + ": Adding multi point to single point intents" )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Adding bidirectional point  intents
+    for i in range( len( devices ) ):
+        egressDevice = devicesCopy[ i ]
+        ingressDeviceList = copy.copy( devicesCopy )
+        ingressDeviceList.remove( egressDevice )
+        if ports:
+            portEgress = portsCopy[ i ]
+            portIngressList = copy.copy( portsCopy )
+            del portIngressList[ i ]
+        else:
+            portEgress = ""
+            portIngressList = None
+        if not macsDict:
+            dstMac = ""
+        else:
+            dstMac = macsDict[ egressDevice ]
+            if dstMac == None:
+                main.log.debug( "There is no MAC in device - " + egressDevice )
+                dstMac = ""
+
+        intentsId.append(
+                        main.CLIs[ onosNode ].addMultipointToSinglepointIntent(
+                                            ingressDeviceList=ingressDeviceList,
+                                            egressDevice=egressDevice,
+                                            portIngressList=portIngressList,
+                                            portEgress=portEgress,
+                                            ethType=ethType,
+                                            ethDst=dstMac,
+                                            bandwidth=bandwidth,
+                                            lambdaAlloc=lambdaAlloc,
+                                            ipProto=ipProto,
+                                            ipSrc="",
+                                            ipDst="",
+                                            tcpSrc="",
+                                            tcpDst="" ) )
+
+    pingResult = pingallHosts( main, hostNames )
+
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+    # Verify flows
+    checkFlowsState( main )
+
+    # Ping hosts
+    pingResult = pingResult and pingallHosts( main, hostNames )
+    # Ping hosts again...
+    pingResult = pingResult and pingallHosts( main, hostNames )
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+        intentResult = intentResult and checkIntentState( main, intentsId )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+
+        # Ping hosts
+        pingResult = pingResult and pingallHosts( main, hostNames )
+
+        intentResult = checkIntentState( main, intentsId )
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+
+        # Ping hosts
+        pingResult = pingResult and pingallHosts( main, hostNames )
+
+        intentResult = checkIntentState( main, intentsId )
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+
+    stepResult = pingResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def pingallHosts( main, hostList ):
+    # Ping all host in the hosts list variable
+    print "Pinging : ", hostList
+    pingResult = main.TRUE
+    pingResult = main.Mininet1.pingallHosts( hostList )
+    return pingResult
+
+def getHostsData( main, hostList ):
+    """
+        Use fwd app and pingall to discover all the hosts
+    """
+
+    activateResult = main.TRUE
+    appCheck = main.TRUE
+    getDataResult = main.TRUE
+    main.log.info( "Activating reactive forwarding app " )
+    activateResult = main.CLIs[ 0 ].activateApp( "org.onosproject.fwd" )
+    if not activateResult:
+        main.log.error( "Something went wrong installing fwd app" )
+    time.sleep( main.fwdSleep )
+    if isinstance( hostList[ 0 ], types.StringType ):
+        main.Mininet1.pingallHosts( hostList )
+    elif isinstance( hostList[ 0 ], types.ListType ):
+        for i in xrange( len( hostList ) ):
+            main.Mininet1.pingallHosts( hostList[ i ] )
+
+    hostsJson = json.loads( main.CLIs[ 0 ].hosts() )
+    hosts = main.Mininet1.getHosts().keys()
+    # TODO: Make better use of new getHosts function
+    for host in hosts:
+        main.hostsData[ host ] = {}
+        main.hostsData[ host ][ 'mac' ] =  \
+            main.Mininet1.getMacAddress( host ).upper()
+        for hostj in hostsJson:
+            if main.hostsData[ host ][ 'mac' ] == hostj[ 'mac' ]:
+                main.hostsData[ host ][ 'id' ] = hostj[ 'id' ]
+                main.hostsData[ host ][ 'vlan' ] = hostj[ 'vlan' ]
+                main.hostsData[ host ][ 'location' ] = \
+                            hostj[ 'location' ][ 'elementId' ] + '/' + \
+                            hostj[ 'location' ][ 'port' ]
+                main.hostsData[ host ][ 'ipAddresses' ] = hostj[ 'ipAddresses' ]
+
+    main.log.info( "Deactivating reactive forwarding app " )
+    deactivateResult = main.CLIs[ 0 ].deactivateApp( "org.onosproject.fwd" )
+    if activateResult and deactivateResult and main.hostsData:
+        main.log.info( "Successfully used fwd app to discover hosts " )
+        getDataResult = main.TRUE
+    else:
+        main.log.info( "Failed to use fwd app to discover hosts " )
+        getDataResult = main.FALSE
+
+    print main.hostsData
+
+    return getDataResult
+
+def checkTopology( main, expectedLink ):
+    statusResult = main.TRUE
+    # Check onos topology
+    main.log.info( itemName + ": Checking ONOS topology " )
+
+    for i in range( main.numCtrls ):
+        topologyResult = main.CLIs[ i ].topology()
+        statusResult = main.ONOSbench.checkStatus( topologyResult,
+                                                   main.numSwitch,
+                                                   expectedLink )\
+                       and statusResult
+    if not statusResult:
+        main.log.error( itemName + ": Topology mismatch" )
+    else:
+        main.log.info( itemName + ": Topology match" )
+    return statusResult
+
+def checkIntentState( main, intentsId ):
+    """
+        This function will check intent state to make sure all the intents
+        are in INSTALLED state
+    """
+
+    intentResult = main.TRUE
+    results = []
+
+    main.log.info( itemName + ": Checking intents state" )
+    # First check of intents
+    for i in range( main.numCtrls ):
+        tempResult = main.CLIs[ i ].checkIntentState( intentsId=intentsId )
+        results.append( tempResult )
+
+    expectedState = [ 'INSTALLED', 'INSTALLING' ]
+
+    if all( result == main.TRUE for result in results ):
+        main.log.info( itemName + ": Intents are installed correctly" )
+    else:
+        # Wait for at least 5 second before checking the intents again
+        main.log.error( "Intents are not installed correctly. Waiting 5 sec" )
+        time.sleep( 5 )
+        results = []
+        # Second check of intents since some of the intents may be in
+        # INSTALLING state, they should be in INSTALLED at this time
+        for i in range( main.numCtrls ):
+            tempResult = main.CLIs[ i ].checkIntentState( intentsId=intentsId )
+            results.append( tempResult )
+        if all( result == main.TRUE for result in results ):
+            main.log.info( itemName + ": Intents are installed correctly" )
+            intentResult = main.TRUE
+        else:
+            main.log.error( itemName + ": Intents are NOT installed correctly" )
+            intentResult = main.FALSE
+
+    return intentResult
+
+def checkFlowsState( main ):
+
+    main.log.info( itemName + ": Check flows state" )
+    checkFlowsResult = main.CLIs[ 0 ].checkFlowsState()
+    return checkFlowsResult
+
+def link( main, sw1, sw2, option):
+
+    # link down
+    main.log.info( itemName + ": Bring link " + option + "between " +
+                       sw1 + " and " + sw2 )
+    linkResult = main.Mininet1.link( end1=sw1, end2=sw2, option=option )
+    return linkResult
+
+def removeAllIntents( main ):
+    """
+        Remove all intents in the intentsId
+    """
+
+    onosSummary = []
+    removeIntentResult = main.TRUE
+    # Remove intents
+    removeIntentResult = main.CLIs[ 0 ].removeAllIntents( )
+
+    if removeIntentResult:
+        main.log.info( itemName + ": There are no more intents remaining, " +
+                       "successfully removed all the intents." )
+
+    return removeIntentResult
+
+def checkFlowsCount( main ):
+    """
+        Check flows count in each node
+    """
+
+    flowsCount = []
+    main.log.info( itemName + ": Checking flows count in each ONOS node" )
+    for i in range( main.numCtrls ):
+        flowsCount.append( len( json.loads( main.CLIs[ i ].flows() ) ) )
+
+    if flowsCount:
+        if all( flows==flowsCount[ 0 ] for flows in flowsCount ):
+            main.log.info( itemName + ": There are " + str( flowsCount[ 0 ] ) +
+                           " flows in all ONOS node" )
+        else:
+            for i in range( main.numCtrls ):
+                main.log.debug( itemName + ": ONOS node " + str( i + 1 ) +
+                                " has " + str( flowsCount[ i ] ) + " flows" )
+    else:
+        main.log.error( "Checking flows count failed, check summary command" )
+        return main.FALSE
+
+    return main.TRUE
+
+def sendDiscoveryArp( main, hosts=None ):
+    """
+        Sends Discovery ARP packets from each host provided
+        Defaults to each host in main.scapyHosts
+    """
+    # Send an arp ping from each host
+    if not hosts:
+        hosts = main.scapyHosts
+    for host in hosts:
+        pkt = 'Ether( src="{0}")/ARP( psrc="{1}")'.format( host.hostMac ,host.hostIp )
+        # Send from the VLAN interface if there is one so ONOS discovers the VLAN correctly
+        iface = None
+        for interface in host.getIfList():
+            if '.' in interface:
+                main.log.debug( "Detected VLAN interface {0}. Sending ARP packet from {0}".format( interface ) )
+                iface = interface
+                break
+        host.sendPacket( packet=pkt, iface=iface )
+        main.log.info( "Sending ARP packet from {0}".format( host.name ) )
+
+def confirmHostDiscovery( main ):
+    """
+        Confirms that all ONOS nodes have discovered all scapy hosts
+    """
+    import collections
+    scapyHostCount = len( main.scapyHosts )
+    hosts = main.topo.getAllHosts( main )  # Get host data from each ONOS node
+    hostFails = []  # Reset for each failed attempt
+
+    #  Check for matching hosts on each node
+    scapyHostIPs = [ x.hostIp for x in main.scapyHosts if x.hostIp != "0.0.0.0" ]
+    for controller in range( main.numCtrls ):
+        controllerStr = str( controller + 1 )  # ONOS node number
+        # Compare Hosts
+        # Load hosts data for controller node
+        if hosts[ controller ] and "Error" not in hosts[ controller ]:
+            try:
+                hostData = json.loads( hosts[ controller ] )
+            except ( TypeError, ValueError ):
+                main.log.error( "Could not load json:" + str( hosts[ controller ] ) )
+                hostFails.append( controllerStr )
+            else:
+                onosHostIPs = [ x.get( "ipAddresses" )[ 0 ]
+                                for x in hostData
+                                if len( x.get( "ipAddresses" ) ) > 0 ]
+                if not set( collections.Counter( scapyHostIPs ) ).issubset( set ( collections.Counter( onosHostIPs ) ) ):
+                    main.log.warn( "Controller {0} only sees nodes with {1} IPs. It should see all of the following: {2}".format( controllerStr, onosHostIPs, scapyHostIPs ) )
+                    hostFails.append( controllerStr )
+        else:
+            main.log.error( "Hosts returned nothing or an error." )
+            hostFails.append( controllerStr )
+
+    if hostFails:
+        main.log.error( "List of failed ONOS Nodes:" + ', '.join(map(str, hostFails )) )
+        return main.FALSE
+    else:
+        return main.TRUE
+
+def populateHostData( main ):
+    """
+        Populates hostsData
+    """
+    import json
+    try:
+        hostsJson = json.loads( main.CLIs[ 0 ].hosts() )
+        hosts = main.Mininet1.getHosts().keys()
+        # TODO: Make better use of new getHosts function
+        for host in hosts:
+            main.hostsData[ host ] = {}
+            main.hostsData[ host ][ 'mac' ] =  \
+                main.Mininet1.getMacAddress( host ).upper()
+            for hostj in hostsJson:
+                if main.hostsData[ host ][ 'mac' ] == hostj[ 'mac' ]:
+                    main.hostsData[ host ][ 'id' ] = hostj[ 'id' ]
+                    main.hostsData[ host ][ 'vlan' ] = hostj[ 'vlan' ]
+                    main.hostsData[ host ][ 'location' ] = \
+                                hostj[ 'location' ][ 'elementId' ] + '/' + \
+                                hostj[ 'location' ][ 'port' ]
+                    main.hostsData[ host ][ 'ipAddresses' ] = hostj[ 'ipAddresses' ]
+        return main.TRUE
+    except KeyError:
+        main.log.error( "KeyError while populating hostsData")
+        return main.FALSE
+
+def scapyCheckConnection( main, senders, recipients, packet=None, packetFilter=None, expectFailure=False ):
+    """
+        Checks the connectivity between all given sender hosts and all given recipient hosts
+        Packet may be specified. Defaults to Ether/IP packet
+        Packet Filter may be specified. Defaults to Ether/IP from current sender MAC
+            Todo: Optional packet and packet filter attributes for sender and recipients
+        Expect Failure when the sender and recipient are not supposed to have connectivity
+            Timeout of 1 second, returns main.TRUE if the filter is not triggered and kills the filter
+
+    """
+    connectionsFunctional = main.TRUE
+
+    if not packetFilter:
+        packetFilter = 'ether host {}'
+
+    if expectFailure:
+        timeout = 1
+    else:
+        timeout = 10
+
+    for sender in senders:
+        try:
+            senderComp = getattr( main, sender )
+        except AttributeError:
+            main.log.error( "main has no attribute {}".format( sender ) )
+            connectionsFunctional = main.FALSE
+            continue
+
+        for recipient in recipients:
+            # Do not send packets to self since recipient CLI will already be busy
+            if recipient == sender:
+                continue
+            try:
+                recipientComp = getattr( main, recipient )
+            except AttributeError:
+                main.log.error( "main has no attribute {}".format( recipient ) )
+                connectionsFunctional = main.FALSE
+                continue
+
+            recipientComp.startFilter( pktFilter = packetFilter.format( senderComp.hostMac ) )
+
+            if not packet:
+                pkt = 'Ether( src="{0}", dst="{2}" )/IP( src="{1}", dst="{3}" )'.format(
+                    senderComp.hostMac,
+                    senderComp.hostIp,
+                    recipientComp.hostMac,
+                    recipientComp.hostIp )
+            else:
+                pkt = packet
+            senderComp.sendPacket( packet = pkt )
+
+            if recipientComp.checkFilter( timeout ):
+                if expectFailure:
+                    main.log.error( "Packet from {0} successfully received by {1} when it should not have been".format( sender , recipient ) )
+                    connectionsFunctional = main.FALSE
+                else:
+                    main.log.info( "Packet from {0} successfully received by {1}".format( sender , recipient ) )
+            else:
+                recipientComp.killFilter()
+                if expectFailure:
+                    main.log.info( "As expected, packet from {0} was not received by {1}".format( sender , recipient ) )
+                else:
+                    main.log.error( "Packet from {0} was not received by {1}".format( sender , recipient ) )
+                    connectionsFunctional = main.FALSE
+
+        return connectionsFunctional
+
+def checkLeaderChange( leaders1, leaders2 ):
+    """
+        Checks for a change in intent partition leadership.
+
+        Takes the output of leaders -c in json string format before and after
+        a potential change as input
+
+        Returns main.TRUE if no mismatches are detected
+        Returns main.FALSE if there is a mismatch or on error loading the input
+    """
+    try:
+        leaders1 = json.loads( leaders1 )
+        leaders2 = json.loads( leaders2 )
+    except ( AttributeError, TypeError):
+        main.log.exception( self.name + ": Object not as expected" )
+        return main.FALSE
+    except Exception:
+        main.log.exception( self.name + ": Uncaught exception!" )
+        main.cleanup()
+        main.exit()
+    main.log.info( "Checking Intent Paritions for Change in Leadership" )
+    mismatch = False
+    for dict1 in leaders1:
+        if "intent" in dict1.get( "topic", [] ):
+            for dict2 in leaders2:
+                if dict1.get( "topic", 0 ) == dict2.get( "topic", 0 ) and \
+                    dict1.get( "leader", 0 ) != dict2.get( "leader", 0 ):
+                    mismatch = True
+                    main.log.error( "{0} changed leader from {1} to {2}".\
+                        format( dict1.get( "topic", "no-topic" ),\
+                            dict1.get( "leader", "no-leader" ),\
+                            dict2.get( "leader", "no-leader" ) ) )
+    if mismatch:
+        return main.FALSE
+    else:
+        return main.TRUE
+
+
+def report( main ):
+    """
+        Report errors/warnings/exceptions
+    """
+    main.ONOSbench.logReport( main.ONOSip[ 0 ],
+                              [ "INFO",
+                                "FOLLOWER",
+                                "WARN",
+                                "flow",
+                                "ERROR",
+                                "Except" ],
+                              "s" )
+
+    main.log.info( "ERROR report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "ERROR" ],
+                "d" )
+
+    main.log.info( "EXCEPTIONS report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "Except" ],
+                "d" )
+
+    main.log.info( "WARNING report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "WARN" ],
+                "d" )
diff --git a/TestON/tests/FUNC/FUNCintentRest/dependencies/newFuncTopo.py b/TestON/tests/FUNC/FUNCintentRest/dependencies/newFuncTopo.py
new file mode 100755
index 0000000..5edf7f7
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintentRest/dependencies/newFuncTopo.py
@@ -0,0 +1,148 @@
+#!/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 VLANHost( Host ):
+    def config( self, vlan=100, **params ):
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ifconfig %s inet 0' % intf )
+        self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        newName = '%s.%d' % ( intf, vlan )
+        intf.name = newName
+        self.nameToIntf[ newName ] = intf
+        return r
+
+class IPv6Host( Host ):
+    def config( self, v6Addr='1000:1/64', **params ):
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ifconfig %s inet 0' % intf )
+        self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
+        return r
+
+class dualStackHost( Host ):
+    def config( self, v6Addr='2000:1/64', **params ):
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
+        return r
+
+class MyTopo( Topo ):
+
+    def __init__( self ):
+        # Initialize topology
+        Topo.__init__( self )
+        # Switch S5 Hosts
+        host1=self.addHost( 'h1', ip='10.1.0.2/24' )
+        host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
+        host3=self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
+        #VLAN hosts
+        host4=self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
+        host5=self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
+        #VPN-1 and VPN-2 Hosts
+        host6=self.addHost( 'h6', ip='11.1.0.2/24' )
+        host7=self.addHost( 'h7', ip='12.1.0.2/24' )
+        #Multicast Sender
+        host8=self.addHost( 'h8', ip='10.1.0.4/24' )
+
+        # Switch S6 Hosts
+        host9=self.addHost( 'h9', ip='10.1.0.5/24' )
+        host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
+        host11=self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
+        #VLAN hosts
+        host12=self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
+        host13=self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
+        #VPN-1 and VPN-2 Hosts
+        host14=self.addHost( 'h14', ip='11.1.0.3/24' )
+        host15=self.addHost( 'h15', ip='12.1.0.3/24' )
+        #Multicast Receiver
+        host16=self.addHost( 'h16', ip='10.1.0.7/24' )
+
+        # Switch S7 Hosts
+        host17=self.addHost( 'h17', ip='10.1.0.8/24' )
+        host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
+        host19=self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
+        #VLAN hosts
+        host20=self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
+        host21=self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
+        #VPN-1 and VPN-2 Hosts
+        host22=self.addHost( 'h22', ip='11.1.0.4/24' )
+        host23=self.addHost( 'h23', ip='12.1.0.4/24' )
+        #Multicast Receiver
+        host24=self.addHost( 'h24', ip='10.1.0.10/24' )
+
+        s1 = self.addSwitch( 's1' )
+        s2 = self.addSwitch( 's2' )
+        s3 = self.addSwitch( 's3' )
+        s4 = self.addSwitch( 's4' )
+        s5 = self.addSwitch( 's5' )
+        s6 = self.addSwitch( 's6' )
+        s7 = self.addSwitch( 's7' )
+
+        self.addLink(s5,host1)
+        self.addLink(s5,host2)
+        self.addLink(s5,host3)
+        self.addLink(s5,host4)
+        self.addLink(s5,host5)
+        self.addLink(s5,host6)
+        self.addLink(s5,host7)
+        self.addLink(s5,host8)
+
+        self.addLink(s6,host9)
+        self.addLink(s6,host10)
+        self.addLink(s6,host11)
+        self.addLink(s6,host12)
+        self.addLink(s6,host13)
+        self.addLink(s6,host14)
+        self.addLink(s6,host15)
+        self.addLink(s6,host16)
+
+        self.addLink(s7,host17)
+        self.addLink(s7,host18)
+        self.addLink(s7,host19)
+        self.addLink(s7,host20)
+        self.addLink(s7,host21)
+        self.addLink(s7,host22)
+        self.addLink(s7,host23)
+        self.addLink(s7,host24)
+
+        self.addLink(s1,s2)
+        self.addLink(s1,s3)
+        self.addLink(s1,s4)
+        self.addLink(s1,s5)
+        self.addLink(s2,s3)
+        self.addLink(s2,s5)
+        self.addLink(s2,s6)
+        self.addLink(s3,s4)
+        self.addLink(s3,s6)
+        self.addLink(s4,s7)
+        topos = { 'mytopo': ( lambda: MyTopo() ) }
+
+# HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
+
+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/FUNCintentRest/dependencies/startUp.py b/TestON/tests/FUNC/FUNCintentRest/dependencies/startUp.py
new file mode 100644
index 0000000..bf2a2b6
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintentRest/dependencies/startUp.py
@@ -0,0 +1,38 @@
+"""
+    This wrapper function is use for starting up onos instance
+"""
+
+import time
+import os
+import json
+
+def onosBuild( main, gitBranch ):
+    """
+        This includes pulling ONOS and building it using maven install
+    """
+
+    buildResult = main.FALSE
+
+    # Git checkout a branch of ONOS
+    checkOutResult = main.ONOSbench.gitCheckout( gitBranch )
+    # Does the git pull on the branch that was checked out
+    if not checkOutResult:
+        main.log.warn( "Failed to checked out " + gitBranch +
+                                           " branch")
+    else:
+        main.log.info( "Successfully checked out " + gitBranch +
+                                           " branch")
+    gitPullResult = main.ONOSbench.gitPull()
+    if gitPullResult == main.ERROR:
+        main.log.error( "Error pulling git branch" )
+    else:
+        main.log.info( "Successfully pulled " + gitBranch + " branch" )
+
+    # Maven clean install
+    buildResult = main.ONOSbench.cleanInstall()
+
+    return buildResult
+
+
+
+
diff --git a/TestON/tests/FUNC/FUNCintentRest/dependencies/topo.py b/TestON/tests/FUNC/FUNCintentRest/dependencies/topo.py
new file mode 100644
index 0000000..b44e3fc
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCintentRest/dependencies/topo.py
@@ -0,0 +1,100 @@
+"""
+    These functions can be used for topology comparisons
+"""
+
+import time
+import os
+import json
+
+def getAllDevices( main ):
+    """
+        Return a list containing the devices output from each ONOS node
+    """
+    devices = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].devices,
+                         name="devices-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        devices.append( t.result )
+    return devices
+
+def getAllHosts( main ):
+    """
+        Return a list containing the hosts output from each ONOS node
+    """
+    hosts = []
+    ipResult = main.TRUE
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].hosts,
+                         name="hosts-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        hosts.append( t.result )
+    return hosts
+
+def getAllPorts( main ):
+    """
+        Return a list containing the ports output from each ONOS node
+    """
+    ports = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].ports,
+                         name="ports-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        ports.append( t.result )
+    return ports
+
+def getAllLinks( main ):
+    """
+        Return a list containing the links output from each ONOS node
+    """
+    links = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].links,
+                         name="links-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        links.append( t.result )
+    return links
+
+def getAllClusters( main ):
+    """
+        Return a list containing the clusters output from each ONOS node
+    """
+    clusters = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].clusters,
+                         name="clusters-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        clusters.append( t.result )
+    return clusters
+
+
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.params b/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.params
new file mode 100644
index 0000000..58917ba
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.params
@@ -0,0 +1,55 @@
+<PARAMS>
+    # CASE - Description
+    # 1 - Variable initialization and optional pull and build ONOS package
+    # 2 - Install ONOS
+    # 11 - Start Mininet with Openflow 1.3 (OpenvSwitch --version more than 2.3.1)
+    # 12 - Assign switch to controller
+    # 14 - Stop Mininet
+    # 2000 - Test Point Intent
+    # 3000 - Test Single To Multi Point Intent
+    # 4000 - Test multi to single point intents
+    # 5000 - Test host mobility
+
+    <testcases>1,2,11,12,13,2000,3000,4000,5000,14</testcases>
+
+    <SCALE>
+        <size>1</size>
+    </SCALE>
+
+    <DEPENDENCY>
+        <path>/tests/FUNC/FUNCipv6Intent/dependencies/</path>
+        <wrapper1>startUp</wrapper1>
+        <wrapper2>FUNCIpv6IntentFunction</wrapper2>
+        <wrapper3>topo</wrapper3>
+        <topology>newFuncTopo.py</topology>
+    </DEPENDENCY>
+
+    <ENV>
+        <cellApps>drivers,openflow,proxyarp,mobility</cellApps>
+    </ENV>
+    <GIT>
+        <pull>false</pull>
+        <branch>master</branch>
+    </GIT>
+    <SLEEP>
+        <startup>15</startup>
+        <reroute>5</reroute>
+        <removeintent>10</removeintent>
+        <checkintent>5</checkintent>
+        <fwd>10</fwd>
+        <topoAttempts>3</topoAttempts>
+    </SLEEP>
+    <MININET>
+        <switch>7</switch>
+        <links>20</links>
+    </MININET>
+
+    # Intent tests params
+    <SDNIP>
+        <tcpProto>6</tcpProto>
+        <icmpProto>58</icmpProto>
+        <srcPort>5001</srcPort>
+        <dstPort>5001</dstPort>
+    </SDNIP>
+
+</PARAMS>
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.py b/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.py
new file mode 100644
index 0000000..9c49283
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.py
@@ -0,0 +1,865 @@
+# Testing the basic intent for ipv6 functionality of ONOS
+
+class FUNCipv6Intent:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        import time
+        import imp
+        import re
+
+        """
+        - Construct tests variables
+        - GIT ( optional )
+            - Checkout ONOS master branch
+            - Pull latest ONOS code
+        - Building ONOS ( optional )
+            - Install ONOS package
+            - Build ONOS package
+        """
+        main.case( "Constructing test variables and building ONOS package" )
+        main.step( "Constructing test variables" )
+        main.caseExplanation = "This test case is mainly for loading " +\
+                               "from params file, and pull and build the " +\
+                               " latest ONOS package"
+        stepResult = main.FALSE
+        # Test variables
+        try:
+            main.testOnDirectory = re.sub( "(/tests)$", "", main.testDir )
+            main.apps = main.params[ 'ENV' ][ 'cellApps' ]
+            gitBranch = main.params[ 'GIT' ][ 'branch' ]
+            main.dependencyPath = main.testOnDirectory + \
+                                  main.params[ 'DEPENDENCY' ][ 'path' ]
+            main.topology = main.params[ 'DEPENDENCY' ][ 'topology' ]
+            main.scale = ( main.params[ 'SCALE' ][ 'size' ] ).split( "," )
+            if main.ONOSbench.maxNodes:
+                main.maxNodes = int( main.ONOSbench.maxNodes )
+            else:
+                main.maxNodes = 0
+            wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
+            wrapperFile2 = main.params[ 'DEPENDENCY' ][ 'wrapper2' ]
+            wrapperFile3 = main.params[ 'DEPENDENCY' ][ 'wrapper3' ]
+            main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+            main.checkIntentSleep = int( main.params[ 'SLEEP' ][ 'checkintent' ] )
+            main.removeIntentSleep = int( main.params[ 'SLEEP' ][ 'removeintent' ] )
+            main.rerouteSleep = int( main.params[ 'SLEEP' ][ 'reroute' ] )
+            main.fwdSleep = int( main.params[ 'SLEEP' ][ 'fwd' ] )
+            main.checkTopoAttempts = int( main.params[ 'SLEEP' ][ 'topoAttempts' ] )
+            gitPull = main.params[ 'GIT' ][ 'pull' ]
+            main.numSwitch = int( main.params[ 'MININET' ][ 'switch' ] )
+            main.numLinks = int( main.params[ 'MININET' ][ 'links' ] )
+            main.cellData = {} # for creating cell file
+            main.hostsData = {}
+            main.CLIs = []
+            main.ONOSip = []
+            main.assertReturnString = ''  # Assembled assert return string
+
+            main.ONOSip = main.ONOSbench.getOnosIps()
+            print main.ONOSip
+
+            # Assigning ONOS cli handles to a list
+            for i in range( 1,  main.maxNodes + 1 ):
+                main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
+
+            # -- INIT SECTION, ONLY RUNS ONCE -- #
+            main.startUp = imp.load_source( wrapperFile1,
+                                            main.dependencyPath +
+                                            wrapperFile1 +
+                                            ".py" )
+
+            main.intentFunction = imp.load_source( wrapperFile2,
+                                            main.dependencyPath +
+                                            wrapperFile2 +
+                                            ".py" )
+
+            main.topo = imp.load_source( wrapperFile3,
+                                         main.dependencyPath +
+                                         wrapperFile3 +
+                                         ".py" )
+
+            copyResult1 = main.ONOSbench.scp( main.Mininet1,
+                                              main.dependencyPath +
+                                              main.topology,
+                                              main.Mininet1.home,
+                                              direction="to" )
+            if main.CLIs:
+                stepResult = main.TRUE
+            else:
+                main.log.error( "Did not properly created list of ONOS CLI handle" )
+                stepResult = main.FALSE
+        except Exception as e:
+            main.log.exception(e)
+            main.cleanup()
+            main.exit()
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully construct " +
+                                        "test variables ",
+                                 onfail="Failed to construct test variables" )
+
+        if gitPull == 'True':
+            main.step( "Building ONOS in " + gitBranch + " branch" )
+            onosBuildResult = main.startUp.onosBuild( main, gitBranch )
+            stepResult = onosBuildResult
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=stepResult,
+                                     onpass="Successfully compiled " +
+                                            "latest ONOS",
+                                     onfail="Failed to compile " +
+                                            "latest ONOS" )
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+        main.ONOSbench.getVersion( report=True )
+
+    def CASE2( self, main ):
+        """
+        - Set up cell
+            - Create cell file
+            - Set cell file
+            - Verify cell file
+        - Kill ONOS process
+        - Uninstall ONOS cluster
+        - Verify ONOS start up
+        - Install ONOS cluster
+        - Connect to cli
+        """
+
+        # main.scale[ 0 ] determines the current number of ONOS controller
+        main.numCtrls = int( main.scale[ 0 ] )
+
+        main.case( "Starting up " + str( main.numCtrls ) +
+                   " node(s) ONOS cluster" )
+        main.caseExplanation = "Set up ONOS with " + str( main.numCtrls ) +\
+                                " node(s) ONOS cluster"
+
+
+
+        #kill off all onos processes
+        main.log.info( "Safety check, killing all ONOS processes" +
+                       " before initiating environment setup" )
+
+        for i in range( main.maxNodes ):
+            main.ONOSbench.onosDie( main.ONOSip[ i ] )
+
+        print "NODE COUNT = ", main.numCtrls
+
+        tempOnosIp = []
+        for i in range( main.numCtrls ):
+            tempOnosIp.append( main.ONOSip[i] )
+
+        main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
+                                       "temp", main.Mininet1.ip_address,
+                                       main.apps, tempOnosIp )
+
+        main.step( "Apply cell to environment" )
+        cellResult = main.ONOSbench.setCell( "temp" )
+        verifyResult = main.ONOSbench.verifyCell()
+        stepResult = cellResult and verifyResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully applied cell to " + \
+                                        "environment",
+                                 onfail="Failed to apply cell to environment " )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+        stepResult = packageResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully created ONOS package",
+                                 onfail="Failed to create ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Uninstalling ONOS package" )
+        onosUninstallResult = main.TRUE
+        for ip in main.ONOSip:
+            onosUninstallResult = onosUninstallResult and \
+                    main.ONOSbench.onosUninstall( nodeIp=ip )
+        stepResult = onosUninstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully uninstalled ONOS package",
+                                 onfail="Failed to uninstall ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Installing ONOS package" )
+        onosInstallResult = main.TRUE
+        for i in range( main.numCtrls ):
+            onosInstallResult = onosInstallResult and \
+                    main.ONOSbench.onosInstall( node=main.ONOSip[ i ] )
+        stepResult = onosInstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully installed ONOS package",
+                                 onfail="Failed to install ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Starting ONOS service" )
+        stopResult = main.TRUE
+        startResult = main.TRUE
+        onosIsUp = main.TRUE
+
+        for i in range( main.numCtrls ):
+            onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
+        if onosIsUp == main.TRUE:
+            main.log.report( "ONOS instance is up and ready" )
+        else:
+            main.log.report( "ONOS instance may not be up, stop and " +
+                             "start ONOS again " )
+
+            for i in range( main.numCtrls ):
+                stopResult = stopResult and \
+                        main.ONOSbench.onosStop( main.ONOSip[ i ] )
+            for i in range( main.numCtrls ):
+                startResult = startResult and \
+                        main.ONOSbench.onosStart( main.ONOSip[ i ] )
+        stepResult = onosIsUp and stopResult and startResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ONOS service is ready",
+                                 onfail="ONOS service did not start properly" )
+
+        main.step( "Start ONOS cli" )
+        cliResult = main.TRUE
+        for i in range( main.numCtrls ):
+            cliResult = cliResult and \
+                        main.CLIs[ i ].startOnosCli( main.ONOSip[ i ] )
+        stepResult = cliResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully start ONOS cli",
+                                 onfail="Failed to start ONOS cli" )
+
+        main.step( "Checking that ONOS is ready" )
+        for i in range( 3 ):
+            ready = True
+            for i in range( int( main.scale[ 0 ] ) ):
+                output = main.CLIs[ i ].summary()
+                if not output:
+                    ready = False
+            time.sleep( 30 )
+        utilities.assert_equals( expect=True, actual=ready,
+                                 onpass="ONOS summary command succeded",
+                                 onfail="ONOS summary command failed" )
+        if not ready:
+            main.cleanup()
+            main.exit()
+
+        main.step( "setup the ipv6NeighbourDiscovery" )
+        cfgResult1 = main.CLIs[0].setCfg( "org.onosproject.proxyarp.ProxyArp", "ipv6NeighborDiscovery", "true" )
+        cfgResult2 = main.CLIs[0].setCfg( "org.onosproject.provider.host.impl.HostLocationProvider", "ipv6NeighborDiscovery", "true" )
+        cfgResult = cfgResult1 and cfgResult2
+        utilities.assert_equals( expect=main.TRUE, actual=cfgResult,
+                                onpass="ipv6NeighborDiscovery cfg is set to true",
+                                onfail="Failed to cfg set ipv6NeighborDiscovery" )
+
+        # Remove the first element in main.scale list
+        main.scale.remove( main.scale[ 0 ] )
+
+        main.intentFunction.report( main )
+
+    def CASE11( self, main ):
+        """
+            Start Mininet topology with OF 1.3 switches
+        """
+        main.OFProtocol = "1.3"
+        main.log.report( "Start Mininet topology with OF 1.3 switches" )
+        main.case( "Start Mininet topology with OF 1.3 switches" )
+        main.caseExplanation = "Start mininet topology with OF 1.3 " +\
+                                "switches to test intents, exits out if " +\
+                                "topology did not start correctly"
+
+        main.step( "Starting Mininet topology with OF 1.3 switches" )
+        args = "--switch ovs,protocols=OpenFlow13"
+        topoResult = main.Mininet1.startNet( topoFile=main.dependencyPath +
+                                                      main.topology,
+                                             args=args )
+        stepResult = topoResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully loaded topology",
+                                 onfail="Failed to load topology" )
+        # Exit if topology did not load properly
+        if not topoResult:
+            main.cleanup()
+            main.exit()
+
+    def CASE12( self, main ):
+        """
+            Assign mastership to controllers
+        """
+        import re
+
+        main.case( "Assign switches to controllers" )
+        main.step( "Assigning switches to controllers" )
+        main.caseExplanation = "Assign OF " + main.OFProtocol +\
+                                " switches to ONOS nodes"
+
+        assignResult = main.TRUE
+        switchList = []
+
+        # Creates a list switch name, use getSwitch() function later...
+        for i in range( 1, ( main.numSwitch + 1 ) ):
+            switchList.append( 's' + str( i ) )
+
+        tempONOSip = []
+        for i in range( main.numCtrls ):
+            tempONOSip.append( main.ONOSip[ i ] )
+
+        assignResult = main.Mininet1.assignSwController( sw=switchList,
+                                                         ip=tempONOSip,
+                                                         port='6633' )
+        if not assignResult:
+            main.cleanup()
+            main.exit()
+
+        for i in range( 1, ( main.numSwitch + 1 ) ):
+            response = main.Mininet1.getSwController( "s" + str( i ) )
+            print( "Response is " + str( response ) )
+            if re.search( "tcp:" + main.ONOSip[ 0 ], response ):
+                assignResult = assignResult and main.TRUE
+            else:
+                assignResult = main.FALSE
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully assigned switches" +
+                                        "to controller",
+                                 onfail="Failed to assign switches to " +
+                                        "controller" )
+
+    def CASE13( self, main ):
+        """
+        Discover all hosts and store its data to a dictionary
+        """
+        main.case( "Discover all hosts" )
+
+        stepResult = main.TRUE
+        main.step( "Discover all hosts using pingall " )
+        stepResult = main.intentFunction.getHostsData( main )
+        utilities.assert_equals( expect=main.TRUE,
+                                actual=stepResult,
+                                onpass="Successfully discovered hosts",
+                                onfail="Failed to discover hosts" )
+
+    def CASE14( self, main ):
+        """
+            Stop mininet
+        """
+        main.log.report( "Stop Mininet topology" )
+        main.case( "Stop Mininet topology" )
+        main.caseExplanation = "Stopping the current mininet topology " +\
+                                "to start up fresh"
+
+        main.step( "Stopping Mininet Topology" )
+        topoResult = main.Mininet1.stopNet( )
+        stepResult = topoResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully stop mininet",
+                                 onfail="Failed to stop mininet" )
+        # Exit if topology did not load properly
+        if not topoResult:
+            main.cleanup()
+            main.exit()
+
+    def CASE2000( self, main ):
+        """
+            add point intents between 2 hosts:
+                - Get device ids | ports
+                - Add point intents
+                - Check intents
+                - Verify flows
+                - Ping hosts
+                - Reroute
+                    - Link down
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                    - Link up
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                - Remove intents
+        """
+        import time
+        import json
+        import re
+
+        # Assert variables - These variable's name|format must be followed
+        # if you want to use the wrapper function
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+
+        main.testName = "Point Intents"
+        main.case( main.testName + " Test - " + str( main.numCtrls ) +
+                   " NODE(S) - OF " + main.OFProtocol )
+        main.caseExplanation = "This test case will test point to point" +\
+                               " intents using " + str( main.numCtrls ) +\
+                               " node(s) cluster;\n" +\
+                               "Different type of hosts will be tested in " +\
+                               "each step such as IPV6, Dual stack, VLAN etc" +\
+                               ";\nThe test will use OF " + main.OFProtocol +\
+                               " OVS running in Mininet"
+        # No option point intents
+        main.step( "NOOPTION: Add point intents between h1 and h9, ipv6 hosts" )
+        main.assertReturnString = "Assertion Result for NOOPTION point intent\n"
+        stepResult = main.TRUE
+        stepResult = main.intentFunction.pointIntent(
+                                       main,
+                                       name="NOOPTION",
+                                       host1="h1",
+                                       host2="h9",
+                                       deviceId1="of:0000000000000005/1",
+                                       deviceId2="of:0000000000000006/1")
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        stepResult = main.TRUE
+        main.step( "IPV6: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for IPV6 point intent\n"
+        stepResult = main.intentFunction.pointIntent(
+                                       main,
+                                       name="IPV6",
+                                       host1="h1",
+                                       host2="h9",
+                                       deviceId1="of:0000000000000005/1",
+                                       deviceId2="of:0000000000000006/1",
+                                       port1="",
+                                       port2="",
+                                       ethType="IPV6",
+                                       mac1="00:00:00:00:00:01",
+                                       mac2="00:00:00:00:00:09",
+                                       bandwidth="",
+                                       lambdaAlloc=False,
+                                       ipProto="",
+                                       ip1="",
+                                       ip2="",
+                                       tcp1="",
+                                       tcp2="",
+                                       sw1="s5",
+                                       sw2="s2",
+                                       expectedLink=18 )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "IPV6_2: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for IPV6 no mac address point intents\n"
+        stepResult = main.intentFunction.pointIntent(
+                                       main,
+                                       name="IPV6_2",
+                                       host1="h1",
+                                       host2="h9",
+                                       deviceId1="of:0000000000000005/1",
+                                       deviceId2="of:0000000000000006/1",
+                                       ipProto="",
+                                       ip1="",
+                                       ip2="",
+                                       tcp1="",
+                                       tcp2="",
+                                       expectedLink="")
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "SDNIP-ICMP: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for SDNIP-ICMP IPV6 using ICMP point intents\n"
+        mac1 = main.hostsData[ 'h1' ][ 'mac' ]
+        mac2 = main.hostsData[ 'h9' ][ 'mac' ]
+        main.log.debug(mac2)
+        ipProto = main.params[ 'SDNIP' ][ 'icmpProto' ]
+        ip1 = str( main.hostsData[ 'h1' ][ 'ipAddresses' ][ 0 ] ) + "/128"
+        ip2 = str( main.hostsData[ 'h9' ][ 'ipAddresses' ][ 0 ] ) + "/128"
+        stepResult = main.intentFunction.pointIntent(
+                                           main,
+                                           name="SDNIP-ICMP",
+                                           host1="h1",
+                                           host2="h9",
+                                           deviceId1="of:0000000000000005/1",
+                                           deviceId2="of:0000000000000006/1",
+                                           mac1=mac1,
+                                           mac2=mac2,
+                                           ethType="IPV6",
+                                           ipProto=ipProto,
+                                           ip1=ip1,
+                                           ip2=ip2 )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "SDNIP-TCP: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for SDNIP-TCP IPV6 using TCP point intents\n"
+        mac1 = main.hostsData[ 'h1' ][ 'mac' ]
+        mac2 = main.hostsData[ 'h9' ][ 'mac' ]
+        ip1 = str( main.hostsData[ 'h1' ][ 'ipAddresses' ][ 0 ] ) + "/128"
+        ip2 = str( main.hostsData[ 'h9' ][ 'ipAddresses' ][ 0 ] ) + "/128"
+        ipProto = main.params[ 'SDNIP' ][ 'tcpProto' ]
+        tcp1 = main.params[ 'SDNIP' ][ 'srcPort' ]
+        tcp2 = main.params[ 'SDNIP' ][ 'dstPort' ]
+        stepResult = main.intentFunction.pointIntentTcp(
+                                           main,
+                                           name="SDNIP-TCP",
+                                           host1="h1",
+                                           host2="h9",
+                                           deviceId1="of:0000000000000005/1",
+                                           deviceId2="of:0000000000000006/1",
+                                           mac1=mac1,
+                                           mac2=mac2,
+                                           ethType="IPV6",
+                                           ipProto=ipProto,
+                                           ip1=ip1,
+                                           ip2=ip2,
+                                           tcp1=tcp1,
+                                           tcp2=tcp2,
+                                           sw1="",
+                                           sw2="",
+                                           expectedLink="" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "DUALSTACK1: Add point intents between h3 and h11" )
+        main.assertReturnString = "Assertion Result for Dualstack1 IPV6 with mac address point intents\n"
+        stepResult = main.intentFunction.pointIntent(
+                                       main,
+                                       name="DUALSTACK1",
+                                       host1="h3",
+                                       host2="h11",
+                                       deviceId1="of:0000000000000005/3",
+                                       deviceId2="of:0000000000000006/3",
+                                       port1="",
+                                       port2="",
+                                       ethType="IPV6",
+                                       mac1="00:00:00:00:00:03",
+                                       mac2="00:00:00:00:00:0B",
+                                       bandwidth="",
+                                       lambdaAlloc=False,
+                                       ipProto="",
+                                       ip1="",
+                                       ip2="",
+                                       tcp1="",
+                                       tcp2="",
+                                       sw1="s5",
+                                       sw2="s2",
+                                       expectedLink=18 )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "VLAN: Add point intents between h5 and h24" )
+        main.assertReturnString = "Assertion Result for VLAN IPV6 with mac address point intents\n"
+        stepResult = main.intentFunction.pointIntent(
+                                       main,
+                                       name="VLAN",
+                                       host1="h5",
+                                       host2="h24",
+                                       deviceId1="of:0000000000000005/5",
+                                       deviceId2="of:0000000000000007/8",
+                                       port1="",
+                                       port2="",
+                                       ethType="IPV6",
+                                       mac1="00:00:00:00:00:05",
+                                       mac2="00:00:00:00:00:18",
+                                       bandwidth="",
+                                       lambdaAlloc=False,
+                                       ipProto="",
+                                       ip1="",
+                                       ip2="",
+                                       tcp1="",
+                                       tcp2="",
+                                       sw1="s5",
+                                       sw2="s2",
+                                       expectedLink=18 )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "1HOP: Add point intents between h1 and h9" )
+        main.assertReturnString = "Assertion Result for 1HOP IPV6 with no mac address point intents\n"
+        stepResult = main.intentFunction.hostIntent( main,
+                                              name='1HOP',
+                                              host1='h1',
+                                              host2='h9',
+                                              host1Id='00:00:00:00:00:01/-1',
+                                              host2Id='00:00:00:00:00:09/-1')
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.intentFunction.report( main )
+
+    def CASE3000( self, main ):
+        """
+            Add single point to multi point intents
+                - Get device ids
+                - Add single point to multi point intents
+                - Check intents
+                - Verify flows
+                - Ping hosts
+                - Reroute
+                    - Link down
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                    - Link up
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                - Remove intents
+        """
+        import time
+        import json
+        import re
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                        main.numSwitch"
+        main.testName = "Single to Multi Point Intents"
+        main.case( main.testName + " Test - " + str( main.numCtrls ) + " NODE(S) - OF " + main.OFProtocol )
+        main.caseExplanation = "This test case will test single point to" +\
+                               " multi point intents using " +\
+                               str( main.numCtrls ) + " node(s) cluster;\n" +\
+                               "Different type of hosts will be tested in " +\
+                               "each step such as IPV6, Dual stack, VLAN etc" +\
+                               ";\nThe test will use OF " + main.OFProtocol +\
+                               " OVS running in Mininet "
+        main.step( "NOOPTION: Add single point to multi point intents" )
+        hostNames = [ 'h1', 'h9', 'h17' ]
+        devices = [ 'of:0000000000000005/1','of:0000000000000006/1', 'of:0000000000000007/1' ]
+        main.assertReturnString = "Assertion results for IPV6 single to multi point intent with no options set\n"
+        stepResult = main.TRUE
+        stepResult = main.intentFunction.singleToMultiIntent(
+                                         main,
+                                         name="NOOPTION",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         sw1="s5",
+                                         sw2="s2",
+                                         expectedLink=18)
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "IPV6: Add single point to multi point intents" )
+        main.assertReturnString = "Assertion results for IPV6 single to multi point intent with IPV6 type and MAC addresses\n"
+        hostNames = [ 'h1', 'h9', 'h17' ]
+        devices = [ 'of:0000000000000005/1', 'of:0000000000000006/1', 'of:0000000000000007/1' ]
+        macs = [ '00:00:00:00:00:01','00:00:00:00:00:09' ,'00:00:00:00:00:11' ]
+        stepResult = main.TRUE
+        stepResult = main.intentFunction.singleToMultiIntent(
+                                         main,
+                                         name="IPV6",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         macs=macs,
+                                         ethType="IPV6",
+                                         sw1="",
+                                         sw2="")
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "IPV6_2: Add single point to multi point intents" )
+        main.assertReturnString = "Assertion results for IPV6 single to multi point intent with IPV6 type and no MAC addresses\n"
+        hostNames = [ 'h1', 'h9', 'h17' ]
+        devices = [ 'of:0000000000000005/1', 'of:0000000000000006/1', 'of:0000000000000007/1' ]
+        stepResult = main.TRUE
+        stepResult = main.intentFunction.singleToMultiIntent(
+                                         main,
+                                         name="IPV6_2",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         ethType="IPV6",
+                                         sw1="",
+                                         sw2="")
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "VLAN: Add single point to multi point intents" )
+        main.assertReturnString = "Assertion results for IPV6 single to multi point intent with IPV6 type and MAC addresses in the same VLAN\n"
+        hostNames = [ 'h5', 'h24' ]
+        devices = [ 'of:0000000000000005/5', 'of:0000000000000007/8' ]
+        macs = [ '00:00:00:00:00:05','00:00:00:00:00:18' ]
+        stepResult = main.TRUE
+        stepResult = main.intentFunction.singleToMultiIntent(
+                                         main,
+                                         name="IPV6",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         macs=macs,
+                                         ethType="IPV6",
+                                         sw1="",
+                                         sw2="")
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.intentFunction.report( main )
+      
+    def CASE4000( self, main ):
+        """
+            Add multi point to single point intents
+                - Get device ids
+                - Add multi point to single point intents
+                - Check intents
+                - Verify flows
+                - Ping hosts
+                - Reroute
+                    - Link down
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+                    - Link up
+                    - Verify flows
+                    - Check topology
+                    - Ping hosts
+             - Remove intents
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+
+        main.testName = "Multi To Single Point Intents"
+        main.case( main.testName + " Test - " + str( main.numCtrls ) +
+                   " NODE(S) - OF " + main.OFProtocol )
+        main.caseExplanation = "This test case will test single point to" +\
+                               " multi point intents using " +\
+                               str( main.numCtrls ) + " node(s) cluster;\n" +\
+                               "Different type of hosts will be tested in " +\
+                               "each step such as IPV6, Dual stack, VLAN etc" +\
+                               ";\nThe test will use OF " + main.OFProtocol +\
+                               " OVS running in Mininet"
+
+        main.step( "NOOPTION: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for NOOPTION multi to single point intent\n"
+        stepResult = main.TRUE
+        hostNames = [ 'h17', 'h9' ]
+        devices = ['of:0000000000000007/1', 'of:0000000000000006/1' ]
+        stepResult = main.intentFunction.multiToSingleIntent(
+                                         main,
+                                         name="NOOPTION",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         sw1="s6",
+                                         sw2="s2",
+                                         expectedLink=18 )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "IPV6: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for IPV6 multi to single point intent with IPV6 type and MAC addresses\n"
+        hostNames = [ 'h1', 'h9', 'h17' ]
+        devices = [ 'of:0000000000000005/1', 'of:0000000000000006/1', 'of:0000000000000007/1' ]
+        macs = [ '00:00:00:00:00:01','00:00:00:00:00:09' ,'00:00:00:00:00:11' ]
+        stepResult = main.TRUE
+        installResult = main.intentFunction.multiToSingleIntent(
+                                         main,
+                                         name="IPV6",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         macs=macs,
+                                         ethType="IPV6",
+                                         sw1="",
+                                         sw2="",
+                                         expectedLink="" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.step( "IPV6_2: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for IPV6 multi to single point intent with IPV6 type and no MAC addresses\n"
+        hostNames = [ 'h1', 'h9' ]
+        devices = [ 'of:0000000000000005/1', 'of:0000000000000006/1' ]
+        stepResult = main.TRUE
+        stepResult = main.intentFunction.multiToSingleIntent(
+                                         main,
+                                         name="IPV6_2",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         ethType="IPV6",
+                                         sw1="",
+                                         sw2="",
+                                         expectedLink="")
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "VLAN: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for IPV6 multi to single point intent with IPV6 type and no MAC addresses in the same VLAN\n"
+        hostNames = [ 'h5', 'h24' ]
+        devices = [ 'of:0000000000000005/5', 'of:0000000000000007/8' ]
+        macs = [ '00:00:00:00:00:05','00:00:00:00:00:18' ]
+        stepResult = main.TRUE
+        stepResult = main.intentFunction.multiToSingleIntent(
+                                         main,
+                                         name="VLAN",
+                                         hostNames=hostNames,
+                                         devices=devices,
+                                         macs=macs,
+                                         ethType="IPV6",
+                                         sw1="",
+                                         sw2="",
+                                         expectedLink="")
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.intentFunction.report( main )
+
+    def CASE5000( self, main ):
+        """
+        Tests Host Mobility
+        Modifies the topology location of h1
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.Mininet1, "Mininet handle should be named Mininet1"
+        assert main.numSwitch, "Placed the total number of switch topology in \
+                                main.numSwitch"
+        main.case( "Test host mobility with host intents " )
+        main.step( "Testing host mobility by moving h1 from s5 to s6" )
+        h1PreMove = main.hostsData[ "h1" ][ "location" ][ 0:19 ]
+
+        main.log.info( "Moving h1 from s5 to s6")
+        main.Mininet1.moveHostv6( "h1","s5","s6" )
+        main.intentFunction.getHostsData( main )
+        h1PostMove = main.hostsData[ "h1" ][ "location" ][ 0:19 ]
+
+        utilities.assert_equals( expect="of:0000000000000006",
+                                 actual=h1PostMove,
+                                 onpass="Mobility: Successfully moved h1 to s6",
+                                 onfail="Mobility: Failed to move h1 to s6" +
+                                        " to single point intents" +
+                                        " with IPV6 type and MAC addresses" +
+                                        " in the same VLAN" )
+        main.step( "IPV6: Add host intents between h1 and h9" )
+        main.assertReturnString = "Assert result for IPV6 host intent between h1, moved, and h9\n"
+        stepResult = main.TRUE
+        stepResult = main.intentFunction.hostIntent( main,
+                                              name='IPV6 Mobility IPV6',
+                                              host1='h1',
+                                              host2='h9',
+                                              host1Id='00:00:00:00:00:01/-1',
+                                              host2Id='00:00:00:00:00:09/-1')
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        main.intentFunction.report( main )
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.topo b/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.topo
new file mode 100755
index 0000000..5d040d9
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.topo
@@ -0,0 +1,62 @@
+<TOPOLOGY>
+    <COMPONENT>
+        <ONOSbench>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+                <nodes>5</nodes>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOScli1>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli1>
+
+        <ONOScli2>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli2>
+
+         <ONOScli3>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli3>
+
+        <ONOS1>
+            <host>OC1</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <Mininet1>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>MininetCliDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS>
+                <home>~/mininet/custom/</home>
+            </COMPONENTS>
+        </Mininet1>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/README b/TestON/tests/FUNC/FUNCipv6Intent/README
new file mode 100644
index 0000000..5e6e81c
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCipv6Intent/README
@@ -0,0 +1,39 @@
+Summary:
+        This test suite consist of basic intent IPv6 functionality testing.
+        The following is an overview of how point-to-point intents are being tested.
+        Steps:
+            - Discover IPv6 hosts with ICMP6 ping
+            - Add point intents
+            - Check intents
+            - Verify flows
+            - ICMP6 ping of all hosts
+            - Reroute
+                - Link down
+                - Verify flows
+                - Check topology
+                - Ping hosts
+                - Link up
+                - Verify flows
+                - Check topology
+                - Ping hosts
+            - Verify intents with VLAN-id
+            - Remove intents
+        This test suite includes testing of different types of intents such as
+        host, point, single-to-multi and multi-to-single ( More intent types to
+        add later ). The same steps above is being performed to other type of
+        intents.
+
+Required:
+        This test requires Mininet topology file newFuncIntent.py that is in the
+        dependencies folder. You should run the topology file to check for any
+        missing packages. The mininet topology file has different type of hosts
+        including VLAN hosts. Therefore you need to install VLAN module to build
+        the topology correctly.
+
+VLAN configuration:
+        Execute command:
+            $ sudo apt-get install vlan
+        Configuration:
+            $ sudo modprobe 8021q
+        NOTE:To make this configuration permanent
+            $ sudo su -c 'echo "8021q" >> /etc/modules'
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/__init__.py b/TestON/tests/FUNC/FUNCipv6Intent/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCipv6Intent/__init__.py
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/dependencies/FUNCIpv6IntentFunction.py b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/FUNCIpv6IntentFunction.py
new file mode 100644
index 0000000..b6d706e
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/FUNCIpv6IntentFunction.py
@@ -0,0 +1,1611 @@
+"""
+    Wrapper functions for FuncIntent
+    This functions include Onosclidriver and Mininetclidriver driver functions
+    Author: subhash_singh@criterionnetworks.com
+"""
+import time
+import copy
+import json
+
+def __init__( self ):
+    self.default = ''
+
+def hostIntent( main,
+                name,
+                host1,
+                host2,
+                onosNode=0,
+                host1Id="",
+                host2Id="",
+                mac1="",
+                mac2="",
+                vlan1="-1",
+                vlan2="-1",
+                sw1="",
+                sw2="",
+                expectedLink=0 ):
+    """
+    Description:
+        Verify add-host-intent
+    Steps:
+        - Discover hosts
+        - Add host intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of host intent to add eg. IPV4 | VLAN | Dualstack
+        host1 - Name of first host
+        host2 - Name of second host
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        host1Id - ONOS id of the first host eg. 00:00:00:00:00:01/-1
+        host2Id - ONOS id of the second host
+        mac1 - Mac address of first host
+        mac2 - Mac address of the second host
+        vlan1 - Vlan tag of first host, defaults to -1
+        vlan2 - Vlan tag of second host, defaults to -1
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    Return:
+        Returns main.TRUE if all verification passed, otherwise return
+        main.FALSE; returns main.FALSE if there is a key error
+    """
+
+    # Assert variables
+    assert main, "There is no main variable"
+    assert name, "variable name is empty"
+    assert host1 and host2, "You must specify hosts"
+
+    global itemName
+    itemName = name
+    h1Id = host1Id
+    h2Id = host2Id
+    h1Mac = mac1
+    h2Mac = mac2
+    vlan1 = vlan1
+    vlan2 = vlan2
+    hostNames = [ host1 , host2 ]
+    intentsId = []
+    stepResult = main.TRUE
+    pingResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+    onosNode = int( onosNode )
+
+    try:
+        if main.hostsData:
+            if not h1Mac:
+                h1Mac = main.hostsData[ host1 ][ 'mac' ]
+            if not h2Mac:
+                h2Mac = main.hostsData[ host2 ][ 'mac' ]
+            if main.hostsData[ host1 ].get( 'vlan' ):
+                vlan1 = main.hostsData[ host1 ][ 'vlan' ]
+            if main.hostsData[ host1 ].get( 'vlan' ):
+                vlan2 = main.hostsData[ host2 ][ 'vlan' ]
+            if not h1Id:
+                h1Id = main.hostsData[ host1 ][ 'id' ]
+            if not h2Id:
+                h2Id = main.hostsData[ host2 ][ 'id' ]
+
+        assert h1Id and h2Id, "You must specify host IDs"
+        if not ( h1Id and h2Id ):
+            main.log.info( "There are no host IDs" )
+            return main.FALSE
+
+    except KeyError:
+        main.log.error( itemName + ": Key error Exception" )
+        return main.FALSE
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Adding host intents
+    main.log.info( itemName + ": Adding host intents" )
+    intent1 = main.CLIs[ onosNode ].addHostIntent( hostIdOne=h1Id,
+                                                   hostIdTwo=h2Id )
+    intentsId.append( intent1 )
+
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+    checkFlowsCount( main )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+    # Verify flows
+    checkFlowsState( main )
+
+    # Ping hosts
+    firstPingResult = main.Mininet1.ping6pair(SRC=hostNames[0], TARGET=main.hostsData[ host2 ][ 'ipAddresses' ][ 0 ])
+    if not firstPingResult:
+        main.log.debug( "First ping failed, there must be" +
+                       " something wrong with ONOS performance" )
+
+    # Ping hosts again...
+    pingTemp = ping6allHosts( main, hostNames )
+    pingResult = pingResult and pingTemp
+    if pingTemp:
+        main.assertReturnString += 'Initial Ping6all Passed\n'
+    else:
+        main.assertReturnString += 'Initial Ping6all Failed\n'
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # Link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+
+        if linkDownResult:
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+        if topoResult:
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = ping6allHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+
+        if pingTemp:
+            main.assertReturnString += 'Link Down Ping6all Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Ping6all Failed\n'
+
+        # Check intent states
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # Link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        time.sleep( main.rerouteSleep )
+
+        if linkUpResult:
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+
+        if topoResult:
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = ping6allHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+
+        if pingTemp:
+            main.assertReturnString += 'Link Up Ping6all Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Ping6all Failed\n'
+
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+
+    if removeIntentResult:
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+
+    stepResult = pingResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def pointIntent( main,
+                 name,
+                 host1,
+                 host2,
+                 onosNode=0,
+                 deviceId1="",
+                 deviceId2="",
+                 port1="",
+                 port2="",
+                 ethType="",
+                 mac1="",
+                 mac2="",
+                 bandwidth="",
+                 lambdaAlloc=False,
+                 ipProto="",
+                 ip1="",
+                 ip2="",
+                 tcp1="",
+                 tcp2="",
+                 sw1="",
+                 sw2="",
+                 expectedLink=0 ):
+
+    """
+    Description:
+        Verify add-point-intent
+    Steps:
+        - Get device ids | ports
+        - Add point intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        host1 - Name of first host
+        host2 - Name of second host
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        deviceId1 - ONOS device id of the first switch, the same as the
+                    location of the first host eg. of:0000000000000001/1,
+                    located at device 1 port 1
+        deviceId2 - ONOS device id of the second switch
+        port1 - The port number where the first host is attached
+        port2 - The port number where the second host is attached
+        ethType - Ethernet type eg. IPV4, IPV6
+        mac1 - Mac address of first host
+        mac2 - Mac address of the second host
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        ip1 - IP address of first host
+        ip2 - IP address of second host
+        tcp1 - TCP port of first host
+        tcp2 - TCP port of second host
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert name, "variable name is empty"
+    assert host1 and host2, "You must specify hosts"
+
+    global itemName
+    itemName = name
+    host1 = host1
+    host2 = host2
+    hostNames = [ host1, host2 ]
+    intentsId = []
+
+    pingResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+    onosNode = int( onosNode )
+
+    # Adding bidirectional point  intents
+    main.log.info( itemName + ": Adding point intents" )
+    intent1 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+                                             egressDevice=deviceId2,
+                                             portIngress=port1,
+                                             portEgress=port2,
+                                             ethType=ethType,
+                                             ethSrc=mac1,
+                                             ethDst=mac2,
+                                             bandwidth=bandwidth,
+                                             lambdaAlloc=lambdaAlloc,
+                                             ipProto=ipProto,
+                                             ipSrc=ip1,
+                                             ipDst=ip2,
+                                             tcpSrc=tcp1,
+                                             tcpDst=tcp2 )
+
+    intentsId.append( intent1 )
+    intent2 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+                                             egressDevice=deviceId1,
+                                             portIngress=port2,
+                                             portEgress=port1,
+                                             ethType=ethType,
+                                             ethSrc=mac2,
+                                             ethDst=mac1,
+                                             bandwidth=bandwidth,
+                                             lambdaAlloc=lambdaAlloc,
+                                             ipProto=ipProto,
+                                             ipSrc=ip2,
+                                             ipDst=ip1,
+                                             tcpSrc=tcp2,
+                                             tcpDst=tcp1 )
+    intentsId.append( intent2 )
+
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+    # Verify flows
+    checkFlowsState( main )
+
+    # Ping hosts
+    pingTemp = ping6allHosts( main, hostNames )
+    pingResult = pingResult and pingTemp
+    if pingTemp:
+        main.assertReturnString += 'Initial Ping6all Passed\n'
+    else:
+        main.assertReturnString += 'Initial Ping6all Failed\n'
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+
+        if linkDownResult:
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+        if topoResult:
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = ping6allHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+        if pingTemp:
+            main.assertReturnString += 'Link Down Ping6all Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Ping6all Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        if linkUpResult:
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+        if topoResult:
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = ping6allHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+        if pingTemp:
+            main.assertReturnString += 'Link Up Ping6all Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Ping6all Failed\n'
+
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+    if removeIntentResult:
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+
+    stepResult = pingResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def pointIntentTcp( main,
+                    name,
+                    host1,
+                    host2,
+                    onosNode=0,
+                    deviceId1="",
+                    deviceId2="",
+                    port1="",
+                    port2="",
+                    ethType="",
+                    mac1="",
+                    mac2="",
+                    bandwidth="",
+                    lambdaAlloc=False,
+                    ipProto="",
+                    ip1="",
+                    ip2="",
+                    tcp1="",
+                    tcp2="",
+                    sw1="",
+                    sw2="",
+                    expectedLink=0 ):
+
+    """
+    Description:
+        Verify add-point-intent only for TCP
+    Steps:
+        - Get device ids | ports
+        - Add point intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        host1 - Name of first host
+        host2 - Name of second host
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        deviceId1 - ONOS device id of the first switch, the same as the
+                    location of the first host eg. of:0000000000000001/1,
+                    located at device 1 port 1
+        deviceId2 - ONOS device id of the second switch
+        port1 - The port number where the first host is attached
+        port2 - The port number where the second host is attached
+        ethType - Ethernet type eg. IPV4, IPV6
+        mac1 - Mac address of first host
+        mac2 - Mac address of the second host
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        ip1 - IP address of first host
+        ip2 - IP address of second host
+        tcp1 - TCP port of first host
+        tcp2 - TCP port of second host
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert name, "variable name is empty"
+    assert host1 and host2, "You must specify hosts"
+
+    global itemName
+    itemName = name
+    host1 = host1
+    host2 = host2
+    hostNames = [ host1, host2 ]
+    intentsId = []
+
+    iperfResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+    onosNode = int( onosNode )
+
+    # Adding bidirectional point  intents
+    main.log.info( itemName + ": Adding point intents" )
+    intent1 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+                                                    egressDevice=deviceId2,
+                                                    portIngress=port1,
+                                                    portEgress=port2,
+                                                    ethType=ethType,
+                                                    ethSrc=mac1,
+                                                    ethDst=mac2,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip1,
+                                                    ipDst=ip2,
+                                                    tcpSrc=tcp1,
+                                                    tcpDst="" )
+
+    intent2 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+                                                    egressDevice=deviceId1,
+                                                    portIngress=port2,
+                                                    portEgress=port1,
+                                                    ethType=ethType,
+                                                    ethSrc=mac2,
+                                                    ethDst=mac1,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip2,
+                                                    ipDst=ip1,
+                                                    tcpSrc=tcp2,
+                                                    tcpDst="" )
+
+    intent3 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+                                                    egressDevice=deviceId2,
+                                                    portIngress=port1,
+                                                    portEgress=port2,
+                                                    ethType=ethType,
+                                                    ethSrc=mac1,
+                                                    ethDst=mac2,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip1,
+                                                    ipDst=ip2,
+                                                    tcpSrc="",
+                                                    tcpDst=tcp2 )
+
+    intent4 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+                                                    egressDevice=deviceId1,
+                                                    portIngress=port2,
+                                                    portEgress=port1,
+                                                    ethType=ethType,
+                                                    ethSrc=mac2,
+                                                    ethDst=mac1,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip2,
+                                                    ipDst=ip1,
+                                                    tcpSrc="",
+                                                    tcpDst=tcp1 )
+    intentsId.append( intent1 )
+    intentsId.append( intent2 )
+    intentsId.append( intent3 )
+    intentsId.append( intent4 )
+
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Verify flows
+    checkFlowsState( main )
+
+    # Run iperf to both host
+    iperfTemp = main.Mininet1.iperftcpipv6( host1,host2 )
+    iperfResult = iperfResult and iperfTemp
+    if iperfTemp:
+        main.assertReturnString += 'Initial Iperf6 Passed\n'
+    else:
+        main.assertReturnString += 'Initial Iperf6 Failed\n'
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+
+        if linkDownResult:
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+        if topoResult:
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+
+        # Run iperf to both host
+        iperfTemp = main.Mininet1.iperftcpipv6( host1,host2 )
+        iperfResult = iperfResult and iperfTemp
+        if iperfTemp:
+            main.assertReturnString += 'Link Down Iperf6 Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Iperf6 Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and iperfResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        if linkUpResult:
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+
+        if topoResult:
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+
+        # Run iperf to both host
+        iperfTemp = main.Mininet1.iperftcpipv6( host1,host2,timeout=10 )
+        iperfResult = iperfResult and iperfTemp
+        if iperfTemp:
+            main.assertReturnString += 'Link Up Iperf6 Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Iperf6 Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and iperfResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+    if removeIntentResult:
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+
+    stepResult = iperfResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def singleToMultiIntent( main,
+                         name,
+                         hostNames="",
+                         onosNode=0,
+                         devices="",
+                         ports="",
+                         ethType="",
+                         macs="",
+                         bandwidth="",
+                         lambdaAlloc=False,
+                         ipProto="",
+                         ipAddresses="",
+                         tcp="",
+                         sw1="",
+                         sw2="",
+                         expectedLink=0 ):
+    """
+    Verify Single to Multi Point intents
+    NOTE:If main.hostsData is not defined, variables data should be passed
+    in the same order index wise. All devices in the list should have the same
+    format, either all the devices have its port or it doesn't.
+    eg. hostName = [ 'h1', 'h2' ,..  ]
+        devices = [ 'of:0000000000000001', 'of:0000000000000002', ...]
+        ports = [ '1', '1', ..]
+        ...
+    Description:
+        Verify add-single-to-multi-intent iterates through the list of given
+        host | devices and add intents
+    Steps:
+        - Get device ids | ports
+        - Add single to multi point intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        hostNames - List of host names
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        devices - List of device ids in the same order as the hosts
+                  in hostNames
+        ports - List of port numbers in the same order as the device in
+                devices
+        ethType - Ethernet type eg. IPV4, IPV6
+        macs - List of hosts mac address in the same order as the hosts in
+               hostNames
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        ipAddresses - IP addresses of host in the same order as the hosts in
+                      hostNames
+        tcp - TCP ports in the same order as the hosts in hostNames
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert hostNames, "You must specify hosts"
+    assert devices or main.hostsData, "You must specify devices"
+
+    global itemName
+    itemName = name
+    tempHostsData = {}
+    intentsId = []
+    onosNode = int( onosNode )
+
+    macsDict = {}
+    ipDict = {}
+    if hostNames and devices:
+        if len( hostNames ) != len( devices ):
+            main.log.debug( "hosts and devices does not have the same length" )
+            return main.FALSE
+        if ports:
+            if len( ports ) != len( devices ):
+                main.log.error( "Ports and devices does " +
+                                "not have the same length" )
+                return main.FALSE
+        else:
+            main.log.info( "Device Ports are not specified" )
+        if macs:
+            for i in range( len( devices ) ):
+                macsDict[ devices[ i ] ] = macs[ i ]
+
+    elif hostNames and not devices and main.hostsData:
+        devices = []
+        main.log.info( "singleToMultiIntent function is using main.hostsData" )
+        for host in hostNames:
+               devices.append( main.hostsData.get( host ).get( 'location' ) )
+               macsDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'mac' )
+               ipDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'ipAddresses' )
+    
+    pingResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+
+    devicesCopy = copy.copy( devices )
+    if ports:
+        portsCopy = copy.copy( ports )
+    main.log.info( itemName + ": Adding single point to multi point intents" )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Adding bidirectional point  intents
+    for i in range( len( devices ) ):
+        ingressDevice = devicesCopy[ i ]
+        egressDeviceList = copy.copy( devicesCopy )
+        egressDeviceList.remove( ingressDevice )
+        if ports:
+            portIngress = portsCopy[ i ]
+            portEgressList = copy.copy( portsCopy )
+            del portEgressList[ i ]
+        else:
+            portIngress = ""
+            portEgressList = None
+        if not macsDict:
+            srcMac = ""
+        else:
+            srcMac = macsDict[ ingressDevice ]
+            if srcMac == None:
+                main.log.debug( "There is no MAC in device - " + ingressDevice )
+                srcMac = ""
+
+        intentsId.append(
+                        main.CLIs[ onosNode ].addSinglepointToMultipointIntent(
+                                            ingressDevice=ingressDevice,
+                                            egressDeviceList=egressDeviceList,
+                                            portIngress=portIngress,
+                                            portEgressList=portEgressList,
+                                            ethType=ethType,
+                                            ethSrc=srcMac,
+                                            bandwidth=bandwidth,
+                                            lambdaAlloc=lambdaAlloc,
+                                            ipProto=ipProto,
+                                            ipSrc="",
+                                            ipDst="",
+                                            tcpSrc="",
+                                            tcpDst="" ) )
+
+    
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+    # Verify flows
+    checkFlowsState( main )
+
+    firstPingResult = main.Mininet1.ping6pair(SRC=hostNames[0], TARGET=main.hostsData[ hostNames[1] ][ 'ipAddresses' ][0])
+    if not firstPingResult:
+        main.log.debug( "First ping failed, there must be" +
+                       " something wrong with ONOS performance" )
+
+    # Ping hosts again...
+    pingTemp = ping6allHosts( main, hostNames )
+    pingResult = pingResult and pingTemp
+    if pingTemp:
+        main.assertReturnString += 'Initial Ping6all Passed\n'
+    else:
+        main.assertReturnString += 'Initial Ping6all Failed\n'
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+
+        if linkDownResult:
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+        if topoResult:
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = ping6allHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+        if pingTemp:
+            main.assertReturnString += 'Link Down Ping6all Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Ping6all Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        if linkUpResult:
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+        if topoResult:
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = ping6allHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+        if pingTemp:
+            main.assertReturnString += 'Link Up Ping6all Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Ping6all Failed\n'
+
+        # Check Intents
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+    if removeIntentResult:
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+
+    stepResult = pingResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def multiToSingleIntent( main,
+                         name,
+                         hostNames="",
+                         onosNode=0,
+                         devices="",
+                         ports="",
+                         ethType="",
+                         macs="",
+                         bandwidth="",
+                         lambdaAlloc=False,
+                         ipProto="",
+                         ipAddresses="",
+                         tcp="",
+                         sw1="",
+                         sw2="",
+                         expectedLink=0 ):
+    """
+    Verify Single to Multi Point intents
+    NOTE:If main.hostsData is not defined, variables data should be passed in the
+    same order index wise. All devices in the list should have the same
+    format, either all the devices have its port or it doesn't.
+    eg. hostName = [ 'h1', 'h2' ,..  ]
+        devices = [ 'of:0000000000000001', 'of:0000000000000002', ...]
+        ports = [ '1', '1', ..]
+        ...
+    Description:
+        Verify add-multi-to-single-intent
+    Steps:
+        - Get device ids | ports
+        - Add multi to single point intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        hostNames - List of host names
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        devices - List of device ids in the same order as the hosts
+                  in hostNames
+        ports - List of port numbers in the same order as the device in
+                devices
+        ethType - Ethernet type eg. IPV4, IPV6
+        macs - List of hosts mac address in the same order as the hosts in
+               hostNames
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        ipAddresses - IP addresses of host in the same order as the hosts in
+                      hostNames
+        tcp - TCP ports in the same order as the hosts in hostNames
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert hostNames, "You must specify hosts"
+    assert devices or main.hostsData, "You must specify devices"
+
+    global itemName
+    itemName = name
+    tempHostsData = {}
+    intentsId = []
+    onosNode = int( onosNode )
+
+    macsDict = {}
+    ipDict = {}
+    if hostNames and devices:
+        if len( hostNames ) != len( devices ):
+            main.log.debug( "hosts and devices does not have the same length" )
+            return main.FALSE
+        if ports:
+            if len( ports ) != len( devices ):
+                main.log.error( "Ports and devices does " +
+                                "not have the same length" )
+                return main.FALSE
+        else:
+            main.log.info( "Device Ports are not specified" )
+        if macs:
+            for i in range( len( devices ) ):
+                macsDict[ devices[ i ] ] = macs[ i ]
+    elif hostNames and not devices and main.hostsData:
+        devices = []
+        main.log.info( "multiToSingleIntent function is using main.hostsData" )
+        for host in hostNames:
+               devices.append( main.hostsData.get( host ).get( 'location' ) )
+               macsDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'mac' )
+               ipDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'ipAddresses' )
+
+    pingResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+
+    devicesCopy = copy.copy( devices )
+    if ports:
+        portsCopy = copy.copy( ports )
+    main.log.info( itemName + ": Adding multi point to single point intents" )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Adding bidirectional point  intents
+    for i in range( len( devices ) ):
+        egressDevice = devicesCopy[ i ]
+        ingressDeviceList = copy.copy( devicesCopy )
+        ingressDeviceList.remove( egressDevice )
+        if ports:
+            portEgress = portsCopy[ i ]
+            portIngressList = copy.copy( portsCopy )
+            del portIngressList[ i ]
+        else:
+            portEgress = ""
+            portIngressList = None
+        if not macsDict:
+            dstMac = ""
+        else:
+            dstMac = macsDict[ egressDevice ]
+            if dstMac == None:
+                main.log.debug( "There is no MAC in device - " + egressDevice )
+                dstMac = ""
+
+        intentsId.append(
+                        main.CLIs[ onosNode ].addMultipointToSinglepointIntent(
+                                            ingressDeviceList=ingressDeviceList,
+                                            egressDevice=egressDevice,
+                                            portIngressList=portIngressList,
+                                            portEgress=portEgress,
+                                            ethType=ethType,
+                                            ethDst=dstMac,
+                                            bandwidth=bandwidth,
+                                            lambdaAlloc=lambdaAlloc,
+                                            ipProto=ipProto,
+                                            ipSrc="",
+                                            ipDst="",
+                                            tcpSrc="",
+                                            tcpDst="" ) )
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+    # Verify flows
+    checkFlowsState( main )
+
+    # Ping hosts...
+    pingTemp = ping6allHosts( main, hostNames )
+    pingResult = pingResult and pingTemp
+    if pingTemp:
+        main.assertReturnString += 'Initial Ping6all Passed\n'
+    else:
+        main.assertReturnString += 'Initial Ping6all Failed\n'
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+
+        if linkDownResult:
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+        if topoResult:
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = ping6allHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+        if pingTemp:
+            main.assertReturnString += 'Link Down Ping6all Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Ping6all Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        if linkUpResult:
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+        if topoResult:
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = ping6allHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+        if pingTemp:
+            main.assertReturnString += 'Link Up Ping6all Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Ping6all Failed\n'
+
+        # Check Intents
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+    if removeIntentResult:
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+
+    stepResult = pingResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def ping6allHosts( main, hostList ):
+    # Ping all host in the hosts list variable
+    main.log.info( "Pinging: " + str( hostList ) )
+    return main.Mininet1.pingIpv6Hosts( hostList )
+
+def getHostsData( main ):
+    """
+        Use fwd app and pingall to discover all the hosts
+    """
+
+    activateResult = main.TRUE
+    appCheck = main.TRUE
+    getDataResult = main.TRUE
+    main.log.info( "Activating reactive forwarding app " )
+    activateResult = main.CLIs[ 0 ].activateApp( "org.onosproject.fwd" )
+    main.CLIs[ 0 ].setCfg( "org.onosproject.provider.host.impl.HostLocationProvider", "ipv6NeighborDiscovery", "true")
+    main.CLIs[ 0 ].setCfg( "org.onosproject.proxyarp.ProxyArp", "ipv6NeighborDiscovery", "true")
+    main.CLIs[ 0 ].setCfg( "org.onosproject.fwd.ReactiveForwarding", "ipv6Forwarding", "true")
+    main.CLIs[ 0 ].setCfg( "org.onosproject.fwd.ReactiveForwarding", "matchIpv6Address", "true")
+    time.sleep( main.fwdSleep )
+
+    for i in range( main.numCtrls ):
+        appCheck = appCheck and main.CLIs[ i ].appToIDCheck()
+        if appCheck != main.TRUE:
+            main.log.warn( main.CLIs[ i ].apps() )
+            main.log.warn( main.CLIs[ i ].appIDs() )
+
+    pingResult = main.Mininet1.pingall( protocol="IPv6", timeout = 600 )
+    hostsJson = json.loads( main.CLIs[ 0 ].hosts() )
+    hosts = main.Mininet1.getHosts().keys()
+    for host in hosts:
+        main.hostsData[ host ] = {}
+        main.hostsData[ host ][ 'mac' ] =  \
+            main.Mininet1.getMacAddress( host ).upper()
+        for hostj in hostsJson:
+            if main.hostsData[ host ][ 'mac' ] == hostj[ 'mac' ]:
+                main.hostsData[ host ][ 'id' ] = hostj[ 'id' ]
+                main.hostsData[ host ][ 'vlan' ] = hostj[ 'vlan' ]
+                main.hostsData[ host ][ 'location' ] = \
+                            hostj[ 'location' ][ 'elementId' ] + '/' + \
+                            hostj[ 'location' ][ 'port' ]
+                main.hostsData[ host ][ 'ipAddresses' ] = hostj[ 'ipAddresses' ]
+
+    main.log.info( "Deactivating reactive forwarding app " )
+    deactivateResult = main.CLIs[ 0 ].deactivateApp( "org.onosproject.fwd" )
+    if activateResult and deactivateResult and main.hostsData:
+        main.log.info( "Successfully used fwd app to discover hosts " )
+        getDataResult = main.TRUE
+    else:
+        main.log.info( "Failed to use fwd app to discover hosts " )
+        getDataResult = main.FALSE
+
+    main.log.info( "Removing the automatically configured ipv6 link-local addresses in hostsData to avoid unnecessary ping with these addresses during initial ping test - link-local starts with 'fe' " )
+    for host in main.hostsData.keys():
+     if main.hostsData[ host ].get( 'ipAddresses' ) != None:
+      main.hostsData[ host ][ 'ipAddresses' ] = [ v for v in main.hostsData[ host ][ 'ipAddresses' ] if not v.startswith('fe') ]
+    print main.hostsData
+    return getDataResult
+
+def checkTopology( main, expectedLink ):
+    statusResult = main.TRUE
+    # Check onos topology
+    main.log.info( itemName + ": Checking ONOS topology " )
+
+    for i in range( main.numCtrls ):
+        topologyResult = main.CLIs[ i ].topology()
+        statusResult = main.ONOSbench.checkStatus( topologyResult,
+                                                   main.numSwitch,
+                                                   expectedLink )\
+                       and statusResult
+    if not statusResult:
+        main.log.error( itemName + ": Topology mismatch" )
+    else:
+        main.log.info( itemName + ": Topology match" )
+    return statusResult
+
+def checkIntentState( main, intentsId ):
+    """
+        This function will check intent state to make sure all the intents
+        are in INSTALLED state
+    """
+
+    intentResult = main.TRUE
+    results = []
+
+    main.log.info( itemName + ": Checking intents state" )
+    # First check of intents
+    for i in range( main.numCtrls ):
+        tempResult = main.CLIs[ i ].checkIntentState( intentsId=intentsId )
+        results.append( tempResult )
+
+    expectedState = [ 'INSTALLED', 'INSTALLING' ]
+
+    if all( result == main.TRUE for result in results ):
+        main.log.info( itemName + ": Intents are installed correctly" )
+    else:
+        # Wait for at least 5 second before checking the intents again
+        main.log.error( "Intents are not installed correctly. Waiting 5 sec" )
+        time.sleep( 5 )
+        results = []
+        # Second check of intents since some of the intents may be in
+        # INSTALLING state, they should be in INSTALLED at this time
+        for i in range( main.numCtrls ):
+            tempResult = main.CLIs[ i ].checkIntentState(
+                                                        intentsId=intentsId )
+            results.append( tempResult )
+        if all( result == main.TRUE for result in results ):
+            main.log.info( itemName + ": Intents are installed correctly" )
+            intentResult = main.TRUE
+        else:
+            main.log.error( itemName + ": Intents are NOT installed correctly" )
+            intentResult = main.FALSE
+
+    return intentResult
+
+def checkFlowsState( main ):
+
+    main.log.info( itemName + ": Check flows state" )
+    checkFlowsResult = main.CLIs[ 0 ].checkFlowsState()
+    return checkFlowsResult
+
+def link( main, sw1, sw2, option):
+
+    # link down
+    main.log.info( itemName + ": Bring link " + option + "between " +
+                       sw1 + " and " + sw2 )
+    linkResult = main.Mininet1.link( end1=sw1, end2=sw2, option=option )
+    return linkResult
+
+def removeAllIntents( main, intentsId ):
+    """
+        Remove all intents in the intentsId
+    """
+
+    onosSummary = []
+    removeIntentResult = main.TRUE
+    # Remove intents
+    for intent in intentsId:
+        main.CLIs[ 0 ].removeIntent( intentId=intent, purge=True )
+
+    time.sleep( main.removeIntentSleep )
+
+    # If there is remianing intents then remove intents should fail
+    for i in range( main.numCtrls ):
+        onosSummary.append( json.loads( main.CLIs[ i ].summary() ) )
+
+    for summary in onosSummary:
+        if summary.get( 'intents' ) != 0:
+            main.log.warn( itemName + ": There are " +
+                           str( summary.get( 'intents' ) ) +
+                           " intents remaining in node " +
+                           str( summary.get( 'node' ) ) +
+                           ", failed to remove all the intents " )
+            removeIntentResult = main.FALSE
+
+    if removeIntentResult:
+        main.log.info( itemName + ": There are no more intents remaining, " +
+                       "successfully removed all the intents." )
+
+    return removeIntentResult
+
+def checkFlowsCount( main ):
+    """
+        Check flows count in each node
+    """
+
+    flowsCount = []
+    main.log.info( itemName + ": Checking flows count in each ONOS node" )
+    for i in range( main.numCtrls ):
+        summaryResult = main.CLIs[ i ].summary()
+        if not summaryResult:
+            main.log.error( itemName + ": There is something wrong with " +
+                            "summary command" )
+            return main.FALSE
+        else:
+            summaryJson = json.loads( summaryResult )
+            flowsCount.append( summaryJson.get( 'flows' ) )
+
+    if flowsCount:
+        if all( flows==flowsCount[ 0 ] for flows in flowsCount ):
+            main.log.info( itemName + ": There are " + str( flowsCount[ 0 ] ) +
+                           " flows in all ONOS node" )
+        else:
+            for i in range( main.numCtrls ):
+                main.log.debug( itemName + ": ONOS node " + str( i ) + " has " +
+                                str( flowsCount[ i ] ) + " flows" )
+    else:
+        main.log.error( "Checking flows count failed, check summary command" )
+        return main.FALSE
+
+    return main.TRUE
+
+def checkLeaderChange( leaders1, leaders2 ):
+    """
+        Checks for a change in intent partition leadership.
+
+        Takes the output of leaders -c in json string format before and after
+        a potential change as input
+
+        Returns main.TRUE if no mismatches are detected
+        Returns main.FALSE if there is a mismatch or on error loading the input
+    """
+    try:
+        leaders1 = json.loads( leaders1 )
+        leaders2 = json.loads( leaders2 )
+    except ( AttributeError, TypeError):
+        main.log.exception( self.name + ": Object not as expected" )
+        return main.FALSE
+    except Exception:
+        main.log.exception( self.name + ": Uncaught exception!" )
+        main.cleanup()
+        main.exit()
+    main.log.info( "Checking Intent Paritions for Change in Leadership" )
+    mismatch = False
+    for dict1 in leaders1:
+        if "intent" in dict1.get( "topic", [] ):
+            for dict2 in leaders2:
+                if dict1.get( "topic", 0 ) == dict2.get( "topic", 0 ) and \
+                    dict1.get( "leader", 0 ) != dict2.get( "leader", 0 ):
+                    mismatch = True
+                    main.log.error( "{0} changed leader from {1} to {2}".\
+                        format( dict1.get( "topic", "no-topic" ),\
+                            dict1.get( "leader", "no-leader" ),\
+                            dict2.get( "leader", "no-leader" ) ) )
+    if mismatch:
+        return main.FALSE
+    else:
+        return main.TRUE
+
+def report( main ):
+    """
+    Report errors/warnings/exceptions
+    """
+
+    main.ONOSbench.logReport( main.ONOSip[ 0 ],
+                              [ "INFO",
+                                "FOLLOWER",
+                                "WARN",
+                                "flow",
+                                "ERROR",
+                                "Except" ],
+                              "s" )
+
+    main.log.info( "ERROR report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "ERROR" ],
+                "d" )
+
+    main.log.info( "EXCEPTIONS report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "Except" ],
+                "d" )
+
+    main.log.info( "WARNING report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "WARN" ],
+                "d" )
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/dependencies/newFuncTopo.py b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/newFuncTopo.py
new file mode 100755
index 0000000..d4731f3
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/newFuncTopo.py
@@ -0,0 +1,144 @@
+#!/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 VLANHost( Host ):
+    def config( self, vlan=100, v6Addr='3000::1/64', **params ):
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ifconfig %s inet 0' % intf )
+        self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ip -6 addr add %s dev %s.%d' % ( v6Addr, intf, vlan ) )
+        newName = '%s.%d' % ( intf, vlan )
+        intf.name = newName
+        self.nameToIntf[ newName ] = intf
+        return r
+
+class IPv6Host( Host ):
+    def config( self, v6Addr='1000::1/64', **params ):
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ifconfig %s inet 0' % intf )
+        self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
+        return r
+
+class dualStackHost( Host ):
+    def config( self, v6Addr='2000:1/64', **params ):
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
+        return r
+
+class MyTopo( Topo ):
+
+    def __init__( self ):
+        # Initialize topology
+        Topo.__init__( self )
+        # Switch S5 Hosts
+        host1=self.addHost( 'h1', cls=IPv6Host, v6Addr='10:1:0::1/64' )
+        host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
+        # Dual Stack Host
+        host3=self.addHost( 'h3', cls=dualStackHost, v6Addr='2000::2/64' )
+        host4=self.addHost( 'h4', cls=IPv6Host, v6Addr='3000::2/64' )
+        #VLAN
+        host5=self.addHost( 'h5', cls=VLANHost,v6Addr='4000::2/64' )
+        host6=self.addHost( 'h6', cls=IPv6Host, v6Addr='11:1:0::2/64' )
+        host7=self.addHost( 'h7', cls=IPv6Host, v6Addr='12:1:0::2/64' )
+        host8=self.addHost( 'h8', cls=IPv6Host, v6Addr='10:1:0::4/64' )
+
+        # Switch S6 Hosts
+        host9=self.addHost( 'h9', cls=IPv6Host, v6Addr='10:1:0::5/64' )
+        host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
+        # Dual Stack Host
+        host11=self.addHost( 'h11', cls=dualStackHost, v6Addr='2000::3/64' )
+        host12=self.addHost( 'h12', cls=IPv6Host, v6Addr='3000::3/64' )
+        host13=self.addHost( 'h13', cls=IPv6Host, v6Addr='4000::3/64' )
+        host14=self.addHost( 'h14', cls=IPv6Host, v6Addr='11:1:0::3/64' )
+        host15=self.addHost( 'h15', cls=IPv6Host, v6Addr='12:1:0::3/64' )
+        host16=self.addHost( 'h16', cls=IPv6Host, v6Addr='10:1:0::7/64' )
+
+        # Switch S7 Hosts
+        host17=self.addHost( 'h17', cls=IPv6Host, v6Addr='10:1:0::8/64' )
+        host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
+        host19=self.addHost( 'h19', cls=IPv6Host, v6Addr='10:1:0::9/64' )
+        host20=self.addHost( 'h20', cls=IPv6Host, v6Addr='100:1:0::4/64' )
+        host21=self.addHost( 'h21', cls=IPv6Host, v6Addr='200:1:0::4/64' )
+        host22=self.addHost( 'h22', cls=IPv6Host, v6Addr='11:1:0::4/64' )
+        host23=self.addHost( 'h23', cls=IPv6Host, v6Addr='12:1:0::4/64' )
+        # VLAN 
+        host24=self.addHost( 'h24', cls=VLANHost, v6Addr='4000::5/64' )
+
+        s1 = self.addSwitch( 's1' )
+        s2 = self.addSwitch( 's2' )
+        s3 = self.addSwitch( 's3' )
+        s4 = self.addSwitch( 's4' )
+        s5 = self.addSwitch( 's5' )
+        s6 = self.addSwitch( 's6' )
+        s7 = self.addSwitch( 's7' )
+
+        self.addLink(s5,host1)
+        self.addLink(s5,host2)
+        self.addLink(s5,host3)
+        self.addLink(s5,host4)
+        self.addLink(s5,host5)
+        self.addLink(s5,host6)
+        self.addLink(s5,host7)
+        self.addLink(s5,host8)
+
+        self.addLink(s6,host9)
+        self.addLink(s6,host10)
+        self.addLink(s6,host11)
+        self.addLink(s6,host12)
+        self.addLink(s6,host13)
+        self.addLink(s6,host14)
+        self.addLink(s6,host15)
+        self.addLink(s6,host16)
+
+        self.addLink(s7,host17)
+        self.addLink(s7,host18)
+        self.addLink(s7,host19)
+        self.addLink(s7,host20)
+        self.addLink(s7,host21)
+        self.addLink(s7,host22)
+        self.addLink(s7,host23)
+        self.addLink(s7,host24)
+
+        self.addLink(s1,s2)
+        self.addLink(s1,s3)
+        self.addLink(s1,s4)
+        self.addLink(s1,s5)
+        self.addLink(s2,s3)
+        self.addLink(s2,s5)
+        self.addLink(s2,s6)
+        self.addLink(s3,s4)
+        self.addLink(s3,s6)
+        self.addLink(s4,s7)
+        topos = { 'mytopo': ( lambda: MyTopo() ) }
+
+# HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
+
+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/FUNCipv6Intent/dependencies/startUp.py b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/startUp.py
new file mode 100644
index 0000000..2ec1ae4
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/startUp.py
@@ -0,0 +1,34 @@
+"""
+    This wrapper function is use for starting up onos instance
+"""
+
+import time
+import os
+import json
+
+def onosBuild( main, gitBranch ):
+    """
+        This includes pulling ONOS and building it using maven install
+    """
+
+    buildResult = main.FALSE
+
+    # Git checkout a branch of ONOS
+    checkOutResult = main.ONOSbench.gitCheckout( gitBranch )
+    # Does the git pull on the branch that was checked out
+    if not checkOutResult:
+        main.log.warn( "Failed to checked out " + gitBranch +
+                                           " branch")
+    else:
+        main.log.info( "Successfully checked out " + gitBranch +
+                                           " branch")
+    gitPullResult = main.ONOSbench.gitPull()
+    if gitPullResult == main.ERROR:
+        main.log.error( "Error pulling git branch" )
+    else:
+        main.log.info( "Successfully pulled " + gitBranch + " branch" )
+
+    # Maven clean install
+    buildResult = main.ONOSbench.cleanInstall()
+
+    return buildResult
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/dependencies/topo.py b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/topo.py
new file mode 100644
index 0000000..d834a09
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/topo.py
@@ -0,0 +1,98 @@
+"""
+    These functions can be used for topology comparisons
+"""
+
+import time
+import os
+import json
+
+def getAllDevices( main ):
+    """
+        Return a list containing the devices output from each ONOS node
+    """
+    devices = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].devices,
+                         name="devices-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        devices.append( t.result )
+    return devices
+
+def getAllHosts( main ):
+    """
+        Return a list containing the hosts output from each ONOS node
+    """
+    hosts = []
+    ipResult = main.TRUE
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].hosts,
+                         name="hosts-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        hosts.append( t.result )
+    return hosts
+
+def getAllPorts( main ):
+    """
+        Return a list containing the ports output from each ONOS node
+    """
+    ports = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].ports,
+                         name="ports-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        ports.append( t.result )
+    return ports
+
+def getAllLinks( main ):
+    """
+        Return a list containing the links output from each ONOS node
+    """
+    links = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].links,
+                         name="links-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        links.append( t.result )
+    return links
+
+def getAllClusters( main ):
+    """
+        Return a list containing the clusters output from each ONOS node
+    """
+    clusters = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].clusters,
+                         name="clusters-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        clusters.append( t.result )
+    return clusters
diff --git a/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.params b/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.params
new file mode 100644
index 0000000..bf5fbac
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.params
@@ -0,0 +1,42 @@
+<PARAMS>
+    # CASE - Description
+    # 1 - Variable initialization and optional pull and build ONOS package
+    # 2 - Install ONOS
+    # 9 - Report logs
+    # 10 - Start Mininet with Openflow 1.0
+    # 11 - Start Mininet with Openflow 1.3
+    # 12 - Assign switch to controller
+    # 14 - Stop Mininet
+    # 20 - Add NetCfgs for undiscovered devices
+    # 21 - Check NetCfgs after devices connect
+    # 22 - Add NetCfgs for discovered devices
+    # 23 - Check NetCfgs after all devices are connected and NetCfgs are set
+    # 24 - Remove NetCfgs
+
+    <testcases>1,2,20,11,21,22,23,24</testcases>
+
+    <DEPENDENCY>
+        <path>/tests/FUNC/FUNCnetCfg/dependencies/</path>
+        <wrapper1>startUp</wrapper1>
+        <wrapper2>netCfg</wrapper2>
+        <wrapper3>topo</wrapper3>
+    </DEPENDENCY>
+
+    <ENV>
+        <cellApps>drivers,openflow,proxyarp,mobility</cellApps>
+    </ENV>
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <SLEEP>
+        <startup>15</startup>
+        <cfgGossip>2</cfgGossip>
+    </SLEEP>
+
+    <MININET>
+        <switch>4</switch>
+    </MININET>
+
+</PARAMS>
diff --git a/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.py b/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.py
new file mode 100644
index 0000000..34bc72b
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.py
@@ -0,0 +1,760 @@
+
+# Testing the basic intent functionality of ONOS
+
+class FUNCnetCfg:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        import imp
+        import re
+
+        """
+        - Construct tests variables
+        - GIT ( optional )
+            - Checkout ONOS master branch
+            - Pull latest ONOS code
+        - Building ONOS ( optional )
+            - Install ONOS package
+            - Build ONOS package
+        """
+
+        main.case( "Constructing test variables and building ONOS package" )
+        main.step( "Constructing test variables" )
+        main.caseExplanation = "This test case is mainly for loading " +\
+                               "from params file, and pull and build the " +\
+                               " latest ONOS package"
+        stepResult = main.FALSE
+
+        # Test variables
+        try:
+            main.testOnDirectory = re.sub( "(/tests)$", "", main.testDir )
+            main.apps = main.params[ 'ENV' ][ 'cellApps' ]
+            gitBranch = main.params[ 'GIT' ][ 'branch' ]
+            main.dependencyPath = main.testOnDirectory + \
+                                  main.params[ 'DEPENDENCY' ][ 'path' ]
+            if main.ONOSbench.maxNodes:
+                main.maxNodes = int( main.ONOSbench.maxNodes )
+            else:
+                main.maxNodes = 0
+            wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
+            wrapperFile2 = main.params[ 'DEPENDENCY' ][ 'wrapper2' ]
+            wrapperFile3 = main.params[ 'DEPENDENCY' ][ 'wrapper3' ]
+            main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+            main.gossipTime = int( main.params[ 'SLEEP'][ 'cfgGossip' ] )
+            gitPull = main.params[ 'GIT' ][ 'pull' ]
+            main.cellData = {}  # for creating cell file
+            main.hostsData = {}
+            main.nodes = []
+            main.ONOSip = []
+
+            main.ONOSip = main.ONOSbench.getOnosIps()
+
+            # Assigning ONOS cli handles to a list
+            try:
+                for i in range( 1, main.maxNodes + 1 ):
+                    main.nodes.append( getattr( main, 'ONOSrest' + str( i ) ) )
+            except AttributeError:
+                main.log.warn( "A " + str( main.maxNodes ) + " node cluster " +
+                               "was defined in env variables, but only " +
+                               str( len( main.nodes ) ) +
+                               " nodes were defined in the .topo file. " +
+                               "Using " + str( len( main.nodes ) ) +
+                               " nodes for the test." )
+
+            main.numCtrls = len( main.nodes )
+
+            # -- INIT SECTION, SHOULD ONLY BE RUN ONCE -- #
+            main.startUp = imp.load_source( wrapperFile1,
+                                            main.dependencyPath +
+                                            wrapperFile1 +
+                                            ".py" )
+
+            main.netCfg = imp.load_source( wrapperFile2,
+                                           main.dependencyPath +
+                                           wrapperFile2 +
+                                           ".py" )
+
+            main.topo = imp.load_source( wrapperFile3,
+                                         main.dependencyPath +
+                                         wrapperFile3 +
+                                         ".py" )
+
+            if main.nodes:
+                stepResult = main.TRUE
+            else:
+                main.log.error( "Did not properly created list of ONOS handle" )
+                stepResult = main.FALSE
+        except Exception as e:
+            main.log.exception(e)
+            main.cleanup()
+            main.exit()
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully construct " +
+                                        "test variables ",
+                                 onfail="Failed to construct test variables" )
+
+        if gitPull == 'True':
+            main.step( "Building ONOS in " + gitBranch + " branch" )
+            onosBuildResult = main.startUp.onosBuild( main, gitBranch )
+            stepResult = onosBuildResult
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=stepResult,
+                                     onpass="Successfully compiled " +
+                                            "latest ONOS",
+                                     onfail="Failed to compile " +
+                                            "latest ONOS" )
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+        main.ONOSbench.getVersion( report=True )
+
+    def CASE2( self, main ):
+        """
+        - Set up cell
+            - Create cell file
+            - Set cell file
+            - Verify cell file
+        - Kill ONOS process
+        - Uninstall ONOS cluster
+        - Verify ONOS start up
+        - Install ONOS cluster
+        - Connect to cli
+        """
+        import time
+        main.case( "Starting up " + str( main.numCtrls ) +
+                   " node(s) ONOS cluster" )
+        main.caseExplanation = "Set up ONOS with " + str( main.numCtrls ) +\
+                                " node(s) ONOS cluster"
+
+        # kill off all onos processes
+        main.log.info( "Safety check, killing all ONOS processes" +
+                       " before initiating environment setup" )
+
+        for i in range( main.maxNodes ):
+            main.ONOSbench.onosStop( main.ONOSip[ i ] )
+            main.ONOSbench.onosDie( main.ONOSip[ i ] )
+
+        tempOnosIp = []
+        for i in range( main.numCtrls ):
+            tempOnosIp.append( main.ONOSip[i] )
+
+        main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
+                                       "temp", main.Mininet1.ip_address,
+                                       main.apps, tempOnosIp )
+
+        main.step( "Apply cell to environment" )
+        cellResult = main.ONOSbench.setCell( "temp" )
+        verifyResult = main.ONOSbench.verifyCell()
+        stepResult = cellResult and verifyResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully applied cell to environment",
+                                 onfail="Failed to apply cell to environment " )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+        stepResult = packageResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully created ONOS package",
+                                 onfail="Failed to create ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Uninstalling ONOS package" )
+        onosUninstallResult = main.TRUE
+        for ip in main.ONOSip:
+            onosUninstallResult = onosUninstallResult and \
+                    main.ONOSbench.onosUninstall( nodeIp=ip )
+        stepResult = onosUninstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully uninstalled ONOS package",
+                                 onfail="Failed to uninstall ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Installing ONOS package" )
+        onosInstallResult = main.TRUE
+        for i in range( main.numCtrls ):
+            onosInstallResult = onosInstallResult and \
+                    main.ONOSbench.onosInstall( node=main.ONOSip[ i ] )
+        stepResult = onosInstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully installed ONOS package",
+                                 onfail="Failed to install ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Starting ONOS service" )
+        stopResult = main.TRUE
+        startResult = main.TRUE
+        onosIsUp = main.TRUE
+
+        for i in range( main.numCtrls ):
+            onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
+        if onosIsUp == main.TRUE:
+            main.log.report( "ONOS instance is up and ready" )
+        else:
+            main.log.report( "ONOS instance may not be up, stop and " +
+                             "start ONOS again " )
+            for i in range( main.numCtrls ):
+                stopResult = stopResult and \
+                        main.ONOSbench.onosStop( main.ONOSip[ i ] )
+            for i in range( main.numCtrls ):
+                startResult = startResult and \
+                        main.ONOSbench.onosStart( main.ONOSip[ i ] )
+        stepResult = onosIsUp and stopResult and startResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ONOS service is ready",
+                                 onfail="ONOS service did not start properly" )
+
+    def CASE8( self, main ):
+        """
+        Compare Topo
+        """
+        import json
+
+        main.case( "Compare ONOS Topology view to Mininet topology" )
+        main.caseExplanation = "Compare topology elements between Mininet" +\
+                                " and ONOS"
+
+        main.step( "Gathering topology information" )
+        # TODO: add a parameterized sleep here
+        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()
+
+        main.step( "Comparing MN topology to ONOS topology" )
+        for controller in range( main.numCtrls ):
+            controllerStr = str( controller + 1 )
+            if devices[ controller ] and ports[ controller ] and\
+               "Error" not in devices[ controller ] and\
+               "Error" not in ports[ controller ]:
+
+                currentDevicesResult = main.Mininet1.compareSwitches(
+                        mnSwitches,
+                        json.loads( devices[ controller ] ),
+                        json.loads( ports[ controller ] ) )
+            else:
+                currentDevicesResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentDevicesResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " Switches view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " Switches view is incorrect" )
+
+            if links[ controller ] and "Error" not in links[ controller ]:
+                currentLinksResult = main.Mininet1.compareLinks(
+                        mnSwitches, mnLinks,
+                        json.loads( links[ controller ] ) )
+            else:
+                currentLinksResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentLinksResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " links view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " links view is incorrect" )
+
+            if hosts[ controller ] or "Error" not in hosts[ controller ]:
+                currentHostsResult = main.Mininet1.compareHosts(
+                        mnHosts,
+                        json.loads( hosts[ controller ] ) )
+            else:
+                currentHostsResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentHostsResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " hosts exist in Mininet",
+                                     onfail="ONOS" + controllerStr +
+                                     " hosts don't match Mininet" )
+
+    def CASE9( self, main ):
+        '''
+            Report errors/warnings/exceptions
+        '''
+        main.log.info( "Error report: \n" )
+        main.ONOSbench.logReport(
+                globalONOSip[0],
+                [ "INFO", "WARN", "ERROR" , "Except" ],
+                "s" )
+        # main.ONOSbench.logReport( globalONOSip[1], [ "INFO" ], "d" )
+
+    def CASE10( self, main ):
+        """
+            Start Mininet topology with OF 1.0 switches
+        """
+        main.OFProtocol = "1.0"
+        main.log.report( "Start Mininet topology with OF 1.0 switches" )
+        main.case( "Start Mininet topology with OF 1.0 switches" )
+        main.caseExplanation = "Start mininet topology with OF 1.0 " +\
+                                "switches to test intents, exits out if " +\
+                                "topology did not start correctly"
+
+        main.step( "Starting Mininet topology with OF 1.0 switches" )
+        args = "--controller none --switch ovs,protocols=OpenFlow10"
+        switches = int( main.params['MININET']['switch'] )
+        cmd = "mn --topo linear,{} {}".format( switches, args )
+        topoResult = main.Mininet1.startNet( mnCmd = cmd )
+        stepResult = topoResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully loaded topology",
+                                 onfail="Failed to load topology" )
+        # Exit if topology did not load properly
+        if not topoResult:
+            main.cleanup()
+            main.exit()
+
+    def CASE11( self, main ):
+        """
+            Start Mininet topology with OF 1.3 switches
+        """
+        import re
+        main.OFProtocol = "1.3"
+        main.log.report( "Start Mininet topology with OF 1.3 switches" )
+        main.case( "Start Mininet topology with OF 1.3 switches" )
+        main.caseExplanation = "Start mininet topology with OF 1.3 " +\
+                                "switches to test intents, exits out if " +\
+                                "topology did not start correctly"
+
+        main.step( "Starting Mininet topology with OF 1.3 switches" )
+        args = "--controller none --switch ovs,protocols=OpenFlow13"
+        switches = int( main.params['MININET']['switch'] )
+        cmd = "mn --topo linear,{} {}".format( switches, args )
+        topoResult = main.Mininet1.startNet( mnCmd = cmd )
+        stepResult = topoResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully loaded topology",
+                                 onfail="Failed to load topology" )
+        # Exit if topology did not load properly
+        if not topoResult:
+            main.cleanup()
+            main.exit()
+
+        tempONOSip = []
+        for i in range( main.numCtrls ):
+            tempONOSip.append( main.ONOSip[ i ] )
+
+        swList = [ "s" + str( i ) for i in range( 1, switches + 1 ) ]
+        assignResult = main.Mininet1.assignSwController( sw=swList,
+                                                         ip=tempONOSip,
+                                                         port='6653' )
+        if not assignResult:
+            main.cleanup()
+            main.exit()
+
+        assignResult = main.TRUE
+        for sw in swList:
+            response = main.Mininet1.getSwController( "s" + str( i ) )
+            main.log.info( "Response is " + str( response ) )
+            for ip in tempONOSip:
+                if re.search( "tcp:" + ip, response ):
+                    assignResult = assignResult and main.TRUE
+                else:
+                    assignResult = assignResult and main.FALSE
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully assigned switches" +
+                                        "to controller",
+                                 onfail="Failed to assign switches to " +
+                                        "controller" )
+
+    def CASE14( self, main ):
+        """
+            Stop mininet
+        """
+        main.log.report( "Stop Mininet topology" )
+        main.case( "Stop Mininet topology" )
+        main.caseExplanation = "Stopping the current mininet topology " +\
+                                "to start up fresh"
+
+        main.step( "Stopping Mininet Topology" )
+        topoResult = main.Mininet1.stopNet( )
+        stepResult = topoResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully stop mininet",
+                                 onfail="Failed to stop mininet" )
+        # Exit if topology did not load properly
+        if not topoResult:
+            main.cleanup()
+            main.exit()
+
+    def CASE20( self, main ):
+        """
+        Add some device configurations and then check they are distributed
+        to all nodes
+        """
+        main.case( "Add Network configurations to the cluster" )
+        main.caseExplanation = "Add Network Configurations for devices" +\
+                               " not discovered yet. One device is allowed" +\
+                               ", the other disallowed."
+        pprint = main.nodes[0].pprint
+
+        main.step( "Add Net Cfg for switch1" )
+        s1Json = { "rackAddress": 1,
+                   "name": "Switch1",
+                   "owner": "Jimmy",
+                   "allowed": True }
+        main.s1Json = s1Json
+        setS1Allow = main.ONOSrest1.setNetCfg( s1Json,
+                                               subjectClass="devices",
+                                               subjectKey="of:0000000000000001",
+                                               configKey="basic" )
+        s1Result = False
+        if setS1Allow:
+            # Check what we set is what is in ONOS
+            getS1 = main.ONOSrest1.getNetCfg( subjectClass="devices",
+                                              subjectKey="of:0000000000000001",
+                                              configKey="basic" )
+            onosCfg = pprint( getS1 )
+            sentCfg = pprint( s1Json )
+            if onosCfg == sentCfg:
+                s1Result = True
+            else:
+                main.log.error( "ONOS NetCfg doesn't match what was sent" )
+                main.log.debug( "ONOS config: {}".format( onosCfg ) )
+                main.log.debug( "Sent config: {}".format( sentCfg ) )
+        utilities.assert_equals( expect=True,
+                                 actual=s1Result,
+                                 onpass="Net Cfg added for device s1",
+                                 onfail="Net Cfg for device s1 not correctly set" )
+
+        main.step( "Add Net Cfg for switch3" )
+        s3Json = { "rackAddress": 3,
+                   "name": "Switch3",
+                   "owner": "Jane",
+                   "allowed": False }
+        main.s3Json = s3Json
+        setS3Disallow = main.ONOSrest1.setNetCfg( s3Json,
+                                                  subjectClass="devices",
+                                                  subjectKey="of:0000000000000003",
+                                                  configKey="basic" )
+        s3Result = False
+        if setS3Disallow:
+            # Check what we set is what is in ONOS
+            getS3 = main.ONOSrest1.getNetCfg( subjectClass="devices",
+                                              subjectKey="of:0000000000000003",
+                                              configKey="basic" )
+            onosCfg = pprint( getS3 )
+            sentCfg = pprint( s3Json )
+            if onosCfg == sentCfg:
+                s3Result = True
+            else:
+                main.log.error( "ONOS NetCfg doesn't match what was sent" )
+                main.log.debug( "ONOS config: {}".format( onosCfg ) )
+                main.log.debug( "Sent config: {}".format( sentCfg ) )
+        utilities.assert_equals( expect=True,
+                                 actual=s3Result,
+                                 onpass="Net Cfg added for device s3",
+                                 onfail="Net Cfg for device s3 not correctly set" )
+        main.netCfg.compareCfg( main, main.gossipTime )
+
+    def CASE21( self, main ):
+        """
+        Initial check of devices
+        """
+        import json
+        try:
+            assert main.s1Json, "s1Json not defined"
+        except AssertionError:
+            main.log.exception( "Case Prerequisites not set: " )
+            main.cleanup()
+            main.exit()
+        main.case( "Check Devices After they initially connect to ONOS" )
+
+        main.netCfg.compareCfg( main )
+
+        main.step( "ONOS should only show devices S1, S2, and S4" )
+        devices = main.ONOSrest1.devices()
+        main.log.debug( main.ONOSrest1.pprint( devices ) )
+        allowedDevices = [ "of:{}".format( str( i ).zfill( 16 ) ) for i in [ 1, 2, 4 ] ]
+        print allowedDevices
+        onosDevices = []
+        for sw in json.loads( devices ):
+            onosDevices.append( str( sw['id'] ) )
+        onosDevices.sort()
+        print onosDevices
+        utilities.assert_equals( expect=allowedDevices,
+                                 actual=onosDevices,
+                                 onpass="Only allowed devices are in ONOS",
+                                 onfail="ONOS devices doesn't match the list" +
+                                        " of allowed devices" )
+
+        main.step( "Check device annotations" )
+        keys = [ 'name', 'owner', 'rackAddress' ]
+        for sw in json.loads( devices ):
+            if "of:0000000000000001" in sw['id']:
+                s1Correct = True
+                for k in keys:
+                    if str( sw.get( 'annotations', {} ).get( k ) ) != str( main.s1Json[k] ):
+                        s1Correct = False
+                        main.log.debug( "{} is wrong on s1".format( k ) )
+                if not s1Correct:
+                    main.log.error( "Annotations for s1 are incorrect: {}".format( sw ) )
+        try:
+            stepResult = s1Correct
+        except NameError:
+            stepResult = False
+            main.log.error( "s1 not found in devices" )
+        utilities.assert_equals( expect=True,
+                                 actual=stepResult,
+                                 onpass="Configured device's annotations are correct",
+                                 onfail="Incorrect annotations for configured devices." )
+
+    def CASE22( self, main ):
+        """
+        Add some device configurations for connected devices and then check
+        they are distributed to all nodes
+        """
+        main.case( "Add Network configurations for connected devices to the cluster" )
+        main.caseExplanation = "Add Network Configurations for discovered " +\
+                               "devices. One device is allowed" +\
+                               ", the other disallowed."
+        pprint = main.nodes[0].pprint
+
+        main.step( "Add Net Cfg for switch2" )
+        s2Json = { "rackAddress": 2,
+                   "name": "Switch2",
+                   "owner": "Jenny",
+                   "allowed": True }
+        main.s2Json = s2Json
+        setS2Allow = main.ONOSrest2.setNetCfg( s2Json,
+                                               subjectClass="devices",
+                                               subjectKey="of:0000000000000002",
+                                               configKey="basic" )
+        s2Result = False
+        if setS2Allow:
+            # Check what we set is what is in ONOS
+            getS2 = main.ONOSrest2.getNetCfg( subjectClass="devices",
+                                              subjectKey="of:0000000000000002",
+                                              configKey="basic" )
+            onosCfg = pprint( getS2 )
+            sentCfg = pprint( s2Json )
+            if onosCfg == sentCfg:
+                s2Result = True
+            else:
+                main.log.error( "ONOS NetCfg doesn't match what was sent" )
+                main.log.debug( "ONOS config: {}".format( onosCfg ) )
+                main.log.debug( "Sent config: {}".format( sentCfg ) )
+        utilities.assert_equals( expect=True,
+                                 actual=s2Result,
+                                 onpass="Net Cfg added for device s2",
+                                 onfail="Net Cfg for device s2 not correctly set" )
+
+        main.step( "Add Net Cfg for switch4" )
+        s4Json = { "rackAddress": 4,
+                   "name": "Switch4",
+                   "owner": "John",
+                   "allowed": False }
+        main.s4Json = s4Json
+        setS4Disallow = main.ONOSrest4.setNetCfg( s4Json,
+                                                  subjectClass="devices",
+                                                  subjectKey="of:0000000000000004",
+                                                  configKey="basic" )
+        s4Result = False
+        if setS4Disallow:
+            # Check what we set is what is in ONOS
+            getS4 = main.ONOSrest4.getNetCfg( subjectClass="devices",
+                                              subjectKey="of:0000000000000004",
+                                              configKey="basic" )
+            onosCfg = pprint( getS4 )
+            sentCfg = pprint( s4Json )
+            if onosCfg == sentCfg:
+                s4Result = True
+            else:
+                main.log.error( "ONOS NetCfg doesn't match what was sent" )
+                main.log.debug( "ONOS config: {}".format( onosCfg ) )
+                main.log.debug( "Sent config: {}".format( sentCfg ) )
+        utilities.assert_equals( expect=True,
+                                 actual=s4Result,
+                                 onpass="Net Cfg added for device s4",
+                                 onfail="Net Cfg for device s3 not correctly set" )
+
+        main.netCfg.compareCfg( main, main.gossipTime )
+
+    def CASE23( self, main ):
+        """
+        Check of devices after all Network Configurations are set
+        """
+        import json
+        try:
+            assert main.s1Json, "s1Json not defined"
+            assert main.s2Json, "s2Json not defined"
+        except AssertionError:
+            main.log.exception( "Case Prerequisites not set: " )
+            main.cleanup()
+            main.exit()
+        main.case( "Check Devices after all configurations are set" )
+
+        main.netCfg.compareCfg( main )
+
+        main.step( "ONOS should only show devices S1 and S2" )
+        devices = main.ONOSrest1.devices()
+        main.log.debug( main.ONOSrest1.pprint( devices ) )
+        allowedDevices = [ "of:{}".format( str( i ).zfill( 16 ) ) for i in [ 1, 2 ] ]
+        onosDevices = []
+        for sw in json.loads( devices ):
+            onosDevices.append( str( sw.get( 'id' ) ) )
+        onosDevices.sort()
+        failMsg = "ONOS devices doesn't match the list of allowed devices.\n"
+        failMsg += "Expected devices: {}\nActual devices: {}".format( allowedDevices,
+                                                                      onosDevices )
+        utilities.assert_equals( expect=allowedDevices,
+                                 actual=onosDevices,
+                                 onpass="Only allowed devices are in ONOS",
+                                 onfail=failMsg )
+
+        main.step( "Check device annotations" )
+        keys = [ 'name', 'owner', 'rackAddress' ]
+        for sw in json.loads( devices ):
+            if "of:0000000000000001" in sw.get( 'id' ):
+                s1Correct = True
+                for k in keys:
+                    if str( sw.get( 'annotations', {} ).get( k ) ) != str( main.s1Json[k] ):
+                        s1Correct = False
+                        main.log.debug( "{} is wrong on s1".format( k ) )
+                if not s1Correct:
+                    main.log.error( "Annotations for s1 are incorrect: {}".format( sw ) )
+            elif "of:0000000000000002" in sw['id']:
+                s2Correct = True
+                for k in keys:
+                    if str( sw.get( 'annotations', {} ).get( k ) ) != str( main.s2Json[k] ):
+                        s2Correct = False
+                        main.log.debug( "{} is wrong on s2".format( k ) )
+                if not s2Correct:
+                    main.log.error( "Annotations for s2 are incorrect: {}".format( sw ) )
+        try:
+            stepResult = s1Correct and s2Correct
+        except NameError:
+            stepResult = False
+            main.log.error( "s1 and/or s2 not found in devices" )
+        utilities.assert_equals( expect=True,
+                                 actual=stepResult,
+                                 onpass="Configured device's annotations are correct",
+                                 onfail="Incorrect annotations for configured devices." )
+
+    def CASE24( self, main ):
+        """
+        Testing removal of configurations
+        """
+        import time
+        try:
+            assert main.s1Json, "s1Json not defined"
+            assert main.s2Json, "s2Json not defined"
+            assert main.s3Json, "s3Json not defined"
+            assert main.s4Json, "s4Json not defined"
+        except AssertionError:
+            main.log.exception( "Case Prerequisites not set: " )
+            main.cleanup()
+            main.exit()
+        main.case( "Testing removal of configurations" )
+        main.step( "Remove 'allowed' configuration from all devices" )
+
+        s1Json = main.s1Json  # NOTE: This is a reference
+        try:
+            del s1Json['allowed']
+        except KeyError:
+            main.log.exception( "Key not found" )
+        setS1 = main.ONOSrest1.setNetCfg( s1Json,
+                                          subjectClass="devices",
+                                          subjectKey="of:0000000000000001",
+                                          configKey="basic" )
+
+        s2Json = main.s2Json  # NOTE: This is a reference
+        try:
+            time.sleep( main.gossipTime )
+            del s2Json['allowed']
+        except KeyError:
+            main.log.exception( "Key not found" )
+        setS2 = main.ONOSrest2.setNetCfg( s2Json,
+                                          subjectClass="devices",
+                                          subjectKey="of:0000000000000002",
+                                          configKey="basic" )
+
+        s3Json = main.s3Json  # NOTE: This is a reference
+        try:
+            time.sleep( main.gossipTime )
+            del s3Json['allowed']
+        except KeyError:
+            main.log.exception( "Key not found" )
+        setS3 = main.ONOSrest3.setNetCfg( s3Json,
+                                          subjectClass="devices",
+                                          subjectKey="of:0000000000000003",
+                                          configKey="basic" )
+
+        s4Json = main.s4Json  # NOTE: This is a reference
+        try:
+            time.sleep( main.gossipTime )
+            del s4Json['allowed']
+        except KeyError:
+            main.log.exception( "Key not found" )
+        setS4 = main.ONOSrest4.setNetCfg( s4Json,
+                                          subjectClass="devices",
+                                          subjectKey="of:0000000000000004",
+                                          configKey="basic" )
+        removeAllowed = setS1 and setS2 and setS3 and setS4
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=removeAllowed,
+                                 onpass="Successfully removed 'allowed' config from devices",
+                                 onfail="Failed to remove the 'allowed' config key." )
+
+        main.netCfg.compareCfg( main, main.gossipTime )
+
+        main.step( "Delete basic config for s1 and s2" )
+        removeS1 = main.ONOSrest1.removeNetCfg( subjectClass="devices",
+                                                subjectKey="of:0000000000000001",
+                                                configKey="basic" )
+        removeS2 = main.ONOSrest2.removeNetCfg( subjectClass="devices",
+                                                subjectKey="of:0000000000000002",
+                                                configKey="basic" )
+        removeSingles = removeS1 and removeS2
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=removeSingles,
+                                 onpass="Successfully removed S1 and S2 basic config",
+                                 onfail="Failed to removed S1 and S2 basic config" )
+
+        main.netCfg.compareCfg( main, main.gossipTime )
+
+        main.step( "Delete the net config for S3" )
+        removeS3 = main.ONOSrest3.removeNetCfg( subjectClass="devices",
+                                                subjectKey="of:0000000000000003" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=removeS3,
+                                 onpass="Successfully removed S3's config",
+                                 onfail="Failed to removed S3's config" )
+
+        main.netCfg.compareCfg( main, main.gossipTime )
+
+        main.step( "Delete the net config for all devices" )
+        remove = main.ONOSrest3.removeNetCfg( subjectClass="devices" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=remove,
+                                 onpass="Successfully removed device config",
+                                 onfail="Failed to remove device config" )
+
+        main.netCfg.compareCfg( main, main.gossipTime )
+
+        main.step( "Assert the net config for devices is empty" )
+        get = main.ONOSrest3.getNetCfg( subjectClass="devices" )
+        utilities.assert_equals( expect='{}',
+                                 actual=get,
+                                 onpass="Successfully removed device config",
+                                 onfail="Failed to remove device config" )
diff --git a/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.topo b/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.topo
new file mode 100755
index 0000000..e1e06eb
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.topo
@@ -0,0 +1,101 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOSrest1>
+            <host>OC1</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest1>
+
+        <ONOSrest2>
+            <host>OC2</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest2>
+
+        <ONOSrest3>
+            <host>OC3</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest3>
+
+        <ONOSrest4>
+            <host>OC4</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest4>
+
+        <ONOSrest5>
+            <host>OC5</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest5>
+
+        <ONOSrest6>
+            <host>OC6</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest6>
+
+        <ONOSrest7>
+            <host>OC7</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest7>
+
+        <Mininet1>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>MininetCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </Mininet1>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNC/FUNCnetCfg/README b/TestON/tests/FUNC/FUNCnetCfg/README
new file mode 100644
index 0000000..f52af84
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetCfg/README
@@ -0,0 +1,11 @@
+This test is designed to test the Network config subsystem. There are two
+primary areas that we are testing, The NetCfg subsystem as a framework and how
+this is used by other subsystems.
+Features Tested:
+A. Network Configuration subsystem as a framework
+    1. Add/Modify/Remove/Reading Net Config data
+    2. Distribution of configurations across ONOS nodes
+B. Usage of Net Cfg by other systems
+    1. Device configuration
+        a. Allow/disallow devices
+        b. Device name and other annotations
diff --git a/TestON/tests/FUNC/FUNCnetCfg/__init__.py b/TestON/tests/FUNC/FUNCnetCfg/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetCfg/__init__.py
diff --git a/TestON/tests/FUNC/FUNCnetCfg/dependencies/__init__.py b/TestON/tests/FUNC/FUNCnetCfg/dependencies/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetCfg/dependencies/__init__.py
diff --git a/TestON/tests/FUNC/FUNCnetCfg/dependencies/netCfg.py b/TestON/tests/FUNC/FUNCnetCfg/dependencies/netCfg.py
new file mode 100644
index 0000000..eb2ab73
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetCfg/dependencies/netCfg.py
@@ -0,0 +1,32 @@
+"""
+These functions are for use with the Network config system
+"""
+import time
+
+def compareCfg( main, gossipTime=None ):
+    """
+    Compare the network configurations across all nodes in the network
+    gossipTime is the number of seconds each gossip round take for the netCfg maps
+    """
+    main.step( "Check net config" )
+    if gossipTime:
+        time.sleep( gossipTime * len( main.nodes ) )
+    responses = []
+    failMsg = "Net Cfg is different on some nodes."
+    failed = False
+    for node in main.nodes:
+        response = node.getNetCfg( )
+        responses.append( node.pprint( response ) )
+        if response == main.FALSE:
+            failed = True
+    compare = [ i == responses[0] for i in responses ]
+    if failed:
+        failMsg += " Some nodes failed to GET netCfg."
+    utilities.assert_equals( expect=True,
+                             actual=all( compare ),
+                             onpass="Net Cfg is the same on all nodes",
+                             onfail=failMsg )
+    if not all( compare ):
+        main.log.debug( "Net Config results:" )
+        for i in responses:
+            main.log.debug( i )
diff --git a/TestON/tests/FUNC/FUNCnetCfg/dependencies/startUp.py b/TestON/tests/FUNC/FUNCnetCfg/dependencies/startUp.py
new file mode 100644
index 0000000..cfaf589
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetCfg/dependencies/startUp.py
@@ -0,0 +1,32 @@
+"""
+    This wrapper function is use for starting up onos instance
+"""
+
+import time
+
+def onosBuild( main, gitBranch ):
+    """
+        This includes pulling ONOS and building it using maven install
+    """
+
+    buildResult = main.FALSE
+
+    # Git checkout a branch of ONOS
+    checkOutResult = main.ONOSbench.gitCheckout( gitBranch )
+    # Does the git pull on the branch that was checked out
+    if not checkOutResult:
+        main.log.warn( "Failed to checked out " + gitBranch +
+                                           " branch")
+    else:
+        main.log.info( "Successfully checked out " + gitBranch +
+                                           " branch")
+    gitPullResult = main.ONOSbench.gitPull()
+    if gitPullResult == main.ERROR:
+        main.log.error( "Error pulling git branch" )
+    else:
+        main.log.info( "Successfully pulled " + gitBranch + " branch" )
+
+    # Maven clean install
+    buildResult = main.ONOSbench.cleanInstall()
+
+    return buildResult
diff --git a/TestON/tests/FUNC/FUNCnetCfg/dependencies/topo.py b/TestON/tests/FUNC/FUNCnetCfg/dependencies/topo.py
new file mode 100644
index 0000000..d834a09
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetCfg/dependencies/topo.py
@@ -0,0 +1,98 @@
+"""
+    These functions can be used for topology comparisons
+"""
+
+import time
+import os
+import json
+
+def getAllDevices( main ):
+    """
+        Return a list containing the devices output from each ONOS node
+    """
+    devices = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].devices,
+                         name="devices-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        devices.append( t.result )
+    return devices
+
+def getAllHosts( main ):
+    """
+        Return a list containing the hosts output from each ONOS node
+    """
+    hosts = []
+    ipResult = main.TRUE
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].hosts,
+                         name="hosts-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        hosts.append( t.result )
+    return hosts
+
+def getAllPorts( main ):
+    """
+        Return a list containing the ports output from each ONOS node
+    """
+    ports = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].ports,
+                         name="ports-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        ports.append( t.result )
+    return ports
+
+def getAllLinks( main ):
+    """
+        Return a list containing the links output from each ONOS node
+    """
+    links = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].links,
+                         name="links-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        links.append( t.result )
+    return links
+
+def getAllClusters( main ):
+    """
+        Return a list containing the clusters output from each ONOS node
+    """
+    clusters = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].clusters,
+                         name="clusters-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        clusters.append( t.result )
+    return clusters
diff --git a/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.params b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.params
new file mode 100644
index 0000000..fc296cc
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.params
@@ -0,0 +1,53 @@
+<PARAMS>
+    # CASE - Description
+    # 1 - Variable initialization and optional pull and build ONOS package
+    # 2 - Install ONOS
+    # 100 - Ensure netconf app is running
+    # 200 - Create or modify a configuration file
+    # 300 - Push a configuration file to bring up a device
+    # 400 - Bring down a device (not yet possible)
+
+    <testcases>1,[2,100,200,300]*2</testcases>
+
+    <SCALE>
+        <size>1,3</size>
+    </SCALE>
+
+    <DEPENDENCY>
+        <path> /tests/FUNC/FUNCnetconf/dependencies/</path>
+        <wrapper1>startUp</wrapper1>
+        <wrapper2>netconf</wrapper2>
+        <wrapper3>topo</wrapper3>
+        <topology></topology>
+    </DEPENDENCY>
+
+    <ENV>
+        <cellApps>drivers,openflow,proxyarp,mobility,netconf</cellApps>
+    </ENV>
+
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <SLEEP>
+        <startup>20</startup>
+        <upSwitch>10</upSwitch>
+        <topoAttempts>3</topoAttempts>
+    </SLEEP>
+
+    <MININET>
+        <switch>0</switch>
+        <links></links>
+    </MININET>
+
+    <CONFIGURE>
+        <cfgDevicePort>830</cfgDevicePort>
+        <cfgDriver>ovs-netconf</cfgDriver>
+        <cfgApps>org.onosproject.netconf</cfgApps>
+        <cfgName>"sdn"</cfgName>
+        <cfgPass>"rocks"</cfgPass>
+        <cfgAppPort>830</cfgAppPort>
+    </CONFIGURE>
+
+</PARAMS>
diff --git a/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.py b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.py
new file mode 100644
index 0000000..ddd1cd8
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.py
@@ -0,0 +1,361 @@
+# Testing the NETCONF protocol within ONOS
+
+class FUNCnetconf:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        import time
+        import imp
+        import re
+
+        """
+        - Construct tests variables
+        - GIT ( optional )
+            - Checkout ONOS master branch
+            - Pull latest ONOS code
+        - Building ONOS ( optional )
+            - Install ONOS package
+            - Build ONOS package
+        """
+
+        main.case( "Constructing test variables and building ONOS package" )
+        main.step( "Constructing test variables" )
+        main.caseExplanation = "This test case is mainly for loading " +\
+                               "from params file, and pull and build the " +\
+                               " latest ONOS package"
+        stepResult = main.FALSE
+
+        # Test variables
+        try:
+            main.testOnDirectory = re.sub( "(/tests)$", "", main.testDir )
+            main.apps = main.params[ 'ENV' ][ 'cellApps' ]
+            gitBranch = main.params[ 'GIT' ][ 'branch' ]
+            main.dependencyPath = main.testOnDirectory + \
+                                  main.params[ 'DEPENDENCY' ][ 'path' ]
+            # main.topology = main.params[ 'DEPENDENCY' ][ 'topology' ]
+            main.scale = ( main.params[ 'SCALE' ][ 'size' ] ).split( "," )
+            if main.ONOSbench.maxNodes:
+                main.maxNodes = int( main.ONOSbench.maxNodes )
+            else:
+                main.maxNodes = 0
+            wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
+            wrapperFile2 = main.params[ 'DEPENDENCY' ][ 'wrapper2' ]
+            wrapperFile3 = main.params[ 'DEPENDENCY' ][ 'wrapper3' ]
+            main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+            main.switchSleep = int( main.params[ 'SLEEP' ][ 'upSwitch' ] )
+            main.checkTopoAttempts = int( main.params[ 'SLEEP' ][ 'topoAttempts' ] )
+            main.numSwitch = int( main.params[ 'MININET' ][ 'switch' ] )
+
+            # Config file parameters
+            main.configDevicePort = main.params[ 'CONFIGURE' ][ 'cfgDevicePort' ]
+            main.configDriver = main.params[ 'CONFIGURE' ][ 'cfgDriver' ]
+            main.configApps = main.params[ 'CONFIGURE' ][ 'cfgApps' ]
+            main.configName = main.params[ 'CONFIGURE' ][ 'cfgName' ]
+            main.configPass = main.params[ 'CONFIGURE' ][ 'cfgPass' ]
+            main.configPort = main.params[ 'CONFIGURE' ][ 'cfgAppPort' ]
+
+            gitPull = main.params[ 'GIT' ][ 'pull' ]
+            main.cellData = {} # for creating cell file
+            main.hostsData = {}
+            main.CLIs = []
+            main.CLIs2 = []
+            main.ONOSip = []
+            main.assertReturnString = ''  # Assembled assert return string
+
+            main.ONOSip = main.ONOSbench.getOnosIps()
+            print main.ONOSip
+
+            # Assigning ONOS cli handles to a list
+            for i in range( 1,  main.maxNodes + 1 ):
+                main.CLIs.append( getattr( main, 'ONOSrest' + str( i ) ) )
+                main.CLIs2.append( getattr( main, 'ONOScli' + str( i ) ) )
+
+            # -- INIT SECTION, ONLY RUNS ONCE -- #
+            main.startUp = imp.load_source( wrapperFile1,
+                                            main.dependencyPath +
+                                            wrapperFile1 +
+                                            ".py" )
+
+            main.netconfFunction = imp.load_source( wrapperFile2,
+                                            main.dependencyPath +
+                                            wrapperFile2 +
+                                            ".py" )
+
+            main.topo = imp.load_source( wrapperFile3,
+                                         main.dependencyPath +
+                                         wrapperFile3 +
+                                         ".py" )
+
+            # Uncomment out the following if a mininet topology is added
+            # copyResult1 = main.ONOSbench.scp( main.Mininet1,
+            #                                   main.dependencyPath +
+            #                                   main.topology,
+            #                                   main.Mininet1.home + "custom/",
+            #                                   direction="to" )
+
+            if main.CLIs and main.CLIs2:
+                stepResult = main.TRUE
+            else:
+                main.log.error( "Did not properly created list of ONOS CLI handle" )
+                stepResult = main.FALSE
+        except Exception as e:
+            main.log.exception(e)
+            main.cleanup()
+            main.exit()
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully construct " +
+                                        "test variables ",
+                                 onfail="Failed to construct test variables" )
+
+        if gitPull == 'True':
+            main.step( "Building ONOS in " + gitBranch + " branch" )
+            onosBuildResult = main.startUp.onosBuild( main, gitBranch )
+            stepResult = onosBuildResult
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=stepResult,
+                                     onpass="Successfully compiled " +
+                                            "latest ONOS",
+                                     onfail="Failed to compile " +
+                                            "latest ONOS" )
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+        main.ONOSbench.getVersion( report=True )
+
+    def CASE2( self, main ):
+        """
+        - Set up cell
+            - Create cell file
+            - Set cell file
+            - Verify cell file
+        - Kill ONOS process
+        - Uninstall ONOS cluster
+        - Verify ONOS start up
+        - Install ONOS cluster
+        - Connect to cli
+        """
+
+        # main.scale[ 0 ] determines the current number of ONOS controller
+        main.numCtrls = int( main.scale[ 0 ] )
+
+        main.case( "Starting up " + str( main.numCtrls ) +
+                   " node(s) ONOS cluster" )
+        main.caseExplanation = "Set up ONOS with " + str( main.numCtrls ) +\
+                                " node(s) ONOS cluster"
+
+
+
+        #kill off all onos processes
+        main.log.info( "Safety check, killing all ONOS processes" +
+                       " before initiating environment setup" )
+
+
+
+        time.sleep( main.startUpSleep )
+        main.step( "Uninstalling ONOS package" )
+        onosUninstallResult = main.TRUE
+        for ip in main.ONOSip:
+            onosUninstallResult = onosUninstallResult and \
+                    main.ONOSbench.onosUninstall( nodeIp=ip )
+        stepResult = onosUninstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully uninstalled ONOS package",
+                                 onfail="Failed to uninstall ONOS package" )
+
+        for i in range( main.maxNodes ):
+            main.ONOSbench.onosDie( main.ONOSip[ i ] )
+
+        main.log.info( "NODE COUNT = " + str( main.numCtrls ) )
+
+        tempOnosIp = []
+        for i in range( main.numCtrls ):
+            tempOnosIp.append( main.ONOSip[i] )
+
+        main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
+                                       "temp", main.Mininet1.ip_address,
+                                       main.apps, tempOnosIp )
+
+        main.step( "Apply cell to environment" )
+        cellResult = main.ONOSbench.setCell( "temp" )
+        verifyResult = main.ONOSbench.verifyCell()
+        stepResult = cellResult and verifyResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully applied cell to " + \
+                                        "environment",
+                                 onfail="Failed to apply cell to environment " )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+        stepResult = packageResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully created ONOS package",
+                                 onfail="Failed to create ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Installing ONOS package" )
+        onosInstallResult = main.TRUE
+        for i in range( main.numCtrls ):
+            onosInstallResult = onosInstallResult and \
+                    main.ONOSbench.onosInstall( node=main.ONOSip[ i ], options="" )
+        stepResult = onosInstallResult
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully installed ONOS package",
+                                 onfail="Failed to install ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Starting ONOS service" )
+        stopResult = main.TRUE
+        startResult = main.TRUE
+        onosIsUp = main.TRUE
+
+        for i in range( main.numCtrls ):
+            onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
+        if onosIsUp == main.TRUE:
+            main.log.report( "ONOS instance is up and ready" )
+        else:
+            main.log.report( "ONOS instance may not be up, stop and " +
+                             "start ONOS again " )
+            for i in range( main.numCtrls ):
+                stopResult = stopResult and \
+                        main.ONOSbench.onosStop( main.ONOSip[ i ] )
+            for i in range( main.numCtrls ):
+                startResult = startResult and \
+                        main.ONOSbench.onosStart( main.ONOSip[ i ] )
+        stepResult = onosIsUp and stopResult and startResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ONOS service is ready",
+                                 onfail="ONOS service did not start properly" )
+
+        # Start an ONOS cli to provide functionality that is not currently
+        # supported by the Rest API remove this when Leader Checking is supported
+        # by the REST API
+
+        main.step( "Start ONOS cli" )
+        cliResult = main.TRUE
+        for i in range( main.numCtrls ):
+            cliResult = cliResult and \
+                        main.CLIs2[ i ].startOnosCli( main.ONOSip[ i ] )
+        stepResult = cliResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully start ONOS cli",
+                                 onfail="Failed to start ONOS cli" )
+
+        # Remove the first element in main.scale list
+        main.scale.remove( main.scale[ 0 ] )
+
+    def CASE100( self, main ):
+        """
+            Start NETCONF app and OFC-Server or make sure that they are already running
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.numCtrls, "Placed the total number of switch topology in \
+                                main.numCtrls"
+
+        testResult = main.FALSE
+        main.testName = "Start up NETCONF app in all nodes"
+        main.case( main.testName + " Test - " + str( main.numCtrls ) +
+                   " NODE(S)" )
+        main.step( "Starting NETCONF app" )
+        main.assertReturnString = "Assertion result for starting NETCONF app"
+        testResult = main.netconfFunction.startApp( main )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        main.step( "Starting OFC-Server" )
+        main.assertReturnString = "Assertion result for starting OFC-Server"
+        testResult = main.netconfFunction.startOFC( main )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        time.sleep( main.startUpSleep )
+
+    def CASE200( self, main ):
+        """
+            Create or modify a Configuration file
+                -The file is built from information loaded from the .params file
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.numCtrls, "Placed the total number of switch topology in \
+                                main.numCtrls"
+
+        main.testName = "Assemble the configuration"
+        main.case( main.testName + " Test - " + str( main.numCtrls ) +
+                   " NODES(S)" )
+        main.step( "Assembling configuration file" )
+        main.assertReturnString = "Assertion result for assembling configuration file"
+        testResult = main.FALSE
+        testResult = main.netconfFunction.createConfig( main )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+        time.sleep( main.startUpSleep )
+
+    def CASE300( self, main ):
+        """
+            Push a configuration and bring up a switch
+        """
+        assert main, "There is no main"
+        assert main.CLIs, "There is no main.CLIs"
+        assert main.numCtrls, "Placed the total number of switch topology in \
+                                main.numCtrls"
+
+        main.testName = "Uploading the configuration"
+        main.case( main.testName + " Test - " + str( main.numCtrls ) +
+                   " NODES(S)" )
+        main.step( "Sending the configuration file")
+        main.assertReturnString = "Assertion result for sending the configuration file"
+        testResult = main.FALSE
+
+        testResult = main.netconfFunction.sendConfig( main )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+        time.sleep( main.switchSleep )
+
+        main.step( "Confirming the device was configured" )
+        main.assertReturnString = "Assertion result for confirming a configuration."
+        testResult = main.FALSE
+
+        testResult = main.netconfFunction.devices( main )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=testResult,
+                                 onpass=main.assertReturnString,
+                                 onfail=main.assertReturnString )
+
+    def CASE400( self, main ):
+        """
+            Bring down a switch
+            This test case is not yet possible, but the functionality needed to
+            perform it is planned to be added
+                There is a message that is sent "Device () has closed session"
+                when the device disconnects from onos for some reason.
+                    Because of the triggers for this message are not practical
+                    to activate this will likely not be used to implement the test
+                    case at this time
+            Possible ways to do this may include bringing down mininet then checking
+            ONOS to see if it was recongnized the device being disconnected
+        """
diff --git a/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.topo b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.topo
new file mode 100644
index 0000000..e027146
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.topo
@@ -0,0 +1,87 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+                <nodes>3</nodes>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOSrest1>
+            <host>OC1</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest1>
+
+        <ONOSrest2>
+            <host>OC2</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest2>
+
+        <ONOSrest3>
+            <host>OC3</host>
+            <port>8181</port>
+            <user>onos</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSrest3>
+
+        <ONOScli1>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli1>
+
+        <ONOScli2>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli2>
+
+         <ONOScli3>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>7</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli3>
+
+        <Mininet1>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>MininetCliDriver</type>
+            <connect_order>8</connect_order>
+            <COMPONENTS>
+                <home>~/mininet/</home>
+            </COMPONENTS>
+        </Mininet1>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNC/FUNCnetconf/README b/TestON/tests/FUNC/FUNCnetconf/README
new file mode 100644
index 0000000..dbf51c0
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetconf/README
@@ -0,0 +1,29 @@
+Summary:
+        This test suite consists of generic NETCONF protocol testing within ONOS
+        using OF-Config to translate NETCONF requests for OVSDB.
+        The following is an overview of how the NETCONF protocol is tested
+        Steps:
+            - Start NETCONF App in all currently running nodes
+            - Start OF-Config server on device to be configured
+            - Create configuration file
+            - Upload the configuration file to the device to be configured
+            - Verify that the device was configured successfully
+
+Required:
+        Make sure that OF-Config, https://github.com/openvswitch/of-config, is
+        installed on the device that is to be configured, the test assumes this
+        device is the machine running TestON.
+        Ensure that <cfgName> and <cfgPass> in the params file are the username
+        and password required to ssh into the desired machine and account that
+        of-config is to be run on.
+        The netconfConfig.json file contains the configuration that was
+        generated by the test.  The test also relies on the existence of this
+        file and will missbehave if it is removed entirely.  The contents of the
+        file are overwritten everytime the test suite runs through Test Case 200
+
+TODO:
+Extend configuration to allow for specification of
+    - Vendor name
+    - Hardware version
+    - Software version
+    - Serial Number
\ No newline at end of file
diff --git a/TestON/tests/FUNC/FUNCnetconf/__init__.py b/TestON/tests/FUNC/FUNCnetconf/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetconf/__init__.py
diff --git a/TestON/tests/FUNC/FUNCnetconf/dependencies/netconf.py b/TestON/tests/FUNC/FUNCnetconf/dependencies/netconf.py
new file mode 100644
index 0000000..631bd84
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetconf/dependencies/netconf.py
@@ -0,0 +1,146 @@
+"""
+    Wrapper functions for FUNCnetconf
+    This functions include Onosclidriver and Mininetclidriver driver functions
+    Author: Jeremy Songster, jeremy@onlab.us
+"""
+import time
+import json
+import os
+
+def __init__( self ):
+    self.default = ''
+
+def startApp( main ):
+    """
+        This function starts the netconf app in all onos nodes and ensures that
+        the OF-Config server is running on the node to be configured
+    """
+
+    startResult = main.FALSE
+    startResult = main.CLIs[ 0 ].activateApp( appName="org.onosproject.netconf" )
+    return startResult
+
+def startOFC( main ):
+    """
+        This function uses pexpect pxssh class to activate the ofc-server daemon on OC2
+    """
+
+    startResult = main.FALSE
+    try:
+        main.ONOSbench.handle.sendline( "" )
+        main.ONOSbench.handle.expect( "\$" )
+        main.ONOSbench.handle.sendline( "ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1 }'" )
+        main.ONOSbench.handle.expect( "\$1 }'" )
+        main.ONOSbench.handle.expect( "\$" )
+        main.configDeviceIp = main.ONOSbench.handle.before
+        main.configDeviceIp = main.configDeviceIp.split()
+        main.configDeviceIp = main.configDeviceIp[ 0 ]
+        main.log.info( "Device to be configured: " + str( main.configDeviceIp ) )
+        main.ONOSbench.handle.sendline( "sudo ofc-server" )
+        main.ONOSbench.handle.expect( "\$" )
+        startResult = main.TRUE
+        return startResult
+    except pexpect.ExceptionPexpect as e:
+        main.log.exception( self.name + ": Pexpect exception found: " )
+        main.log.error( self.name + ":    " + self.handle.before )
+        main.cleanup()
+        main.exit()
+
+def createConfig( main ):
+    """
+        This function writes a configuration file that can later be sent to the
+        REST API to configure a device.
+        The controller device is assumed to be OC1
+        The device to be configured is assumed to be OC2
+    """
+    createCfgResult = main.FALSE
+    # TODO, add ability to set Manufacturer, Hardware and Software versions
+    main.cfgJson = '{ "devices":{ "netconf:'+ main.configDeviceIp + ":" +\
+                    main.configDevicePort + '":' + '{ "basic":{ "driver":"'+\
+                    main.configDriver + '" } } }, "apps": { "' +\
+                    main.configApps + '":{ "devices":[ { "name":' +\
+                    main.configName + ', "password":' + main.configPass +\
+                    ', "ip":"' + main.configDeviceIp + '", "port":' +\
+                    main.configPort + '} ] } } }'
+    try:
+        file = open( os.path.dirname( main.testFile ) + "/dependencies/netconfConfig.json", 'w' )
+        # These lines can cause errors during the configuration process because
+        # they cause the json string to turn into an unordered dictionary before
+        # sorting it alphabetically which can cause the driver type to not be
+        # configured.
+        # main.cfgJson = json.loads( main.cfgJson )
+        # main.cfgJson = json.dumps( main.cfgJson, sort_keys=True,
+        #                        indent=4, separators=(',', ': '))
+        print main.cfgJson
+        file.write( main.cfgJson )
+        if file:
+            createCfgResult = main.TRUE
+            file.close()
+            return createCfgResult
+        else:
+            main.log.error( "There was an error opening the file")
+            return createCfgResult
+    except:
+        main.log.exception( "There was an error opening the file")
+        return createCfgResult
+
+def sendConfig( main ):
+    """
+        This function prepares the command needed to upload the configuration
+        file to the REST API
+    """
+    ip = main.ONOSip[0]
+    port = 8181
+    url = "/network/configuration"
+    method = "POST"
+    data = main.cfgJson
+    configResult = main.FALSE
+    sendResult = main.CLIs[ 0 ].send( ip=ip, port=port, url=url, method=method, data=data )
+    main.log.info( "Device configuration request response code: " + str( sendResult[ 0 ] ) )
+    if ( 200 <= sendResult[ 0 ] <= 299):
+        configResult = main.TRUE
+    else:
+        configResult = main.FALSE
+
+    return configResult
+
+def devices( main ):
+    """
+        This function get the list of devices from the REST API, the ONOS CLI, and
+        the device-controllers command and check to see that each recognizes the
+        device is configured according to the configuration uploaded above.
+    """
+    availResult = main.FALSE
+    typeResult = main.FALSE
+    addressResult = main.FALSE
+    driverResult = main.FALSE
+    try:
+        apiResult = main.CLIs[ 0 ].devices()
+        cliResult = main.CLIs2[ 0 ].devices()
+
+        apiDict = json.loads( apiResult )
+        cliDict = json.loads( cliResult )
+        apiAnnotations = apiDict[ 0 ].get( "annotations" )
+        cliAnnotations = cliDict[ 0 ].get( "annotations" )
+
+        main.log.info( "API device availability result: " + str( apiDict[ 0 ].get( "available" ) ) )
+        main.log.info( "CLI device availability result: " + str( cliDict[ 0 ].get( "available" ) ) )
+        if apiDict[ 0 ].get( "available" ) == True and cliDict[ 0 ].get( "available" ) == True:
+            availResult = main.TRUE
+        main.log.info( "API device type result: " + apiDict[ 0 ].get( "type" ) )
+        main.log.info( "CLI device type result: " + cliDict[ 0 ].get( "type" ) )
+        if apiDict[ 0 ].get( "type" ) == "SWITCH" and cliDict[ 0 ].get( "type" ) == "SWITCH":
+            typeResult = main.TRUE
+        main.log.info( "API device ipaddress: " + apiAnnotations.get( "ipaddress" ) )
+        main.log.info( "CLI device ipaddress: " + apiAnnotations.get( "ipaddress" ) )
+        if str( apiAnnotations.get( "ipaddress" ) ) == main.configDeviceIp and str( cliAnnotations.get( "ipaddress" ) ) == main.configDeviceIp:
+            addressResult = main.TRUE
+        main.log.info( "API device driver: " + apiAnnotations.get( "driver" ) )
+        main.log.info( "CLI device driver: " + cliAnnotations.get( "driver" ) )
+        if apiAnnotations.get( "driver" ) == main.configDriver and cliAnnotations.get( "driver" ) == main.configDriver:
+            driverResult = main.TRUE
+
+        return availResult and typeResult and addressResult and driverResult
+    except TypeError:
+        main.log.error( "Device was not configured correctly" )
+        return main.FALSE
diff --git a/TestON/tests/FUNC/FUNCnetconf/dependencies/netconfConfig.json b/TestON/tests/FUNC/FUNCnetconf/dependencies/netconfConfig.json
new file mode 100644
index 0000000..fc5a231
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetconf/dependencies/netconfConfig.json
@@ -0,0 +1,21 @@
+{
+    "apps": {
+        "org.onosproject.netconf": {
+            "devices": [
+                {
+                    "ip": "10.128.50.10",
+                    "name": "sdn",
+                    "password": "rocks",
+                    "port": 830
+                }
+            ]
+        }
+    },
+    "devices": {
+        "netconf:10.128.50.10:830": {
+            "basic": {
+                "driver": "ovs-netconf"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/TestON/tests/FUNC/FUNCnetconf/dependencies/startUp.py b/TestON/tests/FUNC/FUNCnetconf/dependencies/startUp.py
new file mode 100644
index 0000000..bf2a2b6
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetconf/dependencies/startUp.py
@@ -0,0 +1,38 @@
+"""
+    This wrapper function is use for starting up onos instance
+"""
+
+import time
+import os
+import json
+
+def onosBuild( main, gitBranch ):
+    """
+        This includes pulling ONOS and building it using maven install
+    """
+
+    buildResult = main.FALSE
+
+    # Git checkout a branch of ONOS
+    checkOutResult = main.ONOSbench.gitCheckout( gitBranch )
+    # Does the git pull on the branch that was checked out
+    if not checkOutResult:
+        main.log.warn( "Failed to checked out " + gitBranch +
+                                           " branch")
+    else:
+        main.log.info( "Successfully checked out " + gitBranch +
+                                           " branch")
+    gitPullResult = main.ONOSbench.gitPull()
+    if gitPullResult == main.ERROR:
+        main.log.error( "Error pulling git branch" )
+    else:
+        main.log.info( "Successfully pulled " + gitBranch + " branch" )
+
+    # Maven clean install
+    buildResult = main.ONOSbench.cleanInstall()
+
+    return buildResult
+
+
+
+
diff --git a/TestON/tests/FUNC/FUNCnetconf/dependencies/topo.py b/TestON/tests/FUNC/FUNCnetconf/dependencies/topo.py
new file mode 100644
index 0000000..b44e3fc
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCnetconf/dependencies/topo.py
@@ -0,0 +1,100 @@
+"""
+    These functions can be used for topology comparisons
+"""
+
+import time
+import os
+import json
+
+def getAllDevices( main ):
+    """
+        Return a list containing the devices output from each ONOS node
+    """
+    devices = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].devices,
+                         name="devices-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        devices.append( t.result )
+    return devices
+
+def getAllHosts( main ):
+    """
+        Return a list containing the hosts output from each ONOS node
+    """
+    hosts = []
+    ipResult = main.TRUE
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].hosts,
+                         name="hosts-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        hosts.append( t.result )
+    return hosts
+
+def getAllPorts( main ):
+    """
+        Return a list containing the ports output from each ONOS node
+    """
+    ports = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].ports,
+                         name="ports-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        ports.append( t.result )
+    return ports
+
+def getAllLinks( main ):
+    """
+        Return a list containing the links output from each ONOS node
+    """
+    links = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].links,
+                         name="links-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        links.append( t.result )
+    return links
+
+def getAllClusters( main ):
+    """
+        Return a list containing the clusters output from each ONOS node
+    """
+    clusters = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].clusters,
+                         name="clusters-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        clusters.append( t.result )
+    return clusters
+
+
diff --git a/TestON/tests/FUNC/FUNCoptical/FUNCoptical.params b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.params
new file mode 100644
index 0000000..a906f12
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.params
@@ -0,0 +1,57 @@
+<PARAMS>
+    # CASE - Description
+    # 1 - Variable initialization and optional pull and build ONOS package
+    # 2 - Install ONOS
+    # 10 - Start Mininet opticalTest Topology
+    # 14 - Stop Mininet
+    # 17 - Activate Flow Objectives
+    # 21 - Run pingall to discover all hosts
+    # 22 - Send arpings to discover all hosts
+    # 23 - Compare ONOS Topology to Mininet Topology
+    # 31 - Add and test bidirectional point intents
+    # 32 - Add and test bidirectional host intents
+
+    <testcases>1,[2,10,21,22,23,31,32,14,2,10,21,22,23,31,32,14]*1,[2,10,17,21,22,23,31,32,14,2,10,17,21,22,23,31,32,14]*1</testcases>
+
+    <SCALE>
+        <size>1,3,1,3</size>
+    </SCALE>
+
+    <DEPENDENCY>
+        <path>/tests/FUNC/FUNCoptical/dependencies/</path>
+        <wrapper1>startUp</wrapper1>
+        <wrapper2>FuncIntentFunction</wrapper2>
+        <wrapper3>topo</wrapper3>
+    </DEPENDENCY>
+
+    <ENV>
+        <cellApps>drivers,openflow,proxyarp,mobility,optical,fwd</cellApps>
+    </ENV>
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <SLEEP>
+        <startup>15</startup>
+        <reroute>5</reroute>
+        <removeintent>10</removeintent>
+        <checkintent>5</checkintent>
+        <fwd>10</fwd>
+        <topoAttempts>3</topoAttempts>
+    </SLEEP>
+
+    <MININET>
+        <switch>7</switch>
+        <links>20</links>
+    </MININET>
+
+    # Intent tests params
+    <SDNIP>
+        <tcpProto>6</tcpProto>
+        <icmpProto>1</icmpProto>
+        <srcPort>5001</srcPort>
+        <dstPort>5001</dstPort>
+    </SDNIP>
+
+</PARAMS>
diff --git a/TestON/tests/FUNC/FUNCoptical/FUNCoptical.py b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.py
new file mode 100644
index 0000000..ab4d3d0
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.py
@@ -0,0 +1,628 @@
+# Testing the basic intent functionality of ONOS
+
+class FUNCoptical:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        import time
+        import imp
+        import re
+
+        """
+        - Construct tests variables
+        - GIT ( optional )
+            - Checkout ONOS master branch
+            - Pull latest ONOS code
+        - Building ONOS ( optional )
+            - Install ONOS package
+            - Build ONOS package
+        """
+
+        main.case( "Constructing test variables and building ONOS package" )
+        main.step( "Constructing test variables" )
+        main.caseExplanation = "This test case is mainly for loading " +\
+                               "from params file, and pull and build the " +\
+                               " latest ONOS package"
+        stepResult = main.FALSE
+
+        # Test variables
+        try:
+            main.testOnDirectory = re.sub( "(/tests)$", "", main.testDir )
+            main.apps = main.params[ 'ENV' ][ 'cellApps' ]
+            gitBranch = main.params[ 'GIT' ][ 'branch' ]
+            main.dependencyPath = main.testOnDirectory + \
+                                  main.params[ 'DEPENDENCY' ][ 'path' ]
+            main.scale = ( main.params[ 'SCALE' ][ 'size' ] ).split( "," )
+            if main.ONOSbench.maxNodes:
+                main.maxNodes = int( main.ONOSbench.maxNodes )
+            else:
+                main.maxNodes = 0
+            wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
+            wrapperFile2 = main.params[ 'DEPENDENCY' ][ 'wrapper2' ]
+            wrapperFile3 = main.params[ 'DEPENDENCY' ][ 'wrapper3' ]
+            main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+            main.checkIntentSleep = int( main.params[ 'SLEEP' ][ 'checkintent' ] )
+            main.removeIntentSleep = int( main.params[ 'SLEEP' ][ 'removeintent' ] )
+            main.rerouteSleep = int( main.params[ 'SLEEP' ][ 'reroute' ] )
+            main.fwdSleep = int( main.params[ 'SLEEP' ][ 'fwd' ] )
+            main.checkTopoAttempts = int( main.params[ 'SLEEP' ][ 'topoAttempts' ] )
+            gitPull = main.params[ 'GIT' ][ 'pull' ]
+            main.numSwitch = int( main.params[ 'MININET' ][ 'switch' ] )
+            main.numLinks = int( main.params[ 'MININET' ][ 'links' ] )
+            main.cellData = {} # For creating cell file
+            main.hostsData = {}
+            main.CLIs = []
+            main.ONOSip = []  # List of IPs of active ONOS nodes. CASE 2
+            main.activeONOSip = []
+            main.assertReturnString = ''  # Assembled assert return string
+
+            main.ONOSip = main.ONOSbench.getOnosIps()
+
+            # Assigning ONOS cli handles to a list
+            for i in range( 1,  main.maxNodes + 1 ):
+                main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
+
+            # -- INIT SECTION, ONLY RUNS ONCE -- #
+            main.startUp = imp.load_source( wrapperFile1,
+                                            main.dependencyPath +
+                                            wrapperFile1 +
+                                            ".py" )
+
+            main.intentFunction = imp.load_source( wrapperFile2,
+                                            main.dependencyPath +
+                                            wrapperFile2 +
+                                            ".py" )
+
+            main.topo = imp.load_source( wrapperFile3,
+                                         main.dependencyPath +
+                                         wrapperFile3 +
+                                         ".py" )
+
+            if main.CLIs:
+                stepResult = main.TRUE
+            else:
+                main.log.error( "Did not properly created list of ONOS CLI handle" )
+                stepResult = main.FALSE
+        except Exception as e:
+            main.log.exception(e)
+            main.cleanup()
+            main.exit()
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully construct " +
+                                        "test variables ",
+                                 onfail="Failed to construct test variables" )
+
+        if gitPull == 'True':
+            main.step( "Building ONOS in " + gitBranch + " branch" )
+            onosBuildResult = main.startUp.onosBuild( main, gitBranch )
+            stepResult = onosBuildResult
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=stepResult,
+                                     onpass="Successfully compiled " +
+                                            "latest ONOS",
+                                     onfail="Failed to compile " +
+                                            "latest ONOS" )
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+        main.ONOSbench.getVersion( report=True )
+
+    def CASE2( self, main ):
+        """
+        - Set up cell
+            - Create cell file
+            - Set cell file
+            - Verify cell file
+        - Kill ONOS process
+        - Uninstall ONOS cluster
+        - Verify ONOS start up
+        - Install ONOS cluster
+        - Connect to cli
+        """
+
+        # main.scale[ 0 ] determines the current number of ONOS controller
+        main.numCtrls = int( main.scale[ 0 ] )
+        main.flowCompiler = "Flow Rules"
+
+        main.case( "Starting up " + str( main.numCtrls ) +
+                   " node(s) ONOS cluster" )
+        main.caseExplanation = "Set up ONOS with " + str( main.numCtrls ) +\
+                                " node(s) ONOS cluster"
+
+
+
+        #kill off all onos processes
+        main.log.info( "Safety check, killing all ONOS processes" +
+                       " before initiating environment setup" )
+
+        for i in range( main.maxNodes ):
+            main.ONOSbench.onosDie( main.ONOSip[ i ] )
+
+        print "NODE COUNT = ", main.numCtrls
+
+        tempOnosIp = []
+        for i in range( main.numCtrls ):
+            tempOnosIp.append( main.ONOSip[i] )
+
+        main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
+                                       "temp", main.Mininet1.ip_address,
+                                       main.apps, tempOnosIp )
+
+        main.step( "Apply cell to environment" )
+        cellResult = main.ONOSbench.setCell( "temp" )
+        verifyResult = main.ONOSbench.verifyCell()
+        stepResult = cellResult and verifyResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully applied cell to " + \
+                                        "environment",
+                                 onfail="Failed to apply cell to environment " )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+        stepResult = packageResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully created ONOS package",
+                                 onfail="Failed to create ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Uninstalling ONOS package" )
+        onosUninstallResult = main.TRUE
+        for ip in main.ONOSip:
+            onosUninstallResult = onosUninstallResult and \
+                    main.ONOSbench.onosUninstall( nodeIp=ip )
+        stepResult = onosUninstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully uninstalled ONOS package",
+                                 onfail="Failed to uninstall ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Installing ONOS package" )
+        onosInstallResult = main.TRUE
+        for i in range( main.numCtrls ):
+            onosInstallResult = onosInstallResult and \
+                    main.ONOSbench.onosInstall( node=main.ONOSip[ i ] )
+            # Populate activeONOSip
+            main.activeONOSip.append( main.ONOSip[ i ] )
+        stepResult = onosInstallResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully installed ONOS package",
+                                 onfail="Failed to install ONOS package" )
+
+        time.sleep( main.startUpSleep )
+        main.step( "Starting ONOS service" )
+        stopResult = main.TRUE
+        startResult = main.TRUE
+        onosIsUp = main.TRUE
+
+        for i in range( main.numCtrls ):
+            onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
+        if onosIsUp == main.TRUE:
+            main.log.report( "ONOS instance is up and ready" )
+        else:
+            main.log.report( "ONOS instance may not be up, stop and " +
+                             "start ONOS again " )
+
+            for i in range( main.numCtrls ):
+                stopResult = stopResult and \
+                        main.ONOSbench.onosStop( main.ONOSip[ i ] )
+            for i in range( main.numCtrls ):
+                startResult = startResult and \
+                        main.ONOSbench.onosStart( main.ONOSip[ i ] )
+        stepResult = onosIsUp and stopResult and startResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ONOS service is ready",
+                                 onfail="ONOS service did not start properly" )
+
+        main.step( "Start ONOS cli" )
+        cliResult = main.TRUE
+        for i in range( main.numCtrls ):
+            cliResult = cliResult and \
+                        main.CLIs[ i ].startOnosCli( main.ONOSip[ i ] )
+        stepResult = cliResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully start ONOS cli",
+                                 onfail="Failed to start ONOS cli" )
+
+        # Remove the first element in main.scale list
+        main.scale.remove( main.scale[ 0 ] )
+
+        main.intentFunction.report( main )
+
+
+    def CASE10( self, main ):
+        """
+            Start Mininet opticalTest Topology
+        """
+        main.case( "Mininet with Linc-OE startup")
+        main.caseExplanation = "Start opticalTest.py topology included with ONOS"
+        main.step( "Starting mininet and LINC-OE" )
+        topoResult = main.TRUE
+        time.sleep( 10 )
+        controllerIPs = ' '.join( main.activeONOSip )
+        opticalMnScript = main.LincOE.runOpticalMnScript(ctrllerIP = controllerIPs)
+        topoResult = opticalMnScript
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=topoResult,
+            onpass="Started the topology successfully ",
+            onfail="Failed to start the topology")
+
+        # Exit if topology did not load properly
+        if not topoResult:
+            main.cleanup()
+            main.exit()
+
+
+
+
+    def CASE14( self, main ):
+        """
+            Stop mininet
+        """
+        main.log.report( "Stop Mininet topology" )
+        main.case( "Stop Mininet topology" )
+        main.caseExplanation = "Stopping the current mininet topology " +\
+                                "to start up fresh"
+
+        main.step( "Stopping Mininet Topology" )
+        topoResult = main.LincOE.stopNet( timeout=180 )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=topoResult,
+                                 onpass="Successfully stopped mininet",
+                                 onfail="Failed to stopped mininet" )
+        # Exit if topology did not load properly
+        if not topoResult:
+            main.cleanup()
+            main.exit()
+
+    def CASE17( self, main ):
+        """
+            Use Flow Objectives
+        """
+        main.case( "Enable intent compilation using Flow Objectives" )
+        main.step( "Enabling Flow Objectives" )
+
+        main.flowCompiler = "Flow Objectives"
+
+        cmd = "org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator"
+
+        stepResult = main.CLIs[ 0 ].setCfg( component=cmd,
+                                            propName="useFlowObjectives", value="true" )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully activated Flow Objectives",
+                                 onfail="Failed to activate Flow Objectives" )
+
+    def CASE21( self,main ):
+        """
+            Run pingall to discover all hosts
+        """
+        main.case( "Running Pingall" )
+        main.caseExplanation = "Use pingall to discover all hosts. Pingall is expected to fail."
+        main.step( "Discover Hosts through Pingall" )
+        pingResult = main.LincOE.pingall( timeout = 600 )
+
+        utilities.assert_equals( expect=main.FALSE,
+                                 actual=pingResult,
+                                 onpass="Pingall Completed",
+                                 onfail="Pingall did not complete or did not return fales" )
+
+    def CASE22( self,main ):
+        """
+            Send arpings to discover all hosts
+        """
+        main.case( "Discover Hosts with arping" )
+        main.caseExplanation = "Send arpings between all the hosts to discover and verify them"
+
+        main.step( "Send arping between all hosts" )
+
+        hosts = [ "h1","h2","h3","h4","h5","h6" ]
+
+        arpingHostResults = main.TRUE
+        for host in hosts:
+            if main.LincOE.arping( host ):
+                main.log.info( "Successfully reached host {} with arping".format( host ) )
+            else:
+                main.log.error( "Could not reach host {} with arping".format( host ) )
+                arpingHostResults = main.FALSE
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=arpingHostResults,
+                                 onpass="Successfully discovered all hosts",
+                                 onfail="Could not descover some hosts" )
+
+    def CASE23( self, main ):
+        """
+        Compare ONOS Topology to Mininet Topology
+        """
+        import json
+
+        main.case( "Compare ONOS Topology view to Mininet topology" )
+        main.caseExplanation = "Compare topology elements between Mininet" +\
+                                " and ONOS"
+
+        main.log.info( "Gathering topology information from Mininet" )
+        devicesResults = main.FALSE  # Overall Boolean for device correctness
+        linksResults = main.FALSE  # Overall Boolean for link correctness
+        hostsResults = main.FALSE  # Overall Boolean for host correctness
+        deviceFails = []  # Nodes where devices are incorrect
+        linkFails = []  # Nodes where links are incorrect
+        hostFails = []  # Nodes where hosts are incorrect
+        attempts = main.checkTopoAttempts  # Remaining Attempts
+
+        mnSwitches = 16
+        mnLinks = 46
+        mnHosts = 6
+
+        main.step( "Comparing Mininet topology to ONOS topology" )
+
+        while ( attempts >= 0 ) and\
+            ( not devicesResults or not linksResults or not hostsResults ):
+            time.sleep( 2 )
+            if not devicesResults:
+                devices = main.topo.getAllDevices( main )
+                ports = main.topo.getAllPorts( main )
+                devicesResults = main.TRUE
+                deviceFails = []  # Reset for each attempt
+            if not linksResults:
+                links = main.topo.getAllLinks( main )
+                linksResults = main.TRUE
+                linkFails = []  # Reset for each attempt
+            if not hostsResults:
+                hosts = main.topo.getAllHosts( main )
+                hostsResults = main.TRUE
+                hostFails = []  # Reset for each attempt
+
+            #  Check for matching topology on each node
+            for controller in range( main.numCtrls ):
+                controllerStr = str( controller + 1 )  # ONOS node number
+                # Compare Devices
+                if devices[ controller ] and ports[ controller ] and\
+                    "Error" not in devices[ controller ] and\
+                    "Error" not in ports[ controller ]:
+
+                    try:
+                        deviceData = json.loads( devices[ controller ] )
+                        portData = json.loads( ports[ controller ] )
+                    except (TypeError,ValueError):
+                        main.log.error("Could not load json:" + str( devices[ controller ] ) + ' or ' + str( ports[ controller ] ))
+                        currentDevicesResult = main.FALSE
+                    else:
+                        if mnSwitches == len( deviceData ):
+                            currentDevicesResult = main.TRUE
+                        else:
+                            currentDevicesResult = main.FALSE
+                            main.log.error( "Node {} only sees {} device(s) but {} exist".format(
+                                controllerStr,len( deviceData ),mnSwitches ) )
+                else:
+                    currentDevicesResult = main.FALSE
+                if not currentDevicesResult:
+                    deviceFails.append( controllerStr )
+                devicesResults = devicesResults and currentDevicesResult
+                # Compare Links
+                if links[ controller ] and "Error" not in links[ controller ]:
+                    try:
+                        linkData = json.loads( links[ controller ] )
+                    except (TypeError,ValueError):
+                        main.log.error("Could not load json:" + str( links[ controller ] ) )
+                        currentLinksResult = main.FALSE
+                    else:
+                        if mnLinks == len( linkData ):
+                            currentLinksResult = main.TRUE
+                        else:
+                            currentLinksResult = main.FALSE
+                            main.log.error( "Node {} only sees {} link(s) but {} exist".format(
+                                controllerStr,len( linkData ),mnLinks ) )
+                else:
+                    currentLinksResult = main.FALSE
+                if not currentLinksResult:
+                    linkFails.append( controllerStr )
+                linksResults = linksResults and currentLinksResult
+                # Compare Hosts
+                if hosts[ controller ] and "Error" not in hosts[ controller ]:
+                    try:
+                        hostData = json.loads( hosts[ controller ] )
+                    except (TypeError,ValueError):
+                        main.log.error("Could not load json:" + str( hosts[ controller ] ) )
+                        currentHostsResult = main.FALSE
+                    else:
+                        if mnHosts == len( hostData ):
+                            currentHostsResult = main.TRUE
+                        else:
+                            currentHostsResult = main.FALSE
+                            main.log.error( "Node {} only sees {} host(s) but {} exist".format(
+                                controllerStr,len( hostData ),mnHosts ) )
+                else:
+                    currentHostsResult = main.FALSE
+                if not currentHostsResult:
+                    hostFails.append( controllerStr )
+                hostsResults = hostsResults and currentHostsResult
+            # Decrement Attempts Remaining
+            attempts -= 1
+
+        utilities.assert_equals( expect=[],
+                                 actual=deviceFails,
+                                 onpass="ONOS correctly discovered all devices",
+                                 onfail="ONOS incorrectly discovered devices on nodes: " +
+                                 str( deviceFails ) )
+        utilities.assert_equals( expect=[],
+                                 actual=linkFails,
+                                 onpass="ONOS correctly discovered all links",
+                                 onfail="ONOS incorrectly discovered links on nodes: " +
+                                 str( linkFails ) )
+        utilities.assert_equals( expect=[],
+                                 actual=hostFails,
+                                 onpass="ONOS correctly discovered all hosts",
+                                 onfail="ONOS incorrectly discovered hosts on nodes: " +
+                                 str( hostFails ) )
+        if hostsResults and linksResults and devicesResults:
+            topoResults = main.TRUE
+        else:
+            topoResults = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=topoResults,
+                                 onpass="ONOS correctly discovered the topology",
+                                 onfail="ONOS incorrectly discovered the topology" )
+
+
+    def CASE31( self, main ):
+        import time
+        """
+            Add bidirectional point intents between 2 packet layer( mininet )
+            devices and ping mininet hosts
+        """
+        main.log.report(
+            "This testcase adds bidirectional point intents between 2 " +
+            "packet layer( mininet ) devices and ping mininet hosts" )
+        main.case( "Install point intents between 2 packet layer device and " +
+                   "ping the hosts" )
+        main.caseExplanation = "This testcase adds bidirectional point intents between 2 " +\
+            "packet layer( mininet ) devices and ping mininet hosts"
+
+        main.step( "Adding point intents" )
+        checkFlowResult = main.TRUE
+        main.pIntentsId = []
+        pIntent1 = main.CLIs[ 0 ].addPointIntent(
+            "of:0000ffffffff0001/1",
+            "of:0000ffffffff0005/1" )
+        time.sleep( 10 )
+        pIntent2 = main.CLIs[ 0 ].addPointIntent(
+            "of:0000ffffffff0005/1",
+            "of:0000ffffffff0001/1" )
+        main.pIntentsId.append( pIntent1 )
+        main.pIntentsId.append( pIntent2 )
+        time.sleep( 10 )
+        main.log.info( "Checking intents state")
+        checkStateResult = main.CLIs[ 0 ].checkIntentState(
+                                                  intentsId = main.pIntentsId )
+        time.sleep( 10 )
+        main.log.info( "Checking flows state")
+        checkFlowResult = main.CLIs[ 0 ].checkFlowsState()
+        # Sleep for 10 seconds to provide time for the intent state to change
+        time.sleep( 10 )
+        main.log.info( "Checking intents state one more time")
+        checkStateResult = main.CLIs[ 0 ].checkIntentState(
+                                                  intentsId = main.pIntentsId )
+
+        if checkStateResult and checkFlowResult:
+            addIntentsResult = main.TRUE
+        else:
+            addIntentsResult = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=addIntentsResult,
+            onpass="Successfully added point intents",
+            onfail="Failed to add point intents")
+
+        if not addIntentsResult:
+            main.log.error( "Intents were not properly installed. Exiting case." )
+            main.skipCase()
+
+        main.step( "Ping h1 and h5" )
+        pingResult = main.LincOE.pingHostOptical( src="h1", target="h5" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=pingResult,
+            onpass="Successfully pinged h1 and h5",
+            onfail="Failed to ping between h1 and h5")
+
+    def CASE32( self ):
+        """
+            Add host intents between 2 packet layer host
+        """
+        import time
+        import json
+        main.log.report( "Adding host intents between 2 optical layer host" )
+        main.case( "Test add host intents between optical layer host" )
+        main.caseExplanation = "Test host intents between 2 optical layer host"
+
+        main.step( "Adding host intents to h1 and h2" )
+        hostMACs = []
+        hostId = []
+        # Listing host MAC addresses
+        for i in range( 1 , 7 ):
+            hostMACs.append( "00:00:00:00:00:" +
+                                str( hex( i )[ 2: ] ).zfill( 2 ).upper() )
+        for macs in hostMACs:
+            hostId.append( macs + "/-1" )
+        host1 = hostId[ 0 ]
+        host2 = hostId[ 1 ]
+
+        intentsId = []
+        intent1 = main.CLIs[ 0 ].addHostIntent( hostIdOne = host1,
+                                            hostIdTwo = host2 )
+        intentsId.append( intent1 )
+        # Checking intents state before pinging
+        main.log.info( "Checking intents state" )
+        intentResult = main.CLIs[ 0 ].checkIntentState( intentsId = intentsId )
+        # Check intent state again if intents are not in installed state
+
+
+        # If intent state is wrong, wait 3 sec and try again
+        if not intentResult:
+            time.sleep( 3 )
+            intentResult = main.CLIs[ 0 ].checkIntentState( intentsId = intentsId )
+
+        # If intent state is still wrong, display intent states
+        if not intentResult:
+            main.log.error( main.CLIs[ 0 ].intents() )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=intentResult,
+                                 onpass="All intents are in INSTALLED state ",
+                                 onfail="Some of the intents are not in " +
+                                        "INSTALLED state " )
+
+        if not intentResult:
+            main.log.error( "Intents were not properly installed. Skipping Ping" )
+        else:
+            # Pinging h1 to h2 and then ping h2 to h1
+            main.step( "Pinging h1 and h2" )
+            pingResult = main.TRUE
+            pingResult = main.LincOE.pingHostOptical( src="h1", target="h2" ) \
+                and main.LincOE.pingHostOptical( src="h2",target="h1" )
+
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=pingResult,
+                                     onpass="Pinged successfully between h1 and h2",
+                                     onfail="Pinged failed between h1 and h2" )
+
+        # Removed all added host intents
+        main.step( "Removing host intents" )
+        removeResult = main.TRUE
+        # Check remaining intents
+        try:
+            intentsJson = json.loads( main.CLIs[ 0 ].intents() )
+            main.CLIs[ 0 ].removeIntent( intentId=intent1, purge=True )
+            #main.CLIs[ 0 ].removeIntent( intentId=intent2, purge=True )
+            main.log.debug(intentsJson)
+            for intents in intentsJson:
+                main.CLIs[ 0 ].removeIntent( intentId=intents.get( 'id' ),
+                                             app='org.onosproject.optical',
+                                             purge=True )
+
+            for i in range( main.numCtrls ):
+                if len( json.loads( main.CLIs[ i ].intents() ) ):
+                    print json.loads( main.CLIs[ i ].intents() )
+                    removeResult = main.FALSE
+        except ( TypeError, ValueError ):
+            main.log.error( "Cannot see intents on Node " + str( main.CLIs[ 0 ] ) +\
+                            ".  Removing all intents.")
+            main.CLIs[ 0 ].removeAllIntents( purge=True )
+            main.CLIs[ 0 ].removeAllIntents( purge=True, app='org.onosproject.optical')
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=removeResult,
+                                 onpass="Successfully removed host intents",
+                                 onfail="Failed to remove host intents" )
diff --git a/TestON/tests/FUNC/FUNCoptical/FUNCoptical.topo b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.topo
new file mode 100755
index 0000000..c8037cd
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.topo
@@ -0,0 +1,64 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+                <nodes>3</nodes>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOScli1>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli1>
+
+        <ONOScli2>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli2>
+
+         <ONOScli3>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli3>
+
+        <Mininet1>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>MininetCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+                <home>~/mininet/custom/</home>
+            </COMPONENTS>
+        </Mininet1>
+
+        <LincOE>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>LincOEMininetDriver</type>
+            <connect_order>7</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </LincOE>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNC/FUNCoptical/README b/TestON/tests/FUNC/FUNCoptical/README
new file mode 100644
index 0000000..48a4f5f
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/README
@@ -0,0 +1,11 @@
+Summary:
+        This test suite consist of basic optical functionality testing.
+        It bings up Link-OE topology to simulate optical switches.
+        The following is an overview of the basic functionality that is
+        performed in this test.
+        Steps:
+            - Discover hosts
+            - Compare Mininet topology
+            - Add and test point intents
+            - Add and test host intents
+ 
diff --git a/TestON/tests/FUNC/FUNCoptical/TopoConfig.json b/TestON/tests/FUNC/FUNCoptical/TopoConfig.json
new file mode 100644
index 0000000..9545eae
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/TopoConfig.json
@@ -0,0 +1,2832 @@
+{
+    "linkConfig": [
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 100,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:01",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:01",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:15",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 100,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:02",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:02",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:13",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:02",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:15",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:02",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1e",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 100,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:03",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:10",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:03",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:42",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:04",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:08",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:04",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:0c",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:04",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1a",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 10,
+                "bandwidth": 100000,
+                "port1": 2,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:0b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:04",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 11,
+                "bandwidth": 100000,
+                "port1": 3,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:0b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:04",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 12,
+                "bandwidth": 100000,
+                "port1": 4,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:0b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:04",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 13,
+                "bandwidth": 100000,
+                "port1": 5,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:0b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:04",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 14,
+                "bandwidth": 100000,
+                "port1": 6,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:0b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:04",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:4b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:19",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:4b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:05",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:0e",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 104,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:05",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:06",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:09",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:06",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:13",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:06",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3f",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:07",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2e",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:07",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:30",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:07",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:46",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:08",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:26",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:08",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:27",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:09",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0a",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:19",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0a",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:27",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:14",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:22",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3e",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0c",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:17",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0d",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1a",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0d",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:34",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0e",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:0f",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 101,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0e",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:46",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0f",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:30",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:10",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:31",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:11",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:0f",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:11",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1f",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:11",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:12",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:19",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:12",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:20",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:12",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2a",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 10,
+                "bandwidth": 100000,
+                "port1": 2,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:0a",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 11,
+                "bandwidth": 100000,
+                "port1": 3,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:0a",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 12,
+                "bandwidth": 100000,
+                "port1": 4,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:0a",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 13,
+                "bandwidth": 100000,
+                "port1": 5,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:0a",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 14,
+                "bandwidth": 100000,
+                "port1": 6,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:0a",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:13",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2c",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:13",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:38",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:14",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:46",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:15",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:15",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:44",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:16",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:16",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1f",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 108,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:16",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2a",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 108,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:17",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1f",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:17",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:33",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:17",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:34",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 108,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:18",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1c",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:18",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:31",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1a",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2c",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:40",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:47",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1c",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:29",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1d",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3a",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1d",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3b",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 10,
+                "bandwidth": 100000,
+                "port1": 2,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:09",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 11,
+                "bandwidth": 100000,
+                "port1": 3,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:09",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 12,
+                "bandwidth": 100000,
+                "port1": 4,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:09",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 13,
+                "bandwidth": 100000,
+                "port1": 5,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:09",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 14,
+                "bandwidth": 100000,
+                "port1": 6,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:09",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1e",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1e",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:38",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 104,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1f",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:26",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 108,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1f",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:40",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:20",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:23",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:21",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:43",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:21",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:4a",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:22",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:23",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:26",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:24",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2c",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 10,
+                "bandwidth": 100000,
+                "port1": 2,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:08",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 11,
+                "bandwidth": 100000,
+                "port1": 3,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:08",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 12,
+                "bandwidth": 100000,
+                "port1": 4,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:08",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 13,
+                "bandwidth": 100000,
+                "port1": 5,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:08",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 14,
+                "bandwidth": 100000,
+                "port1": 6,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:08",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:25",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:34",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:25",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:49",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:27",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:45",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:28",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2e",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 10,
+                "bandwidth": 100000,
+                "port1": 2,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:07",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 11,
+                "bandwidth": 100000,
+                "port1": 3,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:07",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 12,
+                "bandwidth": 100000,
+                "port1": 4,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:07",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 13,
+                "bandwidth": 100000,
+                "port1": 5,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:07",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 14,
+                "bandwidth": 100000,
+                "port1": 6,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:07",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:29",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:29",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:37",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:29",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:49",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2a",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:47",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:36",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:38",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2b",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3c",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2d",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:4a",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 10,
+                "bandwidth": 100000,
+                "port1": 2,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:06",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 11,
+                "bandwidth": 100000,
+                "port1": 3,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:06",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 12,
+                "bandwidth": 100000,
+                "port1": 4,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:06",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 13,
+                "bandwidth": 100000,
+                "port1": 5,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:06",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 14,
+                "bandwidth": 100000,
+                "port1": 6,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:06",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2e",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:37",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2f",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3b",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2f",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:44",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 10,
+                "bandwidth": 100000,
+                "port1": 2,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:05",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 11,
+                "bandwidth": 100000,
+                "port1": 3,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:05",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 12,
+                "bandwidth": 100000,
+                "port1": 4,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:05",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 13,
+                "bandwidth": 100000,
+                "port1": 5,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:05",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 14,
+                "bandwidth": 100000,
+                "port1": 6,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:05",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:30",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:37",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:32",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:36",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 108,
+                "numWaves": 80,
+                "port1": 102,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:32",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:38",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 103,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:32",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:41",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:33",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:35",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:42",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 10,
+                "bandwidth": 100000,
+                "port1": 2,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:04",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 11,
+                "bandwidth": 100000,
+                "port1": 3,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:04",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 12,
+                "bandwidth": 100000,
+                "port1": 4,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:04",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 13,
+                "bandwidth": 100000,
+                "port1": 5,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:04",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 14,
+                "bandwidth": 100000,
+                "port1": 6,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:04",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:37",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:42",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 10,
+                "bandwidth": 100000,
+                "port1": 2,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:03",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 11,
+                "bandwidth": 100000,
+                "port1": 3,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:03",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 12,
+                "bandwidth": 100000,
+                "port1": 4,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:03",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 13,
+                "bandwidth": 100000,
+                "port1": 5,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:03",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 14,
+                "bandwidth": 100000,
+                "port1": 6,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:03",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 105,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:3c",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:3d",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3a",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 10,
+                "bandwidth": 100000,
+                "port1": 2,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:02",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 11,
+                "bandwidth": 100000,
+                "port1": 3,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:02",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 12,
+                "bandwidth": 100000,
+                "port1": 4,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:02",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 13,
+                "bandwidth": 100000,
+                "port1": 5,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:02",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 14,
+                "bandwidth": 100000,
+                "port1": 6,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:02",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:3e",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:40",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 107,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:41",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3f",
+            "allowed": true
+        },
+        {
+            "type": "wdmLink",
+            "params": {
+                "port2": 106,
+                "numWaves": 80,
+                "port1": 101,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:ff:ff:45",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:43",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 10,
+                "bandwidth": 100000,
+                "port1": 2,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:01",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 11,
+                "bandwidth": 100000,
+                "port1": 3,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:01",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 12,
+                "bandwidth": 100000,
+                "port1": 4,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:01",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 13,
+                "bandwidth": 100000,
+                "port1": 5,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:01",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+            "allowed": true
+        },
+        {
+            "type": "pktOptLink",
+            "params": {
+                "port2": 14,
+                "bandwidth": 100000,
+                "port1": 6,
+                "nodeName2": "none",
+                "nodeName1": "none"
+            },
+            "nodeDpid1": "00:00:ff:ff:ff:00:00:01",
+            "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+            "allowed": true
+        }
+    ],
+    "switchConfig": [
+        {
+            "name": "none",
+            "longitude": -99.741564,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 32.508086,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:01"
+        },
+        {
+            "name": "none",
+            "longitude": -106.649719,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 35.084446,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:02"
+        },
+        {
+            "name": "none",
+            "longitude": -73.758333,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 42.652222,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:03"
+        },
+        {
+            "name": "none",
+            "longitude": -97.743057,
+            "params": {
+                "numregens": 5
+            },
+            "allowed": true,
+            "latitude": 33.755833,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:04"
+        },
+        {
+            "name": "none",
+            "longitude": -96.7,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 29.57,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:4b"
+        },
+        {
+            "name": "none",
+            "longitude": -78.877778,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 42.882778,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:05"
+        },
+        {
+            "name": "none",
+            "longitude": -108.509167,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 45.781667,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:06"
+        },
+        {
+            "name": "none",
+            "longitude": -76.614127,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 39.293781,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:07"
+        },
+        {
+            "name": "none",
+            "longitude": -86.812225,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 33.517223,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:08"
+        },
+        {
+            "name": "none",
+            "longitude": -100.796917,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 46.836379,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:09"
+        },
+        {
+            "name": "none",
+            "longitude": -91.184167,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 30.449722,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:0a"
+        },
+        {
+            "name": "none",
+            "longitude": -87.640432,
+            "params": {
+                "numregens": 4
+            },
+            "allowed": true,
+            "latitude": 41.881484,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:0b"
+        },
+        {
+            "name": "none",
+            "longitude": -80.837502,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 35.224924,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:0c"
+        },
+        {
+            "name": "none",
+            "longitude": -79.938056,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 32.785278,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:0d"
+        },
+        {
+            "name": "none",
+            "longitude": -81.686943,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 41.498333,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:0e"
+        },
+        {
+            "name": "none",
+            "longitude": -82.996666,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 39.965279,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:0f"
+        },
+        {
+            "name": "none",
+            "longitude": -71.084918,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 42.36745,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:10"
+        },
+        {
+            "name": "none",
+            "longitude": -84.516944,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 39.102778,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:11"
+        },
+        {
+            "name": "none",
+            "longitude": -96.780431,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 32.797524,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:12"
+        },
+        {
+            "name": "none",
+            "longitude": -104.996391,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 39.744999,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:13"
+        },
+        {
+            "name": "none",
+            "longitude": -83.054169,
+            "params": {
+                "numregens": 5
+            },
+            "allowed": true,
+            "latitude": 42.332779,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:14"
+        },
+        {
+            "name": "none",
+            "longitude": -106.483611,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 31.756389,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:15"
+        },
+        {
+            "name": "none",
+            "longitude": -119.79423,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 36.73923,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:16"
+        },
+        {
+            "name": "none",
+            "longitude": -79.793889,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 36.072222,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:17"
+        },
+        {
+            "name": "none",
+            "longitude": -72.676389,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 41.765833,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:18"
+        },
+        {
+            "name": "none",
+            "longitude": -95.36528,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 29.748333,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:19"
+        },
+        {
+            "name": "none",
+            "longitude": -81.43,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 30.33071,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:1a"
+        },
+        {
+            "name": "none",
+            "longitude": -94.578716,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 39.096649,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:1b"
+        },
+        {
+            "name": "none",
+            "longitude": -73.6699993,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 40.5899999,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:1c"
+        },
+        {
+            "name": "none",
+            "longitude": -118.252958,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 34.051227,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:1d"
+        },
+        {
+            "name": "none",
+            "longitude": -115.138889,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 36.168056,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:1e"
+        },
+        {
+            "name": "none",
+            "longitude": -85.760833,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 38.249167,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:1f"
+        },
+        {
+            "name": "none",
+            "longitude": -92.271942,
+            "params": {
+                "numregens": 2
+            },
+            "allowed": true,
+            "latitude": 34.740833,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:20"
+        },
+        {
+            "name": "none",
+            "longitude": -80.195,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 25.779167,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:21"
+        },
+        {
+            "name": "none",
+            "longitude": -87.922501,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 43.037224,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:22"
+        },
+        {
+            "name": "none",
+            "longitude": -90.048058,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 35.145158,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:23"
+        },
+        {
+            "name": "none",
+            "longitude": -93.26718,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 44.977365,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:24"
+        },
+        {
+            "name": "none",
+            "longitude": -76.29,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 36.853333,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:25"
+        },
+        {
+            "name": "none",
+            "longitude": -86.775558,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 36.163955,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:26"
+        },
+        {
+            "name": "none",
+            "longitude": -90.07222,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 29.949806,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:27"
+        },
+        {
+            "name": "none",
+            "longitude": -74.177978,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 40.734408,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:28"
+        },
+        {
+            "name": "none",
+            "longitude": -73.989713,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 40.767497,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:29"
+        },
+        {
+            "name": "none",
+            "longitude": -97.515274,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 35.470833,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:2a"
+        },
+        {
+            "name": "none",
+            "longitude": -122.268889,
+            "params": {
+                "numregens": 2
+            },
+            "allowed": true,
+            "latitude": 37.805556,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:2b"
+        },
+        {
+            "name": "none",
+            "longitude": -95.940277,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 41.259167,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:2c"
+        },
+        {
+            "name": "none",
+            "longitude": -81.377502,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 28.543279,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:2d"
+        },
+        {
+            "name": "none",
+            "longitude": -75.184139,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 39.946446,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:2e"
+        },
+        {
+            "name": "none",
+            "longitude": -112.07709,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 33.450361,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:2f"
+        },
+        {
+            "name": "none",
+            "longitude": -79.995552,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 40.441387,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:30"
+        },
+        {
+            "name": "none",
+            "longitude": -71.415278,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 41.818889,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:31"
+        },
+        {
+            "name": "none",
+            "longitude": -122.678055,
+            "params": {
+                "numregens": 2
+            },
+            "allowed": true,
+            "latitude": 45.522499,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:32"
+        },
+        {
+            "name": "none",
+            "longitude": -77.436096,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 37.540752,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:33"
+        },
+        {
+            "name": "none",
+            "longitude": -78.640831,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 35.779656,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:34"
+        },
+        {
+            "name": "none",
+            "longitude": -77.616389,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 43.157222,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:35"
+        },
+        {
+            "name": "none",
+            "longitude": -121.487221,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 38.578609,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:36"
+        },
+        {
+            "name": "none",
+            "longitude": -75.649167,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 41.415278,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:37"
+        },
+        {
+            "name": "none",
+            "longitude": -111.888336,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 40.767776,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:38"
+        },
+        {
+            "name": "none",
+            "longitude": -98.488892,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 29.429445,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:39"
+        },
+        {
+            "name": "none",
+            "longitude": -119.7,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 34.418889,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:3a"
+        },
+        {
+            "name": "none",
+            "longitude": -117.158611,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 32.746944,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:3b"
+        },
+        {
+            "name": "none",
+            "longitude": -122.397263,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 37.785143,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:3c"
+        },
+        {
+            "name": "none",
+            "longitude": -121.892778,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 37.333333,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:3d"
+        },
+        {
+            "name": "none",
+            "longitude": -89.649444,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 39.795278,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:3e"
+        },
+        {
+            "name": "none",
+            "longitude": -117.419167,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 47.654724,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:3f"
+        },
+        {
+            "name": "none",
+            "longitude": -90.215279,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 38.633335,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:40"
+        },
+        {
+            "name": "none",
+            "longitude": -122.333336,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 47.606945,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:41"
+        },
+        {
+            "name": "none",
+            "longitude": -76.1475,
+            "params": {
+                "numregens": 3
+            },
+            "allowed": true,
+            "latitude": 43.049444,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:42"
+        },
+        {
+            "name": "none",
+            "longitude": -82.522778,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 28.0225,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:43"
+        },
+        {
+            "name": "none",
+            "longitude": -110.968333,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 32.224444,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:44"
+        },
+        {
+            "name": "none",
+            "longitude": -84.290833,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 30.456389,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:45"
+        },
+        {
+            "name": "none",
+            "longitude": -83.538056,
+            "params": {
+                "numregens": 2
+            },
+            "allowed": true,
+            "latitude": 41.65,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:46"
+        },
+        {
+            "name": "none",
+            "longitude": -95.985832,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 36.151669,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:47"
+        },
+        {
+            "name": "none",
+            "longitude": -77.01028,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 38.88306,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:48"
+        },
+        {
+            "name": "none",
+            "longitude": -75.553889,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 39.739167,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:49"
+        },
+        {
+            "name": "none",
+            "longitude": -80.05278,
+            "params": {
+                "numregens": 0
+            },
+            "allowed": true,
+            "latitude": 26.709391,
+            "type": "Roadm",
+            "nodeDpid": "00:00:ff:ff:ff:ff:ff:4a"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/TestON/tests/FUNC/FUNCoptical/Topology.json b/TestON/tests/FUNC/FUNCoptical/Topology.json
new file mode 100644
index 0000000..21c21e7
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/Topology.json
@@ -0,0 +1,4362 @@
+{
+    "devices": {
+        "of:0000ffffffffff4a": {
+            "basic": {
+                "name": "WPBHFLAN",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff4a",
+                "longitude": -80.05278,
+                "mfr": "Linc",
+                "latitude": 26.709391,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff4b": {
+            "basic": {
+                "name": "AUSTTXGR",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff4b",
+                "longitude": -96.7,
+                "mfr": "Linc",
+                "latitude": 29.57,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff44": {
+            "basic": {
+                "name": "TCSNAZMA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff44",
+                "longitude": -110.968333,
+                "mfr": "Linc",
+                "latitude": 32.224444,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff45": {
+            "basic": {
+                "name": "TLHSFLAT",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff45",
+                "longitude": -84.290833,
+                "mfr": "Linc",
+                "latitude": 30.456389,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff46": {
+            "basic": {
+                "name": "TOLDOH21",
+                "optical.regens": 2,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff46",
+                "longitude": -83.538056,
+                "mfr": "Linc",
+                "latitude": 41.65,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff47": {
+            "basic": {
+                "name": "TULSOKTB",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff47",
+                "longitude": -95.985832,
+                "mfr": "Linc",
+                "latitude": 36.151669,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff40": {
+            "basic": {
+                "name": "STLSMO09",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff40",
+                "longitude": -90.215279,
+                "mfr": "Linc",
+                "latitude": 38.633335,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff41": {
+            "basic": {
+                "name": "STTLWA06",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff41",
+                "longitude": -122.333336,
+                "mfr": "Linc",
+                "latitude": 47.606945,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff42": {
+            "basic": {
+                "name": "SYRCNYSU",
+                "optical.regens": 3,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff42",
+                "longitude": -76.1475,
+                "mfr": "Linc",
+                "latitude": 43.049444,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff43": {
+            "basic": {
+                "name": "TAMQFLFN",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff43",
+                "longitude": -82.522778,
+                "mfr": "Linc",
+                "latitude": 28.0225,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff48": {
+            "basic": {
+                "name": "WASHDCSW",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff48",
+                "longitude": -77.01028,
+                "mfr": "Linc",
+                "latitude": 38.88306,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff49": {
+            "basic": {
+                "name": "WLMGDE01",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff49",
+                "longitude": -75.553889,
+                "mfr": "Linc",
+                "latitude": 39.739167,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffff00000a": {
+            "basic": {
+                "mfr": "Linc",
+                "name": "DLLSTXTL-R",
+                "latitude": 32.7,
+                "driver": "PK",
+                "type": "SWITCH",
+                "mac": "eaf75c83054e",
+                "longitude": -96.7
+            }
+        },
+        "of:0000ffffff00000b": {
+            "basic": {
+                "mfr": "Linc",
+                "name": "ATLNGATL-R",
+                "latitude": 33.7,
+                "driver": "PK",
+                "type": "SWITCH",
+                "mac": "ee5628887b4f",
+                "longitude": -97.7
+            }
+        },
+        "of:0000ffffffffff1d": {
+            "basic": {
+                "name": "LSANCA03",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff1d",
+                "longitude": -118.252958,
+                "mfr": "Linc",
+                "latitude": 34.051227,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff03": {
+            "basic": {
+                "name": "ALBYNYSS",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff03",
+                "longitude": -73.758333,
+                "mfr": "Linc",
+                "latitude": 42.652222,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff0a": {
+            "basic": {
+                "name": "BTRGLAMA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff0a",
+                "longitude": -91.184167,
+                "mfr": "Linc",
+                "latitude": 30.449722,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff0b": {
+            "basic": {
+                "name": "CHCGILCL",
+                "optical.regens": 4,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff0b",
+                "longitude": -87.640432,
+                "mfr": "Linc",
+                "latitude": 41.881484,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff0c": {
+            "basic": {
+                "name": "CHRLNCCA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff0c",
+                "longitude": -80.837502,
+                "mfr": "Linc",
+                "latitude": 35.224924,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff0d": {
+            "basic": {
+                "name": "CHTNSCDT",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff0d",
+                "longitude": -79.938056,
+                "mfr": "Linc",
+                "latitude": 32.785278,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff0e": {
+            "basic": {
+                "name": "CLEVOH02",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff0e",
+                "longitude": -81.686943,
+                "mfr": "Linc",
+                "latitude": 41.498333,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff0f": {
+            "basic": {
+                "name": "CLMBOH11",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff0f",
+                "longitude": -82.996666,
+                "mfr": "Linc",
+                "latitude": 39.965279,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffff000008": {
+            "basic": {
+                "mfr": "Linc",
+                "name": "MPLSMNDT-R",
+                "latitude": 44.9,
+                "driver": "PK",
+                "type": "SWITCH",
+                "mac": "96d57fb4eb43",
+                "longitude": -93.2
+            }
+        },
+        "of:0000ffffff000009": {
+            "basic": {
+                "mfr": "Linc",
+                "name": "LSANCA03-R",
+                "latitude": 34.1,
+                "driver": "PK",
+                "type": "SWITCH",
+                "mac": "6ee9b704c04d",
+                "longitude": -118.3
+            }
+        },
+        "of:0000ffffffffff19": {
+            "basic": {
+                "name": "HSTNTX01",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff19",
+                "longitude": -95.36528,
+                "mfr": "Linc",
+                "latitude": 29.748333,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff18": {
+            "basic": {
+                "name": "HRFRCT03",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff18",
+                "longitude": -72.676389,
+                "mfr": "Linc",
+                "latitude": 41.765833,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff13": {
+            "basic": {
+                "name": "DNVRCOMA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff13",
+                "longitude": -104.996391,
+                "mfr": "Linc",
+                "latitude": 39.744999,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffff000001": {
+            "basic": {
+                "mfr": "Linc",
+                "name": "WASHDCSW-R",
+                "latitude": 38.8,
+                "driver": "PK",
+                "type": "SWITCH",
+                "mac": "2221b5cb5c45",
+                "longitude": -77.0
+            }
+        },
+        "of:0000ffffff000002": {
+            "basic": {
+                "mfr": "Linc",
+                "name": "SNJSCA02-R",
+                "latitude": 37.3,
+                "driver": "PK",
+                "type": "SWITCH",
+                "mac": "f28c95ff6145",
+                "longitude": -121.8
+            }
+        },
+        "of:0000ffffffffff10": {
+            "basic": {
+                "name": "CMBRMA01",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff10",
+                "longitude": -71.084918,
+                "mfr": "Linc",
+                "latitude": 42.36745,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff17": {
+            "basic": {
+                "name": "GNBONCEU",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff17",
+                "longitude": -79.793889,
+                "mfr": "Linc",
+                "latitude": 36.072222,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffff000005": {
+            "basic": {
+                "mfr": "Linc",
+                "name": "PHNXAZMA-R",
+                "latitude": 33.4,
+                "driver": "PK",
+                "type": "SWITCH",
+                "mac": "566c93367041",
+                "longitude": -112.0
+            }
+        },
+        "of:0000ffffffffff15": {
+            "basic": {
+                "name": "ELPSTXMA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff15",
+                "longitude": -106.483611,
+                "mfr": "Linc",
+                "latitude": 31.756389,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff14": {
+            "basic": {
+                "name": "DTRTMIBA",
+                "optical.regens": 5,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff14",
+                "longitude": -83.054169,
+                "mfr": "Linc",
+                "latitude": 42.332779,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff12": {
+            "basic": {
+                "name": "DLLSTXTL",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff12",
+                "longitude": -96.780431,
+                "mfr": "Linc",
+                "latitude": 32.797524,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff11": {
+            "basic": {
+                "name": "CNCNOHWS",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff11",
+                "longitude": -84.516944,
+                "mfr": "Linc",
+                "latitude": 39.102778,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffff000003": {
+            "basic": {
+                "mfr": "Linc",
+                "name": "SNANTXCA-R",
+                "latitude": 29.4,
+                "driver": "PK",
+                "type": "SWITCH",
+                "mac": "c6463e3da348",
+                "longitude": -98.4
+            }
+        },
+        "of:0000ffffffffff1c": {
+            "basic": {
+                "name": "LGISLAND",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff1c",
+                "longitude": -73.6699993,
+                "mfr": "Linc",
+                "latitude": 40.5899999,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffff000004": {
+            "basic": {
+                "mfr": "Linc",
+                "name": "ROCHNYXA-R",
+                "latitude": 43.1,
+                "driver": "PK",
+                "type": "SWITCH",
+                "mac": "a2c8e539f440",
+                "longitude": -77.6
+            }
+        },
+        "of:0000ffffffffff1a": {
+            "basic": {
+                "name": "JCVLFLCL",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff1a",
+                "longitude": -81.43,
+                "mfr": "Linc",
+                "latitude": 30.33071,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff1f": {
+            "basic": {
+                "name": "LSVLKYCS",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff1f",
+                "longitude": -85.760833,
+                "mfr": "Linc",
+                "latitude": 38.249167,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff1e": {
+            "basic": {
+                "name": "LSVGNV02",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff1e",
+                "longitude": -115.138889,
+                "mfr": "Linc",
+                "latitude": 36.168056,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff16": {
+            "basic": {
+                "name": "FRSNCA01",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff16",
+                "longitude": -119.79423,
+                "mfr": "Linc",
+                "latitude": 36.73923,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff08": {
+            "basic": {
+                "name": "BRHMALMT",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff08",
+                "longitude": -86.812225,
+                "mfr": "Linc",
+                "latitude": 33.517223,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff09": {
+            "basic": {
+                "name": "BSMRNDJC",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff09",
+                "longitude": -100.796917,
+                "mfr": "Linc",
+                "latitude": 46.836379,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffff000006": {
+            "basic": {
+                "mfr": "Linc",
+                "name": "ORLDFLMA-R",
+                "latitude": 28.5,
+                "driver": "PK",
+                "type": "SWITCH",
+                "mac": "bac54f68574f",
+                "longitude": -81.3
+            }
+        },
+        "of:0000ffffffffff01": {
+            "basic": {
+                "name": "ABLNTXRO",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff01",
+                "longitude": -99.741564,
+                "mfr": "Linc",
+                "latitude": 32.508086,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff02": {
+            "basic": {
+                "name": "ALBQNMMA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff02",
+                "longitude": -106.649719,
+                "mfr": "Linc",
+                "latitude": 35.084446,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffff000007": {
+            "basic": {
+                "mfr": "Linc",
+                "name": "NWRKNJ02-R",
+                "latitude": 40.7,
+                "driver": "PK",
+                "type": "SWITCH",
+                "mac": "1237bde27347",
+                "longitude": -74.1
+            }
+        },
+        "of:0000ffffffffff04": {
+            "basic": {
+                "name": "ATLNGATL",
+                "optical.regens": 5,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff04",
+                "longitude": -97.743057,
+                "mfr": "Linc",
+                "latitude": 33.755833,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff05": {
+            "basic": {
+                "name": "BFLONYFR",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff05",
+                "longitude": -78.877778,
+                "mfr": "Linc",
+                "latitude": 42.882778,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff06": {
+            "basic": {
+                "name": "BLNGMTMA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff06",
+                "longitude": -108.509167,
+                "mfr": "Linc",
+                "latitude": 45.781667,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff07": {
+            "basic": {
+                "name": "BLTMMDCH",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff07",
+                "longitude": -76.614127,
+                "mfr": "Linc",
+                "latitude": 39.293781,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff2b": {
+            "basic": {
+                "name": "OKLDCA03",
+                "optical.regens": 2,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff2b",
+                "longitude": -122.268889,
+                "mfr": "Linc",
+                "latitude": 37.805556,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff2c": {
+            "basic": {
+                "name": "OMAHNENW",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff2c",
+                "longitude": -95.940277,
+                "mfr": "Linc",
+                "latitude": 41.259167,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff2a": {
+            "basic": {
+                "name": "OKCYOKCE",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff2a",
+                "longitude": -97.515274,
+                "mfr": "Linc",
+                "latitude": 35.470833,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff2f": {
+            "basic": {
+                "name": "PHNXAZMA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff2f",
+                "longitude": -112.07709,
+                "mfr": "Linc",
+                "latitude": 33.450361,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff2d": {
+            "basic": {
+                "name": "ORLDFLMA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff2d",
+                "longitude": -81.377502,
+                "mfr": "Linc",
+                "latitude": 28.543279,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff2e": {
+            "basic": {
+                "name": "PHLAPASL",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff2e",
+                "longitude": -75.184139,
+                "mfr": "Linc",
+                "latitude": 39.946446,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff39": {
+            "basic": {
+                "name": "SNANTXCA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff39",
+                "longitude": -98.488892,
+                "mfr": "Linc",
+                "latitude": 29.429445,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff38": {
+            "basic": {
+                "name": "SLKCUTMA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff38",
+                "longitude": -111.888336,
+                "mfr": "Linc",
+                "latitude": 40.767776,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff35": {
+            "basic": {
+                "name": "ROCHNYXA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff35",
+                "longitude": -77.616389,
+                "mfr": "Linc",
+                "latitude": 43.157222,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff34": {
+            "basic": {
+                "name": "RLGHNCMO",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff34",
+                "longitude": -78.640831,
+                "mfr": "Linc",
+                "latitude": 35.779656,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff37": {
+            "basic": {
+                "name": "SCTNPA01",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff37",
+                "longitude": -75.649167,
+                "mfr": "Linc",
+                "latitude": 41.415278,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff36": {
+            "basic": {
+                "name": "SCRMCA01",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff36",
+                "longitude": -121.487221,
+                "mfr": "Linc",
+                "latitude": 38.578609,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff31": {
+            "basic": {
+                "name": "PRVDRIGR",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff31",
+                "longitude": -71.415278,
+                "mfr": "Linc",
+                "latitude": 41.818889,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff30": {
+            "basic": {
+                "name": "PITBPADG",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff30",
+                "longitude": -79.995552,
+                "mfr": "Linc",
+                "latitude": 40.441387,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff33": {
+            "basic": {
+                "name": "RCMDVAGR",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff33",
+                "longitude": -77.436096,
+                "mfr": "Linc",
+                "latitude": 37.540752,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff32": {
+            "basic": {
+                "name": "PTLDOR62",
+                "optical.regens": 2,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff32",
+                "longitude": -122.678055,
+                "mfr": "Linc",
+                "latitude": 45.522499,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff22": {
+            "basic": {
+                "name": "MILWWIHE",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff22",
+                "longitude": -87.922501,
+                "mfr": "Linc",
+                "latitude": 43.037224,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff23": {
+            "basic": {
+                "name": "MMPHTNMA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff23",
+                "longitude": -90.048058,
+                "mfr": "Linc",
+                "latitude": 35.145158,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff20": {
+            "basic": {
+                "name": "LTRKARFR",
+                "optical.regens": 2,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff20",
+                "longitude": -92.271942,
+                "mfr": "Linc",
+                "latitude": 34.740833,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff21": {
+            "basic": {
+                "name": "MIAMFLAC",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff21",
+                "longitude": -80.195,
+                "mfr": "Linc",
+                "latitude": 25.779167,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff26": {
+            "basic": {
+                "name": "NSVLTNMT",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff26",
+                "longitude": -86.775558,
+                "mfr": "Linc",
+                "latitude": 36.163955,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff27": {
+            "basic": {
+                "name": "NWORLAMA",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff27",
+                "longitude": -90.07222,
+                "mfr": "Linc",
+                "latitude": 29.949806,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff24": {
+            "basic": {
+                "name": "MPLSMNDT",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff24",
+                "longitude": -93.26718,
+                "mfr": "Linc",
+                "latitude": 44.977365,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff25": {
+            "basic": {
+                "name": "NRFLVABS",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff25",
+                "longitude": -76.29,
+                "mfr": "Linc",
+                "latitude": 36.853333,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff28": {
+            "basic": {
+                "name": "NWRKNJ02",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff28",
+                "longitude": -74.177978,
+                "mfr": "Linc",
+                "latitude": 40.734408,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff29": {
+            "basic": {
+                "name": "NYCMNY54",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff29",
+                "longitude": -73.989713,
+                "mfr": "Linc",
+                "latitude": 40.767497,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff3e": {
+            "basic": {
+                "name": "SPFDILSD",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff3e",
+                "longitude": -89.649444,
+                "mfr": "Linc",
+                "latitude": 39.795278,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff3d": {
+            "basic": {
+                "name": "SNJSCA02",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff3d",
+                "longitude": -121.892778,
+                "mfr": "Linc",
+                "latitude": 37.333333,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff3f": {
+            "basic": {
+                "name": "SPKNWA01",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff3f",
+                "longitude": -117.419167,
+                "mfr": "Linc",
+                "latitude": 47.654724,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff3a": {
+            "basic": {
+                "name": "SNBBCA01",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff3a",
+                "longitude": -119.7,
+                "mfr": "Linc",
+                "latitude": 34.418889,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff3c": {
+            "basic": {
+                "name": "SNFCCA21",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff3c",
+                "longitude": -122.397263,
+                "mfr": "Linc",
+                "latitude": 37.785143,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff3b": {
+            "basic": {
+                "name": "SNDGCA02",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff3b",
+                "longitude": -117.158611,
+                "mfr": "Linc",
+                "latitude": 32.746944,
+                "type": "ROADM"
+            }
+        },
+        "of:0000ffffffffff1b": {
+            "basic": {
+                "name": "KSCYMO09",
+                "optical.regens": 0,
+                "driver": "LINC-OE",
+                "mac": "ffffffffffff1b",
+                "longitude": -94.578716,
+                "mfr": "Linc",
+                "latitude": 39.096649,
+                "type": "ROADM"
+            }
+        }
+    },
+    "links": {
+        "of:0000ffffff000006/6-of:0000ffffffffff2d/14": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff1b/101-of:0000ffffffffff2c/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 320
+            }
+        },
+        "of:0000ffffffffff1f/102-of:0000ffffffffff40/108": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 468
+            }
+        },
+        "of:0000ffffff000001/4-of:0000ffffffffff48/12": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff0f/101-of:0000ffffffffff30/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 312
+            }
+        },
+        "of:0000ffffffffff06/103-of:0000ffffffffff3f/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 852
+            }
+        },
+        "of:0000ffffffffff30/101-of:0000ffffffffff37/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 457
+            }
+        },
+        "of:0000ffffffffff02/103-of:0000ffffffffff1e/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 931
+            }
+        },
+        "of:0000ffffff00000a/6-of:0000ffffffffff12/14": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff12/102-of:0000ffffffffff20/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 563
+            }
+        },
+        "of:0000ffffff000003/5-of:0000ffffffffff39/13": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000005/3-of:0000ffffffffff2f/11": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff05/103-of:0000ffffffffff0e/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 333
+            }
+        },
+        "of:0000ffffffffff22/101-of:0000ffffffffff24/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 574
+            }
+        },
+        "of:0000ffffffffff0a/102-of:0000ffffffffff27/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 144
+            }
+        },
+        "of:0000ffffffffff02/100-of:0000ffffffffff12/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 1134
+            }
+        },
+        "of:0000ffffffffff04/102-of:0000ffffffffff0c/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 436
+            }
+        },
+        "of:0000ffffff00000a/4-of:0000ffffffffff12/12": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff2d/101-of:0000ffffffffff4a/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 290
+            }
+        },
+        "of:0000ffffffffff13/101-of:0000ffffffffff2c/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 940
+            }
+        },
+        "of:0000ffffff000008/2-of:0000ffffffffff24/10": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000007/6-of:0000ffffffffff28/14": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000008/3-of:0000ffffffffff24/11": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff14/101-of:0000ffffffffff46/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 103
+            }
+        },
+        "of:0000ffffff000002/3-of:0000ffffffffff3d/11": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000009/3-of:0000ffffffffff1d/11": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff11/103-of:0000ffffffffff48/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 779
+            }
+        },
+        "of:0000ffffff000002/5-of:0000ffffffffff3d/13": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff1b/103-of:0000ffffffffff47/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 420
+            }
+        },
+        "of:0000ffffffffff0d/101-of:0000ffffffffff1a/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 368
+            }
+        },
+        "of:0000ffffff000009/4-of:0000ffffffffff1d/12": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff28/101-of:0000ffffffffff2e/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 146
+            }
+        },
+        "of:0000ffffffffff1f/104-of:0000ffffffffff26/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 298
+            }
+        },
+        "of:0000ffffffffff0e/102-of:0000ffffffffff46/101": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 185
+            }
+        },
+        "of:0000ffffff000005/4-of:0000ffffffffff2f/12": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff0c/101-of:0000ffffffffff17/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 160
+            }
+        },
+        "of:0000ffffffffff18/101-of:0000ffffffffff1c/108": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 185
+            }
+        },
+        "of:0000ffffffffff06/101-of:0000ffffffffff09/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 724
+            }
+        },
+        "of:0000ffffff000009/5-of:0000ffffffffff1d/13": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff17/101-of:0000ffffffffff1f/108": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 697
+            }
+        },
+        "of:0000ffffffffff16/102-of:0000ffffffffff1d/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 396
+            }
+        },
+        "of:0000ffffff00000a/2-of:0000ffffffffff12/10": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff1c/101-of:0000ffffffffff29/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 40
+            }
+        },
+        "of:0000ffffff000006/4-of:0000ffffffffff2d/12": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff08/102-of:0000ffffffffff27/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 602
+            }
+        },
+        "of:0000ffffffffff1d/102-of:0000ffffffffff3a/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 167
+            }
+        },
+        "of:0000ffffff00000a/5-of:0000ffffffffff12/13": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000001/3-of:0000ffffffffff48/11": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff01/100-of:0000ffffffffff12/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 334
+            }
+        },
+        "of:0000ffffffffff1a/101-of:0000ffffffffff2d/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 238
+            }
+        },
+        "of:0000ffffff000004/6-of:0000ffffffffff35/14": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff1e/102-of:0000ffffffffff38/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 701
+            }
+        },
+        "of:0000ffffff000008/6-of:0000ffffffffff24/14": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000004/4-of:0000ffffffffff35/12": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000002/2-of:0000ffffffffff3d/10": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff03/101-of:0000ffffffffff42/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 239
+            }
+        },
+        "of:0000ffffffffff2e/101-of:0000ffffffffff37/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 201
+            }
+        },
+        "of:0000ffffffffff13/102-of:0000ffffffffff38/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 714
+            }
+        },
+        "of:0000ffffffffff07/101-of:0000ffffffffff2e/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 170
+            }
+        },
+        "of:0000ffffffffff16/103-of:0000ffffffffff2a/108": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 298
+            }
+        },
+        "of:0000ffffffffff3e/101-of:0000ffffffffff40/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 165
+            }
+        },
+        "of:0000ffffffffff02/101-of:0000ffffffffff13/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 646
+            }
+        },
+        "of:0000ffffff000002/6-of:0000ffffffffff3d/14": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000007/5-of:0000ffffffffff28/13": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000002/4-of:0000ffffffffff3d/12": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff01/101-of:0000ffffffffff15/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 768
+            }
+        },
+        "of:0000ffffff000006/2-of:0000ffffffffff2d/10": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff04/103-of:0000ffffffffff1a/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 566
+            }
+        },
+        "of:0000ffffffffff0e/101-of:0000ffffffffff0f/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 243
+            }
+        },
+        "of:0000ffffff000003/4-of:0000ffffffffff39/12": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000009/2-of:0000ffffffffff1d/10": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff18/102-of:0000ffffffffff31/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 125
+            }
+        },
+        "of:0000ffffff000001/5-of:0000ffffffffff48/13": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff11/102-of:0000ffffffffff1f/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 172
+            }
+        },
+        "of:0000ffffff00000b/6-of:0000ffffffffff04/14": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff29/101-of:0000ffffffffff28/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 19
+            }
+        },
+        "of:0000ffffffffff12/101-of:0000ffffffffff19/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 437
+            }
+        },
+        "of:0000ffffffffff3d/101-of:0000ffffffffff3a/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 455
+            }
+        },
+        "of:0000ffffffffff2b/103-of:0000ffffffffff3c/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 13
+            }
+        },
+        "of:0000ffffffffff4b/101-of:0000ffffffffff19/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 283
+            }
+        },
+        "of:0000ffffffffff32/101-of:0000ffffffffff36/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 934
+            }
+        },
+        "of:0000ffffffffff12/103-of:0000ffffffffff2a/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 365
+            }
+        },
+        "of:0000ffffffffff0d/102-of:0000ffffffffff34/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 424
+            }
+        },
+        "of:0000ffffffffff29/103-of:0000ffffffffff49/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 210
+            }
+        },
+        "of:0000ffffffffff10/101-of:0000ffffffffff31/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 80
+            }
+        },
+        "of:0000ffffffffff1d/101-of:0000ffffffffff3b/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 212
+            }
+        },
+        "of:0000ffffffffff29/102-of:0000ffffffffff37/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 187
+            }
+        },
+        "of:0000ffffff00000a/3-of:0000ffffffffff12/11": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff15/101-of:0000ffffffffff39/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 969
+            }
+        },
+        "of:0000ffffff000003/6-of:0000ffffffffff39/14": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff1e/101-of:0000ffffffffff2f/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 494
+            }
+        },
+        "of:0000ffffffffff1b/102-of:0000ffffffffff40/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 457
+            }
+        },
+        "of:0000ffffff000001/2-of:0000ffffffffff48/10": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff21/102-of:0000ffffffffff4a/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 125
+            }
+        },
+        "of:0000ffffff000003/3-of:0000ffffffffff39/11": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff15/102-of:0000ffffffffff44/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 511
+            }
+        },
+        "of:0000ffffff000005/2-of:0000ffffffffff2f/10": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff2b/102-of:0000ffffffffff38/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 1142
+            }
+        },
+        "of:0000ffffffffff0b/101-of:0000ffffffffff14/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 458
+            }
+        },
+        "of:0000ffffffffff45/101-of:0000ffffffffff43/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 384
+            }
+        },
+        "of:0000ffffffffff32/102-of:0000ffffffffff38/108": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 1225
+            }
+        },
+        "of:0000ffffffffff24/101-of:0000ffffffffff2c/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 560
+            }
+        },
+        "of:0000ffffff000006/3-of:0000ffffffffff2d/11": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff3c/101-of:0000ffffffffff3d/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 80.0
+            }
+        },
+        "of:0000ffffffffff21/101-of:0000ffffffffff43/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 407
+            }
+        },
+        "of:0000ffffff000008/5-of:0000ffffffffff24/13": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000005/6-of:0000ffffffffff2f/14": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff2f/102-of:0000ffffffffff44/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 205
+            }
+        },
+        "of:0000ffffff000007/3-of:0000ffffffffff28/11": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff0a/101-of:0000ffffffffff19/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 491
+            }
+        },
+        "of:0000ffffffffff41/101-of:0000ffffffffff3f/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 442
+            }
+        },
+        "of:0000ffffffffff33/101-of:0000ffffffffff48/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 184
+            }
+        },
+        "of:0000ffffff000004/3-of:0000ffffffffff35/11": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff2f/101-of:0000ffffffffff3b/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 575
+            }
+        },
+        "of:0000ffffff000006/5-of:0000ffffffffff2d/13": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff00000b/3-of:0000ffffffffff04/11": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000009/6-of:0000ffffffffff1d/14": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000007/2-of:0000ffffffffff28/10": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff17/103-of:0000ffffffffff33/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 319
+            }
+        },
+        "of:0000ffffffffff16/101-of:0000ffffffffff1f/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 505
+            }
+        },
+        "of:0000ffffffffff17/102-of:0000ffffffffff34/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 130
+            }
+        },
+        "of:0000ffffffffff2b/101-of:0000ffffffffff36/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 131
+            }
+        },
+        "of:0000ffffffffff03/100-of:0000ffffffffff10/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 265
+            }
+        },
+        "of:0000ffffffffff04/101-of:0000ffffffffff08/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 271
+            }
+        },
+        "of:0000ffffffffff07/103-of:0000ffffffffff46/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 68
+            }
+        },
+        "of:0000ffffffffff0b/102-of:0000ffffffffff22/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 156
+            }
+        },
+        "of:0000ffffffffff20/101-of:0000ffffffffff23/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 249
+            }
+        },
+        "of:0000ffffff00000b/2-of:0000ffffffffff04/10": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff25/102-of:0000ffffffffff49/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 392
+            }
+        },
+        "of:0000ffffffffff09/101-of:0000ffffffffff24/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 741
+            }
+        },
+        "of:0000ffffffffff2a/101-of:0000ffffffffff47/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 188
+            }
+        },
+        "of:0000ffffff000003/2-of:0000ffffffffff39/10": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff11/101-of:0000ffffffffff0f/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 194
+            }
+        },
+        "of:0000ffffffffff35/101-of:0000ffffffffff42/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 143
+            }
+        },
+        "of:0000ffffff000005/5-of:0000ffffffffff2f/13": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff00000b/5-of:0000ffffffffff04/13": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff25/101-of:0000ffffffffff34/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 290
+            }
+        },
+        "of:0000ffffffffff32/103-of:0000ffffffffff41/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 280
+            }
+        },
+        "of:0000ffffff000008/4-of:0000ffffffffff24/12": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff02/102-of:0000ffffffffff15/107": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 444
+            }
+        },
+        "of:0000ffffffffff0b/103-of:0000ffffffffff3e/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 344
+            }
+        },
+        "of:0000ffffffffff07/102-of:0000ffffffffff30/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 378
+            }
+        },
+        "of:0000ffffffffff4b/102-of:0000ffffffffff39/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 141
+            }
+        },
+        "of:0000ffffffffff23/101-of:0000ffffffffff26/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 380
+            }
+        },
+        "of:0000ffffff00000b/4-of:0000ffffffffff04/12": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff08/101-of:0000ffffffffff26/106": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 353
+            }
+        },
+        "of:0000ffffffffff27/101-of:0000ffffffffff45/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 670
+            }
+        },
+        "of:0000ffffff000004/2-of:0000ffffffffff35/10": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000001/6-of:0000ffffffffff48/14": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff05/104-of:0000ffffffffff35/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 128
+            }
+        },
+        "of:0000ffffffffff37/101-of:0000ffffffffff42/105": {
+            "basic": {
+                "optical.waves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 223
+            }
+        },
+        "of:0000ffffff000004/5-of:0000ffffffffff35/13": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffff000007/4-of:0000ffffffffff28/12": {
+            "basic": {
+                "bandwidth": 100000,
+                "type": "OPTICAL",
+                "durable": "true",
+                "optical.type": "cross-connect"
+            }
+        },
+        "of:0000ffffffffff06/102-of:0000ffffffffff13/107": {
+            "basic": {
+                "optical.wves": 80,
+                "durable": "true",
+                "type": "OPTICAL",
+                "optical.type": "WDM",
+                "optical.kms": 875
+            }
+        }
+    },
+    "ports": {
+        "of:0000ffffffffff27/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff3b/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff3b/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffff00000b/7": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 7
+            }
+        },
+        "of:0000ffffffffff32/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff22/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff4b/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff22/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff2f/12": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 12
+            }
+        },
+        "of:0000ffffffffff03/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff03/100": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 100
+            }
+        },
+        "of:0000ffffffffff38/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff32/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff38/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff38/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff38/108": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 108
+            }
+        },
+        "of:0000ffffffffff1e/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffff000008/8": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 8
+            }
+        },
+        "of:0000ffffffffff3d/12": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 12
+            }
+        },
+        "of:0000ffffffffff3d/13": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 13
+            }
+        },
+        "of:0000ffffffffff1e/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff3d/11": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 11
+            }
+        },
+        "of:0000ffffffffff3f/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff1e/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff42/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff42/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff42/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff41/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff39/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff39/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff35/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffff000009/9": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 9
+            }
+        },
+        "of:0000ffffffffff49/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff49/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff2f/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff24/10": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 10
+            }
+        },
+        "of:0000ffffffffff46/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff27/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff43/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff43/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff35/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff04/13": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 13
+            }
+        },
+        "of:0000ffffffffff04/12": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 12
+            }
+        },
+        "of:0000ffffffffff04/11": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 11
+            }
+        },
+        "of:0000ffffffffff04/10": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 10
+            }
+        },
+        "of:0000ffffffffff36/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff36/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff04/14": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 14
+            }
+        },
+        "of:0000ffffffffff35/14": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 14
+            }
+        },
+        "of:0000ffffffffff28/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff17/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff17/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff17/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff47/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff47/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff17/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff20/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff14/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffff000005/9": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 9
+            }
+        },
+        "of:0000ffffffffff1d/12": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 12
+            }
+        },
+        "of:0000ffffffffff1d/13": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 13
+            }
+        },
+        "of:0000ffffffffff14/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff1d/11": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 11
+            }
+        },
+        "of:0000ffffffffff18/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff18/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff35/10": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 10
+            }
+        },
+        "of:0000ffffffffff2b/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff2b/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff2a/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff39/13": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 13
+            }
+        },
+        "of:0000ffffff000006/9": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 9
+            }
+        },
+        "of:0000ffffff000006/8": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 8
+            }
+        },
+        "of:0000ffffffffff1d/14": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 14
+            }
+        },
+        "of:0000ffffffffff39/12": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 12
+            }
+        },
+        "of:0000ffffffffff16/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff16/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff16/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff15/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff15/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff15/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff15/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff48/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffff00000a/8": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 8
+            }
+        },
+        "of:0000ffffff00000a/9": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 9
+            }
+        },
+        "of:0000ffffffffff3c/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff3c/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff23/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff04/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff04/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff04/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff23/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff1c/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff33/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff07/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff07/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff07/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff3d/10": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 10
+            }
+        },
+        "of:0000ffffffffff40/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff2e/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff2e/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff35/12": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 12
+            }
+        },
+        "of:0000ffffffffff2e/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff3a/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff2d/14": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 14
+            }
+        },
+        "of:0000ffffffffff2d/11": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 11
+            }
+        },
+        "of:0000ffffffffff2d/10": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 10
+            }
+        },
+        "of:0000ffffffffff2d/13": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 13
+            }
+        },
+        "of:0000ffffffffff2d/12": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 12
+            }
+        },
+        "of:0000ffffffffff05/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff05/104": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 104
+            }
+        },
+        "of:0000ffffffffff24/14": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 14
+            }
+        },
+        "of:0000ffffffffff13/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff13/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff06/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff13/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff13/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff06/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffff000007/8": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 8
+            }
+        },
+        "of:0000ffffff000007/9": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 9
+            }
+        },
+        "of:0000ffffffffff48/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff44/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff44/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff35/13": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 13
+            }
+        },
+        "of:0000ffffffffff46/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff46/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff31/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff31/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff12/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff12/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff2d/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff12/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff32/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff12/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff12/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff0d/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff0d/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff48/14": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 14
+            }
+        },
+        "of:0000ffffffffff19/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff19/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff19/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff29/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff29/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff29/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff28/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff0a/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff29/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff35/11": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 11
+            }
+        },
+        "of:0000ffffffffff0a/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff30/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffff000004/7": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 7
+            }
+        },
+        "of:0000ffffffffff39/11": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 11
+            }
+        },
+        "of:0000ffffffffff39/10": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 10
+            }
+        },
+        "of:0000ffffffffff30/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff30/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff39/14": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 14
+            }
+        },
+        "of:0000ffffffffff12/10": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 10
+            }
+        },
+        "of:0000ffffffffff12/11": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 11
+            }
+        },
+        "of:0000ffffffffff12/12": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 12
+            }
+        },
+        "of:0000ffffffffff12/13": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 13
+            }
+        },
+        "of:0000ffffffffff12/14": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 14
+            }
+        },
+        "of:0000ffffffffff1d/10": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 10
+            }
+        },
+        "of:0000ffffffffff33/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff2c/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff48/12": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 12
+            }
+        },
+        "of:0000ffffffffff2c/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff2c/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff2d/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff28/11": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 11
+            }
+        },
+        "of:0000ffffffffff28/10": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 10
+            }
+        },
+        "of:0000ffffffffff28/13": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 13
+            }
+        },
+        "of:0000ffffffffff28/12": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 12
+            }
+        },
+        "of:0000ffffffffff28/14": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 14
+            }
+        },
+        "of:0000ffffffffff45/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff3d/14": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 14
+            }
+        },
+        "of:0000ffffffffff45/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffff000004/9": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 9
+            }
+        },
+        "of:0000ffffff000004/8": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 8
+            }
+        },
+        "of:0000ffffffffff01/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff01/100": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 100
+            }
+        },
+        "of:0000ffffff000001/8": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 8
+            }
+        },
+        "of:0000ffffff000005/8": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 8
+            }
+        },
+        "of:0000ffffff000005/7": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 7
+            }
+        },
+        "of:0000ffffffffff27/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffff000007/7": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 7
+            }
+        },
+        "of:0000ffffffffff1b/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff1b/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff1b/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff24/11": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 11
+            }
+        },
+        "of:0000ffffffffff2b/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff06/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff11/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff11/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff11/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff24/13": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 13
+            }
+        },
+        "of:0000ffffff000002/8": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 8
+            }
+        },
+        "of:0000ffffffffff08/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff2a/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff24/12": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 12
+            }
+        },
+        "of:0000ffffffffff08/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff08/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff0b/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff0b/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff0c/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff0b/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff0c/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff26/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff26/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff2f/13": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 13
+            }
+        },
+        "of:0000ffffff00000a/7": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 7
+            }
+        },
+        "of:0000ffffffffff2f/11": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 11
+            }
+        },
+        "of:0000ffffffffff2f/10": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 10
+            }
+        },
+        "of:0000ffffffffff1c/108": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 108
+            }
+        },
+        "of:0000ffffffffff2f/14": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 14
+            }
+        },
+        "of:0000ffffffffff34/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff34/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff34/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff4a/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff4a/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff09/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff2a/108": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 108
+            }
+        },
+        "of:0000ffffffffff09/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffff000002/9": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 9
+            }
+        },
+        "of:0000ffffffffff1d/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff1d/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff1d/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffff000006/7": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 7
+            }
+        },
+        "of:0000ffffff000002/7": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 7
+            }
+        },
+        "of:0000ffffff000001/9": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 9
+            }
+        },
+        "of:0000ffffffffff02/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff02/103": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 103
+            }
+        },
+        "of:0000ffffffffff02/100": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 100
+            }
+        },
+        "of:0000ffffffffff02/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff2f/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff26/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff0e/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff0e/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff4b/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff0e/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffff000008/7": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 7
+            }
+        },
+        "of:0000ffffffffff1a/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff1a/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffff000009/8": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 8
+            }
+        },
+        "of:0000ffffffffff1a/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff24/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffff000009/7": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 7
+            }
+        },
+        "of:0000ffffffffff24/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffff000008/9": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 9
+            }
+        },
+        "of:0000ffffffffff24/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffff000001/7": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 7
+            }
+        },
+        "of:0000ffffff00000b/9": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 9
+            }
+        },
+        "of:0000ffffff00000b/8": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 8
+            }
+        },
+        "of:0000ffffffffff2f/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff3a/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff3d/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffff000003/7": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 7
+            }
+        },
+        "of:0000ffffffffff48/11": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 11
+            }
+        },
+        "of:0000ffffffffff48/10": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 10
+            }
+        },
+        "of:0000ffffffffff3d/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff20/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff41/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff25/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff25/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff1f/108": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 108
+            }
+        },
+        "of:0000ffffffffff10/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff37/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff37/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff37/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        },
+        "of:0000ffffffffff10/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff37/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffff000003/8": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 8
+            }
+        },
+        "of:0000ffffff000003/9": {
+            "optical": {
+                "speed": 0,
+                "type": "COPPER",
+                "port": 9
+            }
+        },
+        "of:0000ffffffffff1f/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff1f/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff1f/104": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 104
+            }
+        },
+        "of:0000ffffffffff1f/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff0f/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff3e/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff0f/105": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 105
+            }
+        },
+        "of:0000ffffffffff48/13": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 13
+            }
+        },
+        "of:0000ffffffffff3e/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff40/106": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 106
+            }
+        },
+        "of:0000ffffffffff0f/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff40/108": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 108
+            }
+        },
+        "of:0000ffffffffff21/102": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 102
+            }
+        },
+        "of:0000ffffffffff21/101": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 101
+            }
+        },
+        "of:0000ffffffffff3f/107": {
+            "optical": {
+                "type": "FIBER",
+                "speed": 0,
+                "port": 107
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/TestON/tests/FUNC/FUNCoptical/__init__.py b/TestON/tests/FUNC/FUNCoptical/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/__init__.py
diff --git a/TestON/tests/FUNC/FUNCoptical/dependencies/FuncIntentFunction.py b/TestON/tests/FUNC/FUNCoptical/dependencies/FuncIntentFunction.py
new file mode 100644
index 0000000..377fd20
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/dependencies/FuncIntentFunction.py
@@ -0,0 +1,1631 @@
+"""
+    Wrapper functions for FuncIntent
+    This functions include Onosclidriver and Mininetclidriver driver functions
+    Author: kelvin@onlab.us
+"""
+import time
+import copy
+import json
+
+def __init__( self ):
+    self.default = ''
+
+def hostIntent( main,
+                name,
+                host1,
+                host2,
+                onosNode=0,
+                host1Id="",
+                host2Id="",
+                mac1="",
+                mac2="",
+                vlan1="-1",
+                vlan2="-1",
+                sw1="",
+                sw2="",
+                expectedLink=0 ):
+    """
+    Description:
+        Verify add-host-intent
+    Steps:
+        - Discover hosts
+        - Add host intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of host intent to add eg. IPV4 | VLAN | Dualstack
+        host1 - Name of first host
+        host2 - Name of second host
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        host1Id - ONOS id of the first host eg. 00:00:00:00:00:01/-1
+        host2Id - ONOS id of the second host
+        mac1 - Mac address of first host
+        mac2 - Mac address of the second host
+        vlan1 - Vlan tag of first host, defaults to -1
+        vlan2 - Vlan tag of second host, defaults to -1
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    Return:
+        Returns main.TRUE if all verification passed, otherwise return
+        main.FALSE; returns main.FALSE if there is a key error
+    """
+
+    # Assert variables
+    assert main, "There is no main variable"
+    assert name, "variable name is empty"
+    assert host1 and host2, "You must specify hosts"
+
+    global itemName
+    itemName = name
+    h1Id = host1Id
+    h2Id = host2Id
+    h1Mac = mac1
+    h2Mac = mac2
+    vlan1 = vlan1
+    vlan2 = vlan2
+    hostNames = [ host1 , host2 ]
+    intentsId = []
+    stepResult = main.TRUE
+    pingResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+    onosNode = int( onosNode )
+
+    try:
+        if main.hostsData:
+            if not h1Mac:
+                h1Mac = main.hostsData[ host1 ][ 'mac' ]
+            if not h2Mac:
+                h2Mac = main.hostsData[ host2 ][ 'mac' ]
+            if main.hostsData[ host1 ].get( 'vlan' ):
+                vlan1 = main.hostsData[ host1 ][ 'vlan' ]
+            if main.hostsData[ host1 ].get( 'vlan' ):
+                vlan2 = main.hostsData[ host2 ][ 'vlan' ]
+            if not h1Id:
+                h1Id = main.hostsData[ host1 ][ 'id' ]
+            if not h2Id:
+                h2Id = main.hostsData[ host2 ][ 'id' ]
+
+        assert h1Id and h2Id, "You must specify host IDs"
+        if not ( h1Id and h2Id ):
+            main.log.info( "There are no host IDs" )
+            return main.FALSE
+
+    except KeyError:
+        main.log.error( itemName + ": Key error Exception" )
+        return main.FALSE
+
+    # Discover hosts using arping incase pingall discovery failed
+    main.log.info( itemName + ": Discover host using arping" )
+    main.Mininet1.arping( srcHost=host1, dstHost=host2 )
+    main.Mininet1.arping( srcHost=host2, dstHost=host1 )
+    host1 = main.CLIs[ 0 ].getHost( mac=h1Mac )
+    host2 = main.CLIs[ 0 ].getHost( mac=h2Mac )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Adding host intents
+    main.log.info( itemName + ": Adding host intents" )
+    intent1 = main.CLIs[ onosNode ].addHostIntent( hostIdOne=h1Id,
+                                                   hostIdTwo=h2Id )
+    intentsId.append( intent1 )
+
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+    checkFlowsCount( main )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+    # Verify flows
+    checkFlowsState( main )
+
+    # Ping hosts
+    firstPingResult = pingallHosts( main, hostNames )
+    if not firstPingResult:
+        main.log.debug( "First ping failed, there must be" +
+                       " something wrong with ONOS performance" )
+
+    # Ping hosts again...
+    pingTemp = pingallHosts( main, hostNames )
+    pingResult = pingResult and pingTemp
+    if pingTemp:
+        main.assertReturnString += 'Initial Pingall Passed\n'
+    else:
+        main.assertReturnString += 'Initial Pingall Failed\n'
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # Link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+
+        if linkDownResult:
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+        if topoResult:
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = pingallHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+
+        if pingTemp:
+            main.assertReturnString += 'Link Down Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Pingall Failed\n'
+
+        # Check intent states
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # Link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        time.sleep( main.rerouteSleep )
+
+        if linkUpResult:
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+
+        if topoResult:
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = pingallHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+
+        if pingTemp:
+            main.assertReturnString += 'Link Up Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Pingall Failed\n'
+
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+
+    if removeIntentResult:
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+
+    stepResult = pingResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def pointIntent( main,
+                 name,
+                 host1,
+                 host2,
+                 onosNode=0,
+                 deviceId1="",
+                 deviceId2="",
+                 port1="",
+                 port2="",
+                 ethType="",
+                 mac1="",
+                 mac2="",
+                 bandwidth="",
+                 lambdaAlloc=False,
+                 ipProto="",
+                 ip1="",
+                 ip2="",
+                 tcp1="",
+                 tcp2="",
+                 sw1="",
+                 sw2="",
+                 expectedLink=0 ):
+
+    """
+    Description:
+        Verify add-point-intent
+    Steps:
+        - Get device ids | ports
+        - Add point intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        host1 - Name of first host
+        host2 - Name of second host
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        deviceId1 - ONOS device id of the first switch, the same as the
+                    location of the first host eg. of:0000000000000001/1,
+                    located at device 1 port 1
+        deviceId2 - ONOS device id of the second switch
+        port1 - The port number where the first host is attached
+        port2 - The port number where the second host is attached
+        ethType - Ethernet type eg. IPV4, IPV6
+        mac1 - Mac address of first host
+        mac2 - Mac address of the second host
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        ip1 - IP address of first host
+        ip2 - IP address of second host
+        tcp1 - TCP port of first host
+        tcp2 - TCP port of second host
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert name, "variable name is empty"
+    assert host1 and host2, "You must specify hosts"
+
+    global itemName
+    itemName = name
+    host1 = host1
+    host2 = host2
+    hostNames = [ host1, host2 ]
+    intentsId = []
+
+    pingResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+    onosNode = int( onosNode )
+
+    # Adding bidirectional point  intents
+    main.log.info( itemName + ": Adding point intents" )
+    intent1 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+                                             egressDevice=deviceId2,
+                                             portIngress=port1,
+                                             portEgress=port2,
+                                             ethType=ethType,
+                                             ethSrc=mac1,
+                                             ethDst=mac2,
+                                             bandwidth=bandwidth,
+                                             lambdaAlloc=lambdaAlloc,
+                                             ipProto=ipProto,
+                                             ipSrc=ip1,
+                                             ipDst=ip2,
+                                             tcpSrc=tcp1,
+                                             tcpDst=tcp2 )
+
+    intentsId.append( intent1 )
+    intent2 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+                                             egressDevice=deviceId1,
+                                             portIngress=port2,
+                                             portEgress=port1,
+                                             ethType=ethType,
+                                             ethSrc=mac2,
+                                             ethDst=mac1,
+                                             bandwidth=bandwidth,
+                                             lambdaAlloc=lambdaAlloc,
+                                             ipProto=ipProto,
+                                             ipSrc=ip2,
+                                             ipDst=ip1,
+                                             tcpSrc=tcp2,
+                                             tcpDst=tcp1 )
+    intentsId.append( intent2 )
+
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+    # Verify flows
+    checkFlowsState( main )
+
+    # Ping hosts
+    pingTemp = pingallHosts( main, hostNames )
+    pingResult = pingResult and pingTemp
+    if pingTemp:
+        main.assertReturnString += 'Initial Pingall Passed\n'
+    else:
+        main.assertReturnString += 'Initial Pingall Failed\n'
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+
+        if linkDownResult:
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+        if topoResult:
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = pingallHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+        if pingTemp:
+            main.assertReturnString += 'Link Down Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Pingall Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        if linkUpResult:
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+        if topoResult:
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = pingallHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+
+        if pingTemp:
+            main.assertReturnString += 'Link Up Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Pingall Failed\n'
+
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+    if removeIntentResult:
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+
+    stepResult = pingResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def pointIntentTcp( main,
+                    name,
+                    host1,
+                    host2,
+                    onosNode=0,
+                    deviceId1="",
+                    deviceId2="",
+                    port1="",
+                    port2="",
+                    ethType="",
+                    mac1="",
+                    mac2="",
+                    bandwidth="",
+                    lambdaAlloc=False,
+                    ipProto="",
+                    ip1="",
+                    ip2="",
+                    tcp1="",
+                    tcp2="",
+                    sw1="",
+                    sw2="",
+                    expectedLink=0 ):
+
+    """
+    Description:
+        Verify add-point-intent only for TCP
+    Steps:
+        - Get device ids | ports
+        - Add point intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        host1 - Name of first host
+        host2 - Name of second host
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        deviceId1 - ONOS device id of the first switch, the same as the
+                    location of the first host eg. of:0000000000000001/1,
+                    located at device 1 port 1
+        deviceId2 - ONOS device id of the second switch
+        port1 - The port number where the first host is attached
+        port2 - The port number where the second host is attached
+        ethType - Ethernet type eg. IPV4, IPV6
+        mac1 - Mac address of first host
+        mac2 - Mac address of the second host
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        ip1 - IP address of first host
+        ip2 - IP address of second host
+        tcp1 - TCP port of first host
+        tcp2 - TCP port of second host
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert name, "variable name is empty"
+    assert host1 and host2, "You must specify hosts"
+
+    global itemName
+    itemName = name
+    host1 = host1
+    host2 = host2
+    hostNames = [ host1, host2 ]
+    intentsId = []
+
+    iperfResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+    onosNode = int( onosNode )
+
+    # Adding bidirectional point  intents
+    main.log.info( itemName + ": Adding point intents" )
+    intent1 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+                                                    egressDevice=deviceId2,
+                                                    portIngress=port1,
+                                                    portEgress=port2,
+                                                    ethType=ethType,
+                                                    ethSrc=mac1,
+                                                    ethDst=mac2,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip1,
+                                                    ipDst=ip2,
+                                                    tcpSrc=tcp1,
+                                                    tcpDst="" )
+
+    intent2 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+                                                    egressDevice=deviceId1,
+                                                    portIngress=port2,
+                                                    portEgress=port1,
+                                                    ethType=ethType,
+                                                    ethSrc=mac2,
+                                                    ethDst=mac1,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip2,
+                                                    ipDst=ip1,
+                                                    tcpSrc=tcp2,
+                                                    tcpDst="" )
+
+    intent3 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+                                                    egressDevice=deviceId2,
+                                                    portIngress=port1,
+                                                    portEgress=port2,
+                                                    ethType=ethType,
+                                                    ethSrc=mac1,
+                                                    ethDst=mac2,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip1,
+                                                    ipDst=ip2,
+                                                    tcpSrc="",
+                                                    tcpDst=tcp2 )
+
+    intent4 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+                                                    egressDevice=deviceId1,
+                                                    portIngress=port2,
+                                                    portEgress=port1,
+                                                    ethType=ethType,
+                                                    ethSrc=mac2,
+                                                    ethDst=mac1,
+                                                    bandwidth=bandwidth,
+                                                    lambdaAlloc=lambdaAlloc,
+                                                    ipProto=ipProto,
+                                                    ipSrc=ip2,
+                                                    ipDst=ip1,
+                                                    tcpSrc="",
+                                                    tcpDst=tcp1 )
+    intentsId.append( intent1 )
+    intentsId.append( intent2 )
+    intentsId.append( intent3 )
+    intentsId.append( intent4 )
+
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Verify flows
+    checkFlowsState( main )
+
+    # Run iperf to both host
+    iperfTemp = main.Mininet1.iperftcp( host1,host2,10 )
+    iperfResult = iperfResult and iperfTemp
+    if iperfTemp:
+        main.assertReturnString += 'Initial Iperf Passed\n'
+    else:
+        main.assertReturnString += 'Initial Iperf Failed\n'
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+
+        if linkDownResult:
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+        if topoResult:
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+
+        # Run iperf to both host
+        iperfTemp = main.Mininet1.iperftcp( host1,host2,10 )
+        iperfResult = iperfResult and iperfTemp
+        if iperfTemp:
+            main.assertReturnString += 'Link Down Iperf Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Iperf Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and iperfResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        if linkUpTemp:
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+
+        if topoResult:
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+
+        # Run iperf to both host
+        iperfTemp = main.Mininet1.iperftcp( host1,host2,10 )
+        iperfResult = iperfResult and iperfTemp
+        if iperfTemp:
+            main.assertReturnString += 'Link Up Iperf Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Iperf Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and iperfResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+    if removeIntentResult:
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+
+    stepResult = iperfResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def singleToMultiIntent( main,
+                         name,
+                         hostNames,
+                         onosNode=0,
+                         devices="",
+                         ports=None,
+                         ethType="",
+                         macs=None,
+                         bandwidth="",
+                         lambdaAlloc=False,
+                         ipProto="",
+                         ipAddresses="",
+                         tcp="",
+                         sw1="",
+                         sw2="",
+                         expectedLink=0 ):
+    """
+    Verify Single to Multi Point intents
+    NOTE:If main.hostsData is not defined, variables data should be passed
+    in the same order index wise. All devices in the list should have the same
+    format, either all the devices have its port or it doesn't.
+    eg. hostName = [ 'h1', 'h2' ,..  ]
+        devices = [ 'of:0000000000000001', 'of:0000000000000002', ...]
+        ports = [ '1', '1', ..]
+        ...
+    Description:
+        Verify add-single-to-multi-intent iterates through the list of given
+        host | devices and add intents
+    Steps:
+        - Get device ids | ports
+        - Add single to multi point intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        hostNames - List of host names
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        devices - List of device ids in the same order as the hosts
+                  in hostNames
+        ports - List of port numbers in the same order as the device in
+                devices
+        ethType - Ethernet type eg. IPV4, IPV6
+        macs - List of hosts mac address in the same order as the hosts in
+               hostNames
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        ipAddresses - IP addresses of host in the same order as the hosts in
+                      hostNames
+        tcp - TCP ports in the same order as the hosts in hostNames
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert hostNames, "You must specify hosts"
+    assert devices or main.hostsData, "You must specify devices"
+
+    global itemName
+    itemName = name
+    tempHostsData = {}
+    intentsId = []
+    onosNode = int( onosNode )
+
+    macsDict = {}
+    ipDict = {}
+    if hostNames and devices:
+        if len( hostNames ) != len( devices ):
+            main.log.debug( "hosts and devices does not have the same length" )
+            #print "len hostNames = ", len( hostNames )
+            #print "len devices = ", len( devices )
+            return main.FALSE
+        if ports:
+            if len( ports ) != len( devices ):
+                main.log.error( "Ports and devices does " +
+                                "not have the same length" )
+                #print "len devices = ", len( devices )
+                #print "len ports = ", len( ports )
+                return main.FALSE
+        else:
+            main.log.info( "Device Ports are not specified" )
+        if macs:
+            for i in range( len( devices ) ):
+                macsDict[ devices[ i ] ] = macs[ i ]
+
+    elif hostNames and not devices and main.hostsData:
+        devices = []
+        main.log.info( "singleToMultiIntent function is using main.hostsData" )
+        for host in hostNames:
+               devices.append( main.hostsData.get( host ).get( 'location' ) )
+               macsDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'mac' )
+               ipDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'ipAddresses' )
+        #print main.hostsData
+
+    #print 'host names = ', hostNames
+    #print 'devices = ', devices
+    #print "macsDict = ", macsDict
+
+    pingResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+
+    devicesCopy = copy.copy( devices )
+    if ports:
+        portsCopy = copy.copy( ports )
+    main.log.info( itemName + ": Adding single point to multi point intents" )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Adding bidirectional point  intents
+    for i in range( len( devices ) ):
+        ingressDevice = devicesCopy[ i ]
+        egressDeviceList = copy.copy( devicesCopy )
+        egressDeviceList.remove( ingressDevice )
+        if ports:
+            portIngress = portsCopy[ i ]
+            portEgressList = copy.copy( portsCopy )
+            del portEgressList[ i ]
+        else:
+            portIngress = ""
+            portEgressList = None
+        if not macsDict:
+            srcMac = ""
+        else:
+            srcMac = macsDict[ ingressDevice ]
+            if srcMac == None:
+                main.log.debug( "There is no MAC in device - " + ingressDevice )
+                srcMac = ""
+
+        intentsId.append(
+                        main.CLIs[ onosNode ].addSinglepointToMultipointIntent(
+                                            ingressDevice=ingressDevice,
+                                            egressDeviceList=egressDeviceList,
+                                            portIngress=portIngress,
+                                            portEgressList=portEgressList,
+                                            ethType=ethType,
+                                            ethSrc=srcMac,
+                                            bandwidth=bandwidth,
+                                            lambdaAlloc=lambdaAlloc,
+                                            ipProto=ipProto,
+                                            ipSrc="",
+                                            ipDst="",
+                                            tcpSrc="",
+                                            tcpDst="" ) )
+
+    # Wait some time for the flow to go through when using multi instance
+    pingTemp = pingallHosts( main, hostNames )
+
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+    # Verify flows
+    checkFlowsState( main )
+
+    pingTemp = pingallHosts( main, hostNames )
+    pingResult = pingResult and pingTemp
+    if pingTemp:
+        main.assertReturnString += 'Initial Pingall Passed\n'
+    else:
+        main.assertReturnString += 'Initial Pingall Failed\n'
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+
+        if linkDownResult:
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+        if topoResult:
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = pingallHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+        if pingTemp:
+            main.assertReturnString += 'Link Down Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Pingall Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        if linkUpResult:
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+        if topoResult:
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = pingallHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+        if pingTemp:
+            main.assertReturnString += 'Link Up Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Pingall Failed\n'
+
+        # Check Intents
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+    if removeIntentResult:
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+
+    stepResult = pingResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def multiToSingleIntent( main,
+                         name,
+                         hostNames,
+                         onosNode=0,
+                         devices="",
+                         ports=None,
+                         ethType="",
+                         macs=None,
+                         bandwidth="",
+                         lambdaAlloc=False,
+                         ipProto="",
+                         ipAddresses="",
+                         tcp="",
+                         sw1="",
+                         sw2="",
+                         expectedLink=0 ):
+    """
+    Verify Single to Multi Point intents
+    NOTE:If main.hostsData is not defined, variables data should be passed in the
+    same order index wise. All devices in the list should have the same
+    format, either all the devices have its port or it doesn't.
+    eg. hostName = [ 'h1', 'h2' ,..  ]
+        devices = [ 'of:0000000000000001', 'of:0000000000000002', ...]
+        ports = [ '1', '1', ..]
+        ...
+    Description:
+        Verify add-multi-to-single-intent
+    Steps:
+        - Get device ids | ports
+        - Add multi to single point intents
+        - Check intents
+        - Verify flows
+        - Ping hosts
+        - Reroute
+            - Link down
+            - Verify flows
+            - Check topology
+            - Ping hosts
+            - Link up
+            - Verify flows
+            - Check topology
+            - Ping hosts
+        - Remove intents
+    Required:
+        name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+        hostNames - List of host names
+    Optional:
+        onosNode - ONOS node to install the intents in main.CLIs[ ]
+                   0 by default so that it will always use the first
+                   ONOS node
+        devices - List of device ids in the same order as the hosts
+                  in hostNames
+        ports - List of port numbers in the same order as the device in
+                devices
+        ethType - Ethernet type eg. IPV4, IPV6
+        macs - List of hosts mac address in the same order as the hosts in
+               hostNames
+        bandwidth - Bandwidth capacity
+        lambdaAlloc - Allocate lambda, defaults to False
+        ipProto - IP protocol
+        ipAddresses - IP addresses of host in the same order as the hosts in
+                      hostNames
+        tcp - TCP ports in the same order as the hosts in hostNames
+        sw1 - First switch to bring down & up for rerouting purpose
+        sw2 - Second switch to bring down & up for rerouting purpose
+        expectedLink - Expected link when the switches are down, it should
+                       be two links lower than the links before the two
+                       switches are down
+    """
+
+    assert main, "There is no main variable"
+    assert hostNames, "You must specify hosts"
+    assert devices or main.hostsData, "You must specify devices"
+
+    global itemName
+    itemName = name
+    tempHostsData = {}
+    intentsId = []
+    onosNode = int( onosNode )
+
+    macsDict = {}
+    ipDict = {}
+    if hostNames and devices:
+        if len( hostNames ) != len( devices ):
+            main.log.debug( "hosts and devices does not have the same length" )
+            #print "len hostNames = ", len( hostNames )
+            #print "len devices = ", len( devices )
+            return main.FALSE
+        if ports:
+            if len( ports ) != len( devices ):
+                main.log.error( "Ports and devices does " +
+                                "not have the same length" )
+                #print "len devices = ", len( devices )
+                #print "len ports = ", len( ports )
+                return main.FALSE
+        else:
+            main.log.info( "Device Ports are not specified" )
+        if macs:
+            for i in range( len( devices ) ):
+                macsDict[ devices[ i ] ] = macs[ i ]
+    elif hostNames and not devices and main.hostsData:
+        devices = []
+        main.log.info( "multiToSingleIntent function is using main.hostsData" )
+        for host in hostNames:
+               devices.append( main.hostsData.get( host ).get( 'location' ) )
+               macsDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'mac' )
+               ipDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+                           main.hostsData.get( host ).get( 'ipAddresses' )
+        #print main.hostsData
+
+    #print 'host names = ', hostNames
+    #print 'devices = ', devices
+    #print "macsDict = ", macsDict
+
+    pingResult = main.TRUE
+    intentResult = main.TRUE
+    removeIntentResult = main.TRUE
+    flowResult = main.TRUE
+    topoResult = main.TRUE
+    linkDownResult = main.TRUE
+    linkUpResult = main.TRUE
+
+    devicesCopy = copy.copy( devices )
+    if ports:
+        portsCopy = copy.copy( ports )
+    main.log.info( itemName + ": Adding multi point to single point intents" )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+
+    # Adding bidirectional point  intents
+    for i in range( len( devices ) ):
+        egressDevice = devicesCopy[ i ]
+        ingressDeviceList = copy.copy( devicesCopy )
+        ingressDeviceList.remove( egressDevice )
+        if ports:
+            portEgress = portsCopy[ i ]
+            portIngressList = copy.copy( portsCopy )
+            del portIngressList[ i ]
+        else:
+            portEgress = ""
+            portIngressList = None
+        if not macsDict:
+            dstMac = ""
+        else:
+            dstMac = macsDict[ egressDevice ]
+            if dstMac == None:
+                main.log.debug( "There is no MAC in device - " + egressDevice )
+                dstMac = ""
+
+        intentsId.append(
+                        main.CLIs[ onosNode ].addMultipointToSinglepointIntent(
+                                            ingressDeviceList=ingressDeviceList,
+                                            egressDevice=egressDevice,
+                                            portIngressList=portIngressList,
+                                            portEgress=portEgress,
+                                            ethType=ethType,
+                                            ethDst=dstMac,
+                                            bandwidth=bandwidth,
+                                            lambdaAlloc=lambdaAlloc,
+                                            ipProto=ipProto,
+                                            ipSrc="",
+                                            ipDst="",
+                                            tcpSrc="",
+                                            tcpDst="" ) )
+
+    pingTemp = pingallHosts( main, hostNames )
+
+    # Check intents state
+    time.sleep( main.checkIntentSleep )
+    intentResult = checkIntentState( main, intentsId )
+
+    # Check intents state again if first check fails...
+    if not intentResult:
+        intentResult = checkIntentState( main, intentsId )
+
+    # Check flows count in each node
+    checkFlowsCount( main )
+    # Verify flows
+    checkFlowsState( main )
+
+    # Ping hosts
+    pingTemp = pingallHosts( main, hostNames )
+
+    # Ping hosts again...
+    pingTemp = pingallHosts( main, hostNames )
+    pingResult = pingResult and pingTemp
+    if pingTemp:
+        main.assertReturnString += 'Initial Pingall Passed\n'
+    else:
+        main.assertReturnString += 'Initial Pingall Failed\n'
+
+    # Test rerouting if these variables exist
+    if sw1 and sw2 and expectedLink:
+        # link down
+        linkDownResult = link( main, sw1, sw2, "down" )
+
+        if linkDownResult:
+            main.assertReturnString += 'Link Down Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Failed\n'
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, expectedLink )
+        if topoResult:
+            main.assertReturnString += 'Link Down Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = pingallHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+        if pingTemp:
+            main.assertReturnString += 'Link Down Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Pingall Failed\n'
+
+        # Check intent state
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Down Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Down Intent State Failed\n'
+
+        # Checks ONOS state in link down
+        if linkDownResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link down" )
+        else:
+            main.log.error( itemName + ": Failed to bring link down" )
+
+        # link up
+        linkUpResult = link( main, sw1, sw2, "up" )
+        if linkUpResult:
+            main.assertReturnString += 'Link Up Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Failed\n'
+
+        time.sleep( main.rerouteSleep )
+
+        # Check flows count in each node
+        checkFlowsCount( main )
+        # Verify flows
+        checkFlowsState( main )
+
+        # Check OnosTopology
+        topoResult = checkTopology( main, main.numLinks )
+        if topoResult:
+            main.assertReturnString += 'Link Up Topology State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Topology State Failed\n'
+
+        # Ping hosts
+        pingTemp = pingallHosts( main, hostNames )
+        pingResult = pingResult and pingTemp
+        if pingTemp:
+            main.assertReturnString += 'Link Up Pingall Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Pingall Failed\n'
+
+        # Check Intents
+        intentTemp = checkIntentState( main, intentsId )
+        intentResult = intentResult and intentTemp
+        if intentTemp:
+            main.assertReturnString += 'Link Up Intent State Passed\n'
+        else:
+            main.assertReturnString += 'Link Up Intent State Failed\n'
+
+        # Checks ONOS state in link up
+        if linkUpResult and topoResult and pingResult and intentResult:
+            main.log.info( itemName + ": Successfully brought link back up" )
+        else:
+            main.log.error( itemName + ": Failed to bring link back up" )
+
+    # Remove all intents
+    removeIntentResult = removeAllIntents( main, intentsId )
+    if removeIntentResult:
+        main.assertReturnString += 'Remove Intents Passed'
+    else:
+        main.assertReturnString += 'Remove Intents Failed'
+
+    stepResult = pingResult and linkDownResult and linkUpResult \
+                 and intentResult and removeIntentResult
+
+    return stepResult
+
+def pingallHosts( main, hostList ):
+    # Ping all host in the hosts list variable
+    main.log.info( "Pinging: " + str( hostList ) )
+    return main.Mininet1.pingallHosts( hostList )
+
+def getHostsData( main ):
+    """
+        Use fwd app and pingall to discover all the hosts
+    """
+
+    activateResult = main.TRUE
+    appCheck = main.TRUE
+    getDataResult = main.TRUE
+    main.log.info( "Activating reactive forwarding app " )
+    activateResult = main.CLIs[ 0 ].activateApp( "org.onosproject.fwd" )
+    time.sleep( main.fwdSleep )
+
+    for i in range( main.numCtrls ):
+        appCheck = appCheck and main.CLIs[ i ].appToIDCheck()
+        if appCheck != main.TRUE:
+            main.log.warn( main.CLIs[ i ].apps() )
+            main.log.warn( main.CLIs[ i ].appIDs() )
+
+    pingResult = main.Mininet1.pingall( timeout = 600 )
+    hostsJson = json.loads( main.CLIs[ 0 ].hosts() )
+    hosts = main.Mininet1.getHosts().keys()
+    # TODO: Make better use of new getHosts function
+    for host in hosts:
+        main.hostsData[ host ] = {}
+        main.hostsData[ host ][ 'mac' ] =  \
+            main.Mininet1.getMacAddress( host ).upper()
+        for hostj in hostsJson:
+            if main.hostsData[ host ][ 'mac' ] == hostj[ 'mac' ]:
+                main.hostsData[ host ][ 'id' ] = hostj[ 'id' ]
+                main.hostsData[ host ][ 'vlan' ] = hostj[ 'vlan' ]
+                main.hostsData[ host ][ 'location' ] = \
+                            hostj[ 'location' ][ 'elementId' ] + '/' + \
+                            hostj[ 'location' ][ 'port' ]
+                main.hostsData[ host ][ 'ipAddresses' ] = hostj[ 'ipAddresses' ]
+
+    main.log.info( "Deactivating reactive forwarding app " )
+    deactivateResult = main.CLIs[ 0 ].deactivateApp( "org.onosproject.fwd" )
+    if activateResult and deactivateResult and main.hostsData:
+        main.log.info( "Successfully used fwd app to discover hosts " )
+        getDataResult = main.TRUE
+    else:
+        main.log.info( "Failed to use fwd app to discover hosts " )
+        getDataResult = main.FALSE
+
+    print main.hostsData
+
+    return getDataResult
+
+def checkTopology( main, expectedLink ):
+    statusResult = main.TRUE
+    # Check onos topology
+    main.log.info( itemName + ": Checking ONOS topology " )
+
+    for i in range( main.numCtrls ):
+        topologyResult = main.CLIs[ i ].topology()
+        statusResult = main.ONOSbench.checkStatus( topologyResult,
+                                                   main.numSwitch,
+                                                   expectedLink )\
+                       and statusResult
+    if not statusResult:
+        main.log.error( itemName + ": Topology mismatch" )
+    else:
+        main.log.info( itemName + ": Topology match" )
+    return statusResult
+
+def checkIntentState( main, intentsId ):
+    """
+        This function will check intent state to make sure all the intents
+        are in INSTALLED state
+    """
+
+    intentResult = main.TRUE
+    results = []
+
+    main.log.info( itemName + ": Checking intents state" )
+    # First check of intents
+    for i in range( main.numCtrls ):
+        tempResult = main.CLIs[ i ].checkIntentState( intentsId=intentsId )
+        results.append( tempResult )
+
+    expectedState = [ 'INSTALLED', 'INSTALLING' ]
+
+    if all( result == main.TRUE for result in results ):
+        main.log.info( itemName + ": Intents are installed correctly" )
+    else:
+        # Wait for at least 5 second before checking the intents again
+        time.sleep( 5 )
+        results = []
+        # Second check of intents since some of the intents may be in
+        # INSTALLING state, they should be in INSTALLED at this time
+        for i in range( main.numCtrls ):
+            tempResult = main.CLIs[ i ].checkIntentState(
+                                                        intentsId=intentsId )
+            results.append( tempResult )
+        if all( result == main.TRUE for result in results ):
+            main.log.info( itemName + ": Intents are installed correctly" )
+        else:
+            main.log.error( itemName + ": Intents are NOT installed correctly" )
+            intentResult = main.FALSE
+
+    return intentResult
+
+def checkFlowsState( main ):
+
+    main.log.info( itemName + ": Check flows state" )
+    checkFlowsResult = main.CLIs[ 0 ].checkFlowsState()
+    return checkFlowsResult
+
+def link( main, sw1, sw2, option):
+
+    # link down
+    main.log.info( itemName + ": Bring link " + option + "between " +
+                       sw1 + " and " + sw2 )
+    linkResult = main.Mininet1.link( end1=sw1, end2=sw2, option=option )
+    return linkResult
+
+def removeAllIntents( main, intentsId ):
+    """
+        Remove all intents in the intentsId
+    """
+
+    onosSummary = []
+    removeIntentResult = main.TRUE
+    # Remove intents
+    for intent in intentsId:
+        main.CLIs[ 0 ].removeIntent( intentId=intent, purge=True )
+
+    time.sleep( main.removeIntentSleep )
+
+    # If there is remianing intents then remove intents should fail
+    for i in range( main.numCtrls ):
+        onosSummary.append( json.loads( main.CLIs[ i ].summary() ) )
+
+    for summary in onosSummary:
+        if summary.get( 'intents' ) != 0:
+            main.log.warn( itemName + ": There are " +
+                           str( summary.get( 'intents' ) ) +
+                           " intents remaining in node " +
+                           str( summary.get( 'node' ) ) +
+                           ", failed to remove all the intents " )
+            removeIntentResult = main.FALSE
+
+    if removeIntentResult:
+        main.log.info( itemName + ": There are no more intents remaining, " +
+                       "successfully removed all the intents." )
+
+    return removeIntentResult
+
+def checkFlowsCount( main ):
+    """
+        Check flows count in each node
+    """
+
+    flowsCount = []
+    main.log.info( itemName + ": Checking flows count in each ONOS node" )
+    for i in range( main.numCtrls ):
+        summaryResult = main.CLIs[ i ].summary()
+        if not summaryResult:
+            main.log.error( itemName + ": There is something wrong with " +
+                            "summary command" )
+            return main.FALSE
+        else:
+            summaryJson = json.loads( summaryResult )
+            flowsCount.append( summaryJson.get( 'flows' ) )
+
+    if flowsCount:
+        if all( flows==flowsCount[ 0 ] for flows in flowsCount ):
+            main.log.info( itemName + ": There are " + str( flowsCount[ 0 ] ) +
+                           " flows in all ONOS node" )
+        else:
+            for i in range( main.numCtrls ):
+                main.log.debug( itemName + ": ONOS node " + str( i ) + " has " +
+                                str( flowsCount[ i ] ) + " flows" )
+    else:
+        main.log.error( "Checking flows count failed, check summary command" )
+        return main.FALSE
+
+    return main.TRUE
+
+def checkLeaderChange( leaders1, leaders2 ):
+    """
+        Checks for a change in intent partition leadership.
+
+        Takes the output of leaders -c in json string format before and after
+        a potential change as input
+
+        Returns main.TRUE if no mismatches are detected
+        Returns main.FALSE if there is a mismatch or on error loading the input
+    """
+    try:
+        leaders1 = json.loads( leaders1 )
+        leaders2 = json.loads( leaders2 )
+    except ( AttributeError, TypeError):
+        main.log.exception( self.name + ": Object not as expected" )
+        return main.FALSE
+    except Exception:
+        main.log.exception( self.name + ": Uncaught exception!" )
+        main.cleanup()
+        main.exit()
+    main.log.info( "Checking Intent Paritions for Change in Leadership" )
+    mismatch = False
+    for dict1 in leaders1:
+        if "intent" in dict1.get( "topic", [] ):
+            for dict2 in leaders2:
+                if dict1.get( "topic", 0 ) == dict2.get( "topic", 0 ) and \
+                    dict1.get( "leader", 0 ) != dict2.get( "leader", 0 ):
+                    mismatch = True
+                    main.log.error( "{0} changed leader from {1} to {2}".\
+                        format( dict1.get( "topic", "no-topic" ),\
+                            dict1.get( "leader", "no-leader" ),\
+                            dict2.get( "leader", "no-leader" ) ) )
+    if mismatch:
+        return main.FALSE
+    else:
+        return main.TRUE
+
+def report( main ):
+    """
+    Report errors/warnings/exceptions
+    """
+
+    main.ONOSbench.logReport( main.ONOSip[ 0 ],
+                              [ "INFO",
+                                "FOLLOWER",
+                                "WARN",
+                                "flow",
+                                "ERROR",
+                                "Except" ],
+                              "s" )
+
+    main.log.info( "ERROR report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "ERROR" ],
+                "d" )
+
+    main.log.info( "EXCEPTIONS report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "Except" ],
+                "d" )
+
+    main.log.info( "WARNING report: \n" )
+    for i in range( main.numCtrls ):
+        main.ONOSbench.logReport( main.ONOSip[ i ],
+                [ "WARN" ],
+                "d" )
diff --git a/TestON/tests/FUNC/FUNCoptical/dependencies/startUp.py b/TestON/tests/FUNC/FUNCoptical/dependencies/startUp.py
new file mode 100644
index 0000000..bf2a2b6
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/dependencies/startUp.py
@@ -0,0 +1,38 @@
+"""
+    This wrapper function is use for starting up onos instance
+"""
+
+import time
+import os
+import json
+
+def onosBuild( main, gitBranch ):
+    """
+        This includes pulling ONOS and building it using maven install
+    """
+
+    buildResult = main.FALSE
+
+    # Git checkout a branch of ONOS
+    checkOutResult = main.ONOSbench.gitCheckout( gitBranch )
+    # Does the git pull on the branch that was checked out
+    if not checkOutResult:
+        main.log.warn( "Failed to checked out " + gitBranch +
+                                           " branch")
+    else:
+        main.log.info( "Successfully checked out " + gitBranch +
+                                           " branch")
+    gitPullResult = main.ONOSbench.gitPull()
+    if gitPullResult == main.ERROR:
+        main.log.error( "Error pulling git branch" )
+    else:
+        main.log.info( "Successfully pulled " + gitBranch + " branch" )
+
+    # Maven clean install
+    buildResult = main.ONOSbench.cleanInstall()
+
+    return buildResult
+
+
+
+
diff --git a/TestON/tests/FUNC/FUNCoptical/dependencies/topo.py b/TestON/tests/FUNC/FUNCoptical/dependencies/topo.py
new file mode 100644
index 0000000..b44e3fc
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/dependencies/topo.py
@@ -0,0 +1,100 @@
+"""
+    These functions can be used for topology comparisons
+"""
+
+import time
+import os
+import json
+
+def getAllDevices( main ):
+    """
+        Return a list containing the devices output from each ONOS node
+    """
+    devices = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].devices,
+                         name="devices-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        devices.append( t.result )
+    return devices
+
+def getAllHosts( main ):
+    """
+        Return a list containing the hosts output from each ONOS node
+    """
+    hosts = []
+    ipResult = main.TRUE
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].hosts,
+                         name="hosts-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        hosts.append( t.result )
+    return hosts
+
+def getAllPorts( main ):
+    """
+        Return a list containing the ports output from each ONOS node
+    """
+    ports = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].ports,
+                         name="ports-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        ports.append( t.result )
+    return ports
+
+def getAllLinks( main ):
+    """
+        Return a list containing the links output from each ONOS node
+    """
+    links = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].links,
+                         name="links-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        links.append( t.result )
+    return links
+
+def getAllClusters( main ):
+    """
+        Return a list containing the clusters output from each ONOS node
+    """
+    clusters = []
+    threads = []
+    for i in range( main.numCtrls ):
+        t = main.Thread( target=main.CLIs[i].clusters,
+                         name="clusters-" + str( i ),
+                         args=[ ] )
+        threads.append( t )
+        t.start()
+
+    for t in threads:
+        t.join()
+        clusters.append( t.result )
+    return clusters
+
+
diff --git a/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.params b/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.params
new file mode 100644
index 0000000..0b5ad68
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.params
@@ -0,0 +1,48 @@
+<PARAMS>
+    # CASE - Description
+    # 1 - Compile ONOS and push it to the test machines
+    # 2 - Test ovsdb connection and tearDown
+    # 3 - Test default br-int configuration and vxlan port
+    # 4 - Test default openflow configuration
+    # 5 - Test default flows
+    # 6 - Configure Network Subnet Port
+    # 7 - Test host go online and ping each other
+    # 8 - Clear ovs configuration and host configuration
+
+    <testcases>1,3,4,2,5,6,7,8</testcases>
+
+    <DEPENDENCY>
+        <path>/tests/FUNC/FUNCovsdbtest/dependencies/</path>
+    </DEPENDENCY>
+
+    <ENV>
+        <cellName>singlenode</cellName>
+        <cellApps>drivers,openflow,proxyarp,mobility</cellApps>
+    </ENV>
+
+    <CTRL>
+        <ip1>OC1</ip1>
+        <port1>6653</port1>
+        <ovsdbport>6640</ovsdbport>
+    </CTRL>
+
+    <TIMER>
+        <delaytime>5</delaytime>      #delaytime for ovsdb connection create and delete
+    </TIMER>
+
+    <HTTP>
+        <port>8181</port>
+        <path>/onos/vtn/</path>
+    </HTTP>
+
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <OVSDB>
+        <ip1>OCN</ip1>
+        <ip2>OC1</ip2>
+    </OVSDB>
+
+</PARAMS>
diff --git a/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.py b/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.py
new file mode 100644
index 0000000..45e15f4
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.py
@@ -0,0 +1,789 @@
+"""
+Description: This test is to check onos set configuration and flows with ovsdb connection.
+
+List of test cases:
+CASE1: Compile ONOS and push it to the test machines
+CASE2: Test ovsdb connection and tearDown
+CASE3: Test default br-int configuration and vxlan port
+CASE4: Test default openflow configuration
+CASE5: Test default flows
+CASE6: Configure Network Subnet Port
+CASE7: Test host go online and ping each other
+CASE8: Clear ovs configuration and host configuration
+zhanghaoyu7@huawei.com
+"""
+import os
+
+class FUNCovsdbtest:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        """
+        CASE1 is to compile ONOS and push it to the test machines
+
+        Startup sequence:
+        cell <name>
+        onos-verify-cell
+        NOTE: temporary - onos-remove-raft-logs
+        onos-uninstall
+        start mininet
+        git pull
+        mvn clean install
+        onos-package
+        onos-install -f
+        onos-wait-for-start
+        start cli sessions
+        start ovsdb
+        start vtn apps
+        """
+        import os
+        main.log.info( "ONOS Single node start " +
+                         "ovsdb test - initialization" )
+        main.case( "Setting up test environment" )
+        main.caseExplanation = "Setup the test environment including " +\
+                                "installing ONOS, start ONOS."
+
+        # load some variables from the params file
+        PULLCODE = False
+        if main.params[ 'GIT' ][ 'pull' ] == 'True':
+            PULLCODE = True
+        gitBranch = main.params[ 'GIT' ][ 'branch' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        ipList = os.getenv( main.params[ 'CTRL' ][ 'ip1' ] )
+        OVSDB1Ip = os.getenv( main.params[ 'OVSDB' ][ 'ip1' ] )
+        OVSDB2Ip = os.getenv( main.params[ 'OVSDB' ][ 'ip2' ] )
+
+        main.step( "Create cell file" )
+        cellAppString = main.params[ 'ENV' ][ 'cellApps' ]
+        main.ONOSbench.createCellFile( main.ONOSbench.ip_address, cellName,
+                                       main.OVSDB1.ip_address,
+                                       cellAppString, ipList )
+
+        main.step( "Applying cell variable to environment" )
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
+
+        main.log.info( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftLogs()
+
+        main.CLIs = []
+        main.nodes = []
+        main.numCtrls= 1
+
+        for i in range( 1, main.numCtrls + 1 ):
+            try:
+                main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
+                main.nodes.append( getattr( main, 'ONOS' + str( i ) ) )
+                ipList.append( main.nodes[ -1 ].ip_address )
+            except AttributeError:
+                break
+
+        main.log.info( "Uninstalling ONOS" )
+        for node in main.nodes:
+            main.ONOSbench.onosUninstall( node.ip_address )
+
+        # Make sure ONOS process is not running
+        main.log.info( "Killing any ONOS processes" )
+        killResults = main.TRUE
+        for node in main.nodes:
+            killed = main.ONOSbench.onosKill( node.ip_address )
+            killResults = killResults and killed
+
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
+        main.step( "Git checkout and pull" + gitBranch )
+        if PULLCODE:
+            main.ONOSbench.gitCheckout( gitBranch )
+            gitPullResult = main.ONOSbench.gitPull()
+            # values of 1 or 3 are good
+            utilities.assert_lesser( expect=0, actual=gitPullResult,
+                                      onpass="Git pull successful",
+                                      onfail="Git pull failed" )
+
+        main.ONOSbench.getVersion( report=True )
+
+        main.step( "Using mvn clean install" )
+        cleanInstallResult = main.TRUE
+        if PULLCODE and gitPullResult == main.TRUE:
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn" +
+                           "clean install" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=cleanInstallResult,
+                                 onpass="MCI successful",
+                                 onfail="MCI failed" )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+        utilities.assert_equals( expect=main.TRUE,
+                                     actual=packageResult,
+                                     onpass="Successfully created ONOS package",
+                                     onfail="Failed to create ONOS package" )
+
+        main.step( "Installing ONOS package" )
+        onosInstallResult = main.ONOSbench.onosInstall(
+                options="-f", node=main.nodes[0].ip_address )
+        utilities.assert_equals( expect=main.TRUE, actual=onosInstallResult,
+                                 onpass="ONOS install successful",
+                                 onfail="ONOS install failed" )
+
+        main.step( "Checking if ONOS is up yet" )
+        print main.nodes[0].ip_address
+        for i in range( 2 ):
+            onos1Isup = main.ONOSbench.isup( main.nodes[0].ip_address )
+            if onos1Isup:
+                break
+        utilities.assert_equals( expect=main.TRUE, actual=onos1Isup,
+                                 onpass="ONOS startup successful",
+                                 onfail="ONOS startup failed" )
+        main.log.step( "Starting ONOS CLI sessions" )
+        print main.nodes[0].ip_address
+        cliResults = main.ONOScli1.startOnosCli( main.nodes[0].ip_address )
+        utilities.assert_equals( expect=main.TRUE, actual=cliResults,
+                                 onpass="ONOS cli startup successful",
+                                 onfail="ONOS cli startup failed" )
+
+        main.step( "App Ids check" )
+        appCheck = main.ONOScli1.appToIDCheck()
+
+        if appCheck !=main.TRUE:
+            main.log.warn( main.CLIs[0].apps() )
+            main.log.warn( main.CLIs[0].appIDs() )
+            utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+                                 onpass="App Ids seem to be correct",
+                                 onfail="Something is wrong with app Ids" )
+        if cliResults == main.FALSE:
+            main.log.error( "Failed to start ONOS,stopping test" )
+            main.cleanup()
+            main.exit()
+
+        main.step( "Install onos-ovsdatabase" )
+        installResults = main.ONOScli1.activateApp( "org.onosproject.ovsdb" )
+        utilities.assert_equals( expect=main.TRUE, actual=installResults,
+                                 onpass="Install onos-ovsdatabase successful",
+                                 onfail="Install onos-ovsdatabase failed" )
+
+        main.step( "Install onos-app-vtnrsc" )
+        installResults = main.ONOScli1.activateApp( "org.onosproject.vtnrsc" )
+        utilities.assert_equals( expect=main.TRUE, actual=installResults,
+                                 onpass="Install onos-app-vtnrsc successful",
+                                 onfail="Install onos-app-vtnrsc failed" )
+
+        main.step( "Install onos-app-vtn" )
+        installResults = main.ONOScli1.activateApp( "org.onosproject.vtn" )
+        utilities.assert_equals( expect=main.TRUE, actual=installResults,
+                                 onpass="Install onos-app-vtn successful",
+                                 onfail="Install onos-app-vtn failed" )
+
+        main.step( "Install onos-app-vtnweb" )
+        installResults = main.ONOScli1.activateApp( "org.onosproject.vtnweb" )
+        utilities.assert_equals( expect=main.TRUE, actual=installResults,
+                                 onpass="Install onos-app-vtnweb successful",
+                                 onfail="Install onos-app-vtnweb failed" )
+
+    def CASE2( self, main ):
+
+        """
+        Test ovsdb connection and teardown
+        """
+        import os,sys
+        import re
+        import time
+
+        main.case( "Test ovsdb connection and teardown" )
+        main.caseExplanation = "Test ovsdb connection create and delete" +\
+                                " over ovsdb node and onos node "
+
+        ctrlip = os.getenv( main.params[ 'CTRL' ][ 'ip1' ] )
+        ovsdbport = main.params[ 'CTRL' ][ 'ovsdbport' ]
+        delaytime = main.params[ 'TIMER' ][ 'delaytime' ]
+
+        main.step( "Set ovsdb node manager" )
+        assignResult = main.OVSDB1.setManager( ip=ctrlip, port=ovsdbport, delaytime=delaytime )
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Set ovsdb node manager sucess",
+                                 onfail="Set ovsdb node manager failed" )
+
+        main.step( "Check ovsdb node manager is " + str( ctrlip ) )
+        response = main.OVSDB1.getManager()
+        if re.search( ctrlip, response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Check ovsdb node manager is " + str( response ) ,
+                                 onfail="Check ovsdb node manager failed" )
+
+        main.step( "Delete ovsdb node manager" )
+        deleteResult = main.OVSDB1.delManager( delaytime=delaytime )
+        stepResult = deleteResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node delete manager sucess",
+                                 onfail="ovsdb node delete manager failed" )
+
+        main.step( "Check ovsdb node delete manager " + str( ctrlip ) )
+        response = main.OVSDB1.getManager()
+        if not re.search( ctrlip, response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Check ovsdb node delete manager sucess",
+                                 onfail="Check ovsdb node delete manager failed" )
+
+    def CASE3( self, main ):
+
+        """
+        Test default br-int configuration and vxlan port
+        """
+        import re
+        import time
+        import os,sys
+
+        main.case( "Test default br-int configuration and vxlan port" )
+        main.caseExplanation = "onos create default br-int bridge and" +\
+                                " vxlan port on the ovsdb node"
+
+        ctrlip = os.getenv( main.params[ 'CTRL' ][ 'ip1' ] )
+        ovsdbport = main.params[ 'CTRL' ][ 'ovsdbport' ]
+        delaytime = main.params[ 'TIMER' ][ 'delaytime' ]
+
+        main.step( "ovsdb node 1 set ovs manager to " + str( ctrlip ) )
+        assignResult = main.OVSDB1.setManager( ip=ctrlip, port=ovsdbport, delaytime=delaytime )
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 1 set ovs manager to  to " +\
+                                  str( ctrlip ) + " sucess",
+                                 onfail="ovsdb node 1 set ovs manager to  to " +\
+                                  str( ctrlip ) + " failed" )
+
+        main.step( "ovsdb node 2 set ovs manager to " + str( ctrlip ) )
+        assignResult = main.OVSDB2.setManager( ip=ctrlip, port=ovsdbport, delaytime=delaytime )
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 2 set ovs manager to  to " +\
+                                  str( ctrlip ) + " sucess",
+                                 onfail="ovsdb node 2 set ovs manager to  to " +\
+                                  str( ctrlip ) + " failed" )
+
+        main.step( "Check ovsdb node 1 manager is " + str( ctrlip ) )
+        response = main.OVSDB1.getManager()
+        if re.search( ctrlip, response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 1 manager is " + str( response ) ,
+                                 onfail="ovsdb node 1 manager check failed" )
+
+        main.step( "Check ovsdb node 2 manager is " + str( ctrlip ) )
+        response = main.OVSDB2.getManager()
+        if re.search( ctrlip, response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 2 manager is " + str( response ) ,
+                                 onfail="ovsdb node 2 manager check failed" )
+
+        main.step( "Check default br-int bridge on ovsdb node " + str( OVSDB1Ip ) )
+        response = main.OVSDB1.listBr()
+        if re.search( "br-int", response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="onos add default bridge on the node 1 sucess",
+                                 onfail="onos add default bridge on the node 1 failed" )
+
+        main.step( "Check default br-int bridge on ovsdb node " + str( OVSDB2Ip ) )
+        response = main.OVSDB2.listBr()
+        if re.search( "br-int", response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="onos add default bridge on the node 2 sucess",
+                                 onfail="onos add default bridge on the node 2 failed" )
+
+        main.step( "Check default vxlan port on ovsdb node " + str( OVSDB1Ip ) )
+        response = main.OVSDB1.listPorts( "br-int" )
+        if re.search( "vxlan", response ) and re.search( str( OVSDB2Ip ), response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="onos add default vxlan port on the node 1 sucess",
+                                 onfail="onos add default vxlan port on the node 1 failed" )
+
+        main.step( "Check default vxlan port on ovsdb node " + str( OVSDB2Ip ) )
+        response = main.OVSDB2.listPorts( "br-int" )
+        if re.search( "vxlan", response ) and re.search( str( OVSDB1Ip ), response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="onos add default vxlan port on the node 2 sucess",
+                                 onfail="onos add default vxlan port on the node 2 failed" )
+
+    def CASE4( self, main ):
+
+        """
+        Test default openflow configuration
+        """
+        import re
+        import time
+        import os,sys
+
+        ctrlip = os.getenv( main.params[ 'CTRL' ][ 'ip1' ] )
+        ovsdbport = main.params[ 'CTRL' ][ 'ovsdbport' ]
+        delaytime = main.params[ 'TIMER' ][ 'delaytime' ]
+
+        main.step( "ovsdb node 1 set ovs manager to " + str( ctrlip ) )
+        assignResult = main.OVSDB1.setManager( ip=ctrlip, port=ovsdbport, delaytime=delaytime )
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 1 set ovs manager to  to " +\
+                                  str( ctrlip ) + " sucess",
+                                 onfail="ovsdb node 1 set ovs manager to  to " +\
+                                  str( ctrlip ) + " failed" )
+
+        main.step( "ovsdb node 2 set ovs manager to " + str( ctrlip ) )
+        assignResult = main.OVSDB2.setManager( ip=ctrlip, port=ovsdbport, delaytime=delaytime )
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 2 set ovs manager to  to " +\
+                                  str( ctrlip ) + " sucess",
+                                 onfail="ovsdb node 2 set ovs manager to  to " +\
+                                  str( ctrlip ) + " failed" )
+
+        main.step( "Check ovsdb node 1 manager is " + str( ctrlip ) )
+        response = main.OVSDB1.getManager()
+        if re.search( ctrlip, response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 1 manager is " + str( response ) ,
+                                 onfail="ovsdb node 1 manager check failed\n" +\
+                                 str( main.OVSDB1.show() ) )
+
+        main.step( "Check ovsdb node 2 manager is " + str( ctrlip ) )
+        response = main.OVSDB2.getManager()
+        if re.search( ctrlip, response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 2 manager is " + str( response ) ,
+                                 onfail="ovsdb node 2 manager check failed\n" +\
+                                 str( main.OVSDB2.show() ) )
+
+        main.step( "Check ovsdb node 1 bridge br-int controller set to " + str( ctrlip ) )
+        response = main.OVSDB1.getController( "br-int" )
+        if re.search( ctrlip, response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Check ovsdb node 1 bridge br-int controller set to " +\
+                                  str( ctrlip ) + " sucess",
+                                 onfail="Check ovsdb node 1 bridge br-int controller set to " +\
+                                  str( ctrlip ) + " failed\n" + str( main.OVSDB1.show() ) )
+
+        main.step( "Check ovsdb node 2 bridge br-int controller set to  " + str( ctrlip ) )
+        response = main.OVSDB2.getController( "br-int" )
+        if re.search( ctrlip, response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Check ovsdb node 2 bridge br-int controller set to " +\
+                                  str( ctrlip ) + " sucess",
+                                 onfail="Check ovsdb node 2 bridge br-int controller set to " +\
+                                  str( ctrlip ) + " failed\n" + str( main.OVSDB2.show()) )
+
+        main.step( "Check onoscli devices have ovs " + str( OVSDB1Ip ) )
+        response = main.ONOScli1.devices()
+        if re.search( OVSDB1Ip, response ) and not re.search( "false", response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Check onoscli devices have ovs " + str( OVSDB1Ip ) + " sucess",
+                                 onfail="Check onoscli devices have ovs " + str( OVSDB1Ip ) + " failed" )
+
+        main.step( "Check onoscli devices have ovs " + str( OVSDB2Ip ) )
+        response = main.ONOScli1.devices()
+        if re.search( OVSDB2Ip, response ) and not re.search( "false", response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Check onoscli devices have ovs " + str( OVSDB2Ip ) + " sucess",
+                                 onfail="Check onoscli devices have ovs " + str( OVSDB2Ip ) + " failed" )
+
+    def CASE5( self, main ):
+
+        """
+        Test default flows
+        """
+        import re
+        import time
+        import os,sys
+
+        ctrlip = os.getenv( main.params[ 'CTRL' ][ 'ip1' ] )
+        ovsdbport = main.params[ 'CTRL' ][ 'ovsdbport' ]
+        delaytime = main.params[ 'TIMER' ][ 'delaytime' ]
+
+        main.step( "ovsdb node 1 set ovs manager to onos" )
+        assignResult = main.OVSDB1.setManager( ip=ctrlip, port=ovsdbport, delaytime=delaytime )
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 1 set ovs manager to  to " +\
+                                  str( ctrlip ) + " sucess",
+                                 onfail="ovsdb node 1 set ovs manager to  to " +\
+                                  str( ctrlip ) + " failed" )
+
+        main.step( "Check ovsdb node 1 manager is " + str( ctrlip ) )
+        response = main.OVSDB1.getManager()
+        if re.search( ctrlip, response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 1 manager is " + str( response ) ,
+                                 onfail="ovsdb node 1 manager check failed" )
+
+        main.step( "Check ovsdb node 1 bridge br-int default flows on " + str( OVSDB1Ip ) )
+        response = main.OVSDB1.dumpFlows( sw="br-int", protocols="OpenFlow13" )
+        if re.search( "actions=CONTROLLER", response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully set default flows " + str( ctrlip ) ,
+                                 onfail="Failed to set default flows " + str( ctrlip ) )
+
+    def CASE6( self, main ):
+        """
+        Configure Network Subnet Port
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCovsdbtest.dependencies.Nbdata import NetworkData
+            from tests.FUNC.FUNCovsdbtest.dependencies.Nbdata import SubnetData
+            from tests.FUNC.FUNCovsdbtest.dependencies.Nbdata import VirtualPortData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "Configure Network Subnet Port Start" )
+        main.case( "Configure Network Subnet Port" )
+        main.caseExplanation = "Configure Network Subnet Port " +\
+                                "Verify post is OK"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        httpport = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.step( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        subnet = SubnetData()
+        subnet.id = "e44bd655-e22c-4aeb-b1e9-ea1606875178"
+        subnet.tenant_id = network.tenant_id
+        subnet.network_id = network.id
+        subnet.start = "10.0.0.1"
+        subnet.end = "10.0.0.254"
+        subnet.cidr = "10.0.0.0/24"
+        port1 = VirtualPortData()
+        port1.id = "00000000-0000-0000-0000-000000000001"
+        port1.subnet_id = subnet.id
+        port1.tenant_id = network.tenant_id
+        port1.network_id = network.id
+        port1.macAddress = "00:00:00:00:00:01"
+        port1.ip_address = "10.0.0.1"
+        port2 = VirtualPortData()
+        port2.id = "00000000-0000-0000-0000-000000000002"
+        port2.subnet_id = subnet.id
+        port2.tenant_id = network.tenant_id
+        port2.network_id = network.id
+        port2.macAddress = "00:00:00:00:00:02"
+        port2.ip_address = "10.0.0.2"
+
+        networkpostdata = network.DictoJson()
+        subnetpostdata = subnet.DictoJson()
+        port1postdata = port1.DictoJson()
+        port2postdata = port2.DictoJson()
+
+        main.step( "Post Network Data via HTTP(Post port need post network)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'networks/',
+                                                 'POST', None, networkpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Network Success",
+                onfail="Post Network Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Subnet Data via HTTP(Post port need post subnet)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'subnets/',
+                                                 'POST', None, subnetpostdata )
+        utilities.assert_equals(
+                expect='202',
+                actual=Poststatus,
+                onpass="Post Subnet Success",
+                onfail="Post Subnet Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Port1 Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'ports/',
+                                                 'POST', None, port1postdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Port Success",
+                onfail="Post Port Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Port2 Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'ports/',
+                                                 'POST', None, port2postdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Port Success",
+                onfail="Post Port Failed " + str( Poststatus ) + "," + str( result ) )
+
+    def CASE7( self, main ):
+
+        """
+        Test host go online and ping each other
+        """
+        import re
+        import time
+        import os,sys
+
+        ctrlip = os.getenv( main.params[ 'CTRL' ][ 'ip1' ] )
+        ovsdbport = main.params[ 'CTRL' ][ 'ovsdbport' ]
+        delaytime = main.params[ 'TIMER' ][ 'delaytime' ]
+
+        main.step( "ovsdb node 1 set ovs manager to " + str( ctrlip ) )
+        assignResult = main.OVSDB1.setManager( ip=ctrlip, port=ovsdbport, delaytime=delaytime )
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 1 set ovs manager to  to " +\
+                                  str( ctrlip ) + " sucess",
+                                 onfail="ovsdb node 1 set ovs manager to  to " +\
+                                  str( ctrlip ) + " failed" )
+
+        main.step( "ovsdb node 2 set ovs manager to " + str( ctrlip ) )
+        assignResult = main.OVSDB2.setManager( ip=ctrlip, port=ovsdbport, delaytime=delaytime )
+        stepResult = assignResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 2 set ovs manager to " +\
+                                  str( ctrlip ) + " sucess",
+                                 onfail="ovsdb node 2 set ovs manager to " +\
+                                  str( ctrlip ) + " failed" )
+
+        main.step( "Create host1 on node 1 " + str( OVSDB1Ip ) )
+        stepResult = main.OVSDB1.createHost( hostname="host1" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Create host1 on node 1 " + str( OVSDB1Ip ) + " sucess",
+                                 onfail="Create host1 on node 1 " + str( OVSDB1Ip ) + " failed" )
+
+        main.step( "Create host2 on node 2 " + str( OVSDB2Ip ) )
+        stepResult = main.OVSDB2.createHost( hostname="host2" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Create host2 on node 2 " + str( OVSDB2Ip ) + " sucess",
+                                 onfail="Create host2 on node 2 " + str( OVSDB2Ip ) + " failed" )
+
+        main.step( "Create port on host1 on the node " + str ( OVSDB1Ip ) )
+        stepResult = main.OVSDB1.createHostport( hostname="host1", hostport="host1-eth0", hostportmac="000000000001" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Create port on host1 on the node " + str( OVSDB1Ip ) + " sucess",
+                                 onfail="Create port on host1 on the node " + str( OVSDB1Ip ) + " failed" )
+
+        main.step( "Create port on host2 on the node " + str ( OVSDB2Ip ) )
+        stepResult = main.OVSDB2.createHostport( hostname="host2", hostport="host2-eth0", hostportmac="000000000002" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Create port on host1 on the node " + str( OVSDB2Ip ) + " sucess",
+                                 onfail="Create port on host1 on the node " + str( OVSDB2Ip ) + " failed" )
+
+        main.step( "Add port to ovs br-int and host go-online on the node " + str ( OVSDB1Ip ) )
+        stepResult = main.OVSDB1.addPortToOvs( ovsname="br-int", ifaceId="00000000-0000-0000-0000-000000000001",
+                                               attachedMac="00:00:00:00:00:01", vmuuid="10000000-0000-0000-0000-000000000001" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Add port to ovs br-int and host go-online on the node " +\
+                                  str( OVSDB1Ip ) + " sucess",
+                                 onfail="Add port to ovs br-int and host go-online on the node " +\
+                                  str( OVSDB1Ip ) + " failed" )
+
+        main.step( "Add port to ovs br-int and host go-online on the node " + str ( OVSDB2Ip ) )
+        stepResult = main.OVSDB2.addPortToOvs( ovsname="br-int", ifaceId="00000000-0000-0000-0000-000000000002",
+                                               attachedMac="00:00:00:00:00:02", vmuuid="10000000-0000-0000-0000-000000000001" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Add port to ovs br-int and host go-online on the node " +\
+                                  str( OVSDB2Ip ) + " sucess",
+                                 onfail="Add port to ovs br-int and host go-online on the node " +\
+                                  str( OVSDB2Ip ) + " failed" )
+
+        main.step( "Check onos set host flows on the node " + str( OVSDB1Ip ) )
+        response = main.OVSDB1.dumpFlows( sw="br-int", protocols="OpenFlow13" )
+        if re.search( "00:00:00:00:00:01", response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Check onos set host flows on the node " +\
+                                  str( OVSDB1Ip ) + " sucess",
+                                 onfail="Check onos set host flows on the node " +\
+                                  str( OVSDB1Ip ) + " failed" )
+
+        main.step( "Check onos set host flows on the node " + str( OVSDB2Ip ) )
+        response = main.OVSDB2.dumpFlows( sw="br-int", protocols="OpenFlow13" )
+        if re.search( "00:00:00:00:00:02", response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Check onos set host flows on the node " +\
+                                  str( OVSDB2Ip ) + " sucess",
+                                 onfail="Check onos set host flows on the node " +\
+                                  str( OVSDB2Ip ) + " failed" )
+
+        main.step( "Check hosts can ping each other" )
+        main.OVSDB1.setHostportIp( hostname="host1", hostport1="host1-eth0", ip="10.0.0.1" )
+        main.OVSDB2.setHostportIp( hostname="host2", hostport1="host2-eth0", ip="10.0.0.2" )
+        pingResult1 = main.OVSDB1.hostPing( src="10.0.0.1", hostname="host1", target="10.0.0.2" )
+        pingResult2 = main.OVSDB2.hostPing( src="10.0.0.2", hostname="host2", target="10.0.0.1" )
+        stepResult = pingResult1 and pingResult2
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully host go online and ping each other,controller is " +\
+                                        str( ctrlip ),
+                                 onfail="Failed to host go online and ping each other,controller is " +\
+                                        str( ctrlip ) )
+
+    def CASE8( self, main ):
+
+        """
+        Clear ovs configuration and host configuration
+        """
+        import re
+        import time
+        import os,sys
+
+        ctrlip = os.getenv( main.params[ 'CTRL' ][ 'ip1' ] )
+        OVSDB1Ip = os.getenv( main.params[ 'OVSDB' ][ 'ip1' ] )
+        OVSDB2Ip = os.getenv( main.params[ 'OVSDB' ][ 'ip2' ] )
+        delaytime = main.params[ 'TIMER' ][ 'delaytime' ]
+
+        main.step( "Delete ovsdb node 1 manager" )
+        deleteResult = main.OVSDB1.delManager( delaytime=delaytime )
+        stepResult = deleteResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 1 delete manager sucess",
+                                 onfail="ovsdb node 1 delete manager failed" )
+
+        main.step( "Delete ovsdb node 2 manager" )
+        deleteResult = main.OVSDB2.delManager( delaytime=delaytime )
+        stepResult = deleteResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="ovsdb node 2 delete manager sucess",
+                                 onfail="ovsdb node 2 delete manager failed" )
+
+        main.step( "Delete ovsdb node 1 bridge br-int" )
+        deleteResult = main.OVSDB1.delBr( sw="br-int" )
+        stepResult = deleteResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Delete ovsdb node 1 bridge br-int sucess",
+                                 onfail="Delete ovsdb node 1 bridge br-int failed" )
+
+        main.step( "Delete ovsdb node 2 bridge br-int" )
+        deleteResult = main.OVSDB2.delBr( sw="br-int" )
+        stepResult = deleteResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Delete ovsdb node 2 bridge br-int sucess",
+                                 onfail="Delete ovsdb node 2 bridge br-int failed" )
+
+        main.step( "Delete ip netns host on the ovsdb node 1" )
+        deleteResult = main.OVSDB1.delHost( hostname="host1" )
+        stepResult = deleteResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Delete ip netns host on the ovsdb node 1 sucess",
+                                 onfail="Delete ip netns host on the ovsdb node 1 failed" )
+
+        main.step( "Delete ip netns host on the ovsdb node 2" )
+        deleteResult = main.OVSDB2.delHost( hostname="host2" )
+        stepResult = deleteResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Delete ip netns host on the ovsdb node 2 sucess",
+                                 onfail="Delete ip netns host on the ovsdb node 2 failed" )
+
+        main.step( "Check onoscli devices openflow session is false " + str( OVSDB1Ip ) )
+        response = main.ONOScli1.devices()
+        if re.search( OVSDB1Ip, response ) and not re.search( "true", response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Check openflow session is false " + str( OVSDB1Ip ) + " sucess",
+                                 onfail="Check openflow session is false " + str( OVSDB1Ip ) + " failed" )
+
+        main.step( "Check onoscli devices have ovs " + str( OVSDB2Ip ) )
+        response = main.ONOScli1.devices()
+        if re.search( OVSDB2Ip, response ) and not re.search( "true", response ):
+            stepResult = main.TRUE
+        else:
+            stepResult = main.FALSE
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Check openflow session is false " + str( OVSDB2Ip ) + " sucess",
+                                 onfail="Check openflow session is false " + str( OVSDB2Ip ) + " failed" )
diff --git a/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.topo b/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.topo
new file mode 100644
index 0000000..bde73ff
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.topo
@@ -0,0 +1,60 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOScli1>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli1>
+
+        <ONOS1>
+            <host>OC1</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <ONOSrest>
+            <host>OC1</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOSrest>
+
+        <OVSDB1>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OvsdbDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </OVSDB1>
+
+        <OVSDB2>
+            <host>OC1</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OvsdbDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </OVSDB2>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNC/FUNCovsdbtest/README b/TestON/tests/FUNC/FUNCovsdbtest/README
new file mode 100644
index 0000000..e73cc26
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCovsdbtest/README
@@ -0,0 +1,2 @@
+TODO:
+    Brief summary of the test and test cases. 
diff --git a/TestON/tests/FUNC/FUNCovsdbtest/__init__.py b/TestON/tests/FUNC/FUNCovsdbtest/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCovsdbtest/__init__.py
diff --git a/TestON/tests/FUNC/FUNCovsdbtest/dependencies/Nbdata.py b/TestON/tests/FUNC/FUNCovsdbtest/dependencies/Nbdata.py
new file mode 100644
index 0000000..3fde20d
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCovsdbtest/dependencies/Nbdata.py
@@ -0,0 +1,212 @@
+"""
+This file provide the data
+lanqinglong@huawei.com
+"""
+import json
+
+class NetworkData:
+
+    def __init__(self):
+        self.id = ''
+        self.state = 'ACTIVE'
+        self.name = 'onosfw-1'
+        self.physicalNetwork = 'none'
+        self.admin_state_up = True
+        self.tenant_id = ''
+        self.routerExternal = False
+        self.type ='LOCAL'
+        self.segmentationID = '6'
+        self.shared = False
+
+    def DictoJson(self):
+
+        if self.id =='' or self.tenant_id == '':
+            print 'Id and tenant id is necessary!'
+
+        Dicdata = {}
+        if self.id !='':
+            Dicdata['id'] = self.id
+        if self.state != '':
+            Dicdata['status'] = self.state
+        if self.name !='':
+            Dicdata['name'] = self.name
+        if self.physicalNetwork !='':
+            Dicdata['provider:physical_network'] = self.physicalNetwork
+        if self.admin_state_up !='':
+            Dicdata['admin_state_up'] = self.admin_state_up
+        if self.tenant_id !='':
+            Dicdata['tenant_id'] = self.tenant_id
+        if self.routerExternal !='':
+            Dicdata['router:external'] = self.routerExternal
+        if self.type !='':
+            Dicdata['provider:network_type'] = self.type
+        if self.segmentationID !='':
+            Dicdata['provider:segmentation_id'] = self.segmentationID
+        if self.shared !='':
+            Dicdata['shared'] = self.shared
+
+        Dicdata = {'network': Dicdata}
+
+        return json.dumps(Dicdata,indent=4)
+
+    def Ordered(self,obj):
+
+        if isinstance(obj, dict):
+            return sorted((k,self.Ordered(v)) for k,  v in obj.items())
+        if isinstance(obj, list):
+            return sorted(self.Ordered(x) for x in obj )
+        else:
+            return obj
+
+    def JsonCompare(self,SourceData,DestiData,FirstPara,SecondPara):
+
+        try:
+            SourceCompareDataDic = json.loads(SourceData)
+            DestiCompareDataDic = json.loads(DestiData)
+        except ValueError:
+            print "SourceData or DestData is not JSON Type!"
+            return False
+
+        try:
+            Socom = SourceCompareDataDic[FirstPara][SecondPara]
+            Decom = DestiCompareDataDic[FirstPara][SecondPara]
+        except KeyError,error:
+            print "Key error ,This key is not found:%s"%error
+            return False
+
+        if str(Socom).lower()== str(Decom).lower():
+            return True
+        else:
+            print "Source Compare data:"+FirstPara+"."+SecondPara+"="+str(Socom)
+            print "Dest Compare data: "+FirstPara+"."+SecondPara+"="+str(Decom)
+            return False
+
+class SubnetData(NetworkData):
+
+    def __init__(self):
+        self.id = ''
+        self.tenant_id = ''
+        self.network_id = ''
+        self.nexthop = '192.168.1.1'
+        self.destination = '192.168.1.1/24'
+        self.start = '192.168.2.2'
+        self.end = '192.168.2.254'
+        self.ipv6_address_mode = 'DHCPV6_STATELESS'
+        self.ipv6_ra_mode = 'DHCPV6_STATELESS'
+        self.cidr = '192.168.1.1/24'
+        self.enable_dhcp = True
+        self.dns_nameservers = 'aaa'
+        self.gateway_ip = '192.168.2.1'
+        self.ip_version = '4'
+        self.shared = False
+        self.name = 'demo-subnet'
+
+    def DictoJson(self):
+        if self.id =='' or self.tenant_id == '':
+            print 'Id and tenant id is necessary!'
+
+        Dicdata = {}
+        host_routesdata = []
+        host_routesdata.append({'nexthop': self.nexthop,'destination': self.destination})
+        allocation_pools = []
+        allocation_pools.append({'start': self.start,'end':self.end})
+
+        if self.id != '':
+            Dicdata['id'] = self.id
+        if self.network_id != '':
+            Dicdata['network_id'] = self.network_id
+        if self.name != '':
+            Dicdata['name'] = self.name
+        if self.nexthop != '':
+            Dicdata['host_routes'] = host_routesdata
+        if self.tenant_id != '':
+            Dicdata['tenant_id'] = self.tenant_id
+        if self.start != '':
+            Dicdata['allocation_pools'] = allocation_pools
+        if self.shared != '':
+            Dicdata['shared'] = self.shared
+        if self.ipv6_address_mode != '':
+            Dicdata['ipv6_address_mode'] = self.ipv6_address_mode
+        if self.ipv6_ra_mode != '':
+            Dicdata['ipv6_ra_mode'] = self.ipv6_ra_mode
+        if self.cidr != '':
+            Dicdata['cidr'] = self.cidr
+        if self.enable_dhcp != '':
+            Dicdata['enable_dhcp'] = self.enable_dhcp
+        if self.dns_nameservers != '':
+            Dicdata['dns_nameservers'] = self.dns_nameservers
+        if self.gateway_ip != '':
+            Dicdata['gateway_ip'] = self.gateway_ip
+        if self.ip_version != '':
+            Dicdata['ip_version'] = self.ip_version
+
+        Dicdata = {'subnet': Dicdata}
+
+        return json.dumps(Dicdata,indent=4)
+
+class VirtualPortData(NetworkData):
+
+    def __init__(self):
+        self.id = ''
+        self.state = 'ACTIVE'
+        self.bindingHostId = 'fa:16:3e:76:8e:88'
+        self.allowedAddressPairs = [{'mac_address':'fa:16:3e:76:8e:88','ip_address':'192.168.1.1'}]
+        self.deviceOwner = 'none'
+        self.fixedIp = []
+        self.securityGroups = [{'securityGroup':'asd'}]
+        self.adminStateUp = True
+        self.network_id = ''
+        self.tenant_id = ''
+        self.subnet_id = ''
+        self.bindingvifDetails = 'port_filter'
+        self.bindingvnicType = 'normal'
+        self.bindingvifType = 'ovs'
+        self.macAddress = 'fa:16:3e:76:8e:88'
+        self.deviceId = 'a08aa'
+        self.name = 'u'
+
+    def DictoJson(self):
+        if self.id == '' or self.tenant_id == ' ' or \
+           self.network_id == '' or self.subnet_id == '':
+            print 'Id/tenant id/networkid/subnetId is necessary!'
+
+        Dicdata = {}
+        fixedIp =[]
+        fixedIp.append({'subnet_id':self.subnet_id,'ip_address':'192.168.1.4'})
+        allocation_pools = []
+
+        if self.id != '':
+            Dicdata['id'] = self.id
+        if self.state != '':
+            Dicdata['status'] = self.state
+        if self.bindingHostId != '':
+            Dicdata['binding:host_id'] = self.bindingHostId
+        if self.allowedAddressPairs != '':
+            Dicdata['allowed_address_pairs'] = self.allowedAddressPairs
+        if self.deviceOwner != '':
+            Dicdata['device_owner'] = self.deviceOwner
+        if self.securityGroups != '':
+            Dicdata['security_groups'] = self.securityGroups
+        if self.adminStateUp != '':
+            Dicdata['admin_state_up'] = self.adminStateUp
+        if self.network_id != '':
+            Dicdata['network_id'] = self.network_id
+        if self.tenant_id != '':
+            Dicdata['tenant_id'] = self.tenant_id
+        if self.bindingvifDetails != '':
+            Dicdata['binding:vif_details'] = self.bindingvifDetails
+        if self.bindingvnicType != '':
+            Dicdata['binding:vnic_type'] = self.bindingvnicType
+        if self.bindingvifType != '':
+            Dicdata['binding:vif_type'] = self.bindingvifType
+        if self.macAddress != '':
+            Dicdata['mac_address'] = self.macAddress
+        if self.deviceId != '':
+            Dicdata['device_id'] = self.deviceId
+        if self.name != '':
+            Dicdata['name'] = self.name
+
+        Dicdata['fixed_ips'] = fixedIp
+        Dicdata = {'port': Dicdata}
+
+        return json.dumps(Dicdata,indent=4)
diff --git a/TestON/tests/FUNC/FUNCovsdbtest/dependencies/__init__.py b/TestON/tests/FUNC/FUNCovsdbtest/dependencies/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCovsdbtest/dependencies/__init__.py
diff --git a/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.params b/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.params
new file mode 100644
index 0000000..84cab8c
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.params
@@ -0,0 +1,45 @@
+<PARAMS>
+    # CASE - Description
+    # 1 - Variable initialization and optional pull and build ONOS package
+    # 2 - Create Network northbound test
+    # 3 - Update Network northbound test
+    # 4 - Delete Network northbound test
+    # 5 - Create Subnet northbound test
+    # 6 - Update Subnet northbound test
+    # 7 - Delete Subnet northbound test
+    # 8 - Create Virtualport northbound test
+    # 9 - Update Virtualport northbound test
+    #10 - Delete Virtualport northbound test
+
+    <testcases>1,2,3,4,5,6,7,8,9,10,11,12,13</testcases>
+
+    <SLEEP>
+        <startup>15</startup>
+    </SLEEP>
+
+    <ENV>
+        <cellName>singlenode</cellName>
+        <cellApps>drivers,openflow,proxyarp,mobility</cellApps>
+    </ENV>
+
+    <CTRL>
+        <ip1>OC1</ip1>
+        <port1>6653</port1>
+    </CTRL>
+
+    <HTTP>
+        <port>8181</port>
+        <path>/onos/vtn/</path>
+    </HTTP>
+
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <MININET>
+        <switch>7</switch>
+        <links>20</links>
+    </MININET>
+
+</PARAMS>
diff --git a/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.py b/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.py
new file mode 100644
index 0000000..adf85a2
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.py
@@ -0,0 +1,1186 @@
+"""
+Description: This test is to determine if North bound
+    can handle the request
+
+List of test cases:
+CASE1 - Variable initialization and optional pull and build ONOS package
+CASE2 - Create Network northbound test
+CASE3 - Update Network northbound test
+CASE4 - Delete Network northbound test
+CASE5 - Create Subnet northbound test
+CASE6 - Update Subnet northbound test
+CASE7 - Delete Subnet northbound test
+CASE8 - Create Virtualport northbound test
+CASE9 - Update Virtualport northbound test
+CASE10 - Delete Virtualport northbound test
+CASE11 - Post Error Json Create Network test
+CASE12 - Post Error Json Create Subnet test
+CASE13 - Post Error Json Create Virtualport test
+
+lanqinglong@huawei.com
+"""
+import os
+
+class FUNCvirNetNB:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        """
+        CASE1 is to compile ONOS and push it to the test machines
+
+        Startup sequence:
+        cell<name>
+        onos-verify-cell
+        NOTE:temporary - onos-remove-raft-logs
+        onos-uninstall
+        git pull
+        mvn clean install
+        onos-package
+        onos-install -f
+        onos-wait-for-start
+        start cli sessions
+        start vtnrsc
+        """
+
+        import time
+        import os
+        main.log.info( "ONOS Single node Start "+
+                      "VirtualNet Northbound test - initialization" )
+        main.case( "Setting up test environment" )
+        main.caseExplanation  = "Setup the test environment including "+\
+                                "installing ONOS,start ONOS."
+
+        # load some variables from the params file
+        PULLCODE = False
+        if main.params['GIT']['pull'] =='True':
+            PULLCODE = True
+        gitBranch = main.params['GIT']['branch']
+        cellName = main.params['ENV']['cellName']
+        ipList = os.getenv( main.params['CTRL']['ip1'] )
+
+        main.step("Create cell file and apply to environment")
+        cellAppString = main.params['ENV']['cellApps']
+        main.ONOSbench.createCellFile(main.ONOSbench.ip_address,cellName,
+                                      main.Mininet1.ip_address,
+                                      cellAppString,ipList )
+
+        cellResult = main.ONOSbench.setCell(cellName)
+        verifyResult = main.ONOSbench.verifyCell()
+
+        stepResult = cellResult and verifyResult
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully applied cell to " + \
+                                        "environment",
+                                 onfail="Failed to apply cell to environment " )
+
+        #FIXME:this is short term fix
+        main.log.info( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftLogs()
+
+        main.CLIs = []
+        main.nodes = []
+        main.numCtrls=1
+        main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+
+        for i in range ( 1, main.numCtrls +1):
+            try:
+                main.CLIs.append( getattr( main, 'ONOScli' + str(i) ) )
+                main.nodes.append( getattr( main, 'ONOS' + str(i) ) )
+                ipList.append( main.nodes[ -1 ].ip_address )
+            except AttributeError:
+                break
+
+        main.log.info( "Uninstalling ONOS" )
+        for node in main.nodes:
+            main.ONOSbench.onosUninstall( node.ip_address )
+
+        #Make sure ONOS is DEAD
+        main.log.info( "Killing any ONOS processes" )
+        killResults = main.TRUE
+        for node in main.nodes:
+            killed = main.ONOSbench.onosKill( node.ip_address )
+            killResults = killResults and killed
+
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
+        main.log.info( "Git checkout and pull " + gitBranch )
+        if PULLCODE:
+            main.ONOSbench.gitCheckout ( gitBranch )
+            gitPullResult = main.ONOSbench.gitPull()
+            # values of 1 or 3 are good
+            utilities.assert_lesser ( expect=0, actual=gitPullResult,
+                                      onpass="Git pull successful",
+                                      onfail ="Git pull failed" )
+        main.ONOSbench.getVersion( report =True )
+        main.step( "Using mvn clean install" )
+        cleanInstallResult= main.TRUE
+        if PULLCODE and gitPullResult == main.TRUE:
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+        else:
+            main.log.warn("Did not pull new code so skipping mvn "+
+                          "clean install")
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=cleanInstallResult,
+                                 onpass="MCI successful",
+                                 onfail="MCI failed" )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=packageResult,
+                                 onpass="Successfully created ONOS package",
+                                 onfail="Failed to create ONOS package " )
+        time.sleep( main.startUpSleep )
+
+        main.step( "Installing ONOS package" )
+        onosInstallResult = main.ONOSbench.onosInstall(
+            options="-f",node=main.nodes[0].ip_address )
+        utilities.assert_equals( expect=main.TRUE, actual=onosInstallResult,
+                                onpass="ONOS install successful",
+                                onfail="ONOS install failed" )
+        time.sleep( main.startUpSleep )
+
+        main.step( "Checking if ONOS is up yet" )
+
+        for i in range( 2 ):
+            onos1Isup =  main.ONOSbench.isup( main.nodes[0].ip_address )
+            if onos1Isup:
+                break
+        utilities.assert_equals( expect=main.TRUE, actual=onos1Isup,
+                     onpass="ONOS startup successful",
+                     onfail="ONOS startup failed" )
+        time.sleep( main.startUpSleep )
+
+        main.log.step( "Starting ONOS CLI sessions" )
+
+        print main.nodes[0].ip_address
+        cliResults = main.ONOScli1.startOnosCli(main.nodes[0].ip_address)
+        utilities.assert_equals( expect=main.TRUE, actual=cliResults,
+                                onpass="ONOS cli startup successful",
+                                onfail="ONOS cli startup failed" )
+        time.sleep( main.startUpSleep )
+
+        main.step( "App Ids check" )
+        appCheck = main.ONOScli1.appToIDCheck()
+        if appCheck != main.TRUE:
+            main.log.warn( main.CLIs[0].apps() )
+            main.log.warn( main.CLIs[0].appIDs() )
+        utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+                     onpass="App Ids seem to be correct",
+                     onfail="Something is wrong with app Ids" )
+
+        if cliResults == main.FALSE:
+            main.log.error( "Failed to start ONOS, stopping test" )
+            main.cleanup()
+            main.exit()
+
+        main.step( "Install org.onosproject.vtn app" )
+        installResults = main.ONOScli1.activateApp( "org.onosproject.vtn" )
+        utilities.assert_equals( expect=main.TRUE, actual=installResults,
+                     onpass="Install org.onosproject.vtn successful",
+                     onfail="Install org.onosproject.vtn app failed" )
+
+        time.sleep( main.startUpSleep )
+
+    def CASE2 ( self,main ):
+
+        """
+        Test Post Network
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Network Post test Start" )
+        main.case( "Virtual Network NBI Test - Network" )
+        main.caseExplanation  = "Test Network Post NBI " +\
+                                "Verify Post Data same with Stored Data"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.log.info( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        postdata = network.DictoJson()
+
+        main.step( "Post Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path+'networks/',
+                                                'POST', None, postdata)
+
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Success",
+                onfail="Post Failed " + str( Poststatus ) + str( result ) )
+
+        main.step( "Get Data via HTTP" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                'GET', None, None)
+        utilities.assert_equals(
+                expect='200',
+                actual=Getstatus,
+                onpass="Get Success",
+                onfail="Get Failed " + str( Getstatus ) + str( result ) )
+
+        main.log.info("Post Network Data is :%s\nGet Network Data is:%s"%(postdata,result))
+
+        main.step( "Compare Send Id and Get Id" )
+        IDcmpresult = network.JsonCompare( postdata, result, 'network', 'id' )
+        TanantIDcmpresult = network.JsonCompare( postdata, result, 'network', 'tenant_id' )
+        Cmpresult = IDcmpresult and TanantIDcmpresult
+
+        utilities.assert_equals(
+                expect=True,
+                actual=Cmpresult,
+                onpass="Compare Success",
+                onfail="Compare Failed:ID compare: " + str( IDcmpresult ) + \
+                       ",Tenant id compare :" + str( TanantIDcmpresult ) )
+
+        deletestatus,result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                 'DELETE', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=deletestatus,
+                onpass="Delete Network Success",
+                onfail="Delete Network Failed")
+
+        if Cmpresult != True:
+            main.log.error( "Post Network compare failed" )
+
+    def CASE3( self,main ):
+
+        """
+        Test Update Network
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Network Update test Start" )
+        main.case( "Virtual Network NBI Test - Network" )
+        main.caseExplanation  = "Test Network Update NBI " +\
+                                "Verify Update Data same with Stored Data"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.log.info( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        network.shared = False
+        postdata = network.DictoJson()
+
+        network.shared = True
+        postdatanew = network.DictoJson()
+
+        main.step( "Post Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path+'networks',
+                                                 'POST', None, postdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Success",
+                onfail="Post Failed " + str( Poststatus ) + str( result ) )
+
+        main.step( "Update Data via HTTP" )
+        Updatestatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                   'PUT', None, postdatanew)
+        utilities.assert_equals(
+                expect='200',
+                actual=Updatestatus,
+                onpass="Update Success",
+                onfail="Update Failed " + str( Updatestatus ) + str( result ) )
+
+        main.step( "Get Data via HTTP" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                'GET', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=Getstatus,
+                onpass="Get Success",
+                onfail="Get Failed " + str( Getstatus ) + str( result ) )
+
+        main.step( "Compare Update data." )
+        IDcmpresult = network.JsonCompare( postdatanew, result, 'network', 'id' )
+        TanantIDcmpresult = network.JsonCompare( postdatanew, result, 'network', 'tenant_id' )
+        Shareresult = network.JsonCompare( postdatanew, result, 'network', 'shared' )
+
+        Cmpresult = IDcmpresult and TanantIDcmpresult and Shareresult
+        utilities.assert_equals(
+                expect=True,
+                actual=Cmpresult,
+                onpass="Compare Success",
+                onfail="Compare Failed:ID compare:" + str( IDcmpresult ) + \
+                       ",Tenant id compare:"+ str( TanantIDcmpresult ) + \
+                       ",Name compare:" + str( Shareresult ) )
+
+        deletestatus,result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                 'DELETE', None, None )
+
+        utilities.assert_equals(
+                expect='200',
+                actual=deletestatus,
+                onpass="Delete Network Success",
+                onfail="Delete Network Failed" )
+
+        if Cmpresult != True:
+            main.log.error( "Update Network compare failed" )
+
+    def CASE4( self,main ):
+
+        """
+        Test Delete Network
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Network Delete test Start" )
+        main.case( "Virtual Network NBI Test - Network" )
+        main.caseExplanation = "Test Network Delete NBI " +\
+                                "Verify Stored Data is NULL after Delete"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.log.info( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        postdata = network.DictoJson()
+
+        main.step( "Post Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path + 'networks/',
+                                                 'POST', None, postdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Success",
+                onfail="Post Failed " + str( Poststatus ) + str( result ) )
+
+        main.step( "Delete Data via HTTP" )
+        Deletestatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                'DELETE', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=Deletestatus,
+                onpass="Delete Success",
+                onfail="Delete Failed " + str( Deletestatus ) + str( result ) )
+
+        main.step( "Get Data is NULL" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                'GET', None, None )
+        utilities.assert_equals(
+                expect='Network is not found',
+                actual=result,
+                onpass="Get Success",
+                onfail="Get Failed " + str( Getstatus ) + str( result ) )
+
+        if result != 'Network is not found':
+            main.log.error( "Delete Network failed" )
+
+    def CASE5( self, main ):
+
+        """
+        Test Post Subnet
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import SubnetData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Subnet Post test Start" )
+        main.case( "Virtual Network NBI Test - Subnet" )
+        main.caseExplanation = "Test Subnet Post NBI " +\
+                                "Verify Stored Data is same with Post Data"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.log.info( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        subnet = SubnetData()
+        subnet.id = "e44bd655-e22c-4aeb-b1e9-ea1606875178"
+        subnet.tenant_id = network.tenant_id
+        subnet.network_id = network.id
+
+        networkpostdata = network.DictoJson()
+        subnetpostdata = subnet.DictoJson()
+
+        main.step( "Post Network Data via HTTP(Post Subnet need post network)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path + 'networks/',
+                                                 'POST', None, networkpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Network Success",
+                onfail="Post Network Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Subnet Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path + 'subnets/',
+                                                 'POST', None, subnetpostdata )
+        utilities.assert_equals(
+                expect='202',
+                actual=Poststatus,
+                onpass="Post Subnet Success",
+                onfail="Post Subnet Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Get Subnet Data via HTTP" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, subnet.id, path + 'subnets/',
+                                                 'GET', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=Getstatus,
+                onpass="Get Subnet Success",
+                onfail="Get Subnet Failed " + str( Getstatus ) + "," + str( result ) )
+
+        IDcmpresult = subnet.JsonCompare( subnetpostdata, result, 'subnet', 'id' )
+        TanantIDcmpresult = subnet.JsonCompare( subnetpostdata, result, 'subnet', 'tenant_id' )
+        NetoworkIDcmpresult = subnet.JsonCompare( subnetpostdata, result, 'subnet', 'network_id' )
+
+        main.step( "Compare Post Subnet Data via HTTP" )
+        Cmpresult = IDcmpresult and TanantIDcmpresult and NetoworkIDcmpresult
+        utilities.assert_equals(
+                expect=True,
+                actual=Cmpresult,
+                onpass="Compare Success",
+                onfail="Compare Failed:ID compare:" + str( IDcmpresult ) + \
+                       ",Tenant id compare:"+ str( TanantIDcmpresult ) + \
+                       ",Network id compare:" + str( NetoworkIDcmpresult ) )
+
+        deletestatus,result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                 'DELETE', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=deletestatus,
+                onpass="Delete Network Success",
+                onfail="Delete Network Failed" )
+
+        if Cmpresult != True:
+            main.log.error( "Post Subnet compare failed" )
+
+    def CASE6( self, main ):
+
+        """
+        Test Post Subnet
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import SubnetData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Subnet Update test Start" )
+        main.case( "Virtual Network NBI Test - Subnet" )
+        main.caseExplanation = "Test Subnet Update NBI " +\
+                                "Verify Stored Data is same with Update Data"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.log.info( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        subnet = SubnetData()
+        subnet.id = "e44bd655-e22c-4aeb-b1e9-ea1606875178"
+        subnet.tenant_id = network.tenant_id
+        subnet.network_id = network.id
+        subnet.start = "192.168.2.1"
+        subnet.end = "192.168.2.255"
+        networkpostdata = network.DictoJson()
+        subnetpostdata = subnet.DictoJson()
+
+        #Change allocation_poolsdata scope
+        subnet.start = "192.168.102.1"
+        subnet.end = "192.168.102.255"
+        #end change
+        newsubnetpostdata = subnet.DictoJson()
+
+        main.step( "Post Network Data via HTTP(Post Subnet need post network)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path + 'networks/',
+                                                 'POST', None, networkpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Network Success",
+                onfail="Post Network Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Subnet Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path + 'subnets/',
+                                                 'POST', None, subnetpostdata )
+        utilities.assert_equals(
+                expect='202',
+                actual=Poststatus,
+                onpass="Post Subnet Success",
+                onfail="Post Subnet Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Update Subnet Data via HTTP" )
+        Putstatus, result = main.ONOSrest.send( ctrlip, port, subnet.id, path + 'subnets/',
+                                                 'PUT', None, newsubnetpostdata )
+        utilities.assert_equals(
+                expect='203',
+                actual=Putstatus,
+                onpass="Update Subnet Success",
+                onfail="Update Subnet Failed " + str( Putstatus ) + "," + str( result ) )
+
+        main.step( "Get Subnet Data via HTTP" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, subnet.id, path + 'subnets/',
+                                                 'GET', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=Getstatus,
+                onpass="Get Subnet Success",
+                onfail="Get Subnet Failed " + str( Getstatus ) + "," + str( result ) )
+
+        IDcmpresult = subnet.JsonCompare( newsubnetpostdata, result, 'subnet', 'id' )
+        TanantIDcmpresult = subnet.JsonCompare( newsubnetpostdata, result, 'subnet', 'tenant_id' )
+        Poolcmpresult = subnet.JsonCompare( newsubnetpostdata, result, 'subnet', 'allocation_pools' )
+
+        main.step( "Compare Subnet Data" )
+        Cmpresult = IDcmpresult and TanantIDcmpresult and Poolcmpresult
+        utilities.assert_equals(
+                expect=True,
+                actual=Cmpresult,
+                onpass="Compare Success",
+                onfail="Compare Failed:ID compare:" + str( IDcmpresult ) + \
+                       ",Tenant id compare:"+ str( TanantIDcmpresult ) + \
+                       ",Pool compare:" + str( Poolcmpresult ) )
+
+        main.step( "Delete Subnet via HTTP" )
+        deletestatus,result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                 'DELETE', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=deletestatus,
+                onpass="Delete Network Success",
+                onfail="Delete Network Failed" )
+
+        if Cmpresult != True:
+            main.log.error( "Update Subnet compare failed" )
+
+    def CASE7( self, main ):
+
+        """
+        Test Delete Subnet
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import SubnetData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Subnet Delete test Start" )
+        main.case( "Virtual Network NBI Test - Subnet" )
+        main.caseExplanation = "Test Subnet Delete NBI " +\
+                                "Verify Stored Data is Null after Delete"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.log.info( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        subnet = SubnetData()
+        subnet.id = "e44bd655-e22c-4aeb-b1e9-ea1606875178"
+        subnet.tenant_id = network.tenant_id
+        subnet.network_id = network.id
+
+        networkpostdata = network.DictoJson()
+        subnetpostdata = subnet.DictoJson()
+
+        main.step( "Post Network Data via HTTP(Post Subnet need post network)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path + 'networks/',
+                                                 'POST', None, networkpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Network Success",
+                onfail="Post Network Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Subnet Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path + 'subnets/',
+                                                 'POST', None, subnetpostdata )
+        utilities.assert_equals(
+                expect='202',
+                actual=Poststatus,
+                onpass="Post Subnet Success",
+                onfail="Post Subnet Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Delete Subnet Data via HTTP" )
+        Deletestatus, result = main.ONOSrest.send( ctrlip, port, subnet.id, path + 'subnets/',
+                                                 'DELETE', None, None )
+        utilities.assert_equals(
+                expect='201',
+                actual=Deletestatus,
+                onpass="Delete Subnet Success",
+                onfail="Delete Subnet Failed " + str( Deletestatus ) + "," + str( result ) )
+
+        main.step( "Get Subnet Data is NULL" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, subnet.id, path + 'subnets/',
+                                                 'GET', None, None )
+        utilities.assert_equals(
+                expect='Subnet is not found',
+                actual=result,
+                onpass="Get Subnet Success",
+                onfail="Get Subnet Failed " + str( Getstatus ) + str( result ) )
+
+        if result != 'Subnet is not found':
+            main.log.error( "Delete Subnet failed" )
+
+    def CASE8( self, main ):
+
+        """
+        Test Post Port
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import SubnetData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import VirtualPortData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Port Post test Start" )
+        main.case( "Virtual Network NBI Test - Port" )
+        main.caseExplanation = "Test Port Post NBI " +\
+                                "Verify Stored Data is same with Post Data"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        httpport = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.log.info( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        subnet = SubnetData()
+        subnet.id = "e44bd655-e22c-4aeb-b1e9-ea1606875178"
+        subnet.tenant_id = network.tenant_id
+        subnet.network_id = network.id
+        port = VirtualPortData()
+        port.id = "9352e05c-58b8-4f2c-b4df-c20435ser56466"
+        port.subnet_id = subnet.id
+        port.tenant_id = network.tenant_id
+        port.network_id = network.id
+
+        networkpostdata = network.DictoJson()
+        subnetpostdata = subnet.DictoJson()
+        portpostdata = port.DictoJson()
+
+        main.step( "Post Network Data via HTTP(Post port need post network)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'networks/',
+                                                 'POST', None, networkpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Network Success",
+                onfail="Post Network Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Subnet Data via HTTP(Post port need post subnet)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'subnets/',
+                                                 'POST', None, subnetpostdata )
+        utilities.assert_equals(
+                expect='202',
+                actual=Poststatus,
+                onpass="Post Subnet Success",
+                onfail="Post Subnet Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Port Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'ports/',
+                                                 'POST', None, portpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Port Success",
+                onfail="Post Port Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Get Port Data via HTTP" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, httpport, port.id, path + 'ports/',
+                                                 'GET', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=Getstatus,
+                onpass="Get Port Success",
+                onfail="Get Port Failed " + str( Getstatus ) + "," + str( result ) )
+
+        main.step( "Compare Post Port Data" )
+        IDcmpresult = subnet.JsonCompare( portpostdata, result, 'port', 'id' )
+        TanantIDcmpresult = subnet.JsonCompare( portpostdata, result, 'port', 'tenant_id' )
+        NetoworkIDcmpresult = subnet.JsonCompare( portpostdata, result, 'port', 'network_id' )
+        fixedIpresult = subnet.JsonCompare( portpostdata, result, 'port', 'fixed_ips' )
+
+        Cmpresult = IDcmpresult and TanantIDcmpresult and NetoworkIDcmpresult and fixedIpresult
+        utilities.assert_equals(
+                expect=True,
+                actual=Cmpresult,
+                onpass="Compare Success",
+                onfail="Compare Failed:ID compare:" + str( IDcmpresult ) + \
+                       ",Tenant id compare:"+ str( TanantIDcmpresult ) + \
+                       ",Network id compare:" + str( NetoworkIDcmpresult ) +\
+                       ",FixIp compare:" + str( fixedIpresult ) )
+
+        main.step( "Clean Data via HTTP" )
+        deletestatus,result = main.ONOSrest.send( ctrlip, httpport, network.id, path + 'networks/',
+                                                 'DELETE', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=deletestatus,
+                onpass="Delete Network Success",
+                onfail="Delete Network Failed" )
+
+        if Cmpresult != True:
+            main.log.error( "Post port compare failed" )
+
+    def CASE9( self, main ):
+
+        """
+        Test Update Port
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import SubnetData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import VirtualPortData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Port Update test Start" )
+        main.case( "Virtual Network NBI Test - Port" )
+        main.caseExplanation = "Test Port Update NBI " +\
+                                "Verify Stored Data is same with New Post Data"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        httpport = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.log.info( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        subnet = SubnetData()
+        subnet.id = "e44bd655-e22c-4aeb-b1e9-ea1606875178"
+        subnet.tenant_id = network.tenant_id
+        subnet.network_id = network.id
+        port = VirtualPortData()
+        port.id = "9352e05c-58b8-4f2c-b4df-c20435ser56466"
+        port.subnet_id = subnet.id
+        port.tenant_id = network.tenant_id
+        port.network_id = network.id
+        port.name = "onos"
+
+        networkpostdata = network.DictoJson()
+        subnetpostdata = subnet.DictoJson()
+        portpostdata = port.DictoJson()
+
+        #create update data
+        port.name = "onos-new"
+        newportpostdata = port.DictoJson()
+        #end
+
+        main.step( "Post Network Data via HTTP(Post port need post network)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'networks/',
+                                                 'POST', None, networkpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Network Success",
+                onfail="Post Network Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Subnet Data via HTTP(Post port need post subnet)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'subnets/',
+                                                 'POST', None, subnetpostdata )
+        utilities.assert_equals(
+                expect='202',
+                actual=Poststatus,
+                onpass="Post Subnet Success",
+                onfail="Post Subnet Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Port Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'ports/',
+                                                 'POST', None, portpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Port Success",
+                onfail="Post Port Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Update Port Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, port.id, path + 'ports/',
+                                                 'PUT', None, newportpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Update Port Success",
+                onfail="Update Port Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Get Port Data via HTTP" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, httpport, port.id, path + 'ports/',
+                                                 'GET', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=Getstatus,
+                onpass="Get Port Success",
+                onfail="Get Port Failed " + str( Getstatus ) + "," + str( result ) )
+
+        main.step( "Compare Update Port Data" )
+        IDcmpresult = subnet.JsonCompare( portpostdata, result, 'port', 'id' )
+        TanantIDcmpresult = subnet.JsonCompare( portpostdata, result, 'port', 'tenant_id' )
+        NetoworkIDcmpresult = subnet.JsonCompare( portpostdata, result, 'port', 'network_id' )
+        Nameresult = subnet.JsonCompare( newportpostdata, result, 'port', 'name' )
+
+        Cmpresult = IDcmpresult and TanantIDcmpresult and NetoworkIDcmpresult and Nameresult
+        utilities.assert_equals(
+                expect=True,
+                actual=Cmpresult,
+                onpass="Compare Success",
+                onfail="Compare Failed:ID compare:" + str( IDcmpresult ) + \
+                       ",Tenant id compare:"+ str( TanantIDcmpresult ) + \
+                       ",Network id compare:" + str( NetoworkIDcmpresult ) + \
+                       ",Name compare:" + str(Nameresult) )
+
+        main.step( "Clean Data via HTTP" )
+        deletestatus,result = main.ONOSrest.send( ctrlip, httpport, network.id, path + 'networks/',
+                                                 'DELETE', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=deletestatus,
+                onpass="Delete Network Success",
+                onfail="Delete Network Failed" )
+
+        if Cmpresult != True:
+            main.log.error( "Update port compare failed" )
+
+    def CASE10( self, main ):
+
+        """
+        Test Delete Port
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import SubnetData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import VirtualPortData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Port Delete test Start" )
+        main.case( "Virtual Network NBI Test - Port" )
+        main.caseExplanation = "Test Port Delete NBI " +\
+                                "Verify port delete success"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        httpport = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.log.info( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        subnet = SubnetData()
+        subnet.id = "e44bd655-e22c-4aeb-b1e9-ea1606875178"
+        subnet.tenant_id = network.tenant_id
+        subnet.network_id = network.id
+        port = VirtualPortData()
+        port.id = "9352e05c-58b8-4f2c-b4df-c20435ser56466"
+        port.subnet_id = subnet.id
+        port.tenant_id = network.tenant_id
+        port.network_id = network.id
+
+        networkpostdata = network.DictoJson()
+        subnetpostdata = subnet.DictoJson()
+        portpostdata = port.DictoJson()
+
+        main.step( "Post Network Data via HTTP(Post port need post network)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'networks/',
+                                                 'POST', None, networkpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Network Success",
+                onfail="Post Network Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Subnet Data via HTTP(Post port need post subnet)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'subnets/',
+                                                 'POST', None, subnetpostdata )
+        utilities.assert_equals(
+                expect='202',
+                actual=Poststatus,
+                onpass="Post Subnet Success",
+                onfail="Post Subnet Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Port Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'ports/',
+                                                 'POST', None, portpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Port Success",
+                onfail="Post Port Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Delete Port Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, port.id, path + 'ports/',
+                                                 'Delete', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Delete Port Success",
+                onfail="Delete Port Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Get Port Data is NULL" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, httpport, port.id, path + 'ports/',
+                                                 'GET', None, None )
+        utilities.assert_equals(
+                expect='VirtualPort is not found',
+                actual=result,
+                onpass="Get Port Success",
+                onfail="Get Port Failed " + str( Getstatus ) + "," + str( result ) )
+
+        if result != 'VirtualPort is not found':
+            main.log.error( "Delete Port failed" )
+
+        main.step( "Clean Data via HTTP" )
+        deletestatus,result = main.ONOSrest.send( ctrlip, httpport, network.id, path + 'networks/',
+                                                 'DELETE', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=deletestatus,
+                onpass="Delete Network Success",
+                onfail="Delete Network Failed" )            
+    def CASE11 ( self,main ):
+
+        """
+        Test Post Error Json Create Network
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Post Error Json Create Network test Start" )
+        main.case( "Virtual Network NBI Test - Network" )
+        main.caseExplanation  = "Test Network Post With Error json " +\
+                                "The wrong Json can't post network successfully"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.step( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        #The network.admin_state_up should be True or False,when the admin_state_up is 'tttttttttt',the Json can't post.
+        network.admin_state_up = 'tttttttttt'
+        #The network.routerExternal should be True or False,when the routerExternal is 'ffffffffffff',the Json can't post.
+        network.routerExternal = 'ffffffffffff'
+        #The network.shared should be True or False,when the shared is 'ffffffffffffff',the Json can't post.
+        network.shared = 'ffffffffffffff'
+        postdata = network.DictoJson()
+
+        main.step( "Post Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path+'networks/',
+                                                'POST', None, postdata)
+
+        utilities.assert_equals(
+                expect='500',
+                actual=Poststatus,
+                onpass="The Json is wrong,can't post",
+                onfail="Wrong Json can post successfully " )
+    def CASE12( self, main ):
+
+        """
+        Test Post Error Json Create Subnet
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import SubnetData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Post Error Json Create Subnet test Start" )
+        main.case( "Virtual Network NBI Test - Subnet" )
+        main.caseExplanation = "Test Subnet Post With Error json " +\
+                                "The wrong Json can't post network successfully"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.step( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        subnet = SubnetData()
+        subnet.id = "e44bd655-e22c-4aeb-b1e9-ea1606875178"
+        #The subnet.enable_dhcp should be True or False,when the enable_dhcp is 'tttttttttttttt',the Json can't post.
+        subnet.enable_dhcp = 'tttttttttttttt'
+        #The subnet.tenant_id should be True or False,when the tenant_id is ffffffffffffff',the Json can't post.
+        subnet.shared = 'ffffffffffffff'
+        subnet.tenant_id = network.tenant_id
+        subnet.network_id = network.id
+
+        networkpostdata = network.DictoJson()
+        subnetpostdata = subnet.DictoJson()
+
+        main.step( "Post Network Data via HTTP(Post Subnet need post network)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path + 'networks/',
+                                                 'POST', None, networkpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Network Success",
+                onfail="Post Network Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Subnet Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path + 'subnets/',
+                                                 'POST', None, subnetpostdata )
+        utilities.assert_equals(
+                expect='500',
+                actual=Poststatus,
+                onpass="The Json is wrong,can't post",
+                onfail="Wrong Json can post successfully " )
+    def CASE13( self, main ):
+
+        """
+        Test Post Error Json Create Virtualport
+        """
+        import os
+
+        try:
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import SubnetData
+            from tests.FUNC.FUNCvirNetNB.dependencies.Nbdata import VirtualPortData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error, please check!" )
+            main.cleanup()
+            main.exit()
+
+        main.log.info( "ONOS Post Error Json Create Subnet test Start" )
+        main.case( "Virtual Network NBI Test - Port" )
+        main.caseExplanation = "Test Subnet Post With Error json " +\
+                                "The wrong Json can't create port successfully"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        httpport = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.step( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        subnet = SubnetData()
+        subnet.id = "e44bd655-e22c-4aeb-b1e9-ea1606875178"
+        subnet.tenant_id = network.tenant_id
+        subnet.network_id = network.id
+        port = VirtualPortData()
+        port.id = "9352e05c-58b8-4f2c-b4df-c20435ser56466"
+        port.subnet_id = subnet.id
+        port.tenant_id = network.tenant_id
+        port.network_id = network.id
+        #The port.adminStateUp should be True or False,when the adminStateUp is 'tttttttttttt',the Json can't post.
+        port.adminStateUp = 'tttttttttttt'
+
+        networkpostdata = network.DictoJson()
+        subnetpostdata = subnet.DictoJson()
+        portpostdata = port.DictoJson()
+
+        main.step( "Post Network Data via HTTP(Post port need post network)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'networks/',
+                                                 'POST', None, networkpostdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Network Success",
+                onfail="Post Network Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Subnet Data via HTTP(Post port need post subnet)" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'subnets/',
+                                                 'POST', None, subnetpostdata )
+        utilities.assert_equals(
+                expect='202',
+                actual=Poststatus,
+                onpass="Post Subnet Success",
+                onfail="Post Subnet Failed " + str( Poststatus ) + "," + str( result ) )
+
+        main.step( "Post Port Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, httpport, '', path + 'ports/',
+                                                 'POST', None, portpostdata )
+        utilities.assert_equals(
+                expect='500',
+                actual=Poststatus,
+                onpass="The Json is wrong,can't post",
+                onfail="Wrong Json can post successfully" )
diff --git a/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.topo b/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.topo
new file mode 100644
index 0000000..72a1b61
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.topo
@@ -0,0 +1,53 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOScli1>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli1>
+
+        <ONOS1>
+            <host>OC1</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <ONOSrest>
+            <host>OC1</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOSrest>
+
+        <Mininet1>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>MininetCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+                <controller> none </controller>
+            </COMPONENTS>
+        </Mininet1>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNC/FUNCvirNetNB/__init__.py b/TestON/tests/FUNC/FUNCvirNetNB/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCvirNetNB/__init__.py
diff --git a/TestON/tests/FUNC/FUNCvirNetNB/dependencies/Nbdata.py b/TestON/tests/FUNC/FUNCvirNetNB/dependencies/Nbdata.py
new file mode 100644
index 0000000..9b3b978
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCvirNetNB/dependencies/Nbdata.py
@@ -0,0 +1,212 @@
+"""
+This file provide the data
+lanqinglong@huawei.com
+"""
+import json
+
+class NetworkData:
+
+    def __init__(self):
+        self.id = ''
+        self.state = 'ACTIVE'
+        self.name = 'onosfw-1'
+        self.physicalNetwork = 'none'
+        self.admin_state_up = True
+        self.tenant_id = ''
+        self.routerExternal = False
+        self.type ='LOCAL'
+        self.segmentationID = '6'
+        self.shared = False
+
+    def DictoJson(self):
+
+        if self.id =='' or self.tenant_id == '':
+            print 'Id and tenant id is necessary!'
+
+        Dicdata = {}
+        if self.id !='':
+            Dicdata['id'] = self.id
+        if self.state != '':
+            Dicdata['status'] = self.state
+        if self.name !='':
+            Dicdata['name'] = self.name
+        if self.physicalNetwork !='':
+            Dicdata['provider:physical_network'] = self.physicalNetwork
+        if self.admin_state_up !='':
+            Dicdata['admin_state_up'] = self.admin_state_up
+        if self.tenant_id !='':
+            Dicdata['tenant_id'] = self.tenant_id
+        if self.routerExternal !='':
+            Dicdata['router:external'] = self.routerExternal
+        if self.type !='':
+            Dicdata['provider:network_type'] = self.type
+        if self.segmentationID !='':
+            Dicdata['provider:segmentation_id'] = self.segmentationID
+        if self.shared !='':
+            Dicdata['shared'] = self.shared
+
+        Dicdata = {'network': Dicdata}
+
+        return json.dumps(Dicdata,indent=4)
+
+    def Ordered(self,obj):
+
+        if isinstance(obj, dict):
+            return sorted((k,self.Ordered(v)) for k,  v in obj.items())
+        if isinstance(obj, list):
+            return sorted(self.Ordered(x) for x in obj )
+        else:
+            return obj
+
+    def JsonCompare(self,SourceData,DestiData,FirstPara,SecondPara):
+
+        try:
+            SourceCompareDataDic = json.loads(SourceData)
+            DestiCompareDataDic = json.loads(DestiData)
+        except ValueError:
+            print "SourceData or DestData is not JSON Type!"
+            return False
+
+        try:
+            Socom = SourceCompareDataDic[FirstPara][SecondPara]
+            Decom = DestiCompareDataDic[FirstPara][SecondPara]
+        except KeyError,error:
+            print "Key error ,This key is not found:%s"%error
+            return False
+
+        if str(Socom).lower()== str(Decom).lower():
+            return True
+        else:
+            print "Source Compare data:"+FirstPara+"."+SecondPara+"="+str(Socom)
+            print "Dest Compare data: "+FirstPara+"."+SecondPara+"="+str(Decom)
+            return False
+
+class SubnetData(NetworkData):
+
+    def __init__(self):
+        self.id = ''
+        self.tenant_id = ''
+        self.network_id = ''
+        self.nexthop = '192.168.1.1'
+        self.destination = '192.168.1.1/24'
+        self.start = '192.168.2.2'
+        self.end = '192.168.2.254'
+        self.ipv6_address_mode = 'DHCPV6_STATELESS'
+        self.ipv6_ra_mode = 'DHCPV6_STATELESS'
+        self.cidr = '192.168.1.1/24'
+        self.enable_dhcp = True
+        self.dns_nameservers = 'aaa'
+        self.gateway_ip = '192.168.2.1'
+        self.ip_version = '4'
+        self.shared = False
+        self.name = 'demo-subnet'
+
+    def DictoJson(self):
+        if self.id =='' or self.tenant_id == '':
+            print 'Id and tenant id is necessary!'
+
+        Dicdata = {}
+        host_routesdata = []
+        host_routesdata.append({'nexthop': self.nexthop,'destination': self.destination})
+        allocation_pools = []
+        allocation_pools.append({'start': self.start,'end':self.end})
+
+        if self.id != '':
+            Dicdata['id'] = self.id
+        if self.network_id != '':
+            Dicdata['network_id'] = self.network_id
+        if self.name != '':
+            Dicdata['name'] = self.name
+        if self.nexthop != '':
+            Dicdata['host_routes'] = host_routesdata
+        if self.tenant_id != '':
+            Dicdata['tenant_id'] = self.tenant_id
+        if self.start != '':
+            Dicdata['allocation_pools'] = allocation_pools
+        if self.shared != '':
+            Dicdata['shared'] = self.shared
+        if self.ipv6_address_mode != '':
+            Dicdata['ipv6_address_mode'] = self.ipv6_address_mode
+        if self.ipv6_ra_mode != '':
+            Dicdata['ipv6_ra_mode'] = self.ipv6_ra_mode
+        if self.cidr != '':
+            Dicdata['cidr'] = self.cidr
+        if self.enable_dhcp != '':
+            Dicdata['enable_dhcp'] = self.enable_dhcp
+        if self.dns_nameservers != '':
+            Dicdata['dns_nameservers'] = self.dns_nameservers
+        if self.gateway_ip != '':
+            Dicdata['gateway_ip'] = self.gateway_ip
+        if self.ip_version != '':
+            Dicdata['ip_version'] = self.ip_version
+
+        Dicdata = {'subnet': Dicdata}
+
+        return json.dumps(Dicdata,indent=4)
+
+class VirtualPortData(NetworkData):
+
+    def __init__(self):
+        self.id = ''
+        self.state = 'ACTIVE'
+        self.bindingHostId = 'fa:16:3e:76:8e:88'
+        self.allowedAddressPairs = [{'mac_address':'fa:16:3e:76:8e:88','ip_address':'192.168.1.1'}]
+        self.deviceOwner = 'none'
+        self.fixedIp = []
+        self.securityGroups = [{'securityGroup':'asd'}]
+        self.adminStateUp = True
+        self.network_id = ''
+        self.tenant_id = ''
+        self.subnet_id = ''
+        self.bindingvifDetails = 'port_filter'
+        self.bindingvnicType = 'normal'
+        self.bindingvifType = 'ovs'
+        self.macAddress = 'fa:16:3e:76:8e:88'
+        self.deviceId = 'a08aa'
+        self.name = 'u'
+
+    def DictoJson(self):
+        if self.id == '' or self.tenant_id == ' ' or \
+           self.network_id == '' or self.subnet_id == '':
+            print 'Id/tenant id/networkid/subnetId is necessary!'
+
+        Dicdata = {}
+        fixedIp =[]
+        fixedIp.append({'subnet_id':self.subnet_id,'ip_address':'192.168.1.4'})
+        allocation_pools = []
+
+        if self.id != '':
+            Dicdata['id'] = self.id
+        if self.state != '':
+            Dicdata['status'] = self.state
+        if self.bindingHostId != '':
+            Dicdata['binding:host_id'] = self.bindingHostId
+        if self.allowedAddressPairs != '':
+            Dicdata['allowed_address_pairs'] = self.allowedAddressPairs
+        if self.deviceOwner != '':
+            Dicdata['device_owner'] = self.deviceOwner
+        if self.securityGroups != '':
+            Dicdata['security_groups'] = self.securityGroups
+        if self.adminStateUp != '':
+            Dicdata['admin_state_up'] = self.adminStateUp
+        if self.network_id != '':
+            Dicdata['network_id'] = self.network_id
+        if self.tenant_id != '':
+            Dicdata['tenant_id'] = self.tenant_id
+        if self.bindingvifDetails != '':
+            Dicdata['binding:vif_details'] = self.bindingvifDetails
+        if self.bindingvnicType != '':
+            Dicdata['binding:vnic_type'] = self.bindingvnicType
+        if self.bindingvifType != '':
+            Dicdata['binding:vif_type'] = self.bindingvifType
+        if self.macAddress != '':
+            Dicdata['mac_address'] = self.macAddress
+        if self.deviceId != '':
+            Dicdata['device_id'] = self.deviceId
+        if self.name != '':
+            Dicdata['name'] = self.name
+
+        Dicdata['fixed_ips'] = fixedIp
+        Dicdata = {'port': Dicdata}
+
+        return json.dumps(Dicdata,indent=4)
\ No newline at end of file
diff --git a/TestON/tests/FUNC/FUNCvirNetNB/dependencies/__init__.py b/TestON/tests/FUNC/FUNCvirNetNB/dependencies/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCvirNetNB/dependencies/__init__.py
diff --git a/TestON/tests/FUNC/__init__.py b/TestON/tests/FUNC/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/__init__.py
diff --git a/TestON/tests/FUNC/dependencies/__init__.py b/TestON/tests/FUNC/dependencies/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/dependencies/__init__.py