Index: branches/single_player_map/src/lib/collision_reaction/cr_defs.h
===================================================================
--- branches/single_player_map/src/lib/collision_reaction/cr_defs.h	(revision 9057)
+++ branches/single_player_map/src/lib/collision_reaction/cr_defs.h	(revision 9058)
@@ -29,9 +29,12 @@
 
 //!< the collision axis x collision event
-#define COLLISION_TYPE_AXIS_X   1
+#define COLLISION_TYPE_AXIS_X      1
+#define COLLISION_TZPE_AXIS_X_NEG  2
 //!< the collision axis y collision event
-#define COLLISION_TYPE_AXIS_Y   2
+#define COLLISION_TYPE_AXIS_Y      3
+#define COLLISION_TYPE_AXIS_Y_NEG  4
 //!< the collision axis z collision event
-#define COLLISION_TYPE_AXIS_Z   4
+#define COLLISION_TYPE_AXIS_Z      5
+#define COLLISION_TYPE_AXIS_Z_NEG  6
 //!< the collision is a obb collision
 #define COLLISION_TYPE_OBB      8
Index: branches/single_player_map/src/lib/collision_reaction/cr_physics_ground_walk.cc
===================================================================
--- branches/single_player_map/src/lib/collision_reaction/cr_physics_ground_walk.cc	(revision 9057)
+++ branches/single_player_map/src/lib/collision_reaction/cr_physics_ground_walk.cc	(revision 9058)
@@ -112,8 +112,27 @@
         }
         break;
+        
+      case COLLISION_TYPE_AXIS_X_NEG:
+        front = collPos.len() - box->halfLength[0]; // should be [0]
+
+        // object is beneath the plane (ground)
+        if( front <= 0.0f )
+        {
+          Vector dirX = entity->getAbsDirX(); dirX.y = 0.0f; dirX.normalize();
+          Vector backoff = dirX * front * -1.0f;
+          
+          entity->setAbsCoor(entity->getLastAbsCoor());
+         // entity->shiftCoor(backoff);
+        }
+        // object is already in the wall
+        else if( ce->isInWall())
+        {
+          entity->setAbsCoor(entity->getLastAbsCoor());
+        }
+        break;
 
 
         // collision in the y-axis
-      case COLLISION_TYPE_AXIS_Y:
+      case COLLISION_TYPE_AXIS_Y_NEG:
         // calulate the height above ground
         height = collPos.y - box->halfLength[1];
@@ -149,7 +168,28 @@
         {
           entity->setAbsCoor(entity->getAbsCoor());
-          //Vector dirZ = entity->getAbsDirZ(); dirZ.y = 0.0f; dirZ.normalize();
-          //Vector backoff = dirZ * side;
-          //entity->shiftCoor(backoff);
+          Vector dirZ = entity->getAbsDirZ(); dirZ.y = 0.0f; dirZ.normalize();
+          Vector backoff = dirZ * side;
+          entity->shiftCoor(backoff);
+        }
+        // object is already in the wall
+        else if( ce->isInWall())
+        {
+          entity->setAbsCoor(entity->getLastAbsCoor());
+        }
+        break;
+        
+        
+         // collision in the z-axis
+      case COLLISION_TYPE_AXIS_Z_NEG:
+
+        side = collPos.len()  - box->halfLength[2]; // should be [2]
+
+        // object is beneath the plane (ground)
+        if( side <= 0.0f )
+        {
+         
+          Vector dirZ = entity->getAbsDirZ(); dirZ.y = 0.0f; dirZ.normalize();
+          Vector backoff = dirZ * side*-1.0f;
+          entity->shiftCoor(backoff);
         }
         // object is already in the wall
Index: branches/single_player_map/src/lib/graphics/importer/bsp_manager.cc
===================================================================
--- branches/single_player_map/src/lib/graphics/importer/bsp_manager.cc	(revision 9057)
+++ branches/single_player_map/src/lib/graphics/importer/bsp_manager.cc	(revision 9058)
@@ -972,7 +972,11 @@
   Vector position1 = position;
   Vector position2 = position + Vector(0.0,1.0,0.0);
+  Vector position3 = position;
+  Vector position4 = position + Vector(0.0,1.0,0.0);
   Vector dest = worldEntity->getAbsCoor() - upDir*40.0f; //
   Vector dest1 = position + forwardDir*4.0f;
   Vector dest2 = position2 + forwardDir*4.0;
+  Vector dest3 = position + forwardDir*4.0f;
+  Vector dest4 = position2 + forwardDir*4.0;
   dest = position - Vector(0.0, 40.0,0.0);
   Vector out = dest;
@@ -986,16 +990,17 @@
 
   if( box != NULL) {
-    position = worldEntity->getAbsCoor() +  box->center + Vector(0.0, 1.0, 0.0) * box->halfLength[1] * 1.0f;
+    position = worldEntity->getAbsCoor() +  box->center; // + Vector(0.0, 1.0, 0.0) * box->halfLength[1] * 1.0f;
     dest     = worldEntity->getAbsCoor() +  box->center - Vector(0.0, 1.0, 0.0) * (box->halfLength[1] + BSP_Y_OFFSET) *   100;
 
     Vector dirX =  worldEntity->getAbsDirX(); dirX.y = 0.0f; dirX.normalize();
 
-    position1 = worldEntity->getAbsCoor() +  box->center - dirX * (box->halfLength[0]  + BSP_X_OFFSET);
+    //position1 = worldEntity->getAbsCoor() +  box->center - dirX * (box->halfLength[0]  + BSP_X_OFFSET);
     dest1     = worldEntity->getAbsCoor() +  box->center + dirX * (box->halfLength[0]  + BSP_X_OFFSET);
-
+    dest2     = worldEntity->getAbsCoor() -  box->center + dirX * (box->halfLength[0]  + BSP_X_OFFSET);
+    
     Vector dirZ =  worldEntity->getAbsDirZ(); dirX.y = 0.0f; dirZ.normalize();
-    position2 = worldEntity->getAbsCoor() +  box->center - dirZ * (box->halfLength[2]  + BSP_Z_OFFSET);
-    dest2     = worldEntity->getAbsCoor() +  box->center + dirZ * (box->halfLength[2]  + BSP_Z_OFFSET);
-
+    //position2 = worldEntity->getAbsCoor() +  box->center - dirZ * (box->halfLength[2]  + BSP_Z_OFFSET);
+    dest3     = worldEntity->getAbsCoor() +  box->center + dirZ * (box->halfLength[2]  + BSP_Z_OFFSET);
+    dest4     = worldEntity->getAbsCoor() -  box->center + dirZ * (box->halfLength[2]  + BSP_Z_OFFSET);
   } else {
     // Init positions and destinations to anything useful!
@@ -1055,4 +1060,7 @@
   bool xCollision = false;
   bool zCollision = false;
+  bool xCollisionNeg = false;
+  bool zCollisionNeg = false;
+  
 
 
@@ -1123,9 +1131,10 @@
   // Return the normal here: Normal's stored in this->collPlane;
   if( collision) {
-    worldEntity->registerCollision(COLLISION_TYPE_AXIS_Y , this->parent, worldEntity, Vector(testPlane->x, testPlane->y, testPlane->z), out, SolidFlag);
+    worldEntity->registerCollision(COLLISION_TYPE_AXIS_Y_NEG , this->parent, worldEntity, Vector(testPlane->x, testPlane->y, testPlane->z), out, SolidFlag);
 }
   if(xCollision) {
     worldEntity->registerCollision(COLLISION_TYPE_AXIS_X , this->parent, worldEntity, Vector(testPlane->x, testPlane->y, testPlane->z),dest1 , SolidFlag);
   }
+  
   if(zCollision) {
     worldEntity->registerCollision(COLLISION_TYPE_AXIS_Z , this->parent, worldEntity, Vector(testPlane->x, testPlane->y, testPlane->z), dest2 , SolidFlag);
