Index: branches/proxy/src/lib/network/network_stream.cc
===================================================================
--- branches/proxy/src/lib/network/network_stream.cc	(revision 9594)
+++ branches/proxy/src/lib/network/network_stream.cc	(revision 9595)
@@ -403,5 +403,6 @@
       {
         // each server (proxy and master) have an address space for new network nodes of 1000 nodes
-        userId = SharedNetworkData::getInstance()->getHostID() * 1000 + 1;
+        // the first NET_ID_PROXY_MAX are always reserved for proxy servers
+        userId = SharedNetworkData::getInstance()->getHostID() * 1000 + NET_ID_PROXY_MAX + 1;
 
         for ( PeerList::iterator it = peers.begin(); it != peers.end(); it++ )
@@ -432,16 +433,23 @@
     {
       // determine the network node id
-      if ( freeSocketSlots.size() > 0 )
-      {
-        userId = freeSocketSlots.back();
-        freeSocketSlots.pop_back();
-      }
-      else
+//       if ( freeSocketSlots.size() > 0 )
+//       {
+//         userId = freeSocketSlots.back();
+//         freeSocketSlots.pop_back();
+//       }
+//       else
       {
         userId = 1;
 
-        for ( PeerList::iterator it = peers.begin(); it != peers.end(); it++ )
-          if ( it->first >= userId )
-            userId = it->first + 1;
+        for( int i = 0; i < NET_ID_PROXY_MAX; i++)
+        {
+          if( this->peers.find( i) != this->peers.end())
+            userId = i;
+          break;
+        }
+
+//         for ( PeerList::iterator it = peers.begin(); it != peers.end(); it++ )
+//           if ( it->first >= userId )
+//             userId = it->first + 1;
       }
 
@@ -521,5 +529,11 @@
   // check if the connecting client should reconnect to a proxy server
   if( SharedNetworkData::getInstance()->isMasterServer())
-    this->peers[userId].handshake->setRedirect(/*this->networkMonitor->isReconnectNextClient()*/false);
+  {
+    if( this->networkMonitor->isReconnectNextClient())
+    {
+      this->peers[userId].handshake->setRedirect(true);
+      PRINTF(0)("forwarding client to proxy server because this server is saturated\n");
+    }
+  }
 
   // the connecting node of course is a client
@@ -612,5 +626,4 @@
               this->pInfo->userId = SharedNetworkData::getInstance()->getHostID();
 
-#warning the ip address is not set here because it results in a segfault when connecting to a proxy server => trace this later
 //               it->second.ip = it->second.socket->getRemoteAddress();
 
@@ -828,6 +841,5 @@
       if ( ( SharedNetworkData::getInstance()->isMasterServer() ||
              SharedNetworkData::getInstance()->isProxyServerActive() &&  peer->second.isClient() ) &&
-             ( sync.getUniqueID() >= 1000 || sync.getUniqueID() <= SharedNetworkData::getInstance()->getMaxPlayer() + 1)
-             /*<= SharedNetworkData::getInstance()->getMaxPlayer() + 1*/) // plus one to handle one client more than the max to redirect it
+             ( sync.getUniqueID() >= 1000 || sync.getUniqueID() <= SharedNetworkData::getInstance()->getMaxPlayer() + 1 + NET_ID_PROXY_MAX))
         n = Converter::intToByteArray( 0, buf + offset, UDP_PACKET_SIZE - offset );
       else
Index: branches/proxy/src/lib/network/proxy/network_settings.cc
===================================================================
--- branches/proxy/src/lib/network/proxy/network_settings.cc	(revision 9594)
+++ branches/proxy/src/lib/network/proxy/network_settings.cc	(revision 9595)
@@ -87,4 +87,5 @@
   // setUniqueID( maxCon+2 ) because we need one id for every handshake
   // and one for handshake to reject client maxCon+1
+  // NEW: at most there will be
   SharedNetworkData::getInstance()->setNewUniqueID( this->maxPlayer + 2);
 }
Index: branches/proxy/src/util/multiplayer_team_deathmatch.cc
===================================================================
--- branches/proxy/src/util/multiplayer_team_deathmatch.cc	(revision 9594)
+++ branches/proxy/src/util/multiplayer_team_deathmatch.cc	(revision 9595)
@@ -534,6 +534,4 @@
   if ( oldPlayable )
   {
-    //if ( userId == SharedNetworkData::getInstance()->getHostID() )
-    //  State::getPlayer()->setPlayable( NULL );
     delete oldPlayable;
   }
