diff --git a/src/test/mininet/__init__.py b/src/test/mininet/__init__.py
new file mode 100644
index 0000000..58368ab
--- /dev/null
+++ b/src/test/mininet/__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/mininet/mininetTest.py b/src/test/mininet/mininetTest.py
new file mode 100644
index 0000000..cdac3f0
--- /dev/null
+++ b/src/test/mininet/mininetTest.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()
+
