Index: /branches/cr/src/lib/collision_reaction/collision_handle.cc
===================================================================
--- /branches/cr/src/lib/collision_reaction/collision_handle.cc	(revision 7944)
+++ /branches/cr/src/lib/collision_reaction/collision_handle.cc	(revision 7945)
@@ -72,3 +72,26 @@
 }
 
+/**
+ * flushes the collision list
+ */
+void CollisionHandle::flushCollisions()
+{
+  std::vector<Collision*>::iterator it;
+  for( it = this->collisionList.begin(); it != this->collisionList.end(); it++)
+    CREngine::getInstance()->pushCollisionObject(*it);
+  this->collisionList.clear();
+}
 
+
+/**
+ * handles the collisions and react according to algorithm
+ */
+void CollisionHandle::handleCollisions()
+{
+
+  // collision reaction calculations
+
+  // now set state to dispatched
+  this->bDispatched = true;
+  this->flushCollisions();
+}
Index: /branches/cr/src/lib/collision_reaction/collision_handle.h
===================================================================
--- /branches/cr/src/lib/collision_reaction/collision_handle.h	(revision 7944)
+++ /branches/cr/src/lib/collision_reaction/collision_handle.h	(revision 7945)
@@ -20,28 +20,32 @@
 
 //! A class for defining collision reactions and storing events
-class CollisionHandle : public BaseObject {
+class CollisionHandle : public BaseObject
+{
 
- public:
-  CollisionHandle(WorldEntity* owner, CREngine::CRType type);
-  virtual ~CollisionHandle();
+  public:
+    CollisionHandle(WorldEntity* owner, CREngine::CRType type);
+    virtual ~CollisionHandle();
 
 
-  void addTarget(long classID);
+    void addTarget(long classID);
 
-  void registerCollision(Collision* collision);
+    void registerCollision(Collision* collision);
 
-  void handleCollisions();
-  void flushCollsions();
+    void handleCollisions();
 
 
- private:
-   WorldEntity*                  owner;                   //!< the worldenity this reaction will be applied on
-   CREngine::CRType              type;                    //!< the reaction type
+  private:
+    void flushCollisions();
 
-   bool                          bDispatched;             //!< true if this handle has already been dispatched
-   bool                          bStopOnFirstCollision;   //!< true if the cd of this object should be terminated after one match
 
-   std::vector<Collision*>       collisionList;           //!< a list full of collisions
-   std::vector<long>             targetList;              //!< a list of target classes for filtering
+  private:
+    WorldEntity*                  owner;                   //!< the worldenity this reaction will be applied on
+    CREngine::CRType              type;                    //!< the reaction type
+
+    bool                          bDispatched;             //!< true if this handle has already been dispatched
+    bool                          bStopOnFirstCollision;   //!< true if the cd of this object should be terminated after one match
+
+    std::vector<Collision*>       collisionList;           //!< a list full of collisions
+    std::vector<long>             targetList;              //!< a list of target classes for filtering
 
 };
Index: /branches/cr/src/lib/collision_reaction/cr_engine.cc
===================================================================
--- /branches/cr/src/lib/collision_reaction/cr_engine.cc	(revision 7944)
+++ /branches/cr/src/lib/collision_reaction/cr_engine.cc	(revision 7945)
@@ -19,4 +19,5 @@
 
 #include "collision.h"
+#include "collision_handle.h"
 #include "cr_defs.h"
 
@@ -51,5 +52,7 @@
 }
 
-
+/**
+ * inits the CREngine to a working state
+ */
 void CREngine::init()
 {
@@ -62,5 +65,11 @@
 
 void CREngine::reset()
-{}
+{
+  // first clear all CollisionHandles
+  std::vector<CollisionHandle*>::iterator it;
+  for( it = this->collisionHandles.begin(); it != this->collisionHandles.end(); it++)
+    delete *it;
+  this->collisionHandles.clear();
+}
 
 
@@ -72,6 +81,8 @@
 CollisionHandle* CREngine::subscribeReaction(WorldEntity* owner, CRType type)
 {
+  CollisionHandle* ch = new CollisionHandle(owner, type);
+  this->collisionHandles.push_back(ch);
+}
 
-}
 
 bool CREngine::unsubscribeReaction(WorldEntity* worldEntity)
Index: /branches/cr/src/lib/collision_reaction/cr_engine.h
===================================================================
--- /branches/cr/src/lib/collision_reaction/cr_engine.h	(revision 7944)
+++ /branches/cr/src/lib/collision_reaction/cr_engine.h	(revision 7945)
@@ -41,5 +41,4 @@
   inline static CREngine* getInstance() { if (!singletonRef) singletonRef = new CREngine();  return singletonRef; };
 
-  void init();
   void reset();
 
@@ -60,6 +59,8 @@
   void debug();
 
+
 private:
   CREngine();
+  void init();
 
 
Index: /branches/cr/src/world_entities/world_entity.cc
===================================================================
--- /branches/cr/src/world_entities/world_entity.cc	(revision 7944)
+++ /branches/cr/src/world_entities/world_entity.cc	(revision 7945)
@@ -33,4 +33,5 @@
 
 #include "collision_handle.h"
+#include "collision.h"
 
 #include <stdarg.h>
@@ -68,4 +69,8 @@
   this->objectListNumber = OM_INIT;
   this->objectListIterator = NULL;
+
+  // reset all collision handles to NULL == unsubscribed state
+  for(int i = 0; i < CREngine::CR_NUMBER; ++i)
+    this->collisionHandles[i] = NULL;
 
   this->toList(OM_NULL);
@@ -242,4 +247,8 @@
 void WorldEntity::subscribeReaction(CREngine::CRType type, int nrOfTargets, long target...)
 {
+  if( this->collisionHandles[type] != NULL)  {
+    PRINTF(2)("Registering for a CollisionReaction already subscribed to! Skipping\n");
+    return;
+  }
 
   this->collisionHandles[type] = CREngine::getInstance()->subscribeReaction(this, type);
@@ -257,5 +266,5 @@
  *  @param collisionEvent the event
  */
-void WorldEntity::registerCollision(WorldEntity* entityA, WorldEntity* entityB, BouningVolume* bvA, BoundingVolume* bvB)
+bool WorldEntity::registerCollision(WorldEntity* entityA, WorldEntity* entityB, BoundingVolume* bvA, BoundingVolume* bvB)
 {
   // create a collision event
Index: /branches/cr/src/world_entities/world_entity.h
===================================================================
--- /branches/cr/src/world_entities/world_entity.h	(revision 7944)
+++ /branches/cr/src/world_entities/world_entity.h	(revision 7945)
@@ -71,5 +71,5 @@
   /* --- Collision Reaction Block --- */
   void subscribeReaction(CREngine::CRType type, int nrOfTargets, long target, ...);
-  void registerCollision(WorldEntity* entityA, WorldEntity* entityB, BoundingVolume* bvA, BoundingVolume* bvB);
+  bool registerCollision(WorldEntity* entityA, WorldEntity* entityB, BoundingVolume* bvA, BoundingVolume* bvB);
 
 
