diff --git a/src/test/mini/__init__.py b/src/test/mini/__init__.py
new file mode 100644
index 0000000..58368ab
--- /dev/null
+++ b/src/test/mini/__init__.py
@@ -0,0 +1,26 @@
+#
+# Copyright 2016-present Ciena Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+import os,sys
+##add the python path to lookup the utils
+working_dir = os.path.dirname(os.path.realpath(sys.argv[-1]))
+utils_dir = os.path.join(working_dir, '../utils')
+fsm_dir = os.path.join(working_dir, '../fsm')
+subscriber_dir = os.path.join(working_dir, '../subscriber')
+__path__.append(utils_dir)
+__path__.append(fsm_dir)
+__path__.append(subscriber_dir)
+cli_dir = os.path.join(working_dir, '../cli')
+__path__.append(cli_dir)
diff --git a/src/test/mini/miniTest.py b/src/test/mini/miniTest.py
new file mode 100644
index 0000000..5caadc7
--- /dev/null
+++ b/src/test/mini/miniTest.py
@@ -0,0 +1,734 @@
+#copyright 2016-present Ciena Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+import unittest
+from nose.tools import *
+from nose.twistedtools import reactor, deferred
+from twisted.internet import defer
+from scapy.all import *
+from OnosCtrl import OnosCtrl
+from OnosFlowCtrl import OnosFlowCtrl
+from OltConfig import OltConfig
+from onosclidriver import OnosCliDriver
+from functools import partial
+#from CordContainer import Onos
+utils_dir = os.path.join( os.path.dirname(os.path.realpath(__file__)), '../utils')
+sys.path.append(utils_dir)
+sys.path.insert(1, '/usr/local/lib/python2.7/dist-packages/requests')
+import time, monotonic
+from CordContainer import Onos
+from OnosLog import OnosLog
+from CordLogger import CordLogger
+import os
+import json
+import random
+import collections
+from mininet.net import Mininet
+from mininet.topo import SingleSwitchTopo,LinearTopo,Topo
+from mininet.topolib import TreeTopo
+#from mininet.clean import Cleanup
+from mininet.node import Controller, RemoteController, Switch
+from mininet.cli import CLI
+from mininet.log import setLogLevel, info
+from mininet.link import TCLink
+from mininet.util import dumpNodeConnections
+from mininet.node import CPULimitedHost
+log.setLevel('INFO')
+
+class mininet_exchange(unittest.TestCase):
+    app = 'org.onosproject.fwd'
+    controller = os.getenv('ONOS_CONTROLLER_IP') or 'localhost'
+    controller = controller.split(',')[0]
+
+    @classmethod
+    def setUpClass(cls):
+	pass
+
+    @classmethod
+    def tearDownClass(cls):
+	pwd = os.getcwd()
+	log.info('teardown- current working dir is %s'%pwd)
+	os.chdir('/root')
+	cmds = ['rm -r mininet','apt-get remove mininet']
+	for cmd in cmds:
+            os.system(cmd)
+        os.chdir(pwd)
+        log.info('teardown- dir after removing mininet is %s'%os.getcwd())
+        time.sleep(5)
+
+    def setUp(self):
+        self.onos_ctrl = OnosCtrl(self.app)
+        self.onos_ctrl.activate()
+
+    def tearDown(self):
+        self.onos_ctrl = OnosCtrl(self.app)
+        self.onos_ctrl.deactivate()
+
+    def cliEnter(self, controller = None):
+        retries = 0
+        while retries < 30:
+            self.cli = OnosCliDriver(controller = controller, connect = True)
+            if self.cli.handle:
+                break
+            else:
+                retries += 1
+                time.sleep(2)
+
+    def cliExit(self):
+        self.cli.disconnect()
+
+    def test_creation_of_topology(self):
+        try:
+            net = Mininet( topo=None, build=False)
+            h1 = net.addHost( 'h1')
+            h2 = net.addHost( 'h2' )
+            h3 = net.addHost( 'h3' )
+            s1 = net.addSwitch( 's1', dpid="0000000000000201")
+            s2 = net.addSwitch( 's2', dpid="0000000000000202")
+            s3 = net.addSwitch( 's3', dpid="0000000000000203")
+            net.addLink(h1, s1, )
+            net.addLink(h2, s2, )
+            net.addLink(h3, s3, )
+            net.addLink(s1, s2, )
+            net.addLink(s2, s3, )
+            #net.build()
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+	    s1.start( [ctrl] )
+            s2.start( [ctrl] )
+            s3.start( [ctrl] )
+	    #CLI(net)
+	    for switch in net.switches:
+		log.info('dpid of switch is %s'%switch.dpid)
+	    for host in net.hosts:
+	   	log.info('host %s added with IP addres %s'%(host.name,host.IP()))
+            net.stop()
+	    log.info('Successfully created  mininet topology and connected to cluster controllers')
+        except Exception as Error:
+            log.info('Got error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_creation_of_single_switch_topology(self,hosts=5):
+        try:
+            topo = SingleSwitchTopo(hosts)
+            net = Mininet(topo=topo )
+            net.start()
+            log.info('Node connections are %s'%dumpNodeConnections(net.hosts))
+      	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+	    for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('Pingall response is %s'%response)
+            assert_equal(response,0.0)
+            net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_creation_of_linear_topology(self,switches=5):
+        try:
+            topo = LinearTopo(switches)
+            net = Mininet(topo=topo)
+            net.start()
+            log.info('Node connections are %s'%dumpNodeConnections(net.hosts))
+	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('Pingall response is %s'%response)
+            assert_equal(response,0.0)
+	    #CLI(net)
+            net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating minine topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_creation_of_tree_topology(self):
+        try:
+            topo = TreeTopo(depth=2,fanout=2)
+            net = Mininet(topo=topo)
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('Pingall response is %s'%response)
+            assert_equal(response,0.0)
+            net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_executing_commands_from_mininet_host(self,switches=4):
+        try:
+            topo = LinearTopo(switches)
+            net = Mininet(topo=topo)
+            net.start()
+	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            for host in net.hosts:
+                result = host.cmd('ping -c 2', net.switches[0].IP())
+                log.info('Result is %s'%result)
+                res = result.find('icmp_seq')
+                assert_not_equal(res, -1)
+            net.stop()
+        except Exception as Error:
+            Cleanup.cleanup()
+            log.info('Error while creating topology is %s'%Error)
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_pingall_from_mininet(self,switches=5):
+        try:
+            topo = LinearTopo(switches)
+            net = Mininet(topo=topo)
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                log.info('switch is %s'%switch  )
+                switch.start([ctrl])
+            response = net.pingAll()
+            log.info('pingAll response is %s'%response)
+            assert_equal(response,0.0)
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_initiating_pingall_from_mininet_with_onos_app_deactivation(self,switches=3):
+        try:
+	    topo = LinearTopo(switches)
+            net = Mininet(topo=topo)
+            net.start()
+	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('PingAll response before onos app \'org.onosproject.fwd\' deactivate is %s'%response)
+            assert_equal(response, 0.0)
+            OnosCtrl(self.app).deactivate()
+            response = net.pingAll()
+            log.info('PingAll response after onos app \'org.onosproject.fwd\' deactivate is %s'%response)
+            assert_equal(response, 100.0)
+	    net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+	Cleanup.cleanup()
+
+    def test_verifying_mininet_hosts_in_onos_controller(self,switches=4):
+        try:
+	    topo = LinearTopo(switches)
+            net = Mininet( topo=topo)
+	    net.start()
+	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            log.info('mininet all the devices IDs %s'%net.keys())
+            log.info('mininet all the devices details %s'%net.values())
+            log.info('mininet all the devices information %s'%net.items())
+            response = net.pingAll()
+            log.info('pingAll response is %s'%response)
+            assert_equal(response, 0.0)
+            self.cliEnter()
+            hosts = json.loads(self.cli.hosts(jsonFormat = True))
+            log.info('Discovered hosts: %s' %hosts)
+            assert_equal(len(hosts),switches)
+            self.cliExit()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_tcp_bandwidth_measure_between_mininet_hosts_using_iperf(self):
+        try:
+	    topo = TreeTopo(depth=2,fanout=2)
+            net = Mininet( topo=topo, host=CPULimitedHost, link=TCLink, build=False)
+            net.start()
+	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('PingAll response is %s'%response)
+            bandwidth = net.iperf()
+            log.info('TCP Bandwidth between hosts measured using iperf is %s'%bandwidth)
+            assert_equal(len(bandwidth),2)
+            net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_udp_bandwidth_measure_between_mininet_hosts_using_iperf(self):
+        try:
+            topo = TreeTopo(depth=2,fanout=2)
+            net = Mininet( topo=topo, host=CPULimitedHost, link=TCLink, build=False)
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('pingAll response is %s'%response)
+            bandwidth = net.iperf(l4Type = 'UDP')
+            log.info('UDP Bandwidth between hosts measured using iperf is %s'%bandwidth)
+            assert_equal(len(bandwidth),3)
+            net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_tcp_bandwidth_between_mininet_hosts_using_iperf_with_one_host_removed(self,switches=3):
+        try:
+            topo = LinearTopo(switches)
+            net = Mininet(topo=topo)
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            iperf = net.iperf(l4Type='TCP')
+            log.info('Iperf response before host removed is %s'%iperf)
+            assert_equal(len(iperf),2)
+	    net.delNode(net.hosts[2])
+            iperf = net.iperf(l4Type='TCP')
+            log.info('Iperf response after host removed is %s'%iperf)
+	    assert_equal(len(iperf),2)
+            net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_udp_bandwidth_between_mininet_hosts_using_iperf_with_one_host_removed(self,switches=3):
+        try:
+            topo = LinearTopo(switches)
+            net = Mininet(topo=topo)
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            iperf = net.iperf(l4Type='UDP')
+            log.info('Iperf response before host removed is %s'%iperf)
+            assert_equal(len(iperf),3)
+            net.delNode(net.hosts[2])
+            iperf = net.iperf(l4Type='UDP')
+            log.info('Iperf response after host removed is %s'%iperf)
+	    assert_equal(len(iperf),3)
+            net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_hosts_assigned_with_non_default_ip_address(self):
+        try:
+            net = Mininet( topo=None, controller=RemoteController, host=CPULimitedHost, link=TCLink, build=False)
+            h1 = net.addHost( 'h1', ip='192.168.10.1/24' )
+            h2 = net.addHost( 'h2', ip='192.168.10.10/24' )
+            s1 = net.addSwitch( 's1')
+            s2 = net.addSwitch( 's2')
+            net.addLink(h1, s1, )
+            net.addLink(h2, s2, )
+            net.addLink(s1, s2, )
+	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            net.start()
+            assert_equal(net.hosts[0].IP(),'192.168.10.1')
+            assert_equal(net.hosts[1].IP(),'192.168.10.10')
+            response = net.pingAll()
+            log.info('PingAll response is %s'%response)
+            assert_equal(response,0.0)
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_hosts_assigned_with_non_default_ip_address_in_different_subnets(self):
+        try:
+            net = Mininet( topo=None, controller=RemoteController, host=CPULimitedHost, link=TCLink, build=False)
+            h1 = net.addHost( 'h1', ip='192.168.10.10/24' )
+            h2 = net.addHost( 'h2', ip='192.168.20.10/24' )
+            s1 = net.addSwitch( 's1')
+            s2 = net.addSwitch( 's2')
+            net.addLink(h1, s1, )
+            net.addLink(h2, s2, )
+            net.addLink(s1, s2, )
+            net.start()
+	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            assert_equal(net.hosts[0].IP(),'192.168.10.10')
+            assert_equal(net.hosts[1].IP(),'192.168.20.10')
+            response = net.pingAll()
+            log.info('pingAll response is %s'%response)
+            assert_equal(response,100.0)
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_pingall_with_connection_remove_between_switches(self,switches=4):
+        try:
+	    topo = LinearTopo(switches)
+            net = Mininet(topo=topo)
+	    #net.build()
+            net.start()
+	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('Pingall response before link delete is %s'%response)
+            assert_equal(response,0.0)
+            log.info('Deleting link between switches s1 and s2')
+            net.delLinkBetween(net.switches[0], net.switches[1], )
+            response = net.pingAll()
+            log.info('Pingall response after the link delete is is %s'%response)
+            assert_not_equal(response,0.0)
+            net.stop()
+        except Exception as Error:
+            log.info('Got error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_pingall_with_removing_one_mininet_host(self,switches=3):
+        try:
+	    topo = LinearTopo(switches)
+            net = Mininet(topo=topo)
+	    #net.build()
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('Pingall response before host delete is %s'%response)
+            assert_equal(response,0.0)
+            log.info('removing host h2')
+            net.delNode(net.hosts[1])
+            response = net.pingAll()
+            log.info('Pingall response after host delete is %s'%response)
+            assert_equal(response,0)
+            net.stop()
+        except Exception as Error:
+            log.info('Got error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_pingall_with_removing_one_mininet_switch(self,switches=3):
+        try:
+	    topo = LinearTopo(switches)
+            net = Mininet(topo=topo)
+	    #net.build()
+            net.start()
+	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('Pingall response before switch delete is %s'%response)
+            assert_equal(response,0.0)
+            log.info('Deleting switch s2')
+            net.delNode(net.switches[1])
+            response = net.pingAll()
+            log.info('Pingall response after switch delete is %s'%response)
+            assert_not_equal(response,0.0)
+            net.stop()
+        except Exception as Error:
+            log.info('Got error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_mininet_switch_status_in_onos_controller(self,switches=4):
+        try:
+	    topo = LinearTopo(switches)
+            net = Mininet(topo=topo, build=False)
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('Pingall response is %s'%response)
+            assert_equal(response,0.0)
+            self.cliEnter()
+            devices = json.loads(self.cli.devices(jsonFormat = True))
+	    count = 0
+	    switch_ids = []
+	    for switch in net.switches:
+                dvcid = 'of:'+switch.dpid
+                switch_ids.append(dvcid)
+	    for device in devices:
+	        if str(device['id']) in switch_ids:
+	            assert_equal(str(device['available']), 'True')
+		    count += 1
+	    assert_equal(count,switches)
+            self.cliExit()
+            net.stop()
+        except Exception as Error:
+            log.info('Got error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verify_host_status_in_onos_controller_with_removing_one_mininet_host(self,switches=5):
+        try:
+	    topo = LinearTopo(switches)
+            net = Mininet( topo=topo, build=False)
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('pingall response is %s'%response)
+            assert_equal(response,0.0)
+            self.cliEnter()
+            hosts = json.loads(self.cli.hosts(jsonFormat = True))
+	    log.info('Discovered Hosts are %s'%hosts)
+            assert_equal(len(hosts),switches)
+            log.info('removing host h2')
+            net.delNode(net.hosts[0])
+            hosts = json.loads(self.cli.hosts(jsonFormat = True))
+            assert_equal(len(hosts),switches-1)
+            self.cliExit()
+            net.stop()
+        except Exception as Error:
+            log.info('Got error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_pushing_mac_flows_from_onos_controller_to_mininet_switches(self,switches=3):
+        try:
+            topo = LinearTopo(switches)
+            net = Mininet( topo=topo)
+            net.start()
+            egress_mac = RandMAC()._fix()
+            ingress_mac = RandMAC()._fix()
+            egress = 1
+            ingress = 2
+	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            response = net.pingAll()
+            log.info('pingAll response is %s'%response)
+            self.cliEnter()
+            devices = json.loads(self.cli.devices(jsonFormat = True))
+            for switch in net.switches:
+		dvcid = 'of:'+switch.dpid
+                flow = OnosFlowCtrl(deviceId = dvcid,
+                                        egressPort = egress,
+                                        ingressPort = ingress,
+                                        ethSrc = ingress_mac,
+                                        ethDst = egress_mac)
+                result = flow.addFlow()
+                assert_equal(result, True)
+	    self.cliExit()
+            net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_pushing_ipv4_flows_from_onos_controller_to_mininet_switches(self,switches=5):
+        try:
+            topo = LinearTopo(switches)
+            net = Mininet( topo=topo)
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            egress = 1
+            ingress = 2
+            egress_map = { 'ether': '00:00:00:00:00:03', 'ip': '192.168.30.1' }
+            ingress_map = { 'ether': '00:00:00:00:00:04', 'ip': '192.168.40.1' }
+            response = net.pingAll()
+            log.info('pingAll response is %s'%response)
+            for switch in net.switches:
+		dvcid = 'of:'+switch.dpid
+                flow = OnosFlowCtrl(deviceId = dvcid,
+                                    egressPort = egress,
+                                    ingressPort = ingress,
+                                    ethType = '0x0800',
+				    ipSrc = ('IPV4_SRC', ingress_map['ip']+'/32'),
+                                    ipDst = ('IPV4_DST', egress_map['ip']+'/32')
+                                    )
+                result = flow.addFlow()
+                assert_equal(result, True)
+            net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_pushing_ipv6_flows_from_onos_controller_to_mininet_switches(self,switches=5):
+	try:
+	    topo = LinearTopo(switches)
+	    net = Mininet( topo=topo)
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                switch.start( [ctrl] )
+            egress = 1
+            ingress = 2
+            egress_map = { 'ether': '00:00:00:00:00:03', 'ipv6': '2001:db8:a0b:12f0:1010:1010:1010:1001' }
+            ingress_map = { 'ether': '00:00:00:00:00:04', 'ipv6': '2001:db8:a0b:12f0:1010:1010:1010:1002' }
+	    response = net.pingAll()
+            log.info('pingAll response is %s'%response)
+            for switch in net.switches:
+		dvcid = 'of:'+switch.dpid
+                flow = OnosFlowCtrl(deviceId = dvcid,
+                                    egressPort = egress,
+                                    ingressPort = ingress,
+                                    ethType = '0x86dd',
+                            	    ipSrc = ('IPV6_SRC', ingress_map['ipv6'] + '/48'),
+                            	    ipDst = ('IPV6_DST', egress_map['ipv6'] + '/48')
+                                    )
+                result = flow.addFlow()
+                assert_equal(result, True)
+            net.stop()
+   	except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_topology_created_with_50_switches_in_onos_controller(self,switches=50):
+	try:
+	    topo = LinearTopo(switches)
+	    net = Mininet(topo=topo)
+	    net.start()
+	    ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+	    for switch in net.switches:
+                switch.start([ctrl])
+	    time.sleep(5)
+	    self.cliEnter()
+            devices = json.loads(self.cli.devices(jsonFormat = True))
+	    device_list = []
+	    count = 0
+	    for device in devices:
+		device_list.append(str(device['id']))
+	    log.info('device list is %s'%device_list)
+	    for switch in net.switches:
+                switch_id = 'of:'+switch.dpid
+		if switch_id in device_list:
+		    count += 1
+	    assert_equal(count,switches)
+	    self.cliExit()
+	    net.stop()
+	except Exception as Error:
+	    log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+	Cleanup.cleanup()
+
+    def test_topology_created_with_200_switches_in_onos_controller(self,switches=200):
+        try:
+            topo = LinearTopo(switches)
+            net = Mininet(topo=topo)
+            net.start()
+            ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                log.info('switch is %s'%switch  )
+                switch.start([ctrl])
+	    time.sleep(10)
+	    self.cliEnter()
+            devices = json.loads(self.cli.devices(jsonFormat = True))
+            device_list = []
+            count = 0
+	    for device in devices:
+                device_list.append(str(device['id']))
+            log.info('device list is %s'%device_list)
+            for switch in net.switches:
+                switch_id = 'of:'+switch.dpid
+                if switch_id in device_list:
+                    count += 1
+            assert_equal(count,switches)
+	    self.cliExit()
+	    net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
+    def test_verifying_nodes_removed_in_mininet_status_in_onos_controller(self,switches=50, delete=20):
+        try:
+            topo = LinearTopo(switches)
+            net = Mininet(topo=topo)
+            net.start()
+            o1_ctrl = net.addController( 'onos', controller=RemoteController, ip=self.controller, port=6653)
+            for switch in net.switches:
+                log.info('switch is %s'%switch)
+                switch.start([o1_ctrl])
+	    time.sleep(5)
+	    self.cliEnter()
+            devices = json.loads(self.cli.devices(jsonFormat = True))
+            device_list = []
+            count = 0
+            for device in devices:
+                device_list.append(str(device['id']))
+            log.info('device list is %s'%device_list)
+            for switch in net.switches:
+                switch_id = 'of:'+switch.dpid
+                if switch_id in device_list:
+                    count += 1
+            assert_equal(count,switches)
+	    count = 0
+	    dltd_list = []
+	    for switch in net.switches:
+                log.info('Switch is %s'%switch)
+	        dltd_list.append('of:'+switch.dpid)
+                net.delNode(switch)
+                count += 1
+                if count == delete:
+                    break
+	    log.info('deleted switch dpid\'s %s'%dltd_list)
+	    count = 0
+	    devices = json.loads(self.cli.devices(jsonFormat = True))
+	    for device in devices:
+		if str(device['id']) in dltd_list:
+		    assert_equal(str(device['available']), 'False')
+		    count += 1
+	    assert_equal(count,delete)
+	    self.cliExit()
+	    net.stop()
+        except Exception as Error:
+            log.info('Got unexpected error %s while creating topology'%Error)
+            Cleanup.cleanup()
+            raise
+        Cleanup.cleanup()
+
