Index: trunk/src/lib/collision_detection/bounding_volume.h
===================================================================
--- trunk/src/lib/collision_detection/bounding_volume.h	(revision 9006)
+++ trunk/src/lib/collision_detection/bounding_volume.h	(revision 9008)
@@ -38,4 +38,6 @@
     const int*          triangleIndexes;            //!< Array with the triangle indexes in modelInfo
     int                 triangleIndexesLength;      //!< length of the indexes array
+
+    float               radius;                     //!< the radius of the box (longest axis)
 };
 
Index: trunk/src/lib/collision_detection/obb_tree_node.cc
===================================================================
--- trunk/src/lib/collision_detection/obb_tree_node.cc	(revision 9006)
+++ trunk/src/lib/collision_detection/obb_tree_node.cc	(revision 9008)
@@ -364,4 +364,5 @@
     }
   }
+  this->bvElement->radius = longestAxis;
   PRINTF(4)("\nLongest Axis is: Nr %i with a half-length of:%11.2f\n", longestAxisIndex, longestAxis);
 
@@ -454,4 +455,12 @@
     return;
 
+  float distanceMax = this->bvElement->radius + ((OBBTreeNode*)treeNode)->bvElement->radius;
+  float distance = fabs((nodeA->getAbsCoor() - nodeB->getAbsCoor()).len());
+
+
+//   if( distance < distanceMax)
+//     PRINTF(0)(" %s (%s: group %i) vs %s (%s: group %i): distanceMax: %f, distance: %f\n", nodeA->getClassName(), nodeA->getName(), nodeA->getOMListNumber(), nodeB->getClassName(),  nodeB->getName(), nodeB->getOMListNumber(), distanceMax, distance);
+
+
   PRINTF(4)("collideWith\n");
   PRINTF(5)("Checking OBB %i vs %i: ", this->getIndex(), treeNode->getIndex());
@@ -482,8 +491,17 @@
       if( this->overlapTest(this->nodeLeft->bvElement, treeNode->bvElement, nodeA, nodeB))
       {
+        bool bAdvance = false;
         if( treeNode->nodeLeft != NULL)
           this->nodeLeft->collideWith(treeNode->nodeLeft, nodeA, nodeB);
+        else
+          bAdvance = true;
+
         if( treeNode->nodeRight != NULL)
           this->nodeLeft->collideWith(treeNode->nodeRight, nodeA, nodeB);
+        else
+          bAdvance = true;
+
+        if( bAdvance)
+          this->nodeLeft->collideWith(treeNode, nodeA, nodeB);  // go down the other tree also
       }
     }
@@ -494,8 +512,18 @@
       if( this->overlapTest(this->nodeRight->bvElement, treeNode->bvElement, nodeA, nodeB))
       {
+        bool bAdvance = false;
+
         if( treeNode->nodeLeft != NULL)
           this->nodeRight->collideWith(treeNode->nodeLeft, nodeA, nodeB);
+        else
+          bAdvance = true;
+
         if( treeNode->nodeRight != NULL)
           this->nodeRight->collideWith(treeNode->nodeRight, nodeA, nodeB);
+        else
+          bAdvance = true;
+
+        if( bAdvance)
+          this->nodeRight->collideWith(treeNode, nodeA, nodeB);  // go down the other tree also
       }
     }
@@ -516,4 +544,5 @@
         (treeNode->nodeRight == NULL && treeNode->nodeLeft == NULL)) )
     {
+//       PRINTF(0)("----------------------------------------------\n\n\n\n\n\n--------------------------------\n\n\n");
       nodeA->registerCollision(nodeA, nodeB, (BoundingVolume*)this->bvElement, (BoundingVolume*)treeNode->bvElement);
     }
Index: trunk/src/lib/collision_reaction/cr_object_damage.cc
===================================================================
--- trunk/src/lib/collision_reaction/cr_object_damage.cc	(revision 9006)
+++ trunk/src/lib/collision_reaction/cr_object_damage.cc	(revision 9008)
@@ -56,5 +56,5 @@
   float damage = 0.0f;
 
-  PRINTF(4)("Dealing damage - Handling collision: %s vs %s\n",
+  PRINTF(0)("Dealing damage - Handling collision: %s vs %s\n",
             collision->getEntityA()->getClassName(),
             collision->getEntityB()->getClassName());
@@ -63,5 +63,5 @@
   if( collision->isEntityACollide()) {
     damage = collision->getEntityB()->getDamage();
-    collision->getEntityA()->hit(damage);
+    collision->getEntityA()->hit(damage, collision->getEntityB());
   }
   PRINTF(4)("Dealing damage - %f damage to %s \n", damage, collision->getEntityA()->getClassName());
@@ -69,5 +69,5 @@
   if( collision->isEntityBCollide()) {
     damage = collision->getEntityA()->getDamage();
-    collision->getEntityB()->hit(damage);
+    collision->getEntityB()->hit(damage, collision->getEntityA());
   }
   PRINTF(4)("Dealing damage - %f damage to %s \n", damage, collision->getEntityB()->getClassName());
Index: trunk/src/lib/network/message_manager.h
===================================================================
--- trunk/src/lib/network/message_manager.h	(revision 9006)
+++ trunk/src/lib/network/message_manager.h	(revision 9008)
@@ -32,5 +32,6 @@
   MSGID_PREFEREDTEAM,
   MSGID_CHANGENICKNAME,
-  MSGID_CHATMESSAGE
+  MSGID_CHATMESSAGE,
+  MSGID_RESPAWN
 };
 
Index: trunk/src/lib/network/network_game_manager.cc
===================================================================
--- trunk/src/lib/network/network_game_manager.cc	(revision 9006)
+++ trunk/src/lib/network/network_game_manager.cc	(revision 9008)
@@ -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;
