Index: branches/multi_player_map/src/lib/network/network_game_manager.cc
===================================================================
--- branches/multi_player_map/src/lib/network/network_game_manager.cc	(revision 8826)
+++ branches/multi_player_map/src/lib/network/network_game_manager.cc	(revision 8827)
@@ -39,4 +39,6 @@
 
 #include "network_game_manager.h"
+
+#include "multiplayer_team_deathmatch.h"
 
 
@@ -118,4 +120,7 @@
   stats->setPlayableUniqueId( playable.getUniqueID() );
   stats->setModelFileName( playableModel );
+  
+  if ( rules.isA( CL_MULTIPLAYER_TEAM_DEATHMATCH ) )
+    dynamic_cast<MultiplayerTeamDeathmatch*>(&rules)->respawnPlayable( &playable, team, 0.0f );
   
   return true;
Index: branches/multi_player_map/src/util/multiplayer_team_deathmatch.cc
===================================================================
--- branches/multi_player_map/src/util/multiplayer_team_deathmatch.cc	(revision 8826)
+++ branches/multi_player_map/src/util/multiplayer_team_deathmatch.cc	(revision 8827)
@@ -487,4 +487,6 @@
   stats.setPlayableUniqueId( playable.getUniqueID() );
   stats.setModelFileName( playableModel );
+  
+  this->respawnPlayable( &playable, stats.getPreferedTeamId(), 0.0f );
 
   if ( oldPlayable )
@@ -734,4 +736,31 @@
   }
   
+  this->respawnPlayable( killedStats.getPlayable(), killedStats.getTeamId(), 3.0f );
+}
+
+/**
+ * this function is called on player respawn
+ * @param userId 
+ */
+void MultiplayerTeamDeathmatch::onRespawn( int userId )
+{
+  if ( userId == SharedNetworkData::getInstance()->getHostID() )
+  {
+    this->bLocalPlayerDead = false;
+    this->hideStats();
+  }
+}
+
+/**
+ * this function is called on player respawn
+ * @param we 
+ */
+void MultiplayerTeamDeathmatch::registerSpawn( WorldEntity * we )
+{
+  onRespawn( we->getOwner() );
+}
+
+void MultiplayerTeamDeathmatch::respawnPlayable( Playable * playable, int teamId, float delay )
+{
   const std::list<BaseObject*> * list = ClassList::getList( CL_SPAWNING_POINT );
   
@@ -744,33 +773,24 @@
     SpawningPoint * sp = dynamic_cast<SpawningPoint*>(*it);
     
-    if ( sp->getTeamId() < 0 || sp->getTeamId() == killedStats.getTeamId() )
+    if ( sp->getTeamId() == teamId )
       spList.push_back( sp );
   }
+  
+  if ( spList.size() == 0 )
+  {
+    for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
+    {
+      SpawningPoint * sp = dynamic_cast<SpawningPoint*>(*it);
+    
+      if ( sp->getTeamId() < 0 )
+        spList.push_back( sp );
+    }
+  }
+  
+  assert( spList.size() != 0 );
  
-  int n = spList.size()*rand();
-  
-  spList[n]->pushEntity( killedStats.getPlayable(), 3 );
-}
-
-/**
- * this function is called on player respawn
- * @param userId 
- */
-void MultiplayerTeamDeathmatch::onRespawn( int userId )
-{
-  if ( userId == SharedNetworkData::getInstance()->getHostID() )
-  {
-    this->bLocalPlayerDead = false;
-    this->hideStats();
-  }
-}
-
-/**
- * this function is called on player respawn
- * @param we 
- */
-void MultiplayerTeamDeathmatch::registerSpawn( WorldEntity * we )
-{
-  onRespawn( we->getOwner() );
-}
-
+  int n = (int)((float)spList.size() * (float)rand()/(float)RAND_MAX);
+  
+  spList[n]->pushEntity( playable, delay );
+}
+
Index: branches/multi_player_map/src/util/multiplayer_team_deathmatch.h
===================================================================
--- branches/multi_player_map/src/util/multiplayer_team_deathmatch.h	(revision 8826)
+++ branches/multi_player_map/src/util/multiplayer_team_deathmatch.h	(revision 8827)
@@ -60,4 +60,6 @@
     
     virtual void handleChatMessage( int userId, const std::string & message, int messageType );
+    
+    void respawnPlayable( Playable * playable, int teamId, float delay );
 
   protected:
Index: branches/multi_player_map/src/world_entities/playable.cc
===================================================================
--- branches/multi_player_map/src/world_entities/playable.cc	(revision 8826)
+++ branches/multi_player_map/src/world_entities/playable.cc	(revision 8827)
@@ -392,17 +392,4 @@
     State::getGameRules()->onPlayerSpawn();
 
-
-  if( this->getOwner() % 2 == 0)
-  {
-    //     this->toList(OM_GROUP_00);
-    this->setAbsCoor(213.37, 57.71, -47.98);
-    this->setAbsDir(0, 0, 1, 0);
-  }
-  else
-  { // red team
-    //     this->toList(OM_GROUP_01);
-    this->setAbsCoor(-314.450, 40.701, 83.554);
-    this->setAbsDir(1.0, -0.015, -0.012, 0.011);
-  }
   this->reset();
   this->bDead = false;
Index: branches/multi_player_map/src/world_entities/space_ships/space_ship.cc
===================================================================
--- branches/multi_player_map/src/world_entities/space_ships/space_ship.cc	(revision 8826)
+++ branches/multi_player_map/src/world_entities/space_ships/space_ship.cc	(revision 8827)
@@ -504,5 +504,15 @@
 }
 
-
-
-
+void SpaceShip::destroy( )
+{
+  PRINTF(0)("spaceship destroy\n");
+}
+
+void SpaceShip::respawn( )
+{
+  toList( OM_PLAYERS );
+}
+
+
+
+
Index: branches/multi_player_map/src/world_entities/space_ships/space_ship.h
===================================================================
--- branches/multi_player_map/src/world_entities/space_ships/space_ship.h	(revision 8826)
+++ branches/multi_player_map/src/world_entities/space_ships/space_ship.h	(revision 8827)
@@ -36,4 +36,7 @@
     virtual void postSpawn();
     virtual void leftWorld();
+    
+    virtual void destroy();
+    virtual void respawn();
 
     virtual void collidesWith(WorldEntity* entity, const Vector& location);
Index: branches/multi_player_map/src/world_entities/spawning_point.cc
===================================================================
--- branches/multi_player_map/src/world_entities/spawning_point.cc	(revision 8826)
+++ branches/multi_player_map/src/world_entities/spawning_point.cc	(revision 8827)
@@ -22,4 +22,6 @@
 #include "world_entity.h"
 
+#include "class_list.h"
+
 #include "compiler.h"
 
@@ -34,23 +36,4 @@
  *  constructor
  */
-SpawningPoint::SpawningPoint (ClassID classid, const Vector& position)
-{
-  this->setAbsCoor(position);
-
-  this->init();
-}
-
-
-/**
- *  standard constructor
- */
-SpawningPoint::SpawningPoint (const Vector& position, ClassID classid, SpawningPointMode mode, float delay)
-{
-  this->setAbsCoor(position);
-
-  this->init();
-}
-
-
 SpawningPoint::SpawningPoint( const TiXmlElement * root )
 {
@@ -69,4 +52,7 @@
   
   this->teamId = -1;
+  this->localTimer = 0.0f;
+  
+  this->toList( OM_DEAD_TICK );
   
   MessageManager::getInstance()->registerMessageHandler( MSGID_RESPAWN, respawnMessageHandler, NULL );
@@ -101,5 +87,5 @@
  *  @param entity WorldEntity to be added
  */
-void SpawningPoint::pushEntity(WorldEntity* entity, float delay)
+void SpawningPoint::pushEntity(Playable* entity, float delay)
 {
   QueueEntry qe;
@@ -114,7 +100,7 @@
  *  spawn the entity
  */
-void SpawningPoint::spawn(WorldEntity* entity)
-{
-  PRINTF(1)("Spawningpoint spawns new Entity (%s)\n", entity->getClassName());
+void SpawningPoint::spawn(Playable* entity)
+{
+  PRINTF(0)("Spawningpoint spawns Entity (%s)\n", entity->getClassName());
 
 
@@ -128,4 +114,6 @@
     (State::getGameRules())->registerSpawn( entity );
   }
+  
+  entity->respawn();
 }
 
@@ -140,9 +128,8 @@
 {
   this->localTimer += dt;
-
   std::list<QueueEntry>::iterator it = this->queue.begin();
   for( ; it != this->queue.end(); )
   {
-    
+    //PRINTF(0)("%f <= %f\n", it->respawnTime, this->localTimer);
     if( it->respawnTime <= this->localTimer)
     {
@@ -207,5 +194,48 @@
   assert( Converter::byteArrayToInt( data+INTSIZE, &uniqueId ) == INTSIZE );
   
-  //TODO find Playable and SpawningPoint and spawn Playable
+  SpawningPoint * sp = NULL;
+  Playable      * playable = NULL;
+  
+  const std::list<BaseObject*> * list = ClassList::getList( CL_SPAWNING_POINT );
+  
+  if ( list )
+  {
+    for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
+    {
+      if ( dynamic_cast<SpawningPoint*>(*it)->getUniqueID() == uniqueId )
+      {
+        sp = dynamic_cast<SpawningPoint*>(*it);
+        break;
+      }
+    }
+  }
+  
+  if ( !sp )
+  {
+    PRINTF(2)("could not find spawning point\n");
+    return false;
+  }
+  
+  list = ClassList::getList( CL_PLAYABLE );
+  
+  if ( list )
+  {
+    for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
+    {
+      if ( dynamic_cast<Playable*>(*it)->getUniqueID() == uniqueId )
+      {
+        playable = dynamic_cast<Playable*>(*it);
+        break;
+      }
+    }
+  }
+  
+  if ( !playable )
+  {
+    PRINTF(2)("could not find playable\n");
+    return false;
+  }
+  
+  sp->spawn( playable );
   
   return true;
Index: branches/multi_player_map/src/world_entities/spawning_point.h
===================================================================
--- branches/multi_player_map/src/world_entities/spawning_point.h	(revision 8826)
+++ branches/multi_player_map/src/world_entities/spawning_point.h	(revision 8827)
@@ -20,5 +20,5 @@
 {
   float respawnTime;
-  WorldEntity * entity;
+  Playable * entity;
 };
 
@@ -45,6 +45,4 @@
   public:
     SpawningPoint(const TiXmlElement* root = NULL);
-    SpawningPoint(ClassID classID, const Vector& position = Vector(0.0, 0.0, 0.0));
-    SpawningPoint(const Vector& position, ClassID classID, SpawningPointMode type, float delay);
     virtual ~SpawningPoint ();
     void init();
@@ -55,5 +53,5 @@
     inline void setTeamId( int teamId ){ this->teamId = teamId; }
 
-    void pushEntity(WorldEntity* entity, float delay = 0);
+    void pushEntity(Playable* entity, float delay = 0);
 
     /** activates the spawning point */
@@ -69,5 +67,5 @@
 
   private:
-    void spawn(WorldEntity* entity);
+    void spawn(Playable* entity);
     
     void sendRespawnMessage( int uniqueId );
