Index: /branches/network/src/util/game_rules.cc
===================================================================
--- /branches/network/src/util/game_rules.cc	(revision 8797)
+++ /branches/network/src/util/game_rules.cc	(revision 8798)
@@ -21,4 +21,6 @@
 
 #include "util/mission_goal.h"
+
+#include "shared_network_data.h"
 
 #include "debug.h"
@@ -86,4 +88,6 @@
 void GameRules::registerKill(const Kill& kill)
 {
+  if ( !SharedNetworkData::getInstance()->isGameServer() )
+    return;
   PRINTF(0)("Received Event: Kill\n");
   this->killList.push_back(kill);
Index: /branches/network/src/util/multiplayer_team_deathmatch.cc
===================================================================
--- /branches/network/src/util/multiplayer_team_deathmatch.cc	(revision 8797)
+++ /branches/network/src/util/multiplayer_team_deathmatch.cc	(revision 8798)
@@ -45,4 +45,6 @@
 
 #include "shell_command.h"
+
+#include "spawning_point.h"
 
 
@@ -237,4 +239,15 @@
   if ( !SharedNetworkData::getInstance()->isGameServer() )
     return;
+    
+  //handle kills
+  for ( std::vector<Kill>::iterator it = this->killList.begin(); it != this->killList.end();  )
+  {
+    std::vector<Kill>::iterator delit = it;
+    
+    onKill( it->getKiller()->getOwner(), it->getVictim()->getOwner() );
+    
+    it++;
+    killList.erase( delit );
+  }
   
   gameStateTimer -= dt;
@@ -735,6 +748,4 @@
     stats.setScore( stats.getScore() - 1 );
   
-  killedStats.getPlayable()->toList( OM_DEAD );
-  
   if ( killedUserId == SharedNetworkData::getInstance()->getHostID() )
   {
@@ -743,6 +754,21 @@
   }
   
-  //TODO respawn killed palyer
+  const std::list<BaseObject*> * list = ClassList::getList( CL_SPAWNING_POINT );
+  
+  assert( list );
+  
+  std::vector<SpawningPoint*> spList;
+  
+  for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
+  {
+    SpawningPoint * sp = dynamic_cast<SpawningPoint*>(*it);
+    
+    if ( sp->getTeamId() < 0 || sp->getTeamId() == killedStats.getTeamId() )
+      spList.push_back( sp );
+  }
  
+  int n = spList.size()*rand();
+  
+  spList[n]->pushEntity( killedStats.getPlayable(), 3 );
 }
 
Index: /branches/network/src/world_entities/spawning_point.cc
===================================================================
--- /branches/network/src/world_entities/spawning_point.cc	(revision 8797)
+++ /branches/network/src/world_entities/spawning_point.cc	(revision 8798)
@@ -59,4 +59,6 @@
 {
   this->setClassID(CL_SPAWNING_POINT, "SpawningPoint");
+  
+  this->teamId = -1;
 }
 
@@ -81,4 +83,8 @@
   LoadParam(root, "delay", this, SpawningPoint, setSpawningDelay)
       .describe("sets the delay of the spawning point");
+      
+  /* load teamId */
+  LoadParam(root, "teamId", this, SpawningPoint, setTeamId)
+      .describe("sets teamId");
 
 
Index: /branches/network/src/world_entities/spawning_point.h
===================================================================
--- /branches/network/src/world_entities/spawning_point.h	(revision 8797)
+++ /branches/network/src/world_entities/spawning_point.h	(revision 8798)
@@ -50,4 +50,7 @@
     /** sets the spawning point mode @param mode: the mode */
     void SpawningPoint::setSpawningMode(int mode) { this->mode = (SpawningPointMode)mode; }
+    
+    inline int getTeamId(){ return this->teamId; }
+    inline void setTeamId( int teamId ){ this->teamId = teamId; }
 
     void pushEntity(WorldEntity* entity, float delay = 0);
@@ -72,4 +75,5 @@
     float                           localTimer;                     //!< the local timer
     float                           seed;                           //!< the random seed of the position
+    int                             teamId;                         //!< only spawn players of this team
     ClassID                         classid;                        //!< the classid of the entity to spawn
     SpawningPointMode               mode;                           //!< the mode of the spawning point
