Index: trunk/src/lib/lang/base_object.cc
===================================================================
--- trunk/src/lib/lang/base_object.cc	(revision 5446)
+++ trunk/src/lib/lang/base_object.cc	(revision 5447)
@@ -52,5 +52,6 @@
   //  delete []this->className;
   if (this->objectName)
-    delete[] this->objectName;}
+    delete[] this->objectName;
+}
 
 /**
Index: trunk/src/lib/particles/particle_engine.cc
===================================================================
--- trunk/src/lib/particles/particle_engine.cc	(revision 5446)
+++ trunk/src/lib/particles/particle_engine.cc	(revision 5447)
@@ -18,6 +18,5 @@
 #include "particle_engine.h"
 
-#include "particle_system.h"
-#include "particle_emitter.h"
+#include "class_list.h"
 
 #include "list.h"
@@ -120,5 +119,4 @@
 }
 
-#include "class_list.h"
 /**
 * @brief Connects a ParticleSystem to a ParticleSystem thus emitting Particles.
@@ -216,4 +214,17 @@
 }
 
+
+/**
+ *  removes a Connection between an Emitter and a System
+ * @param connection the connection to remove
+ *
+ * \see bool ParticleEngine::breakConnection(ParticleEmitter* emitter, ParticleSystem* system)
+ */
+bool ParticleEngine::breakConnection(ParticleConnection* connection)
+{
+  this->connectionList->remove(connection);
+  return true;
+}
+
 /**
  *  removes a Connection between an Emitter and a System
@@ -221,6 +232,6 @@
  * @param system The system of the connection to remove
  * @returns true, if the connection was broken, false if the conntection was not found
-
-   only if both system and emitter are in the connection the Connection will be broken
+ *
+ * only if both system and emitter are in the connection the Connection will be broken
 */
 bool ParticleEngine::breakConnection(ParticleEmitter* emitter, ParticleSystem* system)
@@ -245,14 +256,50 @@
 /**
  *  removes a Connection between an Emitter and a System
- * @param connection the connection to remove
-
-   \see bool ParticleEngine::breakConnection(ParticleEmitter* emitter, ParticleSystem* system)
-*/
-bool ParticleEngine::breakConnection(ParticleConnection* connection)
-{
-  this->connectionList->remove(connection);
-  return true;
-}
-
+ * @param emitter The emitter of the connections to remove
+ * @returns the count of connections that were broken, 0 if no conntection was not found
+ */
+unsigned int ParticleEngine::breakConnections(ParticleEmitter* emitter)
+{
+  unsigned int retVal = 0;
+  // look, if we have already added this connection
+  tIterator<ParticleConnection>* tmpConIt = connectionList->getIterator();
+  ParticleConnection* tmpConnection = tmpConIt->firstElement();
+  while(tmpConnection)
+  {
+    if (tmpConnection->emitter == emitter)
+    {
+      this->breakConnection(tmpConnection);
+      retVal++;
+    }
+    tmpConnection = tmpConIt->nextElement();
+  }
+  delete tmpConIt;
+  return retVal;
+}
+
+
+/**
+ *  removes a Connection between an Emitter and a System
+ * @param system The system of the connections to remove
+ * @returns the count of connections that were broken, 0 if no conntection was not found
+ */
+unsigned int ParticleEngine::breakConnections(ParticleSystem* system)
+{
+  unsigned int retVal = 0;
+  // look, if we have already added this connection
+  tIterator<ParticleConnection>* tmpConIt = connectionList->getIterator();
+  ParticleConnection* tmpConnection = tmpConIt->firstElement();
+  while(tmpConnection)
+  {
+    if (tmpConnection->system == system)
+    {
+      this->breakConnection(tmpConnection);
+      retVal++;
+    }
+    tmpConnection = tmpConIt->nextElement();
+  }
+  delete tmpConIt;
+  return retVal;
+}
 
 /**
@@ -406,2 +453,3 @@
 
 }
+
Index: trunk/src/lib/particles/particle_engine.h
===================================================================
--- trunk/src/lib/particles/particle_engine.h	(revision 5446)
+++ trunk/src/lib/particles/particle_engine.h	(revision 5447)
@@ -50,6 +50,8 @@
   bool removeSystem(ParticleSystem* system);
   bool removeEmitter(ParticleEmitter* emitter);
+  bool breakConnection(ParticleConnection* connection);
   bool breakConnection(ParticleEmitter* emitter, ParticleSystem* system);
-  bool breakConnection(ParticleConnection* connection);
+  unsigned int breakConnections(ParticleEmitter* emitter);
+  unsigned int breakConnections(ParticleSystem* system);
 
    ParticleSystem* getSystemByNumber(unsigned int number) const;
Index: trunk/src/story_entities/world.cc
===================================================================
--- trunk/src/story_entities/world.cc	(revision 5446)
+++ trunk/src/story_entities/world.cc	(revision 5447)
@@ -129,4 +129,5 @@
 
   // delete all the initialized Engines.
+  FastFactory::flushAll(true);
   delete LightManager::getInstance();
   delete TrackManager::getInstance();
@@ -138,5 +139,4 @@
   SoundEngine::getInstance()->flushAllBuffers();
   SoundEngine::getInstance()->flushAllSources();
-  FastFactory::flushAll(true);
 
 
Index: trunk/src/util/fast_factory.h
===================================================================
--- trunk/src/util/fast_factory.h	(revision 5446)
+++ trunk/src/util/fast_factory.h	(revision 5447)
@@ -29,5 +29,15 @@
  */
 #define CREATE_FAST_FACTORY(CLASS_NAME, CLASS_ID) \
-  tFastFactory<CLASS_NAME>* global_##CLASS_NAME##_FastFactory = tFastFactory<CLASS_NAME>::getFastFactory(CLASS_ID, #CLASS_NAME)
+  FastFactory* global_##CLASS_NAME##_FastFactory = tFastFactory<CLASS_NAME>::getFastFactory(CLASS_ID, #CLASS_NAME)
+/**
+ * Creates a FastFactory for a Class' static function named ClassName::fastFactory.
+ * @param CLASS_NAME the name of the Class to create the fast-factory for.
+ * @param CLASS_ID the ID of the class to create the fast-factory for @see "class_id.h"
+ *
+ * notice, that the Class to be called, must implement:
+ * static FastFactory*         fastFactory;
+ */
+#define CREATE_FAST_FACTORY_STATIC(CLASS_NAME, CLASS_ID) \
+  FastFactory* CLASS_NAME::fastFactory = tFastFactory<CLASS_NAME>::getFastFactory(CLASS_ID, #CLASS_NAME)
 
 //! A struct, that holds Lists of Objects of a certain type.
Index: trunk/src/world_entities/weapons/projectile.h
===================================================================
--- trunk/src/world_entities/weapons/projectile.h	(revision 5446)
+++ trunk/src/world_entities/weapons/projectile.h	(revision 5447)
@@ -22,5 +22,6 @@
 
 #include "world_entity.h"
-#include "vector.h"
+
+class FastFactory;
 
 class Projectile : public WorldEntity
Index: trunk/src/world_entities/weapons/test_bullet.cc
===================================================================
--- trunk/src/world_entities/weapons/test_bullet.cc	(revision 5446)
+++ trunk/src/world_entities/weapons/test_bullet.cc	(revision 5447)
@@ -18,7 +18,4 @@
 #include "test_bullet.h"
 
-#include "model.h"
-#include "vector.h"
-#include "garbage_collector.h"
 #include "fast_factory.h"
 
@@ -34,5 +31,5 @@
 using namespace std;
 
-CREATE_FAST_FACTORY(TestBullet, CL_TEST_BULLET);
+CREATE_FAST_FACTORY_STATIC(TestBullet, CL_TEST_BULLET);
 
 /**
@@ -51,8 +48,6 @@
   this->lifeSpan = 5;
 
-  this->emitter = new ParticleEmitter(Vector(0,1,0), M_2_PI, 100, 0.01);
+  this->emitter = new ParticleEmitter(Vector(0,1,0), M_2_PI, 100, 5);
   this->emitter->setParent(this);
-  this->emitter->setEmissionRate(20);
-
   this->emitter->setSpread(M_2_PI);
 }
@@ -67,4 +62,10 @@
 
   /* this is normaly done by World.cc by deleting the ParticleEngine */
+  if (TestBullet::trailParticles != NULL && ClassList::getList(CL_TEST_BULLET)->getSize() <= 1)
+  {
+    if (ClassList::exists(TestBullet::trailParticles, CL_PARTICLE_SYSTEM))
+      delete TestBullet::trailParticles;
+    TestBullet::trailParticles = NULL;
+  }
   if (TestBullet::explosionParticles != NULL && ClassList::getList(CL_TEST_BULLET)->getSize() <= 1)
   {
@@ -76,25 +77,39 @@
 }
 
+ParticleSystem* TestBullet::trailParticles = NULL;
 ParticleSystem* TestBullet::explosionParticles = NULL;
-
 
 void TestBullet::activate()
 {
   State::getWorldEntityList()->add(this);
+  if (unlikely(TestBullet::trailParticles == NULL))
+  {
+    TestBullet::trailParticles = new ParticleSystem(1000, PARTICLE_SPRITE);
+    TestBullet::trailParticles->setName("TestBulletTrailParticles");
+    TestBullet::trailParticles->setLifeSpan(.5, .3);
+    TestBullet::trailParticles->setRadius(0.0, .5);
+    TestBullet::trailParticles->setRadius(0.5, 2.0);
+    TestBullet::trailParticles->setRadius(1.0, 5.0);
+    TestBullet::trailParticles->setColor(0.0, 1,0,0,.7);
+    TestBullet::trailParticles->setColor(0.5, .8,.8,0,.5);
+    TestBullet::trailParticles->setColor(1.0, .7,.7,.7,.0);
+  }
   if (unlikely(TestBullet::explosionParticles == NULL))
   {
-    ClassList::debug(3, CL_PARTICLE_SYSTEM);
     TestBullet::explosionParticles = new ParticleSystem(1000, PARTICLE_SPRITE);
-    TestBullet::explosionParticles->setName("TestBulletTrailParticles");
+    TestBullet::explosionParticles->setName("TestBulletExplosionParticles");
     TestBullet::explosionParticles->setLifeSpan(.5, .3);
-    TestBullet::explosionParticles->setRadius(0.0, .5);
-    TestBullet::explosionParticles->setRadius(0.5, 2.0);
-    TestBullet::explosionParticles->setRadius(1.0, 5.0);
-    TestBullet::explosionParticles->setColor(0.0, 1,0,0,.7);
+    TestBullet::explosionParticles->setRadius(0.0, 10);
+    TestBullet::explosionParticles->setRadius(.5, 20.0);
+    TestBullet::explosionParticles->setRadius(1.0, 3.0);
+    TestBullet::explosionParticles->setColor(0.0, 0,1,0,.7);
     TestBullet::explosionParticles->setColor(0.5, .8,.8,0,.5);
-    TestBullet::explosionParticles->setColor(1.0, .7,.7,.7,.0);
+    TestBullet::explosionParticles->setColor(1.0, 1,1,1,.0);
   }
 
-  ParticleEngine::getInstance()->addConnection(this->emitter, TestBullet::explosionParticles);
+  ParticleEngine::getInstance()->addConnection(this->emitter, TestBullet::trailParticles);
+
+  this->emitter->setEmissionRate(20.0);
+  this->emitter->setEmissionVelocity(10.0);
 }
 
@@ -102,8 +117,10 @@
 void TestBullet::deactivate()
 {
-  ParticleEngine::getInstance()->breakConnection(this->emitter, TestBullet::explosionParticles);
+  ParticleEngine::getInstance()->breakConnections(this->emitter);
+  this->lifeCycle = 0.0;
 
-  GarbageCollector::getInstance()->collect(this);
-  this->lifeCycle = 0.0;
+//  GarbageCollector::getInstance()->collect(this);
+  State::getWorldEntityList()->remove(this);
+  TestBullet::fastFactory->kill(this);
 }
 
@@ -111,5 +128,7 @@
 void TestBullet::collidesWith(WorldEntity* entity, const Vector& location)
 {
-
+  if (this->hitEntity != entity && entity->isA(CL_NPC))
+    this->destroy();
+  this->hitEntity = entity;
 }
 
@@ -125,10 +144,10 @@
 
   this->lifeCycle += time/this->lifeSpan;
-  if( this->lifeCycle >= 1)
+  if( this->lifeCycle >= 1.0)
     {
       PRINTF(5)("FINALIZE==========================\n");
       PRINTF(5)("current life cycle is: %f\n", this->lifeCycle);
       PRINTF(5)("FINALIZE===========================\n");
-//      this->finalize();
+
       this->deactivate();
     }
@@ -140,8 +159,12 @@
 void TestBullet::destroy ()
 {
-  this->deactivate();
+  printf("DESTROY TestBullet\n");
+  this->lifeCycle = .95;
+  ParticleEngine::getInstance()->breakConnection(this->emitter, TestBullet::trailParticles);
+  ParticleEngine::getInstance()->addConnection(this->emitter, TestBullet::explosionParticles);
 
-
-  GarbageCollector::getInstance()->collect(this);
+  this->emitter->setEmissionRate(1000.0);
+  this->emitter->setEmissionVelocity(50.0);
+//  this->deactivate();
 
 }
Index: trunk/src/world_entities/weapons/test_bullet.h
===================================================================
--- trunk/src/world_entities/weapons/test_bullet.h	(revision 5446)
+++ trunk/src/world_entities/weapons/test_bullet.h	(revision 5447)
@@ -13,4 +13,5 @@
 class ParticleSystem;
 class ParticleEmitter;
+class FastFactory;
 
 class TestBullet : public Projectile
@@ -33,6 +34,12 @@
 
   private:
-    static ParticleSystem*     explosionParticles;
-    ParticleEmitter*           emitter;
+    static FastFactory*               fastFactory;
+    static ParticleSystem*            trailParticles;
+    static ParticleSystem*            explosionParticles;
+
+    ParticleEmitter*                  emitter;
+
+
+    WorldEntity* hitEntity; // FIXME TEMPORARY
 
 };
