diff --git a/tools/test/topos/optical.py b/tools/test/topos/optical.py
deleted file mode 100755
index 300332a..0000000
--- a/tools/test/topos/optical.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env python
-
-''' file: optical.py '''
-
-from mininet.topo import Topo
-from mininet.node import RemoteController
-from mininet.net import Mininet
-from mininet.cli import CLI
-from mininet.log import setLogLevel, info
-from mininet.link import Intf, Link
-from mininet.util import irange
-
-class NullIntf( Intf ):
-    "A dummy interface with a blank name that doesn't do any configuration"
-    def __init__( self, name, **params ):
-        self.name = ''
-
-class NullLink( Link ):
-    "A dummy link that doesn't touch either interface"
-    def makeIntfPair( cls, intf1, intf2, addr1=None, addr2=None ):
-        pass
-    def delete( self ):
-        pass
-
-class OpticalTopo( Topo ):
-
-    def addIntf( self, switch, intfName ):
-        "Add intf intfName to switch"
-        self.addLink( switch, switch, cls=NullLink,
-                      intfName1=intfName, cls2=NullIntf, intfName2=intfName )
-
-    def build( self, n=2, tapStart=3 ):
-
-        # Add hosts and switches
-        hosts = []
-        switches = []
-        for i in irange( 1, n ):
-            h = self.addHost( 'h%d' % i )
-            s = self.addSwitch( 's%d' % i, dpid="0000ffffffff%04d" % i )
-            self.addLink( h, s )
-            hosts.append( h )
-            switches.append( s )
-
-        # Add optical tap interfaces
-        tapNum = tapStart
-        for sw in switches:
-            self.addIntf( sw, 'tap%d' % tapNum )
-            tapNum += 1
-
-# if you use, sudo mn --custom custom/optical.py, then register the topo:
-#sudo mn --custom optical.py --topo optical,5
-topos = { 'optical': OpticalTopo }
-
-def installStaticFlows( net ):
-    for sw in net.switches:
-      info( 'Adding flows to %s...' % sw.name )
-      sw.dpctl( 'add-flow', 'in_port=1,actions=output=2' )
-      sw.dpctl( 'add-flow', 'in_port=2,actions=output=1' )
-      info( sw.dpctl( 'dump-flows' ) )
-
-def run( n ):
-    topo = OpticalTopo( n )
-    net = Mininet( topo=topo, controller=RemoteController, autoSetMacs=True )
-    net.start()
-    #installStaticFlows( net )
-    CLI( net )
-    net.stop()
-
-# if the script is run directly (sudo custom/optical.py):
-if __name__ == '__main__':
-    import sys
-    try:
-        n = int( sys.argv[1] )
-    except:
-        print ( 'Usage: ./optical.py n    # n is number of switches\n'
-                'Starting with default of 2 switches...\n' )
-        n = 2
-    setLogLevel( 'info' )
-    run( n )
diff --git a/tools/test/topos/optical2.py b/tools/test/topos/optical2.py
deleted file mode 100755
index b778592..0000000
--- a/tools/test/topos/optical2.py
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/usr/bin/env python
-
-''' file: custom/optical.py '''
-
-from mininet.topo import Topo
-from mininet.net import Mininet
-from mininet.cli import CLI
-from mininet.log import setLogLevel, info
-from mininet.link import Intf, Link
-from mininet.node import RemoteController
-
-class NullIntf( Intf ):
-    "A dummy interface with a blank name that doesn't do any configuration"
-    def __init__( self, name, **params ):
-        self.name = ''
-
-class NullLink( Link ):
-    "A dummy link that doesn't touch either interface"
-    def makeIntfPair( cls, intf1, intf2, *args, **kwargs ):
-        pass
-    def delete( self ):
-        pass
-
-class OpticalTopo(Topo):
-    def addIntf( self, switch, intfName ):
-        "Add intf intfName to switch"
-        self.addLink( switch, switch, cls=NullLink,
-                      intfName1=intfName, cls2=NullIntf )
-    def __init__(self):
-
-        # Initialize topology
-        Topo.__init__(self)
-
-        # Add hosts and switches
-        h1 = self.addHost('h1')
-        h2 = self.addHost('h2')
-        h3 = self.addHost('h3')
-        h4 = self.addHost('h4')
-        h5 = self.addHost('h5')
-        h6 = self.addHost('h6')
-
-        s1 = self.addSwitch('s1', dpid="0000ffffffff0001")
-        s2 = self.addSwitch('s2', dpid="0000ffffffff0002")
-        s3 = self.addSwitch('s3', dpid="0000ffffffff0003")
-        s4 = self.addSwitch('s4', dpid="0000ffffffff0004")
-        s5 = self.addSwitch('s5', dpid="0000ffffffff0005")
-        s6 = self.addSwitch('s6', dpid="0000ffffffff0006")
-
-
-        # Add links from hosts to OVS
-        self.addLink(s1, h1)
-        self.addLink(s2, h2)
-        self.addLink(s3, h3)
-        self.addLink(s4, h4)
-        self.addLink(s5, h5)
-        self.addLink(s6, h6)
-
-        # add links from ovs to linc-oe
-        # sorry about the syntax :(
-        self.addIntf(s1,'tap29')
-        self.addIntf(s2,'tap30')
-        self.addIntf(s3,'tap31')
-        self.addIntf(s4,'tap32')
-        self.addIntf(s5,'tap33')
-        self.addIntf(s6,'tap34')
-
-        # if you use, sudo mn --custom custom/optical.py, then register the topo:
-topos = {'optical': ( lambda: OpticalTopo() )}
-
-
-def run():
-    c = RemoteController('c','127.0.0.1',6653)
-    net = Mininet( topo=OpticalTopo(),controller=None,autoSetMacs=True)
-    net.addController(c)
-    net.start()
-
-    #installStaticFlows( net )
-    CLI( net )
-    net.stop()
-
-# if the script is run directly (sudo custom/optical.py):
-if __name__ == '__main__':
-    setLogLevel('info')
-    run()
