diff --git a/examples/cluster.py b/examples/cluster.py
index 093df6686ddc7dc00cee467b3729b6dc663e2dab..ebba471e9469a76b7c5773b86177095bade168bc 100755
--- a/examples/cluster.py
+++ b/examples/cluster.py
@@ -112,7 +112,7 @@ class RemoteMixin( object ):
                 '-o', 'BatchMode=yes',
                 '-o', 'ForwardAgent=yes', '-tt' ]
 
-    def __init__( self, name, server=None, user=None, serverIP=None,
+    def __init__( self, name, server='localhost', user=None, serverIP=None,
                   controlPath='/tmp/mn-%r@%h:%p', splitInit=False, **kwargs):
         """Instantiate a remote node
            name: name of remote node
@@ -122,18 +122,18 @@ def __init__( self, name, server=None, user=None, serverIP=None,
            splitInit: split initialization?
            **kwargs: see Node()"""
         # We connect to servers by IP address
-        if server == 'localhost':
-            server = None
-        self.server = server
-        self.serverIP = serverIP if serverIP else self.findServerIP( server )
+        self.server = server if server else 'localhost'
+        self.serverIP = serverIP if serverIP else self.findServerIP( self.server )
         self.user = user if user else self.findUser()
-        if self.user and self.server:
+        if self.user and self.server != 'localhost':
             self.dest = '%s@%s' % ( self.user, self.serverIP )
+            self.isRemote = True
         else:
+            self.isRemote = False
             self.dest = None
         self.controlPath = controlPath
         self.sshcmd = []
-        if self.dest:
+        if hasattr( self, 'server' ) and self.isRemote:
             self.sshcmd = [ 'sudo', '-E', '-u', self.user ] + self.sshbase
             if self.controlPath:
                 self.sshcmd += [ '-o', 'ControlPath=' + self.controlPath,
@@ -160,20 +160,14 @@ def findUser():
     _ipMatchRegex = re.compile( r'\d+\.\d+\.\d+\.\d+' )
 
     @classmethod
-    def findServerIP( cls, server, intf='eth0' ):
+    def findServerIP( cls, server ):
         "Return our server's IP address"
-        # Check for this server
-        if not server:
-            output = quietRun( 'ifconfig %s' % intf  )
-        # Otherwise, handle remote server
-        else:
-            # First, check for an IP address
-            if server:
-                ipmatch = cls._ipMatchRegex.findall( server )
-                if ipmatch:
-                    return ipmatch[ 0 ]
-            # Otherwise, look up remote server
-            output = quietRun( 'getent ahostsv4 %s' % server )
+        # First, check for an IP address
+        ipmatch = cls._ipMatchRegex.findall( server )
+        if ipmatch:
+            return ipmatch[ 0 ]
+        # Otherwise, look up remote server
+        output = quietRun( 'getent ahostsv4 %s' % server )
         ips = cls._ipMatchRegex.findall( output )
         ip = ips[ 0 ] if ips else None
         return ip
@@ -181,7 +175,7 @@ def findServerIP( cls, server, intf='eth0' ):
     # Command support via shell process in namespace
     def startShell( self, *args, **kwargs ):
         "Start a shell process for running commands"
-        if self.dest:
+        if hasattr( self, 'server' ) and self.isRemote:
             kwargs.update( mnopts='-c' )
         super( RemoteMixin, self ).startShell( *args, **kwargs )
         if self.splitInit:
@@ -231,7 +225,7 @@ def _popen( self, cmd, sudo=True, tt=True, **params):
             returns: Popen() object"""
         if type( cmd ) is str:
             cmd = cmd.split()
-        if self.dest:
+        if hasattr( self, 'server' ) and self.isRemote:
             if sudo:
                 cmd = [ 'sudo', '-E' ] + cmd
             if tt:
@@ -312,9 +306,9 @@ def makeIntfPair( self, intfname1, intfname2, addr1=None, addr2=None ):
             (override this method [and possibly delete()]
             to change link type)"""
         node1, node2 = self.node1, self.node2
-        server1 = getattr( node1, 'server', None )
-        server2 = getattr( node2, 'server', None )
-        if not server1 and not server2:
+        server1 = getattr( node1, 'server', 'localhost' )
+        server2 = getattr( node2, 'server', 'localhost' )
+        if server1 == 'localhost' and server2 == 'localhost':
             # Local link
             return makeIntfPair( intfname1, intfname2, addr1, addr2 )
         elif server1 == server2:
@@ -596,8 +590,8 @@ def __init__( self, *args, **kwargs ):
                    'link': RemoteLink,
                    'precheck': True }
         params.update( kwargs )
-        servers = params.pop( 'servers', [ None ] )
-        servers = [ s if s != 'localhost' else None for s in servers ]
+        servers = params.pop( 'servers', [ 'localhost' ] )
+        servers = [ s if s else 'localhost' for s in servers ]
         self.servers = servers
         self.serverIP = params.pop( 'serverIP', {} )
         if not self.serverIP:
@@ -672,6 +666,9 @@ def placeNodes( self ):
                                  links=self.topo.links() )
         for node in nodes:
             config = self.topo.node_info[ node ]
+            # keep local server name consistent accross nodes
+            if 'server' in config.keys() and config[ 'server' ] == None:
+                config[ 'server' ] = 'localhost'
             server = config.setdefault( 'server', placer.place( node ) )
             if server:
                 config.setdefault( 'serverIP', self.serverIP[ server ] )