Index: branches/network/src/lib/network/network_game_manager.cc
===================================================================
--- branches/network/src/lib/network/network_game_manager.cc	(revision 8119)
+++ branches/network/src/lib/network/network_game_manager.cc	(revision 8120)
@@ -161,5 +161,8 @@
     {
       if ( (*it)->isA(CL_PLAYABLE) )
+      {
+        getInstance()->playablesToDelete.push_back( dynamic_cast<Playable*>(*it) );
         return true;
+      }
         
       delete dynamic_cast<Synchronizeable*>(*it);
@@ -238,5 +241,27 @@
 }
 
-
-
-
+/**
+ * this function will be called periodically by networkManager
+ * @param ds time elapsed since last call of tick
+ */
+void NetworkGameManager::tick( float ds )
+{
+  //delete playables if they are not assigned to local player anymore
+  for ( std::list<Playable*>::iterator it = playablesToDelete.begin(); it != playablesToDelete.end();  )
+  {
+    if ( State::getPlayer()->getPlayable() != *it )
+    {
+      PRINTF(0)("Delete unused playable: %s owner: %d\n", (*it)->getClassName(), (*it)->getOwner() );
+      std::list<Playable*>::iterator delit = it;
+      it++;
+      delete *delit;
+      playablesToDelete.erase( delit );
+      continue;
+    }
+    it++;
+  }
+}
+
+
+
+
Index: branches/network/src/lib/network/network_game_manager.h
===================================================================
--- branches/network/src/lib/network/network_game_manager.h	(revision 8119)
+++ branches/network/src/lib/network/network_game_manager.h	(revision 8120)
@@ -12,4 +12,5 @@
 /* include base_object.h since all classes are derived from this one */
 #include "synchronizeable.h"
+#include "playable.h"
 #include "message_manager.h"
 
@@ -61,4 +62,6 @@
     inline void setGameState( int gameState ){ this->gameState = gameState; }
     inline int getGameState(){ return this->gameState; }
+    
+    void tick( float ds );
 
   private:
@@ -73,4 +76,6 @@
     
     int                           gameState;
+    
+    std::list<Playable*>          playablesToDelete;
 };
 
Index: branches/network/src/lib/network/network_manager.cc
===================================================================
--- branches/network/src/lib/network/network_manager.cc	(revision 8119)
+++ branches/network/src/lib/network/network_manager.cc	(revision 8120)
@@ -30,4 +30,5 @@
 #include "preferences.h"
 #include "network_log.h"
+#include "network_game_manager.h"
 
 
@@ -149,4 +150,6 @@
         static_cast<NetworkStream*>(*stream)->processData();
   }
+  
+  NetworkGameManager::getInstance()->tick( this->elapsedTime );
 }
 
Index: branches/network/src/util/multiplayer_team_deathmatch.cc
===================================================================
--- branches/network/src/util/multiplayer_team_deathmatch.cc	(revision 8119)
+++ branches/network/src/util/multiplayer_team_deathmatch.cc	(revision 8120)
@@ -431,5 +431,5 @@
       if ( stats.getPreferedTeamId() == TEAM_RANDOM )
       {
-        stats.setPreferedTeamId( getTeamForNewUser() );
+        stats.setPreferedTeamId( getRandomTeam() );
         teamChange( stats.getUserId() );
       }
Index: branches/network/src/world_entities/playable.cc
===================================================================
--- branches/network/src/world_entities/playable.cc	(revision 8119)
+++ branches/network/src/world_entities/playable.cc	(revision 8120)
@@ -79,5 +79,5 @@
   // this->setPlayer(NULL);
   // IN ITS DESTRUCTOR.
-  detachCamera();
+  
   assert(this->currentPlayer == NULL);
 }
@@ -283,14 +283,4 @@
 void  Playable::detachCamera()
 {
-  PRINTF(0)("detach camera\n");
-  if ( (PNode*)(State::getCameraTarget()) == this )
-  {
-    PRINTF(0)("lookAt nullParent\n");
-    
-    State::getCameraNode()->setParentSoft(PNode::getNullParent());
-    State::getCameraTargetNode()->setParentSoft(PNode::getNullParent());
-    
-    State::getCamera()->lookAt( PNode::getNullParent() );
-  }
 }
 
Index: branches/network/src/world_entities/spectator.cc
===================================================================
--- branches/network/src/world_entities/spectator.cc	(revision 8119)
+++ branches/network/src/world_entities/spectator.cc	(revision 8120)
@@ -71,6 +71,6 @@
 {
   this->mouseDir =  rot;
-  this->rotY = Quaternion( rot.getHeading(), Vector( 0, 1, 0) );
-  this->rotAxis = Quaternion( rot.getAttitude(), Vector( 0, 0, 1 ) );
+  this->angleY = rot.getHeading();
+  this->angleX = rot.getAttitude();
 }
 
@@ -104,13 +104,45 @@
     yMouse *= time / 10;
     
-    this->rotY *= Quaternion(-M_PI/4.0*this->xMouse, Vector(0,1,0));
-    this->rotAxis *= Quaternion(-M_PI/4.0*this->yMouse, Vector(0,0,1) );
-
-    this->mouseDir = rotY * rotAxis;
-    //this->mouseDir *= Quaternion(-M_PI/4.0*this->yMouse, Vector(0,0,1));
+    angleX -= xMouse;
+    angleY -= yMouse;
+    
+    if ( angleY > 2.05 )
+      angleY = 2.05;
+    
+    if ( angleY < -1.15 )
+      angleY = -1.15;
+    
+    this->mouseDir = Quaternion( angleX, Vector( 0, 1, 0 ) ) * Quaternion( angleY, Vector( 0, 0, 1 ) );
+    
     xMouse = yMouse = 0;
   }
   
   this->setAbsDir( this->mouseDir );
+  
+  Vector velocity;
+  
+  if ( this->bForward )
+  {
+    velocity += this->getAbsDirX();
+  }
+  
+  if ( this->bBackward )
+  {
+    velocity -= this->getAbsDirX();
+  }
+  
+  if ( this->bRight )
+  {
+    velocity += this->getAbsDirZ();
+  }
+  
+  if ( this->bLeft )
+  {
+    velocity -= this->getAbsDirZ();
+  }
+  
+  velocity *= 100;
+  
+  this->shiftCoor( velocity*time );
 }
 
Index: branches/network/src/world_entities/spectator.h
===================================================================
--- branches/network/src/world_entities/spectator.h	(revision 8119)
+++ branches/network/src/world_entities/spectator.h	(revision 8120)
@@ -35,6 +35,8 @@
     Quaternion            mouseDir;           //!< the direction where the player wants to fly
 
-    Quaternion            rotY;
-    Quaternion            rotAxis;
+    //Quaternion            rotY;
+    //Quaternion            rotAxis;
+    float                 angleX;
+    float                 angleY;
 };
 
