diff --git a/TestON/tests/SDNIPperf/Dependency/SDNIPperfMininet.py b/TestON/tests/SDNIPperf/Dependency/SDNIPperfMininet.py
new file mode 100755
index 0000000..4971bd9
--- /dev/null
+++ b/TestON/tests/SDNIPperf/Dependency/SDNIPperfMininet.py
@@ -0,0 +1,340 @@
+#!/usr/bin/python
+
+"""
+Set up the SDN-IP performance test topology
+"""
+
+"""
+AS1 = 64513, (SDN AS)
+AS2 = 64514, reachable by 192.168.10.1, 192.168.20.1
+AS3 = 64516, reachable by 192.168.30.1
+AS4 = 64517, reachable by 192.168.40.1
+AS6 = 64520, reachable by 192.168.60.2, (route server 192.168.60.1)
+"""
+
+from mininet.net import Mininet
+from mininet.node import Controller, RemoteController
+from mininet.log import setLogLevel, info
+from mininet.cli import CLI
+from mininet.topo import Topo
+from mininet.util import quietRun
+from mininet.moduledeps import pathCheck
+
+import os.path
+import time
+from subprocess import Popen, STDOUT, PIPE
+
+QUAGGA_DIR = '/usr/lib/quagga'
+QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
+
+class SDNTopo( Topo ):
+    "SDN Topology"
+
+    def __init__( self, *args, **kwargs ):
+        global numHost101
+        global numHost200
+        numHost101 = 101
+        numHost200 = 200
+
+        Topo.__init__( self, *args, **kwargs )
+        sw1 = self.addSwitch( 'sw1', dpid = '00000000000000a1' )
+        sw2 = self.addSwitch( 'sw2', dpid = '00000000000000a2' )
+        sw3 = self.addSwitch( 'sw3', dpid = '00000000000000a3' )
+        sw4 = self.addSwitch( 'sw4', dpid = '00000000000000a4' )
+        sw5 = self.addSwitch( 'sw5', dpid = '00000000000000a5' )
+        sw6 = self.addSwitch( 'sw6', dpid = '00000000000000a6' )
+        # add a switch for 100 quagga hosts
+        sw100 = self.addSwitch( 'sw100', dpid = '0000000000000100' )
+        swTestOn = self.addSwitch( 'swTestOn', dpid = '0000000000000102' )
+        # Note this switch isn't part of the SDN topology
+        # We'll use the ovs-controller to turn this into a learning switch
+        as6sw = self.addSwitch( 'as6sw', dpid = '00000000000000a7' )
+
+        host1 = self.addHost( 'host1' )
+        host2 = self.addHost( 'host2' )
+        root1 = self.addHost( 'root1', inNamespace = False , ip = '0' )
+        root2 = self.addHost( 'root2', inNamespace = False, ip = '0' )
+        rootTestOn = self.addHost( 'rootTestOn', inNamespace = False, ip = '0' )
+
+        # AS2 host
+        host3 = self.addHost( 'host3' )
+        as2host = self.addHost( 'as2host' )
+        # AS3 host
+        host4 = self.addHost( 'host4' )
+        as3host = self.addHost( 'as3host' )
+        # AS4 host
+        for i in range( numHost101, numHost200 + 1 ):
+            self.addHost( 'host%s' % ( i ) )
+
+        '''as4host = self.addHost( 'as4host' )
+        for i in range(numHost101, numHost200 + 1):
+            self.addHost('as4host%s' %(i))
+        '''
+        # AS6 host
+        as6rs = self.addHost( 'as6rs' )
+        host5 = self.addHost( 'host5' )
+        as6host = self.addHost( 'as6host' )
+
+        self.addLink( host1, sw1 )
+        self.addLink( host2, sw1 )
+        # Links to the multihomed AS
+        self.addLink( host3, sw3 )
+        self.addLink( host3, sw5 )
+        self.addLink( as2host, host3 )
+        # Single links to the remaining two ASes
+        self.addLink( host4, sw2 )
+        self.addLink( sw100, sw6 )
+        self.addLink( as3host, host4 )
+        for i in range( numHost101, numHost200 + 1 ):
+            self.addLink( 'host%s' % ( i ), sw100 )
+        '''
+        for i in range(numHost101, numHost200 + 1):
+            self.addLink('host%s' % (i), 'as4host%s' % (i))
+        '''
+        # AS3-AS4 link
+        # self.addLink( host4, host5)
+        # Add new AS6 to its bridge
+        self.addLink( as6rs, as6sw )
+        self.addLink( host5, as6sw )
+        self.addLink( as6host, host5 )
+        # test the host behind the router(behind the router server)
+        '''
+        for i in range(1, 10):
+            host = self.addHost('as6host%d' % i)
+            self.addLink(host, as6router)
+        '''
+        # Internal Connection To Hosts
+        self.addLink( root1, host1 )
+        self.addLink( root2, host2 )
+
+        self.addLink( sw1, sw2 )
+        self.addLink( sw1, sw3 )
+        self.addLink( sw2, sw4 )
+        self.addLink( sw3, sw4 )
+        self.addLink( sw3, sw5 )
+        self.addLink( sw4, sw6 )
+        self.addLink( sw5, sw6 )
+        self.addLink( as6sw, sw4 )
+
+        self.addLink( swTestOn, rootTestOn )
+        self.addLink( swTestOn, host3 )
+        self.addLink( swTestOn, host4 )
+        self.addLink( swTestOn, host5 )
+        self.addLink( swTestOn, as2host )
+
+        for i in range( numHost101, numHost200 + 1 ):
+            self.addLink( swTestOn, 'host' + str( i ) )
+
+def startsshd( host ):
+    "Start sshd on host"
+    info( '*** Starting sshd\n' )
+    name, intf, ip = host.name, host.defaultIntf(), host.IP()
+    banner = '/tmp/%s.banner' % name
+    host.cmd( 'echo "Welcome to %s at %s" >  %s' % ( name, ip, banner ) )
+    host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
+    info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
+
+def startsshds ( hosts ):
+    for h in hosts:
+        startsshd( h )
+
+def stopsshd():
+    "Stop *all* sshd processes with a custom banner"
+    info( '*** Shutting down stale sshd/Banner processes ',
+          quietRun( "pkill -9 -f Banner" ), '\n' )
+
+def startquagga( host, num, config_file ):
+    info( '*** Starting Quagga on %s\n' % host )
+    quagga_cmd = '%s/bgpd -d -n -f %s -i %s/bgpd%s.pid' \
+    % ( QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num )
+    print quagga_cmd
+    host.cmd( quagga_cmd )
+
+def startquaggahost5( host, num ):
+    info( '*** Starting Quagga on %s\n' % host )
+    quagga_cmd = '%s/bgpd -d -n -f ./as4quaggas/quagga%s.conf -i %s/bgpd%s.pid'\
+     % ( QUAGGA_DIR, num, QUAGGA_RUN_DIR, num )
+    host.cmd( quagga_cmd )
+
+def stopquagga():
+    quietRun( 'sudo pkill -9 -f bgpd' )
+    quietRun( 'sudo pkill -9 -f zebra' )
+
+def sdn1net():
+    topo = SDNTopo()
+    info( '*** Creating network\n' )
+    net = Mininet( topo = topo, controller = RemoteController )
+
+    host1, host2, host3, host4, host5 = net.get( 'host1', 'host2' ,
+                                                 'host3', 'host4', 'host5' )
+
+    # Adding 2nd, 3rd and 4th interface to host1 connected to sw1
+    # for another BGP peering
+    host1.setMAC( '00:00:00:00:00:01', 'host1-eth0' )
+    host1.cmd( 'ip addr add 192.168.20.101/24 dev host1-eth0' )
+    host1.cmd( 'ip addr add 192.168.30.101/24 dev host1-eth0' )
+    host1.cmd( 'ip addr add 192.168.40.101/24 dev host1-eth0' )
+    host1.cmd( 'ip addr add 192.168.60.101/24 dev host1-eth0' )
+
+    # Net has to be start after adding the above link
+    net.start()
+    for i in range( numHost101, numHost200 + 1 ):
+        host100 = net.get( 'host%s' % ( i ) )
+        host100.cmd( 'ifconfig host%s-eth0 192.168.40.%s up' % ( i, i - 100 ) )
+        host100.setIP( str( i ) + ".0.0.254", 8, str( host100 ) + "-eth1" )
+        host100.setMAC( '00:00:' + str( i - 101 ) + ':00:00:90', 'host' \
+                        + str( i ) + '-eth0' )
+        host100.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
+
+    # Set up as6sw as a learning switch as quickly as possible so it
+    # hopefully doesn't connect to the actual controller
+    # TODO figure out how to change controller before starting switch
+    as6sw = net.get( 'as6sw' )
+    as6sw.cmd( 'ovs-vsctl set-controller as6sw none' )
+    as6sw.cmd( 'ovs-vsctl set-fail-mode as6sw standalone' )
+
+
+    sw1, sw2, sw3, sw4, sw5, sw6 = net.get( 'sw1', 'sw2', 'sw3', 'sw4', 'sw5', 'sw6' )
+    sw1.cmd( 'ovs-vsctl set-controller sw1 tcp:10.254.1.201:6633' )
+    sw2.cmd( 'ovs-vsctl set-controller sw2 tcp:10.254.1.201:6633' )
+    sw3.cmd( 'ovs-vsctl set-controller sw3 tcp:10.254.1.201:6633' )
+    sw4.cmd( 'ovs-vsctl set-controller sw4 tcp:10.254.1.201:6633' )
+    sw5.cmd( 'ovs-vsctl set-controller sw5 tcp:10.254.1.201:6633' )
+    sw6.cmd( 'ovs-vsctl set-controller sw6 tcp:10.254.1.201:6633' )
+
+    # Set up sw100 as a learning
+    sw100 = net.get( 'sw100' )
+    sw100.cmd( 'ovs-vsctl set-controller sw100 none' )
+    sw100.cmd( 'ovs-vsctl set-fail-mode sw100 standalone' )
+
+    swTestOn = net.get( 'swTestOn' )
+    swTestOn.cmd( 'ovs-vsctl set-controller swTestOn none' )
+    swTestOn.cmd( 'ovs-vsctl set-fail-mode swTestOn standalone' )
+
+    host1.defaultIntf().setIP( '192.168.10.101/24' )
+
+    # Configure new host interfaces
+    host2.defaultIntf().setIP( '172.16.10.2/24' )
+    host2.defaultIntf().setMAC( '00:00:00:00:01:02' )
+
+    # Set up AS2
+    host3.setIP( '192.168.10.1', 24, 'host3-eth0' )
+    host3.setIP( '192.168.20.1', 24, 'host3-eth1' )
+    host3.setMAC( '00:00:00:00:02:01', 'host3-eth0' )
+    host3.setMAC( '00:00:00:00:02:02', 'host3-eth1' )
+    host3.setIP( '3.0.0.254', 8, 'host3-eth2' )
+    host3.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
+
+    host3.setIP( '1.168.30.2', 24, 'host3-eth3' )
+    host3.cmd( 'sysctl net.ipv4.conf.all.arp_ignore=1' )
+    host3.cmd( 'sysctl net.ipv4.conf.all.arp_announce=1' )
+    as2host = net.get( 'as2host' )
+
+    for i in range( 0, 20 ):
+        as2host.cmd( 'sudo ip addr add 3.0.%d.1/24 dev as2host-eth0' % i )
+    as2host.setIP( '1.168.30.100', 24, 'as2host-eth1' )
+
+    as2host.cmd( 'ip route add default via 3.0.0.254' )
+
+    # Set up AS3
+    host4.setIP( '192.168.30.1', 24, 'host4-eth0' )
+    host4.setMAC( '00:00:00:00:03:01', 'host4-eth0' )
+    host4.setIP( '4.0.0.254', 8, 'host4-eth1' )
+    host4.setMAC( '00:00:00:00:03:99', 'host4-eth1' )
+    host4.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
+    as3host = net.get( 'as3host' )
+    for i in range( 0, 20 ):
+        as3host.cmd( 'sudo ip addr add 4.0.%d.1/24 dev as3host-eth0' % i )
+    as3host.cmd( 'ip route add default via 4.0.0.254' )
+
+    # root space
+    host4.setIP( '1.168.30.3', 24, 'host4-eth2' )
+    host4.setMAC( '00:00:00:00:03:03', 'host4-eth2' )
+
+    # setup interface address for 100 quagga hosts
+    time.sleep( 10 )
+    '''
+    for i in range(numHost101, numHost200 + 1):
+        #host100 = net.get('host' + str(i))
+        #host100.cmd(str(i)+'.0.1.254', 24, 'host'+str(i)+'-eth1')
+        as4host100 = net.get('as4host%s' %(i))
+        as4host100.defaultIntf().setIP(str(i) + '.0.0.1/24')
+        as4host100.cmd('ip route add default via ' + str(i) + '.0.0.254')
+        for j in range(0, 100):
+            as4host100.cmd('sudo ip addr add %d.0.%d.1/24 dev %s-eth0' \
+            %(i, j, as4host100))
+    '''
+    # Set up AS6 - This has a router and a route server
+    as6rs, host5 = net.get( 'as6rs', 'host5' )
+    as6rs.setIP( '192.168.60.1', 24, 'as6rs-eth0' )
+    as6rs.setMAC( '00:00:00:00:06:01', 'as6rs-eth0' )
+    host5.setIP( '192.168.60.2', 24, 'host5-eth0' )
+    host5.setMAC( '00:00:00:00:06:02', 'host5-eth0' )
+    host5.setIP( '5.0.0.254', 8, 'host5-eth1' )
+    host5.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
+    host5.setIP( '1.168.30.5', 24, 'host5-eth2' )
+    host5.setMAC( '00:00:00:00:06:05', 'host5-eth2' )
+
+    as6host = net.get( 'as6host' )
+    as6host.defaultIntf().setIP( '5.0.0.1/24' )
+    as6host.cmd( 'ip route add default via 5.0.0.254' )
+    for i in range( 0, 10 ):
+        as6host.cmd( 'sudo ip addr add 5.0.%d.1/24 dev as6host-eth0' % i )
+
+    # Start Quagga on border routers
+    startquagga( host3, 1, 'quagga1.conf' )
+    startquagga( host4, 2, 'quagga2.conf' )
+    for i in range( numHost101, 200 + 1 ):
+        host100 = net.get( 'host%d' % ( i ) )
+        startquaggahost5( host100, i )
+
+    startquagga( as6rs, 4, 'quagga-as6-rs.conf' )
+    startquagga( host5, 5, 'quagga-as6.conf' )
+
+    root1, root2, rootTestOn = net.get( 'root1', 'root2', 'rootTestOn' )
+    host1.intf( 'host1-eth1' ).setIP( '1.1.1.1/24' )
+    root1.intf( 'root1-eth0' ).setIP( '1.1.1.2/24' )
+    host2.intf( 'host2-eth1' ).setIP( '1.1.2.1/24' )
+    root2.intf( 'root2-eth0' ).setIP( '1.1.2.2/24' )
+
+    rootTestOn.cmd( 'ip addr add 1.168.30.99/24 dev rootTestOn-eth0' )
+
+    stopsshd()
+    '''
+    for i in range(numHost101, numHost200 + 1):
+        hostX = net.get('host%s' %(i))
+        hostX.setIP('1.168.30.' + str(i), 24, str("host") + str(i) + "-eth2")
+        startsshd(hostX)
+        #sshdHosts = []
+        #sshdHosts = sshdHosts + [hostX]
+        #print(sshdHosts)
+    '''
+
+    '''startquagga(host1, 100, 'quagga-sdn.conf')'''
+    host1.cmd( "/home/admin/bird-1.5.0/bird" )
+    hosts = [ host1, host2, host3, host4, host5, as2host ];
+    # sshdHosts = sshdHosts + hosts
+    startsshds( hosts )
+    #
+    onos1 = '10.254.1.201'
+    forwarding1 = '%s:179:%s:179' % ( '1.1.1.2', onos1 )
+    root1.cmd( 'ssh -nNT -o "PasswordAuthentication no" \
+    -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % ( forwarding1, onos1 ) )
+
+    # Forward 2605 to root namespace for easier access to SDN domain BGPd
+    # If root can ssh to itself without a password this should work
+    # root1.cmd( 'ssh -N -o "PasswordAuthentication no" \
+    # -o "StrictHostKeyChecking no" -L 2605:1.1.1.1:2605 1.1.1.1 &' )
+    time.sleep( 3000000000 )
+    CLI( net )
+
+    # Close the ssh port forwarding
+    # quietRun('sudo pkill -f 1.1.1.1')
+
+    stopsshd()
+    stopquagga()
+    net.stop()
+
+if __name__ == '__main__':
+    setLogLevel( 'debug' )
+    sdn1net()
