Index: /orxonox/trunk/src/util/fast_factory.h
===================================================================
--- /orxonox/trunk/src/util/fast_factory.h	(revision 4946)
+++ /orxonox/trunk/src/util/fast_factory.h	(revision 4947)
@@ -64,8 +64,7 @@
 
     /** @returns the first FastFactory */
-    static FastFactory* getFirst()
-    {
-      return FastFactory::first;
-    };
+    inline static FastFactory* getFirst() { return FastFactory::first; };
+
+    static FastFactory* searchFastFactory(ClassID classID, const char* fastFactoryName = NULL);
 
   protected:
@@ -73,17 +72,10 @@
 
     /** sets the Next factory in the list @param nextFactory the next factory */
-    inline void setNext( FastFactory* nextFastFactory)
-    {
-      this->next = nextFastFactory;
-    };
+    inline void setNext( FastFactory* nextFastFactory) { this->next = nextFastFactory; };
     /** @returns the next FastFactory */
-    FastFactory* getNext() const
-      {
-        return this->next;
-      };
+    FastFactory* getNext() const { return this->next; };
 
     /** generates a new Object of the Class T */
     virtual void fabricate() = NULL;
-    static FastFactory* searchFastFactory(ClassID classID, const char* fastFactoryName = NULL);
 
   private:
Index: /orxonox/trunk/src/world_entities/weapons/test_bullet.cc
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/test_bullet.cc	(revision 4946)
+++ /orxonox/trunk/src/world_entities/weapons/test_bullet.cc	(revision 4947)
@@ -22,7 +22,9 @@
 #include "vector.h"
 #include "garbage_collector.h"
+#include "fast_factory.h"
 
 using namespace std;
 
+CREATE_FAST_FACTORY(TestBullet, CL_TEST_BULLET);
 
 /**
Index: /orxonox/trunk/src/world_entities/weapons/test_gun.cc
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/test_gun.cc	(revision 4946)
+++ /orxonox/trunk/src/world_entities/weapons/test_gun.cc	(revision 4947)
@@ -112,6 +112,6 @@
   this->setActionSound(WA_SHOOT, "sound/shot1.wav");
 
-  this->bulletFactory = tFastFactory<TestBullet>::getFastFactory(CL_TEST_BULLET, "TestBullet");
-  this->bulletFactory->prepare(100);
+  this->setProjectile(CL_TEST_BULLET);
+  this->getProjectileFactory()->prepare(100);
 }
 
@@ -158,5 +158,5 @@
 void TestGun::fire()
 {
-  Projectile* pj =  dynamic_cast<Projectile*>(this->bulletFactory->resurrect());
+  Projectile* pj =  dynamic_cast<Projectile*>(this->getProjectileFactory()->resurrect());
 
   pj->setAbsCoor(this->getEmissionPoint());
Index: /orxonox/trunk/src/world_entities/weapons/test_gun.h
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/test_gun.h	(revision 4946)
+++ /orxonox/trunk/src/world_entities/weapons/test_gun.h	(revision 4947)
@@ -54,9 +54,4 @@
 
     int leftRight;   // this will become an enum
-
-    tFastFactory<TestBullet>*       bulletFactory;  //!< The factory for fast interaction with the TestBullet Class.
-
-
-
   };
 #endif /* _TEST_GUN_H */
Index: /orxonox/trunk/src/world_entities/weapons/weapon.cc
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/weapon.cc	(revision 4946)
+++ /orxonox/trunk/src/world_entities/weapons/weapon.cc	(revision 4947)
@@ -80,5 +80,6 @@
   this->emissionPoint.setParent(this);
 
-  this->projectile = NULL;
+  this->projectile = CL_NULL;
+  this->projectileFactory = NULL;
 
   this->hideInactive = true;
@@ -93,4 +94,19 @@
 }
 
+/**
+ * sets the Projectile to use for this weapon.
+ * @param projectile The ID of the Projectile to use
+ *
+ * be aware, that this function does not create Factories, as this is job of Bullet-classes.
+ */
+bool Weapon::setProjectile(ClassID projectile)
+{
+  if (projectile == CL_NULL)
+    return false;
+  this->projectile = projectile;
+  this->projectileFactory = FastFactory::searchFastFactory(projectile);
+  if (this->projectileFactory == NULL)
+    return false;
+};
 
 /**
@@ -446,5 +462,5 @@
   bool retVal = true;
 
-  if (this->projectile == NULL)
+//  if (this->projectile == NULL)
   {
     PRINTF(2)("There was no projectile assigned to the Weapon.\n");
Index: /orxonox/trunk/src/world_entities/weapons/weapon.h
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/weapon.h	(revision 4946)
+++ /orxonox/trunk/src/world_entities/weapons/weapon.h	(revision 4947)
@@ -20,4 +20,5 @@
 
 #include "world_entity.h"
+#include "fast_factory.h"
 
 // FORWARD DECLARATION
@@ -79,6 +80,9 @@
     ////////////////////
 
+    // INTERACTIVITY //
     void requestAction(WeaponAction action);
     float increaseEnergy(float energyToAdd);
+    ///////////////////
+
 
     /** @returns true if the Weapon is Active  (this is used to check if the weapon must be drawn)*/
@@ -88,8 +92,10 @@
 
     // FUNCTIONS TO SET THE WEAPONS PROPERTIES.
-    /** @param projectile a projectile for this weapon */
-    void setProjectile(Projectile* projectile) { this->projectile = projectile; };
-    /** @returns The projectile if availiable */
-    Projectile* getProjectile() { return this->projectile; };
+    bool setProjectile(ClassID projectile);
+    /** @returns The projectile's classID */
+    inline ClassID getProjectile() { return this->projectile; };
+    /** @returns the FastFactory, that creates Projectiles of type getProjectile */
+    inline FastFactory* getProjectileFactory() { return this->projectileFactory; };
+
 
     void setEmissionPoint(const Vector& point);
@@ -188,5 +194,6 @@
     bool                 chargeable;                      //!< if the Weapon is charcheable (if true, the weapon will charge before it fires.)
 
-    Projectile*          projectile;                      //!< the projectile used for this weapon
+    ClassID              projectile;                      //!< the projectile used for this weapon (since they should be generated via macro and the FastFactory, only the ClassID must be known.)
+    FastFactory*         projectileFactory;               //!< A factory, that produces and handles the projectiles.
   };
 
