Index: branches/new_class_id/src/lib/BuildLibs.am
===================================================================
--- branches/new_class_id/src/lib/BuildLibs.am	(revision 9705)
+++ branches/new_class_id/src/lib/BuildLibs.am	(revision 9709)
@@ -1,15 +1,9 @@
 
 libORXlibs_a_LIBRARIES_ = \
-                $(LIB_PREFIX)/util/libORXlibutil.a \
-                $(LIB_PREFIX)/shell/libORXshell.a \
                 $(LIB_PREFIX)/event/libORXevent.a \
                 $(LIB_PREFIX)/gui/qt/libORXqtgui.a \
                 $(LIB_PREFIX)/gui/gl/libORXglgui.a \
                 $(LIB_PREFIX)/gui/libORXbasegui.a \
-                $(LIB_PREFIX)/script_engine/libORXscript.a \
-                $(LIB_PREFIX)/graphics/importer/libORXimporter.a \
                 $(LIB_PREFIX)/graphics/libORXgraphics.a \
-                $(LIB_PREFIX)/graphics/importer/libtc.a \
-                $(LIB_PREFIX)/sound/libORXsound.a \
                 $(LIB_PREFIX)/particles/libORXparticles.a \
                 $(LIB_PREFIX)/collision_detection/libORXcd.a \
@@ -23,7 +17,15 @@
                 $(LIB_PREFIX)/physics/libORXphysics.a \
                 $(LIB_PREFIX)/gui/gl/libORXglgui.a \
+                \
+                $(LIB_PREFIX)/util/libORXlibutil.a \
+                \
+                $(LIB_PREFIX)/graphics/importer/libORXimporter.a \
+                $(LIB_PREFIX)/graphics/importer/libtc.a \
+                $(LIB_PREFIX)/sound/libORXsound.a \
                 $(LIB_PREFIX)/shell/libORXshell.a \
-                $(LIB_PREFIX)/math/libORXmath.a \
+                $(LIB_PREFIX)/script_engine/libORXscript.a \
+                $(LIB_PREFIX)/util/libORXexecutor.a \
                 $(LIB_PREFIX)/util/libORXlibutil.a \
                 $(LIB_PREFIX)/lang/libORXlang.a \
-                $(LIB_PREFIX)/libORXlibs.a
+                $(LIB_PREFIX)/libORXlibs.a \
+                $(LIB_PREFIX)/math/libORXmath.a
Index: branches/new_class_id/src/lib/Makefile.am
===================================================================
--- branches/new_class_id/src/lib/Makefile.am	(revision 9705)
+++ branches/new_class_id/src/lib/Makefile.am	(revision 9709)
@@ -16,6 +16,6 @@
 		data/data_tank.h
 
-SUBDIRS =
-#	. \
+SUBDIRS = \
+	. \
 	math \
 	lang \
Index: branches/new_class_id/src/lib/coord/p_node.cc
===================================================================
--- branches/new_class_id/src/lib/coord/p_node.cc	(revision 9705)
+++ branches/new_class_id/src/lib/coord/p_node.cc	(revision 9709)
@@ -29,4 +29,6 @@
 #include "color.h"
 
+
+NewObjectListDefinition(PNode);
 /**
  * @brief standard constructor
Index: branches/new_class_id/src/lib/graphics/effects/cloud_effect.cc
===================================================================
--- branches/new_class_id/src/lib/graphics/effects/cloud_effect.cc	(revision 9705)
+++ branches/new_class_id/src/lib/graphics/effects/cloud_effect.cc	(revision 9709)
@@ -40,4 +40,5 @@
 float     CloudEffect::fadeTime;
 
+NewObjectListDefinitionID(CloudEffect, CL_CLOUD_EFFECT);
 
 
@@ -56,6 +57,5 @@
 
 
-CREATE_FACTORY(CloudEffect, CL_CLOUD_EFFECT);
-NewObjectListDefinitionID(CloudEffect, CL_CLOUD_EFFECT);
+CREATE_FACTORY(CloudEffect);
 
 CloudEffect::CloudEffect(const TiXmlElement* root) {
Index: branches/new_class_id/src/lib/graphics/effects/fog_effect.cc
===================================================================
--- branches/new_class_id/src/lib/graphics/effects/fog_effect.cc	(revision 9705)
+++ branches/new_class_id/src/lib/graphics/effects/fog_effect.cc	(revision 9709)
@@ -22,4 +22,5 @@
 #include "cloud_effect.h"
 
+NewObjectListDefinition(FogEffect);
 // Define shell commands
 //SHELL_COMMAND(activate, FogEffect, activateFog);
@@ -37,6 +38,5 @@
                        );
 
-CREATE_FACTORY(FogEffect, CL_FOG_EFFECT);
-NewObjectListDefinition(FogEffect);
+CREATE_FACTORY(FogEffect);
 
 /**
Index: branches/new_class_id/src/lib/graphics/effects/lense_flare.cc
===================================================================
--- branches/new_class_id/src/lib/graphics/effects/lense_flare.cc	(revision 9705)
+++ branches/new_class_id/src/lib/graphics/effects/lense_flare.cc	(revision 9709)
@@ -35,6 +35,6 @@
 #include "class_id.h"
 
-CREATE_FACTORY(LenseFlare, CL_LENSE_FLARE);
 NewObjectListDefinitionID(LenseFlare, CL_LENSE_FLARE);
+CREATE_FACTORY(LenseFlare);
 
 /**
Index: branches/new_class_id/src/lib/graphics/effects/lightning_effect.cc
===================================================================
--- branches/new_class_id/src/lib/graphics/effects/lightning_effect.cc	(revision 9705)
+++ branches/new_class_id/src/lib/graphics/effects/lightning_effect.cc	(revision 9709)
@@ -29,4 +29,6 @@
 #include "class_id.h"
 
+NewObjectListDefinitionID(LightningEffect, CL_LIGHTNING_EFFECT);
+
 SHELL_COMMAND(activate, LightningEffect, activateLightning);
 SHELL_COMMAND(deactivate, LightningEffect, deactivateLightning);
@@ -37,6 +39,5 @@
                        );
 
-CREATE_FACTORY(LightningEffect, CL_LIGHTNING_EFFECT);
-NewObjectListDefinitionID(LightningEffect, CL_LIGHTNING_EFFECT);
+CREATE_FACTORY(LightningEffect);
 
 LightningEffect::LightningEffect(const TiXmlElement* root) {
Index: branches/new_class_id/src/lib/graphics/effects/rain_effect.cc
===================================================================
--- branches/new_class_id/src/lib/graphics/effects/rain_effect.cc	(revision 9705)
+++ branches/new_class_id/src/lib/graphics/effects/rain_effect.cc	(revision 9709)
@@ -33,4 +33,6 @@
 #include "class_id.h"
 
+NewObjectListDefinitionID(RainEffect, CL_RAIN_EFFECT);
+
 // Define shell commands
 //SHELL_COMMAND(activate, RainEffect, activateRain);
@@ -48,6 +50,5 @@
                        );
 
-CREATE_FACTORY(RainEffect, CL_RAIN_EFFECT);
-NewObjectListDefinitionID(RainEffect, CL_RAIN_EFFECT);
+CREATE_FACTORY(RainEffect);
 
 /**
Index: branches/new_class_id/src/lib/graphics/effects/snow_effect.cc
===================================================================
--- branches/new_class_id/src/lib/graphics/effects/snow_effect.cc	(revision 9705)
+++ branches/new_class_id/src/lib/graphics/effects/snow_effect.cc	(revision 9709)
@@ -32,4 +32,5 @@
 #include "class_id.h"
 
+NewObjectListDefinitionID(SnowEffect, CL_SNOW_EFFECT);
 SHELL_COMMAND(activate, SnowEffect, activateSnow);
 SHELL_COMMAND(deactivate, SnowEffect, deactivateSnow);
@@ -41,6 +42,5 @@
                        );
 
-CREATE_FACTORY(SnowEffect, CL_SNOW_EFFECT);
-NewObjectListDefinitionID(SnowEffect, CL_SNOW_EFFECT);
+CREATE_FACTORY(SnowEffect);
 
 SnowEffect::SnowEffect(const TiXmlElement* root)
Index: branches/new_class_id/src/lib/graphics/effects/volfog_effect.cc
===================================================================
--- branches/new_class_id/src/lib/graphics/effects/volfog_effect.cc	(revision 9705)
+++ branches/new_class_id/src/lib/graphics/effects/volfog_effect.cc	(revision 9709)
@@ -48,7 +48,6 @@
 
 #include "class_id.h"
-
-CREATE_FACTORY(VolFogEffect, CL_VOLFOG_EFFECT);
 NewObjectListDefinitionID(VolFogEffect, CL_VOLFOG_EFFECT);
+CREATE_FACTORY(VolFogEffect);
 
 VolFogEffect::VolFogEffect(const TiXmlElement* root) {
Index: branches/new_class_id/src/lib/graphics/light.cc
===================================================================
--- branches/new_class_id/src/lib/graphics/light.cc	(revision 9705)
+++ branches/new_class_id/src/lib/graphics/light.cc	(revision 9709)
@@ -29,6 +29,6 @@
 #include "class_id.h"
 
-CREATE_FACTORY(Light, CL_LIGHT);
 NewObjectListDefinitionID(Light, CL_LIGHT);
+CREATE_FACTORY(Light);
 
 //! Definition of the Lights and their Names
Index: branches/new_class_id/src/lib/graphics/render2D/image_plane.cc
===================================================================
--- branches/new_class_id/src/lib/graphics/render2D/image_plane.cc	(revision 9705)
+++ branches/new_class_id/src/lib/graphics/render2D/image_plane.cc	(revision 9709)
@@ -25,7 +25,7 @@
 
 #include "class_id.h"
-CREATE_FACTORY(ImagePlane, CL_IMAGE_ENTITY);
 
-NewObjectListDefinitionID(ImagePlane, CL_IMAGE_ENTITY);
+NewObjectListDefinitionID(ImagePlane, CL_IMAGE_PLANE);
+CREATE_FACTORY(ImagePlane);
 
 
Index: branches/new_class_id/src/lib/gui/gl/glmenu/glmenu_imagescreen.cc
===================================================================
--- branches/new_class_id/src/lib/gui/gl/glmenu/glmenu_imagescreen.cc	(revision 9705)
+++ branches/new_class_id/src/lib/gui/gl/glmenu/glmenu_imagescreen.cc	(revision 9709)
@@ -26,6 +26,6 @@
 
 #include "class_id.h"
-CREATE_FACTORY(GLMenuImageScreen, CL_GLMENU_IMAGE_SCREEN);
 NewObjectListDefinitionID(GLMenuImageScreen, CL_GLMENU_IMAGE_SCREEN);
+CREATE_FACTORY(GLMenuImageScreen);
 
 /**
Index: branches/new_class_id/src/lib/lang/base_object.h
===================================================================
--- branches/new_class_id/src/lib/lang/base_object.h	(revision 9705)
+++ branches/new_class_id/src/lib/lang/base_object.h	(revision 9709)
@@ -44,7 +44,7 @@
   //inline const std::string& getClassName() const { return this->className; }
   /** @returns the className of the corresponding Object as a C-compliant string (const char*) */
-  inline const char* getClassCName() const { return this->className.c_str(); };
+  inline const char* getClassCName() const { return _classes.front()._objectList->name().c_str(); };
   /** @returns the ClassName of the Topmost Object of the ClassStack */
-  inline const std::string& getClassName() const { return _classes.front()._objectList->name(); }
+  inline const std::string& getClassName() const { return _classes.front()._objectList->name(); };
 
   inline const NewClassID& getClassID() const { return *_leafClassID; }
Index: branches/new_class_id/src/lib/lang/new_class_id.cc
===================================================================
--- branches/new_class_id/src/lib/lang/new_class_id.cc	(revision 9705)
+++ branches/new_class_id/src/lib/lang/new_class_id.cc	(revision 9709)
@@ -19,16 +19,25 @@
 #include "new_object_list.h"
 
+/**
+ * @brief a Default Constructor.
+ * this Always points to the ID of the NullClass.
+ */
 NewClassID::NewClassID()
 {
-  *this = NullClass::classID();
+  NullClass::acquireID(this->_id, this->_name);
 };
 
-NewClassID::NewClassID(const NewObjectListBase* objList)
+/**
+ * @brief Acquiring the ID of a objectList.
+ * @param objList The NewObjectList to acquire the ID from.
+ */
+NewClassID::NewClassID(const NewObjectListBase* const objList)
 {
-
-  objList->acquireID(_id, _name);
-
+  objList->acquireID(this->_id, this->_name);
 }
 
 
 NewClassID NullClass::_classID;
+
+int NullClass::_nullID;
+const std::string NullClass::_nullName = std::string("NullClass");
Index: branches/new_class_id/src/lib/lang/new_class_id.h
===================================================================
--- branches/new_class_id/src/lib/lang/new_class_id.h	(revision 9705)
+++ branches/new_class_id/src/lib/lang/new_class_id.h	(revision 9709)
@@ -12,34 +12,64 @@
 class NewObjectListBase;
 
-//! A class to dynamically allocate ClassID's and support a isA operator
+//! A class to dynamically allocate ClassID's and to support a isA operator
+/**
+ * A NewClassID can only be aquired over a NewObjectList,
+ * thus enabling the developer to have permanent access to the correct ID and ClassName
+ *
+ * The Idea behind this concept is, that storing a NewClassID that changes its internal state
+ * all NewClassID's will be updated correctly.
+ *
+ * Since the Existance of any NewObjectList is a requirement during the working process all
+ * ID's should reference a valid ID and ClassName
+ */
 class NewClassID
 {
 public:
   NewClassID();
-  NewClassID(const NewObjectListBase* id);
-  // the copy constructor is also defined.
+  NewClassID(const NewObjectListBase* const id);
+  /// the copy constructor is also defined implicitely.
+
+  /** @returns A constant reference to the ID. */
   const int& id() const { return *_id; };
+  /** @returns A constant reference to the Name. */
   const std::string& name() const { return *_name; };
 
+  /** @param id the id to compare @returns true on match (match is same ID) @brief compares two id's */
   bool operator==(const NewClassID& id) const { return *_id == *id._id /* || _name == id._name */; };
+  /** @param id the id to compare @returns true on match (match is same ID) @brief compares two id's */
   bool operator==(int id) const { return *_id == id; };
+  /** @param name the id to compare @returns true on match (match is same Name) @brief compares an ID with a ClassName */
   bool operator==(const std::string& name) const { return *_name == name; };
+  /** @param id the id to compare @returns false on match (match is same ID) @brief compares two id's */
   bool operator!=(const NewClassID& id) const { return *_id != *id._id /* && _name != id._name*/;  };
+  /** @param id the id to compare @returns false on match (match is same ID) @brief compares two id's */
   bool operator!=(int id) const { return *_id != id; };
+  /** @param name the id to compare @returns false on match (match is same Name) @brief compares an ID with a ClassName */
   bool operator!=(const std::string& name) const { return *_name != name; };
 
 private:
-  const int*                _id;
-  const std::string*        _name;
+  const int*                _id;           //!< A pointer to the ID of the ClassID.
+  const std::string*        _name;         //!< A pointer to the Name of the ClassID.
 };
 
+//! A NullClass. This is the Null of the ClassID.
+/**
+ * implemented as a Class id can be used to reference NullObjects.
+ */
 class NullClass
 {
 public:
-  static NewClassID classID() { return NullClass::_classID; }
+  /** @returns the NullClass' ID. */
+  static const NewClassID& classID() { return NullClass::_classID; }
+  /** @param id the ID to acquire @param name the name to acquire @brief acquires the ID of this Class */
+  static void acquireID(const int*& id, const std::string*& name) { id = &_nullID; name = &_nullName; };
+
 private:
-  NullClass();
+  NullClass() {}; //!< The Default Constructor is hidden from the User.
+
 private:
-  static NewClassID _classID;
+  static NewClassID         _classID;      //!< The NullClass' ID
+  static const std::string  _nullName;     //!< The NullClass' Name ("NullClass")
+  static int                _nullID;       //!< The NullClass' ID
 };
 
Index: branches/new_class_id/src/lib/lang/new_object_list.cc
===================================================================
--- branches/new_class_id/src/lib/lang/new_object_list.cc	(revision 9705)
+++ branches/new_class_id/src/lib/lang/new_object_list.cc	(revision 9709)
@@ -20,4 +20,6 @@
 
 
+#include <stdio.h>
+
 /**
  * @brief Constructor, that creates an ObjectList while checking (development mode) for uniqueness of all Keys (names and ID's)
@@ -27,6 +29,7 @@
  */
 NewObjectListBase::NewObjectListBase(const std::string& className, int id)
-  : _name(className)
-{
+    : _name(className)
+{
+  printf("NewObjectList, Registered %s::%d\n", className.c_str(), id);
   if (NewObjectListBase::_classesByID == NULL)
   {
@@ -47,5 +50,5 @@
   _id = id;
   /// Some Output, that will fall out later
-  //std::cout << "register new ObjectList " << className << " ID: " << this->_id << std::endl;
+  std::cout << "register new ObjectList " << className << " ID: " << this->_id << std::endl;
 
   this->_identity = NewClassID(this);
@@ -98,4 +101,14 @@
  * @return true if such a class already exists.
  */
+bool NewObjectListBase::classIDExists(int id)
+{
+  return (NewObjectListBase::_classesByID->find(id) != NewObjectListBase::_classesByID->end());
+}
+
+/**
+ * @brief Checks if a Class with name already exists.
+ * @param name The Name of the Class to check.
+ * @return true if such a class already exists.
+ */
 bool NewObjectListBase::classNameExists(const std::string& name)
 {
@@ -108,5 +121,5 @@
  * @returns the ClassID if found and NullClass' identity if not.
  */
-const NewClassID& NewObejctListBase::retrieveIdentity(int id)
+const NewClassID& NewObjectListBase::retrieveIdentity(int id)
 {
   const NewObjectListBase* const base = NewObjectListBase::getObjectList(id);
@@ -117,4 +130,5 @@
     return NullClass::classID();
 }
+
 
 /**
@@ -130,16 +144,5 @@
     return base->_identity;
   else
-    return NullObject::classID();
-}
-
-
-/**
- * @brief Checks if a Class with name already exists.
- * @param name The Name of the Class to check.
- * @return true if such a class already exists.
- */
-bool NewObjectListBase::classIDExists(int id)
-{
-  return (NewObjectListBase::_classesByID->find(id) != NewObjectListBase::_classesByID->end());
+    return NullClass::classID();
 }
 
@@ -230,4 +233,45 @@
 }
 
+#include "base_object.h"
+
+/**
+ * @brief Prints out some debugging information about a given List.
+ */
+void NewObjectListBase::debug(unsigned int level) const
+{
+  base_list list;
+  this->getBaseObjectList(&list);
+
+  if (level > 1 || !list.empty())
+    printf(" ObjectList of class %s(id:%d) contains %d objects\n", this->name().c_str(), this->id(), list.size());
+
+  if (level >= 2)
+  {
+    printf("  - listing Instances: \n");
+    for (base_iterator it = list.begin();
+         it != list.end();
+         ++it)
+    {
+      printf("   + %s::%s\n", (*it)->getClassCName(), (*it)->getCName());
+    }
+  }
+}
+
+
+void NewObjectListBase::debugAll(unsigned int level)
+{
+  printf("Listing all %d ObjectLists \n", NewObjectListBase::_classesByID->size());
+
+  for (classNameMap::const_iterator it = NewObjectListBase::_classesByName->begin();
+       it != NewObjectListBase::_classesByName->end();
+       ++it)
+  {
+    (*it).second->debug(level);
+
+  }
+
+}
+
+
 
 /**
Index: branches/new_class_id/src/lib/lang/new_object_list.h
===================================================================
--- branches/new_class_id/src/lib/lang/new_object_list.h	(revision 9705)
+++ branches/new_class_id/src/lib/lang/new_object_list.h	(revision 9709)
@@ -48,27 +48,29 @@
   class IteratorBase { };
 
-  typedef std::list<BaseObject*>            base_list;
-  typedef base_list::iterator               base_iterator;
+  /** @brief A Typedefinition for the Base-List that can be retrieved with getBaseObjectList(base_list*) */
+  typedef std::list<BaseObject*>        base_list;
+  /** @brief An iterator for the base_list */
+  typedef base_list::iterator           base_iterator;
 
 public:
   /** @returns The Identity of the Class stored within. */
-  inline const NewClassID& identity() const { return _identity; }
+  inline const NewClassID&              identity() const { return _identity; }
   /** @returns the ID of the Identity of the ObjectList */
-  inline int id() const { return _id; };
+  inline int                            id() const { return _id; };
   /** @returns The Name of the Class stored in this ObjectList */
-  inline const std::string& name() const { return _name; };
+  inline const std::string&             name() const { return _name; };
   /** @param id The id to compare @returns true on match, false otherwise */
-  inline bool operator==(int id) const { return _id == id; };
+  inline bool                           operator==(int id) const { return _id == id; };
   /** @param id The id to compare @returns true on match, false otherwise */
-  inline bool operator==(const NewClassID& id) const { return id == _id; };
+  inline bool                           operator==(const NewClassID& id) const { return id == _id; };
   /** @param name The name to compare @returns true on match, false otherwise */
-  inline bool operator==(const std::string& name) const { return _name == name; };
+  inline bool                           operator==(const std::string& name) const { return _name == name; };
   /** @param id The id to check @returns true on match, false otherwise */
-  inline void acquireID(const int*& id, const std::string*& name) const { id = &_id; name = &_name; };
+  inline void                           acquireID(const int*& id, const std::string*& name) const { id = &_id; name = &_name; };
   /** @brief fills a list of Objects into a BaseObject*-List. @param list the list to fill */
-  virtual void getBaseObjectList(base_list* list) const = 0;
-
-  static const NewClassID& retrieveIdentity(int id);
-  static const NewClassID& retrieveIdentity(const std::string& name);
+  virtual void                          getBaseObjectList(base_list* list) const = 0;
+
+  static const NewClassID&              retrieveIdentity(int id);
+  static const NewClassID&              retrieveIdentity(const std::string& name);
 
   static const NewObjectListBase* const getObjectList(int classID);
@@ -76,21 +78,23 @@
   static const NewObjectListBase* const getObjectList(const NewClassID& classID);
 
-  static BaseObject* getBaseObject(int classID, const std::string& objectName);
-  static BaseObject* getBaseObject(const std::string& className, const std::string& objectName);
-  static BaseObject* getBaseObject(const NewClassID& classID, const std::string& objectName);
+  static BaseObject*                    getBaseObject(int classID, const std::string& objectName);
+  static BaseObject*                    getBaseObject(const std::string& className, const std::string& objectName);
+  static BaseObject*                    getBaseObject(const NewClassID& classID, const std::string& objectName);
 
   /** @returns an Object with Name name out of this List @param name the name of the Object. */
-  virtual BaseObject* getBaseObject(const std::string& name) const = 0;
+  virtual BaseObject*                   getBaseObject(const std::string& name) const = 0;
 
   static const std::list<std::string>&  getClassNames();
 
+
   static unsigned int                   classCount();
+  void                                  debug(unsigned int level) const;
+  static void                           debugAll(unsigned int level);
+
   static const std::string&             IDToString(int classID);
   static int                            StringToID(const std::string& className);
 
-  virtual void debug() const = 0;
-
   //! Only uset to unsubscribe a BaseObject.
-  virtual void unregisterObject(IteratorBase* _iterators) = 0;
+  virtual void                          unregisterObject(IteratorBase* _iterators) = 0;
 
 protected:
@@ -101,6 +105,6 @@
   NewObjectListBase(const NewObjectListBase&);
 
-  static bool classIDExists(int id);
-  static bool classNameExists(const std::string& className);
+  static bool                         classIDExists(int id);
+  static bool                         classNameExists(const std::string& className);
 
 
@@ -126,4 +130,13 @@
 //! Defines a ObjectsList handler for objects of type T.
 /**
+ * The ObjectList is a generic way to store every object created from a Class 'T'
+ *  into a List. The list can be retrieved, and used constantly over iterators,
+ *  as with normal std::list.
+ *
+ * Furthermore the linkage over the single Lists is given over the Superclass NewObjectListBase.
+ *
+ *
+ *
+ *
  * To define a Class with a ObjectList, you have to:
  *  1. Include 'NewObjectListDeclaration(T);' in its Declaration (at the beginning)
@@ -132,4 +145,22 @@
  *
  * @note The Class must define the compare with const std::string& operator for this to work.
+ *
+ *
+ *
+ * Limitations:
+ *  ObjectList cannot be used with other Factory style Classes, if the class is also a BaseObject,
+ *   and not loaded before the ObjectList.
+ *
+ * @example Iterating: Iteration is made easy, and fast as follows:
+ *   for (NewObjectList<PlayerStats>::const_iterator it = PlayerStats::objectList().begin();
+ *      it != PlayerStats::objectList().end();
+ *     ++it)
+ *   {
+ *    (*it)->dosomething
+ *   }
+ *
+ * @example Find an Object:
+ * Playable* playable = Playable::objectList("orxonox-super-rocket-fighter"); // searches an Object By its name.
+ *
  */
 template<class T>
@@ -154,27 +185,33 @@
   ~NewObjectList();
 
-  virtual BaseObject*     getBaseObject(const std::string& name) const;
-  T*                      getObject(const std::string& name) const;
-  inline const list&      objects() const { return _objects; };
-  bool exists(const T* const object) const;
-
-  inline iterator begin() { return _objects.begin(); };
-  inline const_iterator begin() const { return _objects.begin(); };
-  inline iterator  end() { return _objects.end(); };
-  inline const_iterator  end() const { return _objects.end(); };
-
-  inline bool empty() const { return _objects.empty(); };
-  inline int size() const { return _objects.size(); };
-  inline T* front() const { return _objects.front(); };
-  inline T* back() const { return _objects.back(); };
-
-
-  NewObjectListBase::IteratorBase* registerObject(T* object);
-  virtual void unregisterObject(IteratorBase* iterator);
-
-  virtual void debug() const;
+  virtual BaseObject*                getBaseObject(const std::string& name) const;
+  T*                                 getObject(const std::string& name) const;
+  inline const list&                 objects() const { return _objects; };
+  bool                               exists(const T* const object) const;
+
+  /** @returns an Iterator to the beginning of the List. */
+  inline iterator                    begin() { return _objects.begin(); };
+  /** @returns a constant Iterator to the beginning of the List. */
+  inline const_iterator              begin() const { return _objects.begin(); };
+  /** @returns an Iterator to the end of the List. */
+  inline iterator                    end() { return _objects.end(); };
+  /** @returns a constant Iterator to the beginning of the List. */
+  inline const_iterator              end() const { return _objects.end(); };
+
+  /** @returns true if the List is empty. */
+  inline bool                        empty() const { return _objects.empty(); };
+  /** @returns the size of the List */
+  inline int                         size() const { return _objects.size(); };
+  /** @returns the frontmost Element of the list (normaly the last added Object). */
+  inline T*                          front() const { return _objects.front(); };
+  /** @returns the last added Object */
+  inline T*                          back() const { return _objects.back(); };
+
+
+  NewObjectListBase::IteratorBase*   registerObject(T* object);
+  virtual void                       unregisterObject(IteratorBase* iterator);
 
 protected:
-  virtual void getBaseObjectList(NewObjectListBase::base_list* list) const;
+  virtual void                       getBaseObjectList(NewObjectListBase::base_list* list) const;
 
 
@@ -184,5 +221,5 @@
 
 private:
-  list                _objects;
+  list                _objects;     //!< The List of stored Objects of Type T.
 };
 
@@ -212,6 +249,5 @@
   if (!_objects.empty())
   {
-    std::cout << "There are still Object in the ObjectList of " << this->name() << "(id:" << this->id() << ")\n";
-    this->debug();
+    // std::cout << "There are " << this->size() << " objects from class " << this->name() << "(id:" << this->id() << ") in existance\n";
   }
 }
@@ -279,6 +315,6 @@
 NewObjectListBase::IteratorBase* NewObjectList<T>::registerObject(T* object)
 {
-  this->_objects.push_front(object);
-  return new Iterator(this->_objects.begin());
+  this->_objects.push_back(object);
+  return new Iterator(--this->_objects.end());
 }
 
@@ -294,17 +330,3 @@
 }
 
-/**
- * @brief print out some debug information
- * @note this function will most probably vanish from here and be completely moved to the base class.
- */
-template <class T>
-void NewObjectList<T>::debug() const
-{
-  const_iterator it;
-  for (it = this->_objects.begin(); it != this->_objects.end(); ++it)
-  {
-    std::cout << (*it)->getName() << std::endl;
-  }
-}
-
 #endif /* _NEW_OBJECT_LIST_H */
Index: branches/new_class_id/src/lib/network/monitor/network_stats_widget.cc
===================================================================
--- branches/new_class_id/src/lib/network/monitor/network_stats_widget.cc	(revision 9705)
+++ branches/new_class_id/src/lib/network/monitor/network_stats_widget.cc	(revision 9709)
@@ -29,6 +29,4 @@
 // SHELL_COMMAND(gui, NetworkStatsWidget, toggleGUI)
 // ->setAlias("ProxyGui");
-
-NewObjectListDefinition(NetworkStatsWidget);
 
 HostWidget::HostWidget(const std::string& name, const IP& ip)
@@ -212,4 +210,6 @@
 //======================================================//
 
+
+NewObjectListDefinition(NetworkStatsWidget);
 /**
  * @brief standard constructor
Index: branches/new_class_id/src/lib/network/network_stream.cc
===================================================================
--- branches/new_class_id/src/lib/network/network_stream.cc	(revision 9705)
+++ branches/new_class_id/src/lib/network/network_stream.cc	(revision 9709)
@@ -1194,5 +1194,5 @@
           }
           else
-            b = Factory::fabricate( leafClassId );
+	    ; /// FIXME NEW_CLASS_ID :: b = Factory::fabricate( leafClassId );
 
           if ( !b )
Index: branches/new_class_id/src/lib/network/player_stats.cc
===================================================================
--- branches/new_class_id/src/lib/network/player_stats.cc	(revision 9705)
+++ branches/new_class_id/src/lib/network/player_stats.cc	(revision 9709)
@@ -32,6 +32,6 @@
 #include "class_id.h"
 
-CREATE_FACTORY(PlayerStats, CL_PLAYER_STATS);
 NewObjectListDefinitionID(PlayerStats, CL_PLAYER_STATS);
+CREATE_FACTORY(PlayerStats);
 
 /**
Index: branches/new_class_id/src/lib/particles/box_emitter.cc
===================================================================
--- branches/new_class_id/src/lib/particles/box_emitter.cc	(revision 9705)
+++ branches/new_class_id/src/lib/particles/box_emitter.cc	(revision 9709)
@@ -26,6 +26,7 @@
 #include "class_id.h"
 
-CREATE_FACTORY(BoxEmitter, CL_BOX_EMITTER);
 NewObjectListDefinitionID(BoxEmitter, CL_BOX_EMITTER);
+CREATE_FACTORY(BoxEmitter);
+
 /**
  *  standard constructor
Index: branches/new_class_id/src/lib/particles/dot_emitter.cc
===================================================================
--- branches/new_class_id/src/lib/particles/dot_emitter.cc	(revision 9705)
+++ branches/new_class_id/src/lib/particles/dot_emitter.cc	(revision 9709)
@@ -27,6 +27,6 @@
 
 #include "class_id.h"
-CREATE_FACTORY(DotEmitter, CL_DOT_EMITTER);
 NewObjectListDefinitionID(DotEmitter, CL_DOT_EMITTER);
+CREATE_FACTORY(DotEmitter);
 
 /**
Index: branches/new_class_id/src/lib/particles/dot_particles.cc
===================================================================
--- branches/new_class_id/src/lib/particles/dot_particles.cc	(revision 9705)
+++ branches/new_class_id/src/lib/particles/dot_particles.cc	(revision 9709)
@@ -26,6 +26,6 @@
 #include "class_id.h"
 
-CREATE_FACTORY(DotParticles, CL_DOT_PARTICLES);
 NewObjectListDefinitionID(DotParticles, CL_DOT_PARTICLES);
+CREATE_FACTORY(DotParticles);
 
 SHELL_COMMAND(texture, DotParticles, setMaterialTexture)
Index: branches/new_class_id/src/lib/particles/model_particles.cc
===================================================================
--- branches/new_class_id/src/lib/particles/model_particles.cc	(revision 9705)
+++ branches/new_class_id/src/lib/particles/model_particles.cc	(revision 9709)
@@ -26,6 +26,6 @@
 #include "class_id.h"
 
-CREATE_FACTORY(ModelParticles, CL_MODEL_PARTICLES);
 NewObjectListDefinitionID(ModelParticles, CL_MODEL_PARTICLES);
+CREATE_FACTORY(ModelParticles);
 
 SHELL_COMMAND(texture, ModelParticles, setMaterialTexture)
Index: branches/new_class_id/src/lib/particles/plane_emitter.cc
===================================================================
--- branches/new_class_id/src/lib/particles/plane_emitter.cc	(revision 9705)
+++ branches/new_class_id/src/lib/particles/plane_emitter.cc	(revision 9709)
@@ -26,6 +26,6 @@
 #include "class_id.h"
 
-CREATE_FACTORY(PlaneEmitter, CL_PLANE_EMITTER);
 NewObjectListDefinitionID(PlaneEmitter, CL_PLANE_EMITTER);
+CREATE_FACTORY(PlaneEmitter);
 
 /**
Index: branches/new_class_id/src/lib/particles/spark_particles.cc
===================================================================
--- branches/new_class_id/src/lib/particles/spark_particles.cc	(revision 9705)
+++ branches/new_class_id/src/lib/particles/spark_particles.cc	(revision 9709)
@@ -26,6 +26,6 @@
 #include "class_id.h"
 
-CREATE_FACTORY(SparkParticles, CL_SPARK_PARTICLES);
 NewObjectListDefinitionID(SparkParticles, CL_SPARK_PARTICLES);
+CREATE_FACTORY(SparkParticles);
 
 /**
Index: branches/new_class_id/src/lib/particles/sprite_particles.cc
===================================================================
--- branches/new_class_id/src/lib/particles/sprite_particles.cc	(revision 9705)
+++ branches/new_class_id/src/lib/particles/sprite_particles.cc	(revision 9709)
@@ -26,6 +26,6 @@
 #include "class_id.h"
 
-CREATE_FACTORY(SpriteParticles, CL_SPRITE_PARTICLES);
 NewObjectListDefinitionID(SpriteParticles, CL_SPRITE_PARTICLES);
+CREATE_FACTORY(SpriteParticles);
 
 SHELL_COMMAND(texture, SpriteParticles, setMaterialTexture)
Index: branches/new_class_id/src/lib/physics/fields/gravity.cc
===================================================================
--- branches/new_class_id/src/lib/physics/fields/gravity.cc	(revision 9705)
+++ branches/new_class_id/src/lib/physics/fields/gravity.cc	(revision 9709)
@@ -24,5 +24,5 @@
 NewObjectListDefinitionID(Gravity, CL_FIELD_GRAVITY);
 
-CREATE_FACTORY(Gravity, CL_FIELD_GRAVITY);
+CREATE_FACTORY(Gravity);
 
 Gravity::Gravity(const TiXmlElement* root)
Index: branches/new_class_id/src/lib/physics/physics_connection.cc
===================================================================
--- branches/new_class_id/src/lib/physics/physics_connection.cc	(revision 9705)
+++ branches/new_class_id/src/lib/physics/physics_connection.cc	(revision 9709)
@@ -28,7 +28,6 @@
 
 #include "class_id.h"
-
-CREATE_FACTORY(PhysicsConnection, CL_PHYSICS_CONNECTION);
 NewObjectListDefinition(PhysicsConnection);
+CREATE_FACTORY(PhysicsConnection);
 /**
  *  creates a PhysicsConnection
Index: branches/new_class_id/src/lib/script_engine/script.cc
===================================================================
--- branches/new_class_id/src/lib/script_engine/script.cc	(revision 9705)
+++ branches/new_class_id/src/lib/script_engine/script.cc	(revision 9709)
@@ -22,4 +22,6 @@
 #include "loading/load_param.h"
 #include "parser/tinyxml/tinyxml.h"
+
+NewObjectListDefinition(Script);
 
 CREATE_SCRIPTABLE_CLASS(Script, Script::classID(),
@@ -30,5 +32,4 @@
                      );
 
-NewObjectListDefinition(Script);
 
 Script::Script(const TiXmlElement* root)
Index: branches/new_class_id/src/lib/script_engine/script_class.h
===================================================================
--- branches/new_class_id/src/lib/script_engine/script_class.h	(revision 9705)
+++ branches/new_class_id/src/lib/script_engine/script_class.h	(revision 9709)
@@ -29,8 +29,4 @@
 public:
   virtual ~ScriptClass();
-
-  const std::string& getName() const { return this->getName(); }
-  bool operator==(const std::string& name) const { return (this->getName() == name); }
-  bool operator==(NewClassID classID) const { return (this->_classID == classID); }
 
   virtual void registerClass(Script* script) = 0;
Index: branches/new_class_id/src/lib/shell/Makefile.am
===================================================================
--- branches/new_class_id/src/lib/shell/Makefile.am	(revision 9705)
+++ branches/new_class_id/src/lib/shell/Makefile.am	(revision 9709)
@@ -18,6 +18,6 @@
 		shell_buffer.h \
 		shell_input.h \
+		shell_command_class.h \
 		shell_command.h \
-		shell_command_class.h \
 		shell_completion.h \
 		shell_completion_plugin.h
Index: branches/new_class_id/src/lib/shell/shell_command.cc
===================================================================
--- branches/new_class_id/src/lib/shell/shell_command.cc	(revision 9705)
+++ branches/new_class_id/src/lib/shell/shell_command.cc	(revision 9709)
@@ -26,6 +26,6 @@
 namespace OrxShell
 {
+  NewObjectListDefinition(ShellCommand);
   SHELL_COMMAND(debug, ShellCommandClass, help);
-  NewObjectListDefinition(ShellCommand);
 
 
Index: branches/new_class_id/src/lib/shell/shell_completion.cc
===================================================================
--- branches/new_class_id/src/lib/shell/shell_completion.cc	(revision 9705)
+++ branches/new_class_id/src/lib/shell/shell_completion.cc	(revision 9709)
@@ -141,7 +141,9 @@
       type = ClassCompletion;
 
-    /// FIXME
-//     if (!this->addToCompleteList(*boList, objectBegin, type))
-//       return false;
+    NewObjectListBase::base_list list;
+    objectList->getBaseObjectList(&list);
+
+    if (!this->addToCompleteList(list, objectBegin, type))
+     return false;
 
     return true;
Index: branches/new_class_id/src/lib/shell/some_shell_commands.cc
===================================================================
--- branches/new_class_id/src/lib/shell/some_shell_commands.cc	(revision 9705)
+++ branches/new_class_id/src/lib/shell/some_shell_commands.cc	(revision 9709)
@@ -34,8 +34,8 @@
   SHELL_COMMAND(nick, PlayerStats, shellNick)->setAlias("nick");
 
-#include "class_list.h"
-  SHELL_COMMAND(debug, ClassList, ClassList::debugS)
-      ->describe("Shows all registered classes, if param1: is a valid ClassName only values of this class are shown. param2: how much output")
-      ->defaultValues(MT_NULL, 1);
+// #include "class_list.h"
+//   SHELL_COMMAND(debug, ClassList, ClassList::debugS)
+//       ->describe("Shows all registered classes, if param1: is a valid ClassName only values of this class are shown. param2: how much output")
+//       ->defaultValues(MT_NULL, 1);
 
 #include "p_node.h"
Index: branches/new_class_id/src/lib/util/Makefile.am
===================================================================
--- branches/new_class_id/src/lib/util/Makefile.am	(revision 9705)
+++ branches/new_class_id/src/lib/util/Makefile.am	(revision 9709)
@@ -2,5 +2,12 @@
 include $(MAINSRCDIR)/defs/include_paths.am
 
-noinst_LIBRARIES = libORXlibutil.a
+noinst_LIBRARIES = \
+		libORXlibutil.a \
+		libORXexecutor.a
+
+libORXexecutor_a_SOURCES = \
+		executor/executor.cc \
+		executor/executor_functional.cc \
+		executor/executor_lua.cc
 
 libORXlibutil_a_SOURCES = \
@@ -9,7 +16,4 @@
 		helper_functions.cc \
 		multi_type.cc \
-		executor/executor.cc \
-		executor/executor_functional.cc \
-		executor/executor_lua.cc \
 		\
 		loading/resource_manager.cc \
@@ -19,5 +23,5 @@
 		loading/load_param_description.cc \
 		loading/factory.cc \
-		loading/dynamic_loader.cc \
+		loading/fast_factory.cc \
 		\
 		filesys/file.cc \
@@ -28,4 +32,6 @@
 		threading.cc \
 		timer.cc
+
+#		loading/dynamic_loader.cc
 
 
@@ -55,4 +61,5 @@
 		loading/load_param_description.h \
 		loading/factory.h \
+		loading/fast_factory.h \
 		loading/dynamic_loader.h \
 		\
Index: branches/new_class_id/src/lib/util/loading/dynamic_loader.cc
===================================================================
--- branches/new_class_id/src/lib/util/loading/dynamic_loader.cc	(revision 9705)
+++ branches/new_class_id/src/lib/util/loading/dynamic_loader.cc	(revision 9709)
@@ -31,5 +31,5 @@
 */
 DynamicLoader::DynamicLoader (const std::string& libName)
-    : Factory(NULL, 0)
+    : Factory(libName)
 {
   this->registerObject(this, DynamicLoader::_objectList);
Index: branches/new_class_id/src/lib/util/loading/factory.cc
===================================================================
--- branches/new_class_id/src/lib/util/loading/factory.cc	(revision 9705)
+++ branches/new_class_id/src/lib/util/loading/factory.cc	(revision 9709)
@@ -28,9 +28,10 @@
  * set everything to zero and define factoryName
  */
-Factory::Factory (const std::string& factoryName, int classID)
-    : _classID(classID), _className(factoryName)
+Factory::Factory (const NewClassID& classID)
+    : _classID(classID)
 {
-  this->registerObject(this, Factory::_objectList);
-  this->setName(factoryName);
+  printf("Factory::create(%s::%d)\n", classID.name().c_str(), classID.id());
+  //this->registerObject(this, Factory::_objectList);
+  this->setName(classID.name());
 
   if( Factory::_factoryList == NULL)
@@ -79,13 +80,4 @@
 }
 
-/**
- * @brief Compares the Factories Name against a given ClassName
- * @param className the Name of the Class to Query
- * @returns true on match, false otherwise.
- */
-bool Factory::operator==(const char* className) const
-{
-  return (className != NULL && this->_className == className);
-}
 
 /**
@@ -96,5 +88,5 @@
 bool Factory::operator==(const std::string& className) const
 {
-  return (this->_className == className);
+  return (this->_classID.name() == className);
 }
 
@@ -143,5 +135,4 @@
 }
 
-
 /**
  * @brief Creates a new Object of type classID
@@ -149,5 +140,5 @@
  * @returns a new Object of Type classID on match, NULL otherwise
  */
-BaseObject* Factory::fabricate(int classID)
+BaseObject* Factory::fabricate(const NewClassID& classID)
 {
   if (Factory::_factoryList == NULL)
@@ -157,21 +148,10 @@
   for (factory = Factory::_factoryList->begin(); factory != Factory::_factoryList->end(); factory++)
     if (*(*factory) == classID)
-    {
-      PRINTF(4)("Create a new Object of type %s\n", (*factory)->getCName());
-      return (*factory)->fabricateObject(NULL);
+  {
+    PRINTF(4)("Create a new Object of type %s\n", (*factory)->getCName());
+    return (*factory)->fabricateObject(NULL);
 
-    }
-  PRINTF(2)("Could not Fabricate an Object of ClassID '0x%h'\n", classID);
+  }
+  PRINTF(2)("Could not Fabricate an Object of ClassID '%d'\n", classID.id());
   return NULL;
 }
-
-
-/**
- * @brief Creates a new Object of type classID
- * @param classID the ClassID to match for the newly created Object
- * @returns a new Object of Type classID on match, NULL otherwise
- */
-BaseObject* Factory::fabricate(const NewClassID& classID)
-{
-  return Factory::fabricate(classID.id());
-}
Index: branches/new_class_id/src/lib/util/loading/factory.h
===================================================================
--- branches/new_class_id/src/lib/util/loading/factory.h	(revision 9705)
+++ branches/new_class_id/src/lib/util/loading/factory.h	(revision 9709)
@@ -20,6 +20,6 @@
 
 
-#ifndef _FACTORY_H
-#define _FACTORY_H
+#ifndef __FACTORY_H
+#define __FACTORY_H
 
 class BaseObject;
@@ -27,5 +27,4 @@
 #include "parser/tinyxml/tinyxml.h"
 #include "base_object.h"
-#include <vector>
 #include <list>
 
@@ -34,6 +33,6 @@
  * this should be used at the beginning of all the Classes that should be loadable (in the cc-file)
  */
-#define CREATE_FACTORY(CLASS_NAME, CLASS_ID) \
-    tFactory<CLASS_NAME>* global_##CLASS_NAME##_Factory = new tFactory<CLASS_NAME>(#CLASS_NAME, CLASS_ID)
+#define CREATE_FACTORY(CLASS_NAME) \
+    tFactory<CLASS_NAME>* global_##CLASS_NAME##_Factory = new tFactory<CLASS_NAME>(CLASS_NAME::classID())
 
 //! The Factory is a loadable object handler
@@ -48,19 +47,20 @@
   static  BaseObject* fabricate(const std::string& className);
   static  BaseObject* fabricate(const NewClassID& classID);
-  static  BaseObject* fabricate(int classID);
-  static  BaseObject* fabricate(const TiXmlElement* root = NULL);
+  static  BaseObject* fabricate(const TiXmlElement* root);
 
 
   bool operator==(int classID) const;
-  bool operator==(const char* className) const;
   bool operator==(const std::string& className) const;
+  bool operator==(const NewClassID& classID) const { return _classID == classID; };
 
 protected:
-  Factory (const std::string& factoryName, int classID);
+  Factory (const NewClassID& id);
   virtual BaseObject* fabricateObject(const TiXmlElement* root = NULL) const = 0;
 
+private:
+  Factory (const Factory&) {};
+
 protected:
-  const int                     _classID;              //!< The Class-Identifyer of the Factory.
-  const std::string             _className;            //!< The name of the Class.
+  const NewClassID              _classID;              //!< The Class-Identifyer of the Factory.
   static std::list<Factory*>*   _factoryList;          //!< List of Registered Factories
 };
@@ -78,9 +78,10 @@
    * @param classID the ID of the Class to be created.
    */
-  tFactory (const char* factoryName, int classID)
-      : Factory(factoryName, classID)
+  tFactory (const NewClassID& classID)
+      : Factory(classID)
   {  }
 
 private:
+  tFactory (const tFactory&) {};
   /**
    * @brief fabricates an Object of type T, with the constructor T::T(const TiXmlElemnt*)
Index: branches/new_class_id/src/lib/util/loading/fast_factory.cc
===================================================================
--- branches/new_class_id/src/lib/util/loading/fast_factory.cc	(revision 9709)
+++ branches/new_class_id/src/lib/util/loading/fast_factory.cc	(revision 9709)
@@ -0,0 +1,284 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+### File Specific:
+   main-programmer: Benjamin Grauer
+*/
+
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_LOAD
+
+#include "fast_factory.h"
+
+#include "compiler.h"
+#include "debug.h"
+#include <string.h>
+
+
+NewObjectListDefinition(FastFactory);
+
+/**
+ * @brief Initializes a FastFactory
+ * @param classID the ClassID this Class belongs to (the top-most)
+ * @param fastFactoryName the Name of the ObjectClass-handled here
+ * @return a new FastFactory
+ */
+FastFactory::FastFactory (const NewClassID& classID, const std::string& fastFactoryName)
+{
+  this->registerObject(this, FastFactory::_objectList);
+  this->setName(fastFactoryName);
+
+  this->storedClassID = classID;
+  this->next = NULL;
+
+  this->deadList = NULL;
+  this->unusedContainers = NULL;
+
+  this->storedDeadObjects = 0;
+
+  FastFactory::registerFastFactory(this);
+}
+
+/** a reference to the First FastFactory */
+FastFactory* FastFactory::first = NULL;
+
+/**
+ *  destructor
+ * deletes all the Instances of the FastFactory.
+ */
+FastFactory::~FastFactory ()
+{
+  if (this == first)
+    this->first = NULL;
+  this->flush();
+
+  if (this->next)
+    delete this->next;
+}
+
+/**
+ * deletes all FastFactories
+ */
+void FastFactory::deleteAll()
+{
+  if (FastFactory::first)
+    delete FastFactory::first;
+}
+
+/**
+ * registers a Factory to the List of known factories.
+ * @param fastFactory The factory to add
+ *
+ * needed, to step through all the FastFactories.
+ */
+void FastFactory::registerFastFactory(FastFactory* fastFactory)
+{
+  PRINTF(4)("Registered FastFactory for '%s'\n", fastFactory->getCName());
+
+  if( FastFactory::first == NULL)
+    FastFactory::first = fastFactory;
+  else
+  {
+    FastFactory* tmpFac = FastFactory::first;
+    while( tmpFac->next != NULL)
+      tmpFac = tmpFac->next;
+    tmpFac->setNext(fastFactory);
+  }
+}
+
+/**
+ * searches for a FastFactory
+ * @param classID the ClassID of the FastFactory to search for
+ * @returns true if found, false otherwise.
+ */
+FastFactory* FastFactory::searchFastFactory(const NewClassID& classID)
+{
+  if (FastFactory::first == NULL)
+    return NULL;
+  else
+  {
+    FastFactory* tmpFac = FastFactory::first;
+    while (tmpFac != NULL)
+    {
+      if (tmpFac->storedClassID == classID)
+        return tmpFac;
+      tmpFac = tmpFac->next;
+    }
+  }
+  return NULL;
+}
+
+/**
+ * searches for a FastFactory
+ * @param classID the ClassID of the FastFactory to search for
+ * @returns true if found, false otherwise.
+ */
+FastFactory* FastFactory::searchFastFactory(const std::string& fastFactoryName)
+{
+  if (FastFactory::first == NULL)
+    return NULL;
+  else
+  {
+    FastFactory* tmpFac = FastFactory::first;
+    while (tmpFac != NULL)
+    {
+      if (fastFactoryName == tmpFac->getCName())
+        return tmpFac;
+      tmpFac = tmpFac->next;
+    }
+  }
+  return NULL;
+}
+
+/**
+ * Removes all the stored Containers, and sets the Lists back to emptienes.
+ * @param hardFLUSH if true the containing Objects will also be deleted !! THIS IS DANGEROUS !!
+ */
+void FastFactory::flushAll(bool hardFLUSH)
+{
+  FastFactory* tmpFac = FastFactory::first;
+  while (tmpFac != NULL)
+  {
+    PRINTF(4)("DELETEING ALL OF %s\n",tmpFac->getCName());
+    tmpFac->flush(hardFLUSH);
+    tmpFac = tmpFac->next;
+  }
+}
+
+/**
+ * ereases all the remaining containers, without deleting the stored Objects inside of them.
+ * @param hardFLUSH if the the containing Objects will also be deleted !! THIS IS DANGEROUS !!
+ */
+void FastFactory::flush(bool hardFLUSH)
+{
+  FastObjectMember* tmpMember = this->deadList, *delMember = NULL;
+  while (tmpMember != NULL)
+  {
+    delMember = tmpMember;
+    tmpMember = tmpMember->next;
+    if (hardFLUSH)
+    {
+      delete delMember->objectPointer;
+    }
+    delete delMember;
+  }
+  this->deadList = NULL;
+
+  tmpMember = this->unusedContainers;
+  while (tmpMember != NULL)
+  {
+    delMember = tmpMember;
+    tmpMember = tmpMember->next;
+    delete delMember;
+  }
+  this->unusedContainers = NULL;
+}
+
+/**
+ * generates count new Object of the Corresponding class. (precaching)
+ * @param count How many instances of the class should be generated.
+ */
+void FastFactory::prepare(unsigned int count)
+{
+/*  if (this->storedDeadObjects + this->storedLivingObjects >= count)
+  {
+  PRINTF(3)("not creating new Objects for class %s, because the requested count already exists\n", this->getClassCName());
+}*/
+  for (unsigned int i = this->storedDeadObjects; i < count; i++)
+  {
+    this->fabricate();
+  }
+}
+
+/**
+ * gives back live to one Object.
+ * @return the Object to resurrect.
+ */
+BaseObject* FastFactory::resurrect()
+{
+  PRINTF(4)("Resurecting Object of type %s\n", this->getCName());
+  if (unlikely(this->deadList == NULL))
+  {
+    PRINTF(3)("The deadList of Class %s is empty, this may be either because it has not been filled yet, or the cache is to small.\n" \
+        "  Developer: try increasing the count with FastFactory::prepare(contHigher than actual)\n" \
+        "    Fabricating a new %s\n", this->getCName(), this->getCName());
+    this->fabricate();
+    return this->resurrect();
+  }
+  else
+  {
+    FastObjectMember* tmpC = this->deadList;
+    this->deadList = this->deadList->next;
+
+    tmpC->next = this->unusedContainers;
+    this->unusedContainers = tmpC;
+
+    return tmpC->objectPointer;
+  }
+}
+
+/**
+ * gives back live to one Object.
+ * @param classID the class From which to resurrect an Object.
+ * @return the Object to resurrect, NULL if classID is not found.
+ */
+BaseObject* FastFactory::resurrect(const NewClassID& classID)
+{
+  FastFactory* tmpFac = FastFactory::getFirst();
+
+  while (tmpFac != NULL)
+  {
+    if (classID == tmpFac->storedClassID)
+      return tmpFac->resurrect();
+    tmpFac = tmpFac->next;
+  }
+  return NULL;
+}
+
+/**
+ * kills Object object, meaning, that it will be stored in the deadList of the FastFactory, and waiting for resurrection
+ * @param object the Object to kill.
+ *
+ * synony that would be really grate would be abolish, but this is more like exterminate than pause-mode.
+ */
+void FastFactory::kill(BaseObject* object)
+{
+  FastObjectMember* tmpC;
+  if (unlikely(this->unusedContainers == NULL))
+  {
+    tmpC = new FastObjectMember;
+  }
+  else
+  {
+    tmpC = this->unusedContainers;
+    this->unusedContainers = this->unusedContainers->next;
+  }
+
+  tmpC->next = this->deadList;
+  tmpC->objectPointer = object;
+  this->deadList = tmpC;
+}
+
+
+void FastFactory::kill(BaseObject* object, bool searchForFastFactory)
+{
+  if (likely(searchForFastFactory == true))
+  {
+    FastFactory* tmpFac = FastFactory::first;
+    while (tmpFac != NULL)
+    {
+      if (object->isA(tmpFac->storedClassID))
+      {
+        tmpFac->kill(object);
+        return;
+      }
+      tmpFac = tmpFac->next;
+    }
+  }
+}
Index: branches/new_class_id/src/lib/util/loading/fast_factory.h
===================================================================
--- branches/new_class_id/src/lib/util/loading/fast_factory.h	(revision 9709)
+++ branches/new_class_id/src/lib/util/loading/fast_factory.h	(revision 9709)
@@ -0,0 +1,176 @@
+/*!
+ * @file fast_factory.h
+ * The ObjectManager (FastFactory) is designed, to automatically generate and remove
+ * (without to much overhead) many instances of different classes.
+ *
+ * It is especially usefull for objects, that come only for a short time into existence,
+ * and get killed after a small amount of time (like shots).
+ *
+ * The Creation of an Object is usually done in the Weapon Class, where one subscribes
+ * a Projectile with:
+ * this->bulletFactory = tFastFactory<TestBullet>::getFastFactory(CL_TEST_BULLET, "TestBullet");
+ * (this might change over time).
+ * Then you can at loading time initialize an amount of the class with something like:
+ * this->bulletFactory->prepare(100); // creates 100 entities of TestBullet (dead ones)
+ * afterwards one can just retrieve an Object form the Class with
+ * this->bulletFactory->resurrect();  // this returns a BaseObject an Object of the class.
+ *
+ * The big difference to the FastFactory-class is, that this one is used more for the purpose
+ * of fast game-interaction than for loading. althought one can also load FastFactorized classes
+ * it is not the main topic.
+ */
+
+#ifndef _FAST_FACTORY_H
+#define _FAST_FACTORY_H
+
+#include "base_object.h"
+/**
+ * Creates a FastFactory to a Createable FastFactory.
+ */
+#define CREATE_FAST_FACTORY(CLASS_NAME, CLASS_ID) \
+  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) \
+  FastFactory* CLASS_NAME::fastFactory = tFastFactory<CLASS_NAME>::getFastFactory(CLASS_NAME::classID(), #CLASS_NAME)
+
+//! A struct, that holds Lists of Objects of a certain type.
+typedef struct FastObjectMember
+{
+  BaseObject*          objectPointer;      //!< Pointer to the Object Stored in this Class (if it is the DeadList, else it is bork)
+
+  FastObjectMember*    next;               //!< the next stored FastObjectMember. (or NULL if this is the last one stored in either the deadList or the unusedContainers)
+};
+
+//! The FastFactory is a fast loadable object creator, and Dynamic List of dead object handler.
+/**
+ * The ObjectManager (FastFactory) is designed, to automatically generate and remove
+ * (without to much overhead) many instances of different classes.
+ *
+ * FastFactory is needed to glue all the tFastFactories together.
+ * It is also the general class that implements the necessary functions
+ * to generate, resurrect kill and stuff...
+ */
+class FastFactory : public BaseObject
+{
+  NewObjectListDeclaration(FastFactory);
+
+public:
+  virtual ~FastFactory ();
+  static void deleteAll();
+
+  // functions to push and pop elements of this class
+  BaseObject* resurrect();
+  static BaseObject* resurrect(const NewClassID& classID);
+  void kill(BaseObject* object);
+  static void kill(BaseObject* object, bool searchForFastFactory);
+
+  void prepare(unsigned int count);
+
+  static void flushAll(bool hardFLUSH = false);
+  void flush(bool hardFLUSH = false);
+
+  /** @returns the first FastFactory */
+  inline static FastFactory* getFirst() { return FastFactory::first; };
+
+  static FastFactory* searchFastFactory(const NewClassID& classID);
+  static FastFactory* searchFastFactory(const std::string& fastFactoryName);
+
+  const NewClassID& getStoredID() const { return this->storedClassID; };
+
+protected:
+  FastFactory (const NewClassID& classID, const std::string& fastFactoryName = "");
+
+  /** sets the Next factory in the list @param nextFactory the next factory */
+  inline void setNext( FastFactory* nextFastFactory) { this->next = nextFastFactory; };
+  /** @returns the next FastFactory */
+  FastFactory* getNext() const { return this->next; };
+
+  /** generates a new Object of the Class T */
+  virtual void fabricate() = 0;
+
+private:
+  static void registerFastFactory(FastFactory* fastFactory);
+
+protected:
+  NewClassID            storedClassID;        //!< The classID of the specified class.
+  unsigned int          storedDeadObjects;    //!< How many dead objects are stored in this class
+
+  FastObjectMember*     deadList;             //!< A List of all stored dead Objects of this class.
+  FastObjectMember*     unusedContainers;     //!< This is a List of unused containers, that will be reused by kill.
+
+private:
+  static FastFactory*   first;                //!< A pointer to the first FastFactory.
+
+  FastFactory*          next;                 //!< pointer to the next FastFactory.
+};
+
+
+
+/**
+ *  a FastFactory that is able to load any kind of Object from a ClassID
+ * (this is a Functor)
+ */
+template<class T>
+class tFastFactory : public FastFactory
+{
+public:
+  static tFastFactory<T>* getFastFactory(const NewClassID& classID, const std::string& fastFactoryName);
+
+private:
+  tFastFactory(const NewClassID& classID, const std::string& fastFactoryName);
+
+  virtual void fabricate();
+};
+
+/**
+ * construnts a FastFactory with
+ * @param fastFactoryName the name of the FastFactory
+ * @param fastFactory the ID of the class
+ * @todo (can this be written in another form??)
+ */
+template<class T>
+tFastFactory<T>::tFastFactory(const NewClassID& classID, const std::string& fastFactoryName)
+    : FastFactory(classID, fastFactoryName)
+{}
+
+/**
+ * creates (if not existent) a Factory of Class T, and assigns some values to it
+ * @param classID the ClassID to assign to this class
+ * @param fastFactoryName the name to assign
+ * @returns The FastFactory if existent a new Factory if not.
+ */
+template<class T>
+tFastFactory<T>* tFastFactory<T>::getFastFactory(const NewClassID& classID, const std::string& fastFactoryName)
+{
+  tFastFactory<T>* tmpFac = NULL;
+  if (FastFactory::getFirst() != NULL)
+    tmpFac = static_cast<tFastFactory<T>*>(FastFactory::getFirst()->searchFastFactory(classID));
+
+  if (tmpFac != NULL)
+    return tmpFac;
+  else
+    return new tFastFactory<T>(classID, fastFactoryName);
+}
+
+/**
+ * fabricates an Object of Class T, that corresponds to classID.
+ */
+template<class T>
+void tFastFactory<T>::fabricate()
+{
+  FastObjectMember* tmpFirstDead = new FastObjectMember;
+  tmpFirstDead->objectPointer = new T();
+  tmpFirstDead->next = this->deadList;
+  ++this->storedDeadObjects;
+
+  this->deadList = tmpFirstDead;
+}
+
+#endif /* _FAST_FACTORY_H */
