diff --git a/bin/miniccnxedit b/bin/miniccnxedit
index 5ca6191..6ce2845 100755
--- a/bin/miniccnxedit
+++ b/bin/miniccnxedit
@@ -1,10 +1,7 @@
 #!/usr/bin/python
 
 """
-MiniEdit: a simple network editor for Mininet
-
-This is a simple demonstration of how one might build a
-GUI application using Mininet as the network model.
+MiniCCNxEdit: a simple network editor for MiniCCNx
 
 Bob Lantz, April 2010
 Gregory Gee, July 2013
@@ -51,7 +48,7 @@
 from mininet.topo import SingleSwitchTopo, LinearTopo, SingleSwitchReversedTopo
 from mininet.topolib import TreeTopo
 
-print 'MiniEdit running against MiniNet '+VERSION
+print 'MiniCCNxEdit running...' #+VERSION
 MININET_VERSION = re.sub(r'[^\d\.]', '', VERSION)
 if StrictVersion(MININET_VERSION) > StrictVersion('2.0'):
     from mininet.node import IVSSwitch
@@ -300,7 +297,6 @@
                        'vlanInterfaces':vlanInterfaces}
             self.result = results
 
-
 class VerticalScrolledTable(LabelFrame):
     """A pure Tkinter scrollable frame that actually works!
 
@@ -452,96 +448,6 @@
             if (len(self.e6.get()) > 0):
                 self.result['speedup'] = int(self.e6.get())
 
-class ControllerDialog(tkSimpleDialog.Dialog):
-
-        def __init__(self, parent, title, ctrlrDefaults=None):
-
-            if ctrlrDefaults:
-                self.ctrlrValues = ctrlrDefaults
-
-            tkSimpleDialog.Dialog.__init__(self, parent, title)
-
-        def body(self, master):
-
-            self.var = StringVar(master)
-            self.protcolvar = StringVar(master)
-
-            rowCount=0
-            # Field for Hostname
-            Label(master, text="Name:").grid(row=rowCount, sticky=E)
-            self.hostnameEntry = Entry(master)
-            self.hostnameEntry.grid(row=rowCount, column=1)
-            self.hostnameEntry.insert(0, self.ctrlrValues['hostname'])
-            rowCount+=1
-
-            # Field for Remove Controller Port
-            Label(master, text="Controller Port:").grid(row=rowCount, sticky=E)
-            self.e2 = Entry(master)
-            self.e2.grid(row=rowCount, column=1)
-            self.e2.insert(0, self.ctrlrValues['remotePort'])
-            rowCount+=1
-
-            # Field for Controller Type
-            Label(master, text="Controller Type:").grid(row=rowCount, sticky=E)
-            controllerType = self.ctrlrValues['controllerType']
-            self.o1 = OptionMenu(master, self.var, "Remote Controller", "In-Band Controller", "OpenFlow Reference", "OVS Controller")
-            self.o1.grid(row=rowCount, column=1, sticky=W)
-            if controllerType == 'ref':
-                self.var.set("OpenFlow Reference")
-            elif controllerType == 'inband':
-                self.var.set("In-Band Controller")
-            elif controllerType == 'remote':
-                self.var.set("Remote Controller")
-            else:
-                self.var.set("OVS Controller")
-            rowCount+=1
-
-            # Field for Controller Protcol
-            Label(master, text="Protocol:").grid(row=rowCount, sticky=E)
-            if 'controllerProtocol' in self.ctrlrValues:
-               controllerProtocol = self.ctrlrValues['controllerProtocol']
-            else:
-               controllerProtocol = 'tcp'
-            self.protcol = OptionMenu(master, self.protcolvar, "TCP", "SSL")
-            self.protcol.grid(row=rowCount, column=1, sticky=W)
-            if controllerProtocol == 'ssl':
-                self.protcolvar.set("SSL")
-            else:
-                self.protcolvar.set("TCP")
-            rowCount+=1
-
-            # Field for Remove Controller IP
-            remoteFrame= LabelFrame(master, text='Remote/In-Band Controller', padx=5, pady=5)
-            remoteFrame.grid(row=rowCount, column=0, columnspan=2, sticky=W)
-
-            Label(remoteFrame, text="IP Address:").grid(row=0, sticky=E)
-            self.e1 = Entry(remoteFrame)
-            self.e1.grid(row=0, column=1)
-            self.e1.insert(0, self.ctrlrValues['remoteIP'])
-            rowCount+=1
-
-            return self.hostnameEntry # initial focus
-
-        def apply(self):
-            self.result = { 'hostname': self.hostnameEntry.get(),
-                            'remoteIP': self.e1.get(),
-                            'remotePort': int(self.e2.get())}
-
-            controllerType = self.var.get()
-            if controllerType == 'Remote Controller':
-                self.result['controllerType'] = 'remote'
-            elif controllerType == 'In-Band Controller':
-                self.result['controllerType'] = 'inband'
-            elif controllerType == 'OpenFlow Reference':
-                self.result['controllerType'] = 'ref'
-            else:
-                self.result['controllerType'] = 'ovsc'
-            controllerProtocol = self.protcolvar.get()
-            if controllerProtocol == 'SSL':
-                self.result['controllerProtocol'] = 'ssl'
-            else:
-                self.result['controllerProtocol'] = 'tcp'
-
 class ToolTip(object):
 
     def __init__(self, widget):
@@ -581,11 +487,11 @@
 
 class MiniEdit( Frame ):
 
-    "A simple network editor for Mininet."
+    "A simple network editor for MiniCCNx."
 
-    def __init__( self, parent=None, cheight=600, cwidth=1000 ):
+    def __init__( self, parent=None, cheight=600, cwidth=1000, template_file='miniccnx.conf' ):
 
-        self.defaultIpBase='10.0.0.0/8'
+        #self.defaultIpBase='10.0.0.0/8'
 
         self.nflowDefaults = {'nflowTarget':'',
                               'nflowTimeout':'600',
@@ -596,7 +502,7 @@
                               'sflowPolling':'30'}
 
         self.appPrefs={
-            "ipBase": self.defaultIpBase,
+            #"ipBase": self.defaultIpBase,
             "startCLI": "0",
             "terminalType": 'xterm',
             "switchType": 'ovs',
@@ -609,11 +515,12 @@
                                 'ovsOf13':'0'}
 
         }
-
+	
+	self.template_file = template_file
 
         Frame.__init__( self, parent )
         self.action = None
-        self.appName = 'MiniEdit'
+        self.appName = 'MiniccnxEdit'
         self.fixedFont = tkFont.Font ( family="DejaVu Sans Mono", size="14" )
 
         # Style
@@ -672,7 +579,6 @@
         self.focus()
 
 	#Mouse bindings
-
 	self.bind( '<Button-1>', lambda event: self.clearPopups )
 
         self.hostPopup = Menu(self.top, tearoff=0)
@@ -685,6 +591,8 @@
 
         self.linkPopup = Menu(self.top, tearoff=0)
         self.linkPopup.add_command(label='Link Options', font=self.font)
+        #self.linkPopup.add_separator()
+        #self.linkPopup.add_command(label='Properties', font=self.font, command=self.linkDetails )
 
         # Event handling initalization
         self.linkx = self.linky = self.linkItem = None
@@ -716,14 +624,14 @@
         self.top.configure( menu=mbar )
 
 
-        #fileMenu = Menu( mbar, tearoff=False )
-        #mbar.add_cascade( label="File", font=font, menu=fileMenu )
-        #fileMenu.add_command( label="New", font=font, command=self.newTopology )
-        #fileMenu.add_command( label="Open", font=font, command=self.loadTopology )
-        #fileMenu.add_command( label="Save", font=font, command=self.saveTopology )
+        fileMenu = Menu( mbar, tearoff=False )
+        mbar.add_cascade( label="File", font=font, menu=fileMenu )
+        fileMenu.add_command( label="New", font=font, command=self.newTopology )
+        fileMenu.add_command( label="Open", font=font, command=self.loadTopology )
+        fileMenu.add_command( label="Save", font=font, command=self.saveTopology )
         #fileMenu.add_command( label="Export Level 2 Script", font=font, command=self.exportScript )
-        #fileMenu.add_separator()
-        #fileMenu.add_command( label='Quit', command=self.quit, font=font )
+        fileMenu.add_separator()
+        fileMenu.add_command( label='Quit', command=self.quit, font=font )
 
         #editMenu.add_command( label="Preferences", font=font, command=self.prefDetails)
 
@@ -734,20 +642,20 @@
         #fileMenu.add_separator()
         #runMenu.add_command( label='Show OVS Summary', font=font, command=self.ovsShow )
         #runMenu.add_command( label='Root Terminal', font=font, command=self.rootTerminal )
-
-        # Application menu
-        appMenu = Menu( mbar, tearoff=False )
-        mbar.add_cascade( label=self.appName, font=font, menu=appMenu )
-        appMenu.add_command( label='About Mini-CCNx', command=self.about,
-                             font=font)
-        appMenu.add_separator()
-        appMenu.add_command( label='Quit', command=self.quit, font=font )
 	
         editMenu = Menu( mbar, tearoff=False )
         mbar.add_cascade( label="Edit", font=font, menu=editMenu )
         editMenu.add_command( label="Cut", font=font,
                               command=lambda: self.deleteSelection( None ) )
 
+	# Application menu
+        appMenu = Menu( mbar, tearoff=False )
+        mbar.add_cascade( label=self.appName, font=font, menu=appMenu )
+        appMenu.add_command( label='About Mini-CCNx', command=self.about,
+                             font=font)
+        #appMenu.add_separator()
+        #appMenu.add_command( label='Quit', command=self.quit, font=font )
+
     # Canvas - TUDO IGUAL - OK
 
     def createCanvas( self ):
@@ -898,20 +806,34 @@
 
         # switches/routers
         template.write('[routers]\n')
-        for widget in self.widgetToItem:
-            name = widget[ 'text' ]
-            tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-            if 'Switch' in tags:
-                template.write(name + ':\n')
+        for router in self.switchOpts.values():
+	    #print router
+	    hostname=router['hostname']
+	    nodetype=router['switchType']
+	    nodenum=router['nodeNum']
+
+	    template.write(hostname + ':\n')
+
+            #name = widget[ 'text' ]
+            #tags = self.canvas.gettags( self.widgetToItem[ widget ] )
+            #if 'Switch' in tags:
+                #template.write(name + ':\n')
 
         # Make links
         template.write('[links]\n')
         for link in self.links.values():
-             ( src, dst ) = link
+             dst=link['dest']
+	     src=link['src']
+	     linkopts=link['linkOpts']
+	     linktype=link['type']
+	     
+	     #print linkopts
+	     #print linktype
+
              srcName, dstName = src[ 'text' ], dst[ 'text' ]
              template.write(srcName + ':' + dstName + '\n')
 
-        template.close()
+	template.close()
 
     def addNode( self, node, nodeNum, x, y, name=None):
         "Add a new node to our canvas."
@@ -951,7 +873,7 @@
         c = self.canvas
 
         myFormats = [
-            ('Mininet Topology','*.mn'),
+            ('Miniccnx Topology','*.mnccnx'),
             ('All Files','*'),
         ]
         f = tkFileDialog.askopenfile(filetypes=myFormats, mode='rb')
@@ -976,29 +898,6 @@
             if "netflow" not in self.appPrefs:
                 self.appPrefs["netflow"] = self.nflowDefaults
 
-        # Load controllers
-        if ('controllers' in loadedTopology):
-            if (loadedTopology['version'] == '1'):
-                # This is old location of controller info
-                hostname = 'c0'
-                self.controllers = {}
-                self.controllers[hostname] = loadedTopology['controllers']['c0']
-                self.controllers[hostname]['hostname'] = hostname
-                #elf.addNode('Controller', 0, float(30), float(30), name=hostname)
-                icon = self.findWidgetByName(hostname)
-                #con.bind('<Button-3>', self.do_controllerPopup )
-            else:
-                controllers = loadedTopology['controllers']
-                for controller in controllers:
-                    hostname = controller['opts']['hostname']
-                    x = controller['x']
-                    y = controller['y']
-                    self.addNode('Controller', 0, float(x), float(y), name=hostname)
-                    self.controllers[hostname] = controller['opts']
-                    icon = self.findWidgetByName(hostname)
-                    #con.bind('<Button-3>', self.do_controllerPopup )
-
-
         # Load hosts
         hosts = loadedTopology['hosts']
         for host in hosts:
@@ -1032,8 +931,6 @@
         for switch in switches:
             nodeNum = switch['number']
             hostname = 's'+nodeNum
-            if 'controllers' not in switch['opts']:
-                switch['opts']['controllers'] = []
             if 'switchType' not in switch['opts']:
                 switch['opts']['switchType'] = 'default'
             if 'hostname' in switch['opts']:
@@ -1048,6 +945,7 @@
                 self.addNode('LegacyRouter', nodeNum, float(x), float(y), name=hostname)
                 icon = self.findWidgetByName(hostname)
                 icon.bind('<Button-3>', self.do_legacyRouterPopup )
+            self.switchOpts[hostname] = switch['opts']
 
         # Load links
         links = loadedTopology['links']
@@ -1083,12 +981,12 @@
         self.links = {}
         self.hostOpts = {}
         self.switchOpts = {}
-        self.appPrefs["ipBase"]= self.defaultIpBase
+        #self.appPrefs["ipBase"]= self.defaultIpBase
 
     def saveTopology( self ):
         "Save command."
         myFormats = [
-            ('Mininet Topology','*.mn'),
+            ('Miniccnx Topology','*.mnccnx'),
             ('All Files','*'),
         ]
 
@@ -1152,361 +1050,6 @@
             finally:
                 f.close()
 
-    def exportScript( self ):
-        "Export command."
-        myFormats = [
-            ('Mininet Custom Topology','*.py'),
-            ('All Files','*'),
-        ]
-
-        fileName = tkFileDialog.asksaveasfilename(filetypes=myFormats ,title="Export the topology as...")
-        if len(fileName ) > 0:
-            #print "Now saving under %s" % fileName
-            f = open(fileName, 'wb')
-
-            f.write("#!/usr/bin/python\n")
-            f.write("\n")
-            f.write("from mininet.net import Mininet\n")
-            f.write("from mininet.node import Controller, RemoteController, OVSController\n")
-            f.write("from mininet.node import CPULimitedHost, Host, Node\n")
-            f.write("from mininet.node import OVSKernelSwitch, UserSwitch\n")
-            if StrictVersion(MININET_VERSION) > StrictVersion('2.0'):
-                f.write("from mininet.node import IVSSwitch\n")
-            f.write("from mininet.cli import CLI\n")
-            f.write("from mininet.log import setLogLevel, info\n")
-            f.write("from mininet.link import TCLink, Intf\n")
-            f.write("from subprocess import call\n")
-
-            inBandCtrl = False
-            hasLegacySwitch = False
-            for widget in self.widgetToItem:
-                name = widget[ 'text' ]
-                tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-
-                if 'Controller' in tags:
-                    opts = self.controllers[name]
-                    controllerType = opts['controllerType']
-                    if controllerType == 'inband':
-                        inBandCtrl = True
-
-            if inBandCtrl == True:
-                f.write("\n")
-                f.write("class InbandController( RemoteController ):\n")
-                f.write("\n")
-                f.write("    def checkListening( self ):\n")
-                f.write("        \"Overridden to do nothing.\"\n")
-                f.write("        return\n")
-
-            f.write("\n")
-            f.write("def myNetwork():\n")
-            f.write("\n")
-            f.write("    net = Mininet( topo=None,\n")
-            if len(self.appPrefs['dpctl']) > 0:
-                f.write("                   listenPort="+self.appPrefs['dpctl']+",\n")
-            f.write("                   build=False,\n")
-            f.write("                   ipBase='"+self.appPrefs['ipBase']+"')\n")
-            f.write("\n")
-            f.write("    info( '*** Adding controller\\n' )\n")
-            for widget in self.widgetToItem:
-                name = widget[ 'text' ]
-                tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-    
-                if 'Controller' in tags:
-                    opts = self.controllers[name]
-                    controllerType = opts['controllerType']
-                    if 'controllerProtocol' in opts:
-                        controllerProtocol = opts['controllerProtocol']
-                    else:
-                        controllerProtocol = 'tcp'
-                    controllerIP = opts['remoteIP']
-                    controllerPort = opts['remotePort']
-
-    
-                    f.write("    "+name+"=net.addController(name='"+name+"',\n")
-        
-                    if controllerType == 'remote':
-                        f.write("                      controller=RemoteController,\n")
-                        f.write("                      ip='"+controllerIP+"',\n")
-                    elif controllerType == 'inband':
-                        f.write("                      controller=InbandController,\n")
-                        f.write("                      ip='"+controllerIP+"',\n")
-                    elif controllerType == 'ovsc':
-                        f.write("                      controller=OVSController,\n")
-                    else:
-                        f.write("                      controller=Controller,\n")
-        
-                    f.write("                      protocol='"+controllerProtocol+"',\n")
-                    f.write("                      port="+str(controllerPort)+")\n")
-                    f.write("\n")
-
-            # Save Switches and Hosts
-            f.write("    info( '*** Add switches\\n')\n")
-            for widget in self.widgetToItem:
-                name = widget[ 'text' ]
-                tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-                if 'LegacyRouter' in tags:
-                    f.write("    "+name+" = net.addHost('"+name+"', cls=Node, ip='0.0.0.0')\n")
-                    f.write("    "+name+".cmd('sysctl -w net.ipv4.ip_forward=1')\n")
-                if 'LegacySwitch' in tags:
-                    f.write("    "+name+" = net.addSwitch('"+name+"', cls=OVSKernelSwitch, failMode='standalone')\n")
-                if 'Switch' in tags:
-                    opts = self.switchOpts[name]
-                    nodeNum = opts['nodeNum']
-                    f.write("    "+name+" = net.addSwitch('"+name+"'")
-                    if opts['switchType'] == 'default':
-                        if self.appPrefs['switchType'] == 'ivs':
-                            f.write(", cls=IVSSwitch")
-                        elif self.appPrefs['switchType'] == 'user':
-                            f.write(", cls=UserSwitch")
-                        elif self.appPrefs['switchType'] == 'userns':
-                            f.write(", cls=UserSwitch, inNamespace=True")
-                        else:
-                            f.write(", cls=OVSKernelSwitch")
-                    elif opts['switchType'] == 'ivs':
-                        f.write(", cls=IVSSwitch")
-                    elif opts['switchType'] == 'user':
-                        f.write(", cls=UserSwitch")
-                    elif opts['switchType'] == 'userns':
-                        f.write(", cls=UserSwitch, inNamespace=True")
-                    else:
-                        f.write(", cls=OVSKernelSwitch")
-                    if 'dpctl' in opts:
-                        f.write(", listenPort="+opts['dpctl'])
-                    if 'dpid' in opts:
-                        f.write(", dpid='"+opts['dpid']+"'")
-                    f.write(")\n")
-                    if ('externalInterfaces' in opts):
-                        for extInterface in opts['externalInterfaces']:
-                            f.write("    Intf( '"+extInterface+"', node="+name+" )\n")
-
-            f.write("\n")
-            f.write("    info( '*** Add hosts\\n')\n")
-            for widget in self.widgetToItem:
-                name = widget[ 'text' ]
-                tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-                if 'Host' in tags:
-                    opts = self.hostOpts[name]
-                    ip = None
-                    defaultRoute = None
-                    if 'defaultRoute' in opts and len(opts['defaultRoute']) > 0:
-                        defaultRoute = "'via "+opts['defaultRoute']+"'"
-                    else:
-                        defaultRoute = 'None'
-                    if 'ip' in opts and len(opts['ip']) > 0:
-                        ip = opts['ip']
-                    else:
-                        nodeNum = self.hostOpts[name]['nodeNum']
-                        ipBaseNum, prefixLen = netParse( self.appPrefs['ipBase'] )
-                        ip = ipAdd(i=nodeNum, prefixLen=prefixLen, ipBaseNum=ipBaseNum)
-
-                    if 'cores' in opts or 'cpu' in opts:
-                        f.write("    "+name+" = net.addHost('"+name+"', cls=CPULimitedHost, ip='"+ip+"', defaultRoute="+defaultRoute+")\n")
-                        if 'cores' in opts:
-                            f.write("    "+name+".setCPUs(cores='"+opts['cores']+"')\n")
-                        if 'cpu' in opts:
-                            f.write("    "+name+".setCPUFrac(f="+str(opts['cpu'])+", sched='"+opts['sched']+"')\n")
-                    else:
-                        f.write("    "+name+" = net.addHost('"+name+"', cls=Host, ip='"+ip+"', defaultRoute="+defaultRoute+")\n")
-                    if ('externalInterfaces' in opts):
-                        for extInterface in opts['externalInterfaces']:
-                            f.write("    Intf( '"+extInterface+"', node="+name+" )\n")
-            f.write("\n")
-
-            # Save Links
-            f.write("    info( '*** Add links\\n')\n")
-            for key,linkDetail in self.links.iteritems():
-              tags = self.canvas.gettags(key)
-              if 'data' in tags:
-                optsExist = False
-                src = linkDetail['src']
-                dst = linkDetail['dest']
-                linkopts = linkDetail['linkOpts']
-                srcName, dstName = src[ 'text' ], dst[ 'text' ]
-                bw = ''
-                delay = ''
-                loss = ''
-                max_queue_size = ''
-                linkOpts = "{"
-                if 'bw' in linkopts:
-                    bw =  linkopts['bw']
-                    linkOpts = linkOpts + "'bw':"+str(bw)
-                    optsExist = True
-                if 'delay' in linkopts:
-                    delay =  linkopts['delay']
-                    if optsExist:
-                        linkOpts = linkOpts + ","
-                    linkOpts = linkOpts + "'delay':'"+linkopts['delay']+"'"
-                    optsExist = True
-                if 'loss' in linkopts:
-                    if optsExist:
-                        linkOpts = linkOpts + ","
-                    linkOpts = linkOpts + "'loss':"+str(linkopts['loss'])
-                    optsExist = True
-                if 'max_queue_size' in linkopts:
-                    if optsExist:
-                        linkOpts = linkOpts + ","
-                    linkOpts = linkOpts + "'max_queue_size':"+str(linkopts['max_queue_size'])
-                    optsExist = True
-                if 'jitter' in linkopts:
-                    if optsExist:
-                        linkOpts = linkOpts + ","
-                    linkOpts = linkOpts + "'jitter':'"+linkopts['jitter']+"'"
-                    optsExist = True
-                if 'speedup' in linkopts:
-                    if optsExist:
-                        linkOpts = linkOpts + ","
-                    linkOpts = linkOpts + "'speedup':"+str(linkopts['speedup'])
-                    optsExist = True
-
-                linkOpts = linkOpts + "}"
-                if optsExist:
-                    f.write("    "+srcName+dstName+" = "+linkOpts+"\n")
-                f.write("    net.addLink("+srcName+", "+dstName)
-                if optsExist:
-                    f.write(", cls=TCLink , **"+srcName+dstName)
-                f.write(")\n")
-
-            f.write("\n")
-            f.write("    info( '*** Starting network\\n')\n")
-            f.write("    net.build()\n")
-
-            f.write("    info( '*** Starting controllers\\n')\n")
-            f.write("    for controller in net.controllers:\n")
-            f.write("        controller.start()\n")
-            f.write("\n")
-
-            f.write("    info( '*** Starting switches\\n')\n")
-            for widget in self.widgetToItem:
-                name = widget[ 'text' ]
-                tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-                if 'Switch' in tags or 'LegacySwitch' in tags:
-                    opts = self.switchOpts[name]
-                    ctrlList = ",".join(opts['controllers'])
-                    f.write("    net.get('"+name+"').start(["+ctrlList+"])\n")
-
-            f.write("\n")
-
-            f.write("    info( '*** Post configure switches and hosts\\n')\n")
-            for widget in self.widgetToItem:
-                name = widget[ 'text' ]
-                tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-                if 'Switch' in tags:
-                    opts = self.switchOpts[name]
-                    if opts['switchType'] == 'default':
-                        if self.appPrefs['switchType'] == 'user':
-                            if ('switchIP' in opts):
-                                if (len(opts['switchIP'])>0):
-                                    f.write("    "+name+".cmd('ifconfig "+name+" "+opts['switchIP']+"')\n")
-                        elif self.appPrefs['switchType'] == 'userns':
-                            if ('switchIP' in opts):
-                                if (len(opts['switchIP'])>0):
-                                    f.write("    "+name+".cmd('ifconfig lo "+opts['switchIP']+"')\n")
-                        elif self.appPrefs['switchType'] == 'ovs':
-                            if ('switchIP' in opts):
-                                if (len(opts['switchIP'])>0):
-                                    f.write("    "+name+".cmd('ifconfig "+name+" "+opts['switchIP']+"')\n")
-                    elif opts['switchType'] == 'user':
-                        if ('switchIP' in opts):
-                            if (len(opts['switchIP'])>0):
-                                f.write("    "+name+".cmd('ifconfig "+name+" "+opts['switchIP']+"')\n")
-                    elif opts['switchType'] == 'userns':
-                        if ('switchIP' in opts):
-                            if (len(opts['switchIP'])>0):
-                                f.write("    "+name+".cmd('ifconfig lo "+opts['switchIP']+"')\n")
-                    elif opts['switchType'] == 'ovs':
-                        if ('switchIP' in opts):
-                            if (len(opts['switchIP'])>0):
-                                f.write("    "+name+".cmd('ifconfig "+name+" "+opts['switchIP']+"')\n")
-            for widget in self.widgetToItem:
-                name = widget[ 'text' ]
-                tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-                if 'Host' in tags:
-                    opts = self.hostOpts[name]
-                    # Attach vlan interfaces
-                    if ('vlanInterfaces' in opts):
-                        for vlanInterface in opts['vlanInterfaces']:
-                            f.write("    "+name+".cmd('vconfig add "+name+"-eth0 "+vlanInterface[1]+"')\n")
-                            f.write("    "+name+".cmd('ifconfig "+name+"-eth0."+vlanInterface[1]+" "+vlanInterface[0]+"')\n")
-                    # Run User Defined Start Command
-                    if ('startCommand' in opts):
-                        f.write("    "+name+".cmdPrint('"+opts['startCommand']+"')\n")
-                if 'Switch' in tags:
-                    opts = self.switchOpts[name]
-                    # Run User Defined Start Command
-                    if ('startCommand' in opts):
-                        f.write("    "+name+".cmdPrint('"+opts['startCommand']+"')\n")
-
-            # Configure NetFlow
-            nflowValues = self.appPrefs['netflow']
-            if len(nflowValues['nflowTarget']) > 0:
-                nflowEnabled = False
-                nflowSwitches = ''
-                for widget in self.widgetToItem:
-                    name = widget[ 'text' ]
-                    tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-    
-                    if 'Switch' in tags:
-                        opts = self.switchOpts[name]
-                        if 'netflow' in opts:
-                            if opts['netflow'] == '1':
-                                nflowSwitches = nflowSwitches+' -- set Bridge '+name+' netflow=@MiniEditNF'
-                                nflowEnabled=True
-                if nflowEnabled:
-                    nflowCmd = 'ovs-vsctl -- --id=@MiniEditNF create NetFlow '+ 'target=\\\"'+nflowValues['nflowTarget']+'\\\" '+ 'active-timeout='+nflowValues['nflowTimeout']
-                    if nflowValues['nflowAddId'] == '1':
-                        nflowCmd = nflowCmd + ' add_id_to_interface=true'
-                    else:
-                        nflowCmd = nflowCmd + ' add_id_to_interface=false'
-                    f.write("    \n")
-                    f.write("    call('"+nflowCmd+nflowSwitches+"', shell=True)\n")
-
-            # Configure sFlow
-            sflowValues = self.appPrefs['sflow']
-            if len(sflowValues['sflowTarget']) > 0:
-                sflowEnabled = False
-                sflowSwitches = ''
-                for widget in self.widgetToItem:
-                    name = widget[ 'text' ]
-                    tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-    
-                    if 'Switch' in tags:
-                        opts = self.switchOpts[name]
-                        if 'sflow' in opts:
-                            if opts['sflow'] == '1':
-                                sflowSwitches = sflowSwitches+' -- set Bridge '+name+' sflow=@MiniEditSF'
-                                sflowEnabled=True
-                if sflowEnabled:
-                    sflowCmd = 'ovs-vsctl -- --id=@MiniEditSF create sFlow '+ 'target=\\\"'+sflowValues['sflowTarget']+'\\\" '+ 'header='+sflowValues['sflowHeader']+' '+ 'sampling='+sflowValues['sflowSampling']+' '+ 'polling='+sflowValues['sflowPolling']
-                    f.write("    \n")
-                    f.write("    call('"+sflowCmd+sflowSwitches+"', shell=True)\n")
-
-            f.write("\n")
-            f.write("    CLI(net)\n")
-            for widget in self.widgetToItem:
-                name = widget[ 'text' ]
-                tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-                if 'Host' in tags:
-                    opts = self.hostOpts[name]
-                    # Run User Defined Stop Command
-                    if ('stopCommand' in opts):
-                        f.write("    "+name+".cmdPrint('"+opts['stopCommand']+"')\n")
-                if 'Switch' in tags:
-                    opts = self.switchOpts[name]
-                    # Run User Defined Stop Command
-                    if ('stopCommand' in opts):
-                        f.write("    "+name+".cmdPrint('"+opts['stopCommand']+"')\n")
-
-            f.write("    net.stop()\n")
-            f.write("\n")
-            f.write("if __name__ == '__main__':\n")
-            f.write("    setLogLevel( 'info' )\n")
-            f.write("    myNetwork()\n")
-            f.write("\n")
-
-
-            f.close()
-
-
     # Generic canvas handler
     #
     # We could have used bindtags, as in nodeIcon, but
@@ -1625,16 +1168,6 @@
             self.hostOpts[name] = {'sched':'host'}
             self.hostOpts[name]['nodeNum']=self.hostCount
             self.hostOpts[name]['hostname']=name
-        if 'Controller' == node:
-            name = self.nodePrefixes[ node ] + str( self.controllerCount )
-            ctrlr = { 'controllerType': 'ref',
-                      'hostname': name,
-                      'controllerProtocol': 'tcp',
-                      'remoteIP': '127.0.0.1',
-                      'remotePort': 6633}
-            self.controllers[name] = ctrlr
-            # We want to start controller count at 0
-            self.controllerCount += 1
 
         icon = self.nodeIcon( node, name )
         item = self.canvas.create_window( x, y, anchor='c', window=icon,
@@ -1648,10 +1181,6 @@
         if 'Host' == node:
             icon.bind('<Button-3>', self.do_hostPopup )
 
-    def clickController( self, event ):
-        "Add a new Controller to our canvas."
-        self.newNode( 'Controller', event )
-
     def clickHost( self, event ):
         "Add a new host to our canvas."
         self.newNode( 'Host', event )
@@ -1660,14 +1189,6 @@
         "Add a new switch to our canvas."
         self.newNode( 'LegacyRouter', event )
 
-    def clickLegacySwitch( self, event ):
-        "Add a new switch to our canvas."
-        self.newNode( 'LegacySwitch', event )
-
-    def clickSwitch( self, event ):
-        "Add a new switch to our canvas."
-        self.newNode( 'Switch', event )
-
     def dragNetLink( self, event ):
         "Drag a link's endpoint to another node."
         if self.link is None:
@@ -1808,7 +1329,6 @@
         self.canvas.tag_bind( self.link, '<ButtonPress-1>', select )
         self.canvas.tag_bind( self.link, '<Button-3>', self.do_linkPopup )
 
-
     def startLink( self, event ):
         "Start a new link."
         if event.widget not in self.widgetToItem:
@@ -1824,7 +1344,6 @@
         self.linkWidget = w
         self.linkItem = item
 
-
     def finishLink( self, event ):
         "Finish creating a link"
         if self.link is None:
@@ -1842,43 +1361,20 @@
         # For now, don't allow hosts to be directly linked
         stags = self.canvas.gettags( self.widgetToItem[ source ] )
         dtags = self.canvas.gettags( target )
-        if (('Host' in stags and 'Host' in dtags) or
-           ('Controller' in dtags and 'LegacyRouter' in stags) or
-           ('Controller' in stags and 'LegacyRouter' in dtags) or
-           ('Controller' in dtags and 'LegacySwitch' in stags) or
-           ('Controller' in stags and 'LegacySwitch' in dtags) or
-           ('Controller' in dtags and 'Host' in stags) or
-           ('Controller' in stags and 'Host' in dtags) or
-           ('Controller' in stags and 'Controller' in dtags)):
+        if (('Host' in stags and 'Host' in dtags)):
             self.releaseNetLink( event )
             return
 
         # Set link type
         linkType='data'
-        if 'Controller' in stags or 'Controller' in dtags:
-            linkType='control'
-            c.itemconfig(self.link, dash=(6, 4, 2, 4), fill='red')
-            self.createControlLinkBindings()
-        else:
-            linkType='data'
-            self.createDataLinkBindings()
+	
+	self.createDataLinkBindings()
         c.itemconfig(self.link, tags=c.gettags(self.link)+(linkType,))
 
         x, y = c.coords( target )
         c.coords( self.link, self.linkx, self.linky, x, y )
         self.addLink( source, dest, linktype=linkType )
-        if linkType == 'control':
-            controllerName = ''
-            switchName = ''
-            if 'Controller' in stags:
-                controllerName = source[ 'text' ]
-                switchName = dest[ 'text' ]
-            else:
-                controllerName = dest[ 'text' ]
-                switchName = source[ 'text' ]
-
-            self.switchOpts[switchName]['controllers'].append(controllerName)
-
+        
         # We're done
         self.link = self.linkWidget = None
 
@@ -1891,7 +1387,7 @@
             bg = 'white'
             about = Toplevel( bg='white' )
             about.title( 'About' )
-            info = self.appName + ': a simple network editor for MiniNet'
+            info = self.appName + ': a simple network editor for MiniCCNx'
             version = 'MiniEdit '+MINIEDIT_VERSION
             author = 'Originally by: Bob Lantz <rlantz@cs>, April 2010'
             enhancements = 'Enhancements by: Gregory Gee, Since July 2013'
@@ -1973,44 +1469,6 @@
             self.hostOpts[name] = newHostOpts
             print 'New host details for ' + name + ' = ' + str(newHostOpts)
 
-    def switchDetails( self, _ignore=None ):
-        if ( self.selection is None or
-             self.net is not None or
-             self.selection not in self.itemToWidget ):
-            return
-        widget = self.itemToWidget[ self.selection ]
-        name = widget[ 'text' ]
-        tags = self.canvas.gettags( self.selection )
-        if 'Switch' not in tags:
-            return
-
-        prefDefaults = self.switchOpts[name]
-        switchBox = SwitchDialog(self, title='Switch Details', prefDefaults=prefDefaults)
-        self.master.wait_window(switchBox.top)
-        if switchBox.result:
-            newSwitchOpts = {'nodeNum':self.switchOpts[name]['nodeNum']}
-            newSwitchOpts['switchType'] = switchBox.result['switchType']
-            newSwitchOpts['controllers'] = self.switchOpts[name]['controllers']
-            if len(switchBox.result['startCommand']) > 0:
-                newSwitchOpts['startCommand'] = switchBox.result['startCommand']
-            if len(switchBox.result['stopCommand']) > 0:
-                newSwitchOpts['stopCommand'] = switchBox.result['stopCommand']
-            if len(switchBox.result['dpctl']) > 0:
-                newSwitchOpts['dpctl'] = switchBox.result['dpctl']
-            if len(switchBox.result['dpid']) > 0:
-                newSwitchOpts['dpid'] = switchBox.result['dpid']
-            if len(switchBox.result['hostname']) > 0:
-                newSwitchOpts['hostname'] = switchBox.result['hostname']
-                name = switchBox.result['hostname']
-                widget[ 'text' ] = name
-            if len(switchBox.result['externalInterfaces']) > 0:
-                newSwitchOpts['externalInterfaces'] = switchBox.result['externalInterfaces']
-            newSwitchOpts['switchIP'] = switchBox.result['switchIP']
-            newSwitchOpts['sflow'] = switchBox.result['sflow']
-            newSwitchOpts['netflow'] = switchBox.result['netflow']
-            self.switchOpts[name] = newSwitchOpts
-            print 'New switch details for ' + name + ' = ' + str(newSwitchOpts)
-
     def linkUp( self ):
         if ( self.selection is None or
              self.net is None):
@@ -2057,41 +1515,6 @@
         if prefBox.result:
             self.appPrefs = prefBox.result
 
-
-    def controllerDetails( self ):
-        if ( self.selection is None or
-             self.net is not None or
-             self.selection not in self.itemToWidget ):
-            return
-        widget = self.itemToWidget[ self.selection ]
-        name = widget[ 'text' ]
-        tags = self.canvas.gettags( self.selection )
-        oldName = name
-        if 'Controller' not in tags:
-            return
-
-        ctrlrBox = ControllerDialog(self, title='Controller Details', ctrlrDefaults=self.controllers[name])
-        if ctrlrBox.result:
-            #print 'Controller is ' + ctrlrBox.result[0]
-            if len(ctrlrBox.result['hostname']) > 0:
-                name = ctrlrBox.result['hostname']
-                widget[ 'text' ] = name
-            else:
-                ctrlrBox.result['hostname'] = name
-            self.controllers[name] = ctrlrBox.result
-            print 'New controller details for ' + name + ' = ' + str(self.controllers[name])
-            # Find references to controller and change name
-            if oldName != name:
-                for widget in self.widgetToItem:
-                    switchName = widget[ 'text' ]
-                    tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-                    if 'Switch' in tags:
-                        switch = self.switchOpts[switchName]
-                        if oldName in switch['controllers']:
-                            switch['controllers'].remove(oldName)
-                            switch['controllers'].append(name)
-
-
     def listBridge( self, _ignore=None ):
         if ( self.selection is None or
              self.net is None or
@@ -2159,14 +1582,6 @@
 
         widget = self.itemToWidget[ item ]
         tags = self.canvas.gettags(item)
-        if 'Controller' in tags:
-            # remove from switch controller lists
-            for serachwidget in self.widgetToItem:
-                name = serachwidget[ 'text' ]
-                tags = self.canvas.gettags( self.widgetToItem[ serachwidget ] )
-                if 'Switch' in tags:
-                    if widget['text'] in self.switchOpts[name]['controllers']:
-                        self.switchOpts[name]['controllers'].remove(widget['text'])
             
         for link in widget.links.values():
             # Delete from view and model
@@ -2182,71 +1597,7 @@
             tags = self.canvas.gettags( self.widgetToItem[ widget ] )
             #print name+' has '+str(tags)
 
-            if 'Switch' in tags:
-                opts = self.switchOpts[name]
-                #print str(opts)
-
-                # Create the correct switch class
-                switchClass = customOvs
-                switchParms={}
-                if 'dpctl' in opts:
-                    switchParms['listenPort']=int(opts['dpctl'])
-                if 'dpid' in opts:
-                    switchParms['dpid']=opts['dpid']
-                if opts['switchType'] == 'default':
-                    if self.appPrefs['switchType'] == 'ivs':
-                        switchClass = IVSSwitch
-                    elif self.appPrefs['switchType'] == 'user':
-                        switchClass = CustomUserSwitch
-                    elif self.appPrefs['switchType'] == 'userns':
-                        switchParms['inNamespace'] = True
-                        switchClass = CustomUserSwitch
-                    else:
-                        switchClass = customOvs
-                elif opts['switchType'] == 'user':
-                    switchClass = CustomUserSwitch
-                elif opts['switchType'] == 'userns':
-                    switchClass = CustomUserSwitch
-                    switchParms['inNamespace'] = True
-                elif opts['switchType'] == 'ivs':
-                    switchClass = IVSSwitch
-                else:
-                    switchClass = customOvs
-
-                if switchClass == customOvs:
-                    # Set OpenFlow versions
-                    self.openFlowVersions = []
-                    if self.appPrefs['openFlowVersions']['ovsOf10'] == '1':
-                        self.openFlowVersions.append('OpenFlow10')
-                    if self.appPrefs['openFlowVersions']['ovsOf11'] == '1':
-                        self.openFlowVersions.append('OpenFlow11')
-                    if self.appPrefs['openFlowVersions']['ovsOf12'] == '1':
-                        self.openFlowVersions.append('OpenFlow12')
-                    if self.appPrefs['openFlowVersions']['ovsOf13'] == '1':
-                        self.openFlowVersions.append('OpenFlow13')
-                    protoList = ",".join(self.openFlowVersions)
-                    switchParms['protocols'] = protoList
-                newSwitch = net.addSwitch( name , cls=switchClass, **switchParms)
-
-                # Some post startup config
-                if switchClass == CustomUserSwitch:
-                    if ('switchIP' in opts):
-                        if (len(opts['switchIP']) > 0):
-                            newSwitch.setSwitchIP(opts['switchIP'])
-                if switchClass == customOvs:
-                    if ('switchIP' in opts):
-                        if (len(opts['switchIP']) > 0):
-                            newSwitch.setSwitchIP(opts['switchIP'])
-
-                # Attach external interfaces
-                if ('externalInterfaces' in opts):
-                    for extInterface in opts['externalInterfaces']:
-                        if self.checkIntf(extInterface):
-                           Intf( extInterface, node=newSwitch )
-
-            elif 'LegacySwitch' in tags:
-                newSwitch = net.addSwitch( name , cls=LegacySwitch)
-            elif 'LegacyRouter' in tags:
+            if 'LegacyRouter' in tags:
                 newSwitch = net.addHost( name , cls=LegacyRouter)
             elif 'Host' in tags:
                 opts = self.hostOpts[name]
@@ -2259,8 +1610,8 @@
                     ip = opts['ip']
                 else:
                     nodeNum = self.hostOpts[name]['nodeNum']
-                    ipBaseNum, prefixLen = netParse( self.appPrefs['ipBase'] )
-                    ip = ipAdd(i=nodeNum, prefixLen=prefixLen, ipBaseNum=ipBaseNum)
+                    #ipBaseNum, prefixLen = netParse( self.appPrefs['ipBase'] )
+                    #ip = ipAdd(i=nodeNum, prefixLen=prefixLen, ipBaseNum=ipBaseNum)
 
                 # Create the correct host class
                 if 'cores' in opts or 'cpu' in opts:
@@ -2298,44 +1649,6 @@
                         print 'Checking that OS is VLAN prepared'
                         self.pathCheck('vconfig', moduleName='vlan package')
                         moduleDeps( add='8021q' )
-            elif 'Controller' in tags:
-                opts = self.controllers[name]
-
-                # Get controller info from panel
-                controllerType = opts['controllerType']
-                if 'controllerProtocol' in opts:
-                    controllerProtocol = opts['controllerProtocol']
-                else:
-                    controllerProtocol = 'tcp'
-                    opts['controllerProtocol'] = 'tcp'
-                controllerIP = opts['remoteIP']
-                controllerPort = opts['remotePort']
-
-                # Make controller
-                print 'Getting controller selection:'+controllerType
-                if controllerType == 'remote':
-                    net.addController(name=name,
-                                      controller=RemoteController,
-                                      ip=controllerIP,
-                                      protocol=controllerProtocol,
-                                      port=controllerPort)
-                elif controllerType == 'inband':
-                    net.addController(name=name,
-                                      controller=InbandController,
-                                      ip=controllerIP,
-                                      protocol=controllerProtocol,
-                                      port=controllerPort)
-                elif controllerType == 'ovsc':
-                    net.addController(name=name,
-                                      controller=OVSController,
-                                      protocol=controllerProtocol,
-                                      port=controllerPort)
-                else:
-                    net.addController(name=name,
-                                      controller=Controller,
-                                      protocol=controllerProtocol,
-                                      port=controllerPort)
-
             else:
                 raise Exception( "Cannot create mystery node: " + name )
 
@@ -2377,8 +1690,8 @@
             dpctl = int(self.appPrefs['dpctl'])
         net = Mininet( topo=None,
                        listenPort=dpctl,
-                       build=False,
-                       ipBase=self.appPrefs['ipBase'] )
+                       build=False)
+                       #ipBase=self.appPrefs['ipBase'] )
 
         self.buildNodes(net)
         self.buildLinks(net)
@@ -2406,13 +1719,6 @@
                 # Run User Defined Start Command
                 if ('startCommand' in opts):
                     newHost.cmdPrint(opts['startCommand'])
-            if 'Switch' in tags:
-                newNode = self.net.get(name)
-                opts = self.switchOpts[name]
-                # Run User Defined Start Command
-                if ('startCommand' in opts):
-                    newNode.cmdPrint(opts['startCommand'])
-
 
         # Configure NetFlow
         nflowValues = self.appPrefs['netflow']
@@ -2481,34 +1787,9 @@
         if self.net is None:
             self.net = self.build()
 
-            # Since I am going to inject per switch controllers.
-            # I can't call net.start().  I have to replicate what it
-            # does and add the controller options.
-            #self.net.start()
-            info( '**** Starting %s controllers\n' % len( self.net.controllers ) )
-            for controller in self.net.controllers:
-                info( str(controller) + ' ')
-                controller.start()
-            info('\n')
-            info( '**** Starting %s switches\n' % len( self.net.switches ) )
-            #for switch in self.net.switches:
-            #    info( switch.name + ' ')
-            #    switch.start( self.net.controllers )
             for widget in self.widgetToItem:
                 name = widget[ 'text' ]
                 tags = self.canvas.gettags( self.widgetToItem[ widget ] )
-                if 'Switch' in tags:
-                    opts = self.switchOpts[name]
-                    switchControllers = []
-                    for ctrl in opts['controllers']:
-                        switchControllers.append(self.net.get(ctrl))
-                    info( name + ' ')
-                    # Figure out what controllers will manage this switch
-                    self.net.get(name).start( switchControllers )
-                if 'LegacySwitch' in tags:
-                    self.net.get(name).start( [] )
-                    info( name + ' ')
-            info('\n')
 
             self.postStartSetup()
 
@@ -2525,12 +1806,6 @@
                     # Run User Defined Stop Command
                     if ('stopCommand' in opts):
                         newHost.cmdPrint(opts['stopCommand'])
-                if 'Switch' in tags:
-                    newNode = self.net.get(name)
-                    opts = self.switchOpts[name]
-                    # Run User Defined Stop Command
-                    if ('stopCommand' in opts):
-                        newNode.cmdPrint(opts['stopCommand'])
 
             self.net.stop()
         cleanUpScreens()
@@ -2544,12 +1819,6 @@
             finally:
                 # make sure to release the grab (Tk 8.0a1 only)
                 self.linkPopup.grab_release()
-        else:
-            try:
-                self.linkPopup.tk_popup(event.x_root, event.y_root)
-            finally:
-                # make sure to release the grab (Tk 8.0a1 only)
-                self.linkPopup.grab_release()
 
     def do_legacyRouterPopup(self, event):
         # display the popup menu
@@ -2562,13 +1831,13 @@
 
     def do_hostPopup(self, event):
         # display the popup menu
-
-        try:
-            self.hostPopup.tk_popup(event.x_root, event.y_root)
-	    isHostPopup = True
-        finally:
-                # make sure to release the grab (Tk 8.0a1 only)
-            self.hostPopup.grab_release()
+        if ( self.net is None ):
+		try:
+		    self.hostPopup.tk_popup(event.x_root, event.y_root)
+		    isHostPopup = True
+		finally:
+		    # make sure to release the grab (Tk 8.0a1 only)
+		    self.hostPopup.grab_release()
 
     def xterm( self, _ignore=None ):
         "Make an xterm when a button is pressed."
@@ -2610,12 +1879,13 @@
             else:
                 raise Exception( 'Custom file name not found' )
 
-        desc = ( "The %prog utility creates Mininet network from the\n"
+        desc = ( "The %prog utility creates Miniccnx network from the\n"
                  "command line. It can create parametrized topologies,\n"
-                 "invoke the Mininet CLI, and run tests." )
+                 "invoke the Miniccnx CLI, and run tests." )
 
-        usage = ( '%prog [options]\n'
-                  '(type %prog -h for details)' )
+        usage = ( '%prog [options] [template_file]\n'
+		  '\nIf no template_file is given, generated template will be written to the file miniccnx.conf in the current directory.\n'
+                  'Type %prog -h for details)' )
 
         opts = OptionParser( description=desc, usage=usage )
 
@@ -2629,8 +1899,11 @@
         self.options, self.args = opts.parse_args()
         # We don't accept extra arguments after the options
         if self.args:
-            opts.print_help()
-            exit()
+	     if len(self.args) > 1:
+	     	opts.print_help()
+             	exit()
+	     else:
+	     	self.template_file=self.args[0]
 
     def setCustom( self, name, value ):
         "Set custom parameters for MininetRunner."
@@ -2669,26 +1942,6 @@
         rowIncrement = 100
         currentY = 100
 
-        # Add Controllers
-        print 'controllers:'+str(len(importNet.controllers))
-        for controller in importNet.controllers:
-            name = controller.name
-            x = self.controllerCount*100+100
-            self.addNode('Controller', self.controllerCount,
-                 float(x), float(currentY), name=name)
-            icon = self.findWidgetByName(name)
-           #icon.bind('<Button-3>', self.do_controllerPopup )
-            ctrlr = { 'controllerType': 'ref',
-                      'hostname': name,
-                      'controllerProtocol': controller.protocol,
-                      'remoteIP': controller.ip,
-                      'remotePort': controller.port}
-            self.controllers[name] = ctrlr
-
-
-
-        currentY = currentY + rowIncrement
-
         # Add switches
         print 'switches:'+str(len(importNet.switches))
         columnCount = 0
@@ -2705,30 +1958,13 @@
                  float(x), float(currentY), name=name)
             icon = self.findWidgetByName(name)
             icon.bind('<Button-3>', self.do_switchPopup )
-            # Now link to controllers
-            for controller in importNet.controllers:
-                self.switchOpts[name]['controllers'].append(controller.name)
-                dest = self.findWidgetByName(controller.name)
-                dx, dy = c.coords( self.widgetToItem[ dest ] )
-                self.link = c.create_line(float(x),
-                                          float(currentY),
-                                          dx,
-                                          dy,
-                                          width=4,
-                                          fill='red',
-                                          dash=(6, 4, 2, 4),
-                                          tag='link' )
-                c.itemconfig(self.link, tags=c.gettags(self.link)+('control',))
-                self.addLink( icon, dest, linktype='control' )
-                self.createControlLinkBindings()
-                self.link = self.linkWidget = None
+
             if columnCount == 9:
                 columnCount = 0
                 currentY = currentY + rowIncrement
             else:
                 columnCount =columnCount+1
 
-
         currentY = currentY + rowIncrement
         # Add hosts
         print 'hosts:'+str(len(importNet.hosts))
