Index: branches/coll_rect/src/lib/collision_detection/aabb_tree_node.cc
===================================================================
--- branches/coll_rect/src/lib/collision_detection/aabb_tree_node.cc	(revision 9895)
+++ branches/coll_rect/src/lib/collision_detection/aabb_tree_node.cc	(revision 9896)
@@ -17,6 +17,7 @@
 #include "aabb_tree_node.h"
 #include "aabb.h"
-
 #include "bv_tree.h"
+
+#include "collision_tube.h"
 
 #include "matrix.h"
@@ -532,5 +533,5 @@
         (treeNode->nodeRight == NULL && treeNode->nodeLeft == NULL)) )
     {
-      nodeA->registerCollision(nodeA, nodeB, (BoundingVolume*)this->bvElement, (BoundingVolume*)treeNode->bvElement);
+      CoRe::CollisionTube::getInstance()->registerCollisionEvent( nodeA, nodeB, (BoundingVolume*)this->bvElement, (BoundingVolume*)treeNode->bvElement);
     }
 
Index: branches/coll_rect/src/lib/collision_detection/obb_tree_node.cc
===================================================================
--- branches/coll_rect/src/lib/collision_detection/obb_tree_node.cc	(revision 9895)
+++ branches/coll_rect/src/lib/collision_detection/obb_tree_node.cc	(revision 9896)
@@ -18,4 +18,6 @@
 #include "obb_tree.h"
 #include "obb.h"
+
+#include "collision_tube.h"
 
 #include "matrix.h"
@@ -567,5 +569,5 @@
     {
 //       PRINTF(0)("----------------------------------------------\n\n\n\n\n\n--------------------------------\n\n\n");
-      nodeA->registerCollision(nodeA, nodeB, (BoundingVolume*)this->bvElement, (BoundingVolume*)treeNode->bvElement);
+      CoRe::CollisionTube::getInstance()->registerCollisionEvent( nodeA, nodeB, (BoundingVolume*)this->bvElement, (BoundingVolume*)treeNode->bvElement);
     }
 
Index: branches/coll_rect/src/lib/collision_reaction/collision_filter.cc
===================================================================
--- branches/coll_rect/src/lib/collision_reaction/collision_filter.cc	(revision 9895)
+++ branches/coll_rect/src/lib/collision_reaction/collision_filter.cc	(revision 9896)
@@ -29,4 +29,7 @@
 #include "debug.h"
 
+#include <vector>
+
+
 namespace CoRe
 {
@@ -38,36 +41,13 @@
    * @todo this constructor is not jet implemented - do it
   */
-  CollisionFilter::CollisionFilter (WorldEntity* owner, CREngine::ReactionType type)
+  CollisionFilter::CollisionFilter (WorldEntity* owner)
   {
     this->registerObject(this, CollisionFilter::_objectList);
 
-    this->owner = owner;
-    this->type = type;
+    this->_owner = owner;
 
-    this->bCollided = false;
-    this->bDispatched = true;
-
-    this->collisionReaction = NULL;
-    this->bContinuousPoll = false;
-    this->bStopOnFirstCollision = false;
-
-
-    switch( type)
-    {
-        case CREngine::CR_PHYSICS_FULL_WALK:
-        this->collisionReaction = new CRPhysicsFullWalk();
-        this->bContinuousPoll = true;
-        break;
-        case CREngine::CR_PHYSICS_GROUND_WALK:
-        this->collisionReaction = new CRPhysicsGroundWalk();
-        this->bContinuousPoll = true;
-        break;
-        case CREngine::CR_OBJECT_DAMAGE:
-        this->collisionReaction = new CRObjectDamage();
-        this->bStopOnFirstCollision = true;
-        break;
-        default:
-        break;
-    };
+    this->_bContinuousPoll = false;
+    this->_bStopOnFirstCollision = false;
+    this->_bReactive = false;
   }
 
@@ -78,164 +58,91 @@
   CollisionFilter::~CollisionFilter ()
   {
-    // delete what has to be deleted here
-    if( this->collisionReaction != NULL)
-      delete this->collisionReaction;
-  }
-
-  /**
-   * restores the CollisionFilter to its initial state
-   */
-  void CollisionFilter::reset()
-  {
-    this->flushCollisions();
+    this->unsubscribeReactions();
   }
 
 
   /**
-   * add more filter targets to this collision handle
-   *  @param classID the classid to look for
+   * subscribe reaction
    */
-  void CollisionFilter::addTarget(const ClassID& target)
+  void CollisionFilter::subscribeReaction(CoRe::CREngine::ReactionType type, const ClassID& target1)
   {
-    // make sure there is no dublicate
-    std::vector<ClassID>::iterator it = this->targetList.begin();
-    for( ; it < this->targetList.end(); it++)
-      if( (*it) == target)
-        return;
+    // check if its a valid type
+    if( likely(this->validCRType( type)))
+    {
+      //check if this or any parent class isn't already registered
+      std::vector<ClassID>::iterator it = this->_filters[type].begin();
+      for(; it != this->_filters[type].end(); it++)
+      {
+        if( unlikely(*it == target1))
+          return;
+      }
 
-
-    // add element
-    this->targetList.push_back(target);
-    PRINTF(5)("addTarget: %i \n", target.id());
+      // so subscribe the reaction finaly
+      this->_filters[type].push_back(target1);
+      this->_bReactive = true;
+    }
   }
 
 
   /**
-   * handles the collisions and react according to algorithm
+   * subscribe for a reaction
    */
-  void CollisionFilter::handleCollisions()
+  void CollisionFilter::subscribeReaction(CoRe::CREngine::ReactionType type, const ClassID& target1, const ClassID& target2)
   {
-    // if continuous poll the reaction
-    if( this->bContinuousPoll && !this->bCollided)
-    {
-      this->collisionReaction->update(this->owner);
-      return;
-    }
-
-    // collision reaction calculations (for every collision there will be a reaction)
-    std::vector<Collision*>::iterator it = this->collisionList.begin();
-    for(; it < this->collisionList.end(); it++)
-    {
-      if( !(*it)->isDispatched())
-      {
-        this->collisionReaction->reactToCollision(*it);
-        (*it)->flushCollisionEvents();
-      }
-    }
-
-    // now set state to dispatched
-    this->bDispatched = true;
-    this->bCollided = false;
-
-    this->flushCollisions();
+    this->subscribeReaction(type, target1);
+    this->subscribeReaction(type, target2);
   }
 
 
   /**
-   * filter out the CollisionEvents that are not wanted
-   *  @param collisionEvent the collision event to filter
+   * subscribe for a reaction
    */
-  bool CollisionFilter::filterCollisionEvent(CollisionEvent* collisionEvent)
+  void CollisionFilter::subscribeReaction(CoRe::CREngine::ReactionType type, const ClassID& target1, const ClassID& target2, const ClassID& target3)
   {
-    std::vector<ClassID>::iterator it = this->targetList.begin();
-    for(; it < this->targetList.end(); it++)
-    {
-      //     if(collisionEvent->getEntityB()->isA(CL_AIMING_SYSTEM) || collisionEvent->getEntityA()->isA(CL_AIMING_SYSTEM))
-      //     {
-      //        PRINTF(0)("I am: %s colliding with: %s\n", owner->getClassCName(), collisionEvent->getEntityB()->getClassCName(), *it);
-      //        if( collisionEvent->getEntityA() == this->owner) {
-      //          PRINTF(0)("I am owner -> I am: %s colliding with: %s is a %i filter?\n", owner->getClassCName(),
-      //          collisionEvent->getEntityB()->getClassCName(), *it);
-      //          if( collisionEvent->getEntityB()->isA((ClassID)(*it))) {
-      //            PRINTF(0)("I am owner -> I am: %s colliding with: %s is a %i filter ok\n", owner->getClassCName(),
-      //            collisionEvent->getEntityB()->getClassCName(), *it);
-      //             }
-      //        }
-      //        else {
-      //          PRINTF(0)("I am not owner -> I am: %s colliding with: %s is a %i filter?\n", owner->getClassCName(),
-      //          collisionEvent->getEntityB()->getClassCName(), *it);
-      //          if( collisionEvent->getEntityA()->isA((ClassID)(*it))) {
-      //            PRINTF(0)("I'm not owner -> I am: %s colliding with: %s is a %i filter ok\n", owner->getClassCName(),
-      //            collisionEvent->getEntityA()->getClassCName(), *it);
-      //             }
-      //        }
-      //
-      //     }
+    this->subscribeReaction(type, target1);
+    this->subscribeReaction(type, target2);
+    this->subscribeReaction(type, target3);
+  }
 
-      if( collisionEvent->getEntityA() == this->owner)
-      {
-        if( collisionEvent->getEntityB()->isA((*it)))
-        {
-          PRINTF(5)("I am: %s colliding with: %s is a %i filter ok\n", owner->getClassCName(),
-                    collisionEvent->getEntityB()->getClassCName(), (*it).id());
-          return true;
-        }
-      }
-      else
-      {
-        if( collisionEvent->getEntityA()->isA((*it)))
-        {
-          PRINTF(5)("I am: %s colliding with: %s is a %i filter ok\n", owner->getClassCName(),
-                    collisionEvent->getEntityA()->getClassCName(), (*it).id());
-          return true;
-        }
-      }
-    }
+  /**
+   * unsubscribe from a specific collision reaction
+   */
+  void CollisionFilter::unsubscribeReaction(CoRe::CREngine::ReactionType type)
+  {
+    if( likely(this->validCRType( type)))
+      this->_filters[type].clear();
+  }
 
-    return false;
+  /**
+   * unsubscribe from all collision reactions
+   */
+  void CollisionFilter::unsubscribeReactions()
+  {
+    for(int i = 0; i < CREngine::CR_NUMBER; i++)
+      this->_filters[i].clear();
   }
 
 
+
   /**
-   * filter Collisions that are not wanted to be reacted to
-   *  @param collision the collision object to filter
+   * tests if the owner WorldEntity is listening to collisions from another specif WorldEntity entity
+   *  @param entity WorldEntity to test against
+   *
+   * This is the most important interface function of this class: it performs a check and returns true
+   * if the WorldEntity entity is actualy responsive for a certain other WorldEntity
    */
-  bool CollisionFilter::filterCollision(Collision* collision)
+  bool CollisionFilter::operator()(const WorldEntity* entity) const
   {
-    std::vector<ClassID>::iterator it = this->targetList.begin();
-    for(; it < this->targetList.end(); it++)
+    // if there are no installed criterions just ommit and
+    if( this->bReactive())
+      return false;
+
+    // goes through all registered filter criterions and looks for matches
+    for( int i = 0; i < CREngine::CR_NUMBER; i++ )
     {
-
-      //     if(collision->getEntityB()->isA(CL_AIMING_SYSTEM) || collision->getEntityA()->isA(CL_AIMING_SYSTEM))
-      //     {
-      //       PRINTF(0)("Shared!!! I am: %s colliding with: %s\n", owner->getClassCName(), collision->getEntityB()->getClassCName(), *it);
-      //       if( collision->getEntityA() == this->owner) {
-      //         PRINTF(0)("I am owner -> I am: %s colliding with: %s is a %i filter?\n", owner->getClassCName(),
-      //         collision->getEntityB()->getClassCName(), *it);
-      //         if( collision->getEntityB()->isA((ClassID)(*it))) {
-      //           PRINTF(0)("I am owner -> I am: %s colliding with: %s is a %i filter ok\n", owner->getClassCName(),
-      //           collision->getEntityB()->getClassCName(), *it);
-      //         }
-      //       }
-      //       else {
-      //         PRINTF(0)("I'm not owner -> I am: %s colliding with: %s is a %i filter?\n", owner->getClassCName(),
-      //         collision->getEntityB()->getClassCName(), *it);
-      //         if( collision->getEntityA()->isA((ClassID)(*it))) {
-      //           PRINTF(0)("I'm not owner -> I am: %s colliding with: %s is a %i filter ok\n", owner->getClassCName(),
-      //           collision->getEntityA()->getClassCName(), *it);
-      //         }
-      //       }
-      //     }
-
-      if( collision->getEntityA() == this->owner)
-      {
-        if( collision->getEntityA()->isA(*it))
+      std::vector<ClassID>::const_iterator it = this->_filters[i].begin();
+      for(; it != this->_filters[i].end(); i++ )
+        if( unlikely(entity->isA(*it)))
           return true;
-      }
-      else
-      {
-        if( collision->getEntityB()->isA(*it))
-          return true;
-      }
     }
 
Index: branches/coll_rect/src/lib/collision_reaction/collision_filter.h
===================================================================
--- branches/coll_rect/src/lib/collision_reaction/collision_filter.h	(revision 9895)
+++ branches/coll_rect/src/lib/collision_reaction/collision_filter.h	(revision 9896)
@@ -1,5 +1,6 @@
 /*!
- * @file collision_handle.h
- * @brief Definition of a collision handle: used for accessing per world entity collision events and reactions
+ * @file collision_filter.h
+ * @brief Definition of a collision filter: checks if a certain WorldEntity is responsive for another WorldEntity
+ *
 */
 
@@ -24,49 +25,58 @@
 
 
-  //! A class for defining collision reactions and storing events
+  /**
+   * A class for defining collision reactions and storing events (functional object)
+   *
+   * This class basically checks if the owner of this filter (a WorldEntity) is responsive for a certain other WorldEntity.
+   * The check is performed via the operator() (therefore it's a functional objects). For each CollisionReaction there is a list
+   * of WorldEntities (their ClassIDs) to which it listens to.
+   */
   class CollisionFilter : public BaseObject
   {
     ObjectListDeclaration(CollisionFilter);
 
+
+    /* Constructor/Deconstructors */
   public:
-    CollisionFilter(WorldEntity* owner, CREngine::ReactionType type);
+    CollisionFilter(WorldEntity* owner);
     virtual ~CollisionFilter();
 
-    void reset();
-
-    void addTarget(const ClassID& target);
-
-    /** @returns true if regiestered some new collision events in this tick frame */
-    inline bool isCollided() const { return this->bCollided; }
-    /** @returns true if this collision handle has already been dispatched */
-    inline bool isDispatched() const { return this->bDispatched; }
-    /** @returns true if this handle should be pulled also if there are no collisions */
-    inline bool isContinuousPoll() const { return this->bContinuousPoll; }
-    /** @returns the type */
-    inline CREngine::ReactionType getType() const { return this->type; }
-
-    void handleCollisions();
+  private:
+    CollisionFilter(const CollisionFilter& collisionFilter) {}
+    WorldEntity*                  _owner;                   //!< the worldenity this reaction will be applied on
 
 
-  private:
-    void flushCollisions();
-    bool filterCollisionEvent(CollisionEvent* collisionEvent);
-    bool filterCollision(Collision* collision);
+    /* Defines Operators */
+    bool operator()(const WorldEntity* entity) const;
 
 
+    /* Collision Reaction subscription unsubscription Block */
+  public:
+    void subscribeReaction(CoRe::CREngine::ReactionType type, const ClassID& target1);
+    void subscribeReaction(CoRe::CREngine::ReactionType type, const ClassID& target1, const ClassID& target2);
+    void subscribeReaction(CoRe::CREngine::ReactionType type, const ClassID& target1, const ClassID& target2, const ClassID& target3);
+
+    void unsubscribeReaction(CoRe::CREngine::ReactionType type);
+    void unsubscribeReactions();
 
   private:
-    WorldEntity*                  owner;                   //!< the worldenity this reaction will be applied on
-    CREngine::ReactionType              type;                    //!< the reaction type
+    std::vector<ClassID>          _filters[CREngine::CR_NUMBER];  //!< an array of filter targets: for each collision type a list of filter objects
 
-    bool                          bContinuousPoll;         //!< if this is true
-    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
-    bool                          bCollided;               //!< true if the CollsionHandle has registered some new collisions
 
-    std::vector<Collision*>       collisionList;           //!< a list full of collisions
-    std::vector<ClassID>          targetList;              //!< a list of target classes for filtering @TODO TAKE SET INSTEAD OF VECTOR HERE
+    /* Misc State Informations */
+  public:
+    /** @returns true if this handle should be pulled also if there are no collisions, can also be set with this function (reference)*/
+    inline bool& bContinousPoll() { return this->_bContinuousPoll; }
+    /** @returns true if this filter should be pulled always */
+    inline bool bContinousPoll() const { return this->_bContinuousPoll; }
+    /** @returns true if this @param type Collision Reaction type is a valid number */
+    inline bool validCRType(const CREngine::ReactionType& type) const {return (type >= 0 && type < CREngine::CR_NUMBER); }
+    /** @returns true if this filter is reactive i.e. at least one filter criterion installed */
+    inline bool bReactive() const { return this->_bReactive; }
 
-    CollisionReaction*            collisionReaction;       //!< reference to the collision reaction object
+  private:
+    bool                          _bContinuousPoll;         //!< if this is true
+    bool                          _bStopOnFirstCollision;   //!< true if the cd of this object should be terminated after one match
+    bool                          _bReactive;               //!< true if this class has at least one filter criterion == one target
 
   };
Index: branches/coll_rect/src/lib/collision_reaction/collision_tube.cc
===================================================================
--- branches/coll_rect/src/lib/collision_reaction/collision_tube.cc	(revision 9895)
+++ branches/coll_rect/src/lib/collision_reaction/collision_tube.cc	(revision 9896)
@@ -33,4 +33,7 @@
 
   ObjectListDefinition(CollisionTube);
+
+  CollisionTube* CollisionTube::instance = NULL;
+
 
   /**
Index: branches/coll_rect/src/lib/collision_reaction/collision_tube.h
===================================================================
--- branches/coll_rect/src/lib/collision_reaction/collision_tube.h	(revision 9895)
+++ branches/coll_rect/src/lib/collision_reaction/collision_tube.h	(revision 9896)
@@ -48,8 +48,8 @@
     ObjectListDeclaration(CollisionTube);
 
+  public:
+    virtual ~CollisionTube();
 
-  public:
-    CollisionTube();
-    virtual ~CollisionTube();
+    inline static CollisionTube* getInstance() { if( CollisionTube::instance != NULL) CollisionTube::instance = new CollisionTube(); return CollisionTube::instance; }
 
     /** @returns true if at least one of both WorldEntities are subscribed for a collision check */
@@ -66,4 +66,6 @@
 
   private:
+    /* private std constructor since this is a singleton class */
+    CollisionTube();
     /* private copy constructor so this object can't be passed as a */
     CollisionTube(const CollisionTube& tube) {}
@@ -73,4 +75,5 @@
     std::vector<Collision*>        _collisionList;      //!< the list of collisions since the last processing
 
+    static CollisionTube*          instance;            //!< the singleton instance
   };
 
Index: branches/coll_rect/src/lib/graphics/importer/bsp_manager.cc
===================================================================
--- branches/coll_rect/src/lib/graphics/importer/bsp_manager.cc	(revision 9895)
+++ branches/coll_rect/src/lib/graphics/importer/bsp_manager.cc	(revision 9896)
@@ -46,5 +46,6 @@
 
 #include "aabb.h"
-#include "cr_defs.h"
+#include "cr_engine.h"
+#include "collision_tube.h"
 
 
@@ -1215,5 +1216,5 @@
   if( xCollisionForward)
   {
-    entity->registerCollision(COLLISION_TYPE_AXIS_X ,
+    CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_X ,
                               this->parent, entity,
                               Vector(testPlane->x, testPlane->y, testPlane->z),
@@ -1254,5 +1255,5 @@
   if( xCollisionBackward)
   {
-    entity->registerCollision(COLLISION_TYPE_AXIS_X_NEG ,
+    CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_X_NEG,
                               this->parent, entity,
                               Vector(testPlane->x, testPlane->y, testPlane->z),
@@ -1350,5 +1351,5 @@
   if( yCollisionUp)
   {
-    entity->registerCollision(COLLISION_TYPE_AXIS_Y , this->parent,
+    CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Y, this->parent,
                               entity,
                               Vector(testPlane->x, testPlane->y, testPlane->z),
@@ -1403,11 +1404,9 @@
   if( yCollisionDown)
   {
-    entity->registerCollision(COLLISION_TYPE_AXIS_Y_NEG , this->parent,
+    CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Y_NEG , this->parent,
                               entity,
                               Vector(testPlane->x, testPlane->y, testPlane->z),
                               collPos, SolidFlag);
   }
-
-
 }
 
@@ -1484,5 +1483,5 @@
 
   if( zCollisionRight) {
-    entity->registerCollision(COLLISION_TYPE_AXIS_Z , this->parent,
+    CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Z , this->parent,
                               entity,
                               Vector(testPlane->x, testPlane->y, testPlane->z),
@@ -1523,8 +1522,8 @@
 
   if( zCollisionLeft) {
-    entity->registerCollision(COLLISION_TYPE_AXIS_Z_NEG , this->parent,
-                              entity,
-                              Vector(testPlane->x, testPlane->y, testPlane->z),
-                              collPos , SolidFlag);
+    CoRe::CollisionTube::getInstance()->registerCollisionEvent( CoRe::CREngine::CR_COLLISION_TYPE_AXIS_Z_NEG , this->parent,
+                               entity,
+                               Vector(testPlane->x, testPlane->y, testPlane->z),
+                               collPos , SolidFlag);
   }
 
