diff --git a/TestON/tests/FUNCflow/Dependency/topo-flow.py b/TestON/tests/FUNCflow/Dependency/topo-flow.py
new file mode 100755
index 0000000..2299d9e
--- /dev/null
+++ b/TestON/tests/FUNCflow/Dependency/topo-flow.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/FUNCflow/FUNCflow.params b/TestON/tests/FUNCflow/FUNCflow.params
index 396686e..e0dde55 100755
--- a/TestON/tests/FUNCflow/FUNCflow.params
+++ b/TestON/tests/FUNCflow/FUNCflow.params
@@ -7,38 +7,37 @@
     # 9 - Report logs
     # 10 - Start mininet and assign switches to controller
     # 1000 - Add flows
-    # 2000 - Delete flows
-    # 3000 - Modify flow rule selectors
-    # 4000 - Modify flow rule treatments
-    # 5000 - flow rule controller
-    # 100 - Compare switch flow table with ONOS
-    <testcases>1,2,10,8,1000</testcases>
+    # 2000 - Verify flows are in the ADDED state
+    # 3000 - Delete flows
+    <testcases>1,2,10,11,1000,2000,3000,100</testcases>
 
     <SCALE>
-        <max>3</max>
+        <max>1</max>
     </SCALE>
 
     <DEPENDENCY>
         <path>/tests/FUNCflow/Dependency/</path>
         <wrapper1>startUp</wrapper1>
         <wrapper2>topo</wrapper2>
-        <topology>flow-2sw.py</topology>
+        <topology>topo-flow.py</topology>
     </DEPENDENCY>
 
 
     <TOPO>
         <numSwitches>1</numSwitches>
         <numHosts>2</numHosts>
-        <numLinks>2</numLinks>
+        <numLinks>0</numLinks>
+    </TOPO>
+
+    <MININET>
         <deviceId>of:0000000000000001</deviceId>
         <hostMac1>00:00:00:00:00:01</hostMac1>
         <hostMac2>00:00:00:00:00:02</hostMac2>
-        <ethType>IPV4</ethType>
-    </TOPO>
+    </MININET>
 
     <ENV>
         <cellName>productionCell</cellName>
-        <cellApps>drivers,openflow,fwd</cellApps>
+        <cellApps>drivers,openflow</cellApps>
     </ENV>
 
     <GIT>
diff --git a/TestON/tests/FUNCflow/FUNCflow.py b/TestON/tests/FUNCflow/FUNCflow.py
index 30608a6..fdd2c1f 100644
--- a/TestON/tests/FUNCflow/FUNCflow.py
+++ b/TestON/tests/FUNCflow/FUNCflow.py
@@ -203,7 +203,42 @@
                                  onpass="Successfully start ONOS cli",
                                  onfail="Failed to start ONOS cli" )
 
-    def CASE8( self, main ):
+    def CASE10( self, main ):
+        '''
+            Start Mininet
+        '''
+        main.case( "Setup mininet and assign switches to controllers" )
+        main.step( "Setup Mininet Topology" )
+        topology = main.Mininet1.home + '/custom/' + main.topology
+        mnCmd = 'mn --custom ' + topology + ' --mac --arp'
+        stepResult1 = main.Mininet1.startNet( mnCmd=mnCmd )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult1,
+                                 onpass="Successfully loaded topology",
+                                 onfail="Failed to load topology" )
+
+        main.step( "Assign switches to controllers" )
+        for i in range( main.numSwitches ):
+            stepResult2 = main.Mininet1.assignSwController(
+                                            sw="s" + str( i+1 ),
+                                            ip=main.ONOSip )
+            if not stepResult2:
+                break
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult2,
+                                 onpass="Controller assignment successfull",
+                                 onfail="Controller assignment failed" )
+
+        time.sleep(5)
+
+        caseResult = stepResult1 and stepResult2
+        if not caseResult:
+            main.cleanup()
+            main.exit()
+
+    def CASE11( self, main ):
         '''
             Compare topology
         '''
@@ -244,9 +279,9 @@
             utilities.assert_equals( expect=main.TRUE,
                                      actual=currentDevicesResult,
                                      onpass="ONOS" + controllerStr +
-                                     " Switches view is correct",
+                                            " Switches view is correct",
                                      onfail="ONOS" + controllerStr +
-                                     " Switches view is incorrect" )
+                                            " Switches view is incorrect" )
             if links[ controller ] and "Error" not in links[ controller ]:
                 currentLinksResult = main.Mininet1.compareLinks(
                         mnSwitches, mnLinks,
@@ -256,9 +291,9 @@
             utilities.assert_equals( expect=main.TRUE,
                                      actual=currentLinksResult,
                                      onpass="ONOS" + controllerStr +
-                                     " links view is correct",
+                                            " links view is correct",
                                      onfail="ONOS" + controllerStr +
-                                     " links view is incorrect" )
+                                            " links view is incorrect" )
 
             if hosts[ controller ] or "Error" not in hosts[ controller ]:
                 currentHostsResult = main.Mininet1.compareHosts(
@@ -269,21 +304,85 @@
             utilities.assert_equals( expect=main.TRUE,
                                      actual=currentHostsResult,
                                      onpass="ONOS" + controllerStr +
-                                     " hosts exist in Mininet",
+                                            " hosts exist in Mininet",
                                      onfail="ONOS" + controllerStr +
-                                     " hosts don't match Mininet")
+                                            " hosts don't match Mininet")
 
-        main.step( "Deactiviate reactive fwd" )
-        stepResult = main.CLIs[0].deactivateApp( 'org.onosproject.fwd' )
+
+
+    def CASE1000( self, main ):
+        '''
+            Add flows
+        '''
+
+        main.step("Add flows through rest")
+
+        deviceId = main.params['MININET']['deviceId']
+        host1_mac = main.params['MININET']['hostMac1']
+        host2_mac = main.params['MININET']['hostMac2']
+
+        # Add flows that connects host1 to host 2
+        stepResult = main.ONOSrest.addFlow( deviceId=deviceId,
+                                            egressPort=2,
+                                            ingressPort=1,
+                                            ethSrc=host1_mac,
+                                            ethDst=host2_mac)
+
+        stepResult = stepResult and main.ONOSrest.addFlow( deviceId=deviceId,
+                                                           egressPort=1,
+                                                           ingressPort=2,
+                                                           ethSrc=host2_mac,
+                                                           ethDst=host1_mac)
+
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
-                                 onpass="Successfully deactived fwd app",
-                                 onfail="Failed to deactivate fwd app" )
+                                 onpass="Successfully added flows",
+                                 onfail="Failed add flows" )
 
-        main.log.info("Wait for the flows to dissappear")
-        time.sleep(5)
+    def CASE2000( self, main ):
+        '''
+            Check flows are ADDED
+        '''
+        import json
+        main.step("Check flows  are in the ADDED state")
+        main.log.info("Check only the flows added through REST")
 
-    def CASE9( self, main ):
+        flows = json.loads( main.ONOSrest.flows() )
+
+        stepResult = main.TRUE
+        for f in flows:
+            if "rest" in f.get("appId"):
+                if "ADDED" in f.get("state"):
+                    stepResult = stepResult and main.ONOSrest.removeFlow( deviceId, flowId )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in the ADDED state",
+                                 onfail="All flows are in the ADDED state" )
+
+    def CASE3000( self, main ):
+        '''
+            Delete flows that were added through REST
+        '''
+        import json
+        main.step("Remove flows")
+        main.log.info("Remove the flows that were added through rest")
+
+        flows = json.loads( main.ONOSrest.flows() )
+
+        stepResult = main.TRUE
+        for f in flows:
+            if "rest" in f.get("appId"):
+                flowId = f.get("id")
+                deviceId = f.get("deviceId")
+                stepResult = stepResult and main.ONOSrest.removeFlow( deviceId, flowId )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully removed all rest flows",
+                                 onfail="Failed to remove rest flows" )
+
+    def CASE100( self, main ):
         '''
             Report errors/warnings/exceptions
         '''
@@ -295,123 +394,5 @@
                                     "flow",
                                     "ERROR",
                                     "Except" ],
-                                 "s" )
+                                  "s" )
 
-    def CASE10( self, main ):
-        '''
-            Start Mininet
-        '''
-        main.case( "Setup mininet and assign switches to controllers" )
-        main.step( "Setup Mininet Topology" )
-        topology = main.Mininet1.home + '/custom/' + main.topology
-        stepResult1 = main.Mininet1.startNet( topoFile=topology )
-
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=stepResult1,
-                                 onpass="Successfully loaded topology",
-                                 onfail="Failed to load topology" )
-
-        main.step( "Assign switches to controllers" )
-        for i in range( main.numSwitches ):
-            stepResult2 = main.Mininet1.assignSwController(
-                                            sw="s" + str( i+1 ),
-                                            ip=main.ONOSip )
-            if not stepResult2:
-                break
-
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=stepResult2,
-                                 onpass="Controller assignment successfull",
-                                 onfail="Controller assignment failed" )
-
-        time.sleep(5)
-
-        main.step( "Pingall hosts for discovery" )
-        stepResult3 = main.Mininet1.pingall()
-        if not stepResult3:
-            stepResult3 = main.Mininet1.pingall()
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=stepResult3,
-                                 onpass="Pingall successfull",
-                                 onfail="Pingall unsuccessfull" )
-
-        caseResult = stepResult1 and stepResult2 and stepResult3
-        if not caseResult:
-            main.cleanup()
-            main.exit()
-
-    def CASE1000( self, main ):
-        '''
-            Add flows
-        '''
-
-        main.step("Add some flows")
-
-        deviceId = main.params['TOPO']['deviceId']
-        host1_mac = main.params['TOPO']['hostMac1']
-        host2_mac = main.params['TOPO']['hostMac2']
-
-
-        flowResult1 = main.ONOSrest.addFlow( deviceId=deviceId,
-                                             egressPort=-3,
-                                             ethType="IPV4" )
-
-        flowResult2 = main.ONOSrest.addFlow( deviceId=deviceId,
-                                             egressPort=2,
-                                             ingressPort=1,
-                                             ethSrc=host1_mac,
-                                             ethDst=host2_mac)
-
-        flowResult3 = main.ONOSrest.addFlow( deviceId=deviceId,
-                                             egressPort=1,
-                                             ingressPort=2,
-                                             ethSrc=host2_mac,
-                                             ethDst=host1_mac)
-
-        flowResult = flowResult1 and flowResult2 and flowResult3
-
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=flowResult,
-                                 onpass="Successfully added flows",
-                                 onfail="Failed add flows" )
-
-        main.step("Verify flows with pingall")
-        main.log.info("wait for flows to install")
-        time.sleep(5)
-
-        pingResult = main.Mininet1.pingall()
-        if not pingResult:
-            main.log.warn("First pingall failed. Retrying")
-            pingResult = main.Mininet1.pingall()
-
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=pingResult,
-                                 onpass="Pingall successfull",
-                                 onfail="Pingall failed" )
-
-        time.sleep(100)
-
-    def CASE2000( self, main ):
-        '''
-            Delete flows
-        '''
-
-    def CASE3000( self, main ):
-        '''
-            Modify flow rule selectors
-        '''
-
-    def CASE4000( self, main ):
-        '''
-            Modify flow rule treatment
-        '''
-
-    def CASE5000( self, main ):
-        '''
-            Modify flow rule controller
-        '''
-
-    def CASE100( self, main ):
-        '''
-            Compare switch flow table with ONOS
-        '''
diff --git a/TestON/tests/FUNCflow/FUNCflow.topo b/TestON/tests/FUNCflow/FUNCflow.topo
index 7c17bcb..9ea3d19 100755
--- a/TestON/tests/FUNCflow/FUNCflow.topo
+++ b/TestON/tests/FUNCflow/FUNCflow.topo
@@ -21,26 +21,6 @@
             </COMPONENTS>
         </ONOScli1>
 
-        <ONOScli2>
-            <host>localhost</host>
-            <user>admin</user>
-            <password>onos_test</password>
-            <type>OnosCliDriver</type>
-            <connect_order>3</connect_order>
-            <COMPONENTS>
-            </COMPONENTS>
-        </ONOScli2>
-
-         <ONOScli3>
-            <host>localhost</host>
-            <user>admin</user>
-            <password>onos_test</password>
-            <type>OnosCliDriver</type>
-            <connect_order>4</connect_order>
-            <COMPONENTS>
-            </COMPONENTS>
-        </ONOScli3>
-
         <Mininet1>
             <host>localhost</host>
             <user>admin</user>
