Index: code/branches/presentation/src/orxonox/objects/Scene.cc
===================================================================
--- code/branches/presentation/src/orxonox/objects/Scene.cc	(revision 2465)
+++ code/branches/presentation/src/orxonox/objects/Scene.cc	(revision 2466)
@@ -206,4 +206,9 @@
             this->physicalWorld_   = new btDiscreteDynamicsWorld(this->dispatcher_, this->broadphase_, this->solver_, this->collisionConfig_);
             this->physicalWorld_->setGravity(omni_cast<btVector3>(this->gravity_));
+
+            // also set the collision callback variable.
+            // Note: This is a global variable which we assign a static function.
+            // TODO: Check whether this (or anything about Bullet) works with multiple physics engine instances.
+            gContactAddedCallback = &Scene::collisionCallback;
         }
         else if (!wantPhysics && hasPhysics())
@@ -337,3 +342,26 @@
             this->physicalWorld_->removeRigidBody(object->getPhysicalBody());
     }
+
+    /*static*/ bool Scene::collisionCallback(btManifoldPoint& cp, const btCollisionObject* colObj0, int partId0,
+                                             int index0, const btCollisionObject* colObj1, int partId1, int index1)
+    {
+        // get the WorldEntity pointers
+        WorldEntity* object0 = (WorldEntity*)colObj0->getUserPointer();
+        assert(dynamic_cast<WorldEntity*>(object0));
+        WorldEntity* object1 = (WorldEntity*)colObj1->getUserPointer();
+        assert(dynamic_cast<WorldEntity*>(object1));
+
+        // false means that bullet will assume we didn't modify the contact
+        bool modified = false;
+        if (object0->isCollisionCallbackActive())
+        {
+            modified |= object0->collidesAgainst(object1, cp);
+            if (object1->isCollisionCallbackActive())
+                modified |= object1->collidesAgainst(object0, cp);
+        }
+        else
+            modified |= object1->collidesAgainst(object0, cp);
+
+        return modified;
+    }
 }
Index: code/branches/presentation/src/orxonox/objects/Scene.h
===================================================================
--- code/branches/presentation/src/orxonox/objects/Scene.h	(revision 2465)
+++ code/branches/presentation/src/orxonox/objects/Scene.h	(revision 2466)
@@ -120,4 +120,8 @@
                 { this->setGravity(this->gravity_); }
 
+            // collision callback from bullet
+            static bool collisionCallback(btManifoldPoint& cp, const btCollisionObject* colObj0, int partId0,
+                                          int index0, const btCollisionObject* colObj1, int partId1, int index1);
+
             // Bullet objects
             btDiscreteDynamicsWorld*             physicalWorld_;
Index: code/branches/presentation/src/orxonox/objects/weaponSystem/projectiles/Projectile.cc
===================================================================
--- code/branches/presentation/src/orxonox/objects/weaponSystem/projectiles/Projectile.cc	(revision 2465)
+++ code/branches/presentation/src/orxonox/objects/weaponSystem/projectiles/Projectile.cc	(revision 2466)
@@ -56,4 +56,7 @@
         this->setStatic(false);
         this->translate(Vector3(55, 0, 0), Ogre::Node::TS_LOCAL);
+
+        // Get notification about collisions
+        this->enableCollisionCallback();
 
         if (this->owner_)
Index: code/branches/presentation/src/orxonox/objects/worldentities/WorldEntity.cc
===================================================================
--- code/branches/presentation/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2465)
+++ code/branches/presentation/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2466)
@@ -85,4 +85,5 @@
         this->angularDamping_ = 0;
         this->friction_       = 0.5;
+        this->bCollisionCallbackActive_ = false;
 
         this->registerVariables();
@@ -144,6 +145,5 @@
         registerVariable(this->getScale3D(),    variableDirection::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::scaleChanged));
 
-        registerVariable((int&)this->collisionTypeSynchronised_,
-                                                variableDirection::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::collisionTypeChanged));
+        // Physics stuff
         registerVariable(this->mass_,           variableDirection::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::massChanged));
         registerVariable(this->restitution_,    variableDirection::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::restitutionChanged));
@@ -152,7 +152,12 @@
         registerVariable(this->angularDamping_, variableDirection::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::angularDampingChanged));
         registerVariable(this->friction_,       variableDirection::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::frictionChanged));
+        registerVariable(this->bCollisionCallbackActive_,
+                                                variableDirection::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::collisionCallbackActivityChanged));
+        registerVariable((int&)this->collisionTypeSynchronised_,
+                                                variableDirection::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::collisionTypeChanged));
         registerVariable(this->bPhysicsActiveSynchronised_,
                                                 variableDirection::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::physicsActivityChanged));
 
+        // Attach to parent if necessary
         registerVariable(this->parentID_,       variableDirection::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::parentChanged));
     }
@@ -192,4 +197,17 @@
         else
             this->deactivatePhysics();
+    }
+
+    void WorldEntity::collisionCallbackActivityChanged()
+    {
+        if (this->hasPhysics())
+        {
+            if (bCollisionCallbackActive_)
+                this->physicalBody_->setCollisionFlags(this->physicalBody_->getCollisionFlags() |
+                    btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
+            else
+                this->physicalBody_->setCollisionFlags(this->physicalBody_->getCollisionFlags() &
+                    !btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
+        }
     }
 
@@ -525,4 +543,5 @@
         recalculateMassProps();
         resetPhysicsProps();
+        collisionCallbackActivityChanged();
         activatePhysics();
     }
Index: code/branches/presentation/src/orxonox/objects/worldentities/WorldEntity.h
===================================================================
--- code/branches/presentation/src/orxonox/objects/worldentities/WorldEntity.h	(revision 2465)
+++ code/branches/presentation/src/orxonox/objects/worldentities/WorldEntity.h	(revision 2466)
@@ -240,4 +240,14 @@
             void notifyChildMassChanged();
 
+            virtual inline bool collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint)
+                { return false; } /* With false, Bullet assumes no modification to the collision objects. */
+
+            inline void enableCollisionCallback()
+                { this->bCollisionCallbackActive_ = true; this->collisionCallbackActivityChanged(); }
+            inline void disableCollisionCallback()
+                { this->bCollisionCallbackActive_ = false; this->collisionCallbackActivityChanged(); }
+            inline bool isCollisionCallbackActive()
+                { return this->bCollisionCallbackActive_; }
+
         protected:
             virtual bool isCollisionTypeLegal(CollisionType type) const = 0;
@@ -253,4 +263,5 @@
             void collisionTypeChanged();
             void physicsActivityChanged();
+            void collisionCallbackActivityChanged();
             inline void massChanged()
                 { this->setMass(this->mass_); }
@@ -279,4 +290,5 @@
             btScalar                     friction_;
             btScalar                     childrenMass_;
+            bool                         bCollisionCallbackActive_;
     };
 
Index: code/branches/presentation/src/orxonox/objects/worldentities/pawns/SpaceShip.cc
===================================================================
--- code/branches/presentation/src/orxonox/objects/worldentities/pawns/SpaceShip.cc	(revision 2465)
+++ code/branches/presentation/src/orxonox/objects/worldentities/pawns/SpaceShip.cc	(revision 2466)
@@ -61,4 +61,6 @@
         // Be aware of this call: The collision type legality check will not reach derived classes!
         this->setCollisionType(WorldEntity::Dynamic);
+        // Get notification about collisions
+        this->enableCollisionCallback();
 
         this->setConfigValues();
