diff --git a/bin/mn b/bin/mn
index edd4d98423263ae1e8ca4955504ba83a180bac11..fbe1f05bbfb08888e5069eeb65ba754a9867f504 100755
--- a/bin/mn
+++ b/bin/mn
@@ -281,7 +281,6 @@ class MininetRunner( object ):
         if self.options.post:
             CLI( mn, script=self.options.post )
 
-        mn.stop()
 
         elapsed = float( time.time() - start )
         info( 'completed in %0.3f seconds\n' % elapsed )
diff --git a/mininet/link.py b/mininet/link.py
index be73d52155a6042154a8960856878daeeb068a0d..3e325380ef2779abef042dd8e47a2c02a2687ebe 100644
--- a/mininet/link.py
+++ b/mininet/link.py
@@ -86,6 +86,7 @@ def updateIP( self ):
 
     def updateMAC( self ):
         "Return updated MAC address based on ifconfig"
+        #heres where we send the unecessary ifconfigs
         ifconfig = self.ifconfig()
         macs = self._macMatchRegex.findall( ifconfig )
         self.mac = macs[ 0 ] if macs else None
@@ -102,8 +103,13 @@ def MAC( self ):
     def isUp( self, setUp=False ):
         "Return whether interface is up"
         if setUp:
-            self.ifconfig( 'up' )
-        return "UP" in self.ifconfig()
+            r = self.ifconfig( 'up' )
+            if r:
+                return False
+            else:
+                return True
+        else:
+            return "UP" in self.ifconfig()
 
     def rename( self, newname ):
         "Rename interface"
@@ -138,6 +144,16 @@ def setParam( self, results, method, **param ):
         results[ name ] = result
         return result
 
+    def updateAddr( self ):
+        "instead of updating ip and mac separately, use one ifconfig call to do it simultaneously"
+        ifconfig = self.ifconfig()
+        print ifconfig
+        ips = self._ipMatchRegex.findall( ifconfig )
+        macs = self._macMatchRegex.findall( ifconfig )
+        self.ip = ips[ 0 ] if ips else None
+        self.mac = macs[ 0 ] if macs else None
+        return self.ip, self.mac
+
     def config( self, mac=None, ip=None, ifconfig=None,
                 up=True, **_params ):
         """Configure Node according to (optional) parameters:
@@ -154,8 +170,10 @@ def config( self, mac=None, ip=None, ifconfig=None,
         self.setParam( r, 'setIP', ip=ip )
         self.setParam( r, 'isUp', up=up )
         self.setParam( r, 'ifconfig', ifconfig=ifconfig )
-        self.updateIP()
-        self.updateMAC()
+        #should combine these next two operations into one. this is unecessary
+        #self.updateAddr()
+        #self.updateIP()
+        #self.updateMAC()
         return r
 
     def delete( self ):
diff --git a/mininet/net.py b/mininet/net.py
index 80654f5c37583cd341da02fb25375e6bb3c23f45..4224b974dacef4b24a20cb77f99a5cc09f1e9685 100755
--- a/mininet/net.py
+++ b/mininet/net.py
@@ -101,6 +101,7 @@
 from mininet.util import quietRun, fixLimits, numCores, ensureRoot
 from mininet.util import macColonHex, ipStr, ipParse, netParse, ipAdd
 from mininet.term import cleanUpScreens, makeTerms
+from multiprocessing.pool import ThreadPool
 
 # Mininet version: should be consistent with README and LICENSE
 VERSION = "2.1.0+"
@@ -159,6 +160,8 @@ def __init__( self, topo=None, switch=OVSKernelSwitch, host=Host,
 
         self.terms = []  # list of spawned xterm processes
 
+        self.pool = ThreadPool( 64 )
+
         Mininet.init()  # Initialize Mininet if necessary
 
         self.built = False
@@ -374,13 +377,17 @@ def buildFromTopo( self, topo=None ):
             info( switchName + ' ' )
 
         info( '\n*** Adding links:\n' )
+        # need to 'asynchronize' this too
         for srcName, dstName in topo.links(sort=True):
             src, dst = self.nameToNode[ srcName ], self.nameToNode[ dstName ]
             params = topo.linkInfo( srcName, dstName )
             srcPort, dstPort = topo.port( srcName, dstName )
             self.addLink( src, dst, srcPort, dstPort, **params )
+            #self.pool.apply( self.addLink,  ( src, dst, srcPort, dstPort, params, ) )
+            #self.pool.apply_async( self.addLink, args = ( src, dst )+ params, kwds = { 'Port1':srcPort, 'Port2':dstPort } )
             info( '(%s, %s) ' % ( src.name, dst.name ) )
-
+        #self.pool.close()
+        #self.pool.join()
         info( '\n' )
 
     def configureControlNetwork( self ):
diff --git a/mininet/util.py b/mininet/util.py
index 5cb27f449d5ecad2dc62691c218307ab97ae18d0..b4d213a046d78373bf09ce9b00b51208f38fd35b 100644
--- a/mininet/util.py
+++ b/mininet/util.py
@@ -82,6 +82,8 @@ def errRun( *cmd, **kwargs ):
     poller.register( popen.stdout, POLLIN )
     fdtofile = { popen.stdout.fileno(): popen.stdout }
     outDone, errDone = False, True
+    #bookmark: rearrange this for aynch startup. shouldnt have to keep 
+    # maybe we dont rearrange this. we really just need a method to call a command and NOT poll for output
     if popen.stderr:
         fdtofile[ popen.stderr.fileno() ] = popen.stderr
         poller.register( popen.stderr, POLLIN )
@@ -185,10 +187,10 @@ def moveIntfNoRetry( intf, dstNode, srcNode=None, printError=False ):
     intf = str( intf )
     cmd = 'ip link set %s netns %s' % ( intf, dstNode.pid )
     if srcNode:
-        srcNode.cmd( cmd )
+        output = srcNode.cmd( cmd )
     else:
-        quietRun( cmd )
-    if ( ' %s:' % intf ) not in dstNode.cmd( 'ip link show', intf ):
+        output = quietRun( cmd )
+    if output:
         if printError:
             error( '*** Error: moveIntf: ' + intf +
                    ' not successfully moved to ' + dstNode.name + '\n' )