Index: /code/branches/FICN/src/orxonox/core/ClassFactory.h
===================================================================
--- /code/branches/FICN/src/orxonox/core/ClassFactory.h	(revision 689)
+++ /code/branches/FICN/src/orxonox/core/ClassFactory.h	(revision 690)
@@ -73,4 +73,5 @@
     {
         COUT(4) << "*** Create entry for " << name << " in Factory." << std::endl;
+        ClassIdentifier<T>::createIdentifier(name);
         ClassIdentifier<T>::getIdentifier()->addFactory(new ClassFactory<T>);
         Factory::add(name, ClassIdentifier<T>::getIdentifier());
Index: /code/branches/FICN/src/orxonox/core/Identifier.cc
===================================================================
--- /code/branches/FICN/src/orxonox/core/Identifier.cc	(revision 689)
+++ /code/branches/FICN/src/orxonox/core/Identifier.cc	(revision 690)
@@ -40,4 +40,5 @@
     int Identifier::hierarchyCreatingCounter_s = 0; // Set the static member variable hierarchyCreatingCounter_s to zero
     unsigned int Identifier::classIDcounter_s = 0;  // Set the static member variable classIDcounter_s to zero
+    std::map<std::string, Identifier*> Identifier::identifierMap_s;
 
     /**
Index: /code/branches/FICN/src/orxonox/core/Identifier.h
===================================================================
--- /code/branches/FICN/src/orxonox/core/Identifier.h	(revision 689)
+++ /code/branches/FICN/src/orxonox/core/Identifier.h	(revision 690)
@@ -172,4 +172,5 @@
             unsigned int classID_;                                      //!< The network ID to identify a class through the network
             std::map<std::string, ConfigValueContainer*> configValues_; //!< A map to link the string of configurable variables with their ConfigValueContainer
+            static std::map<std::string, Identifier*> identifierMap_s;  //!< A map, containing all existing ClassIdentifiers
     };
 
@@ -189,9 +190,12 @@
         public:
             static ClassIdentifier<T>* registerClass(const IdentifierList* parents, const std::string& name, bool bRootClass);
-            static ClassIdentifier<T>* getIdentifier();
+            static void createIdentifier(const std::string& name);
             static void addObject(T* object);
 
+            /** @returns the Identifier itself (createIdentifier() has to be called first). */
+            inline static ClassIdentifier<T>* getIdentifier() { return pointer_s; }
+
         private:
-            ClassIdentifier();
+            ClassIdentifier(const std::string& name);
             ClassIdentifier(const ClassIdentifier<T>& identifier) {} // don't copy
             ~ClassIdentifier();
@@ -206,9 +210,12 @@
     /**
         @brief Constructor: Creates the ObjectList.
-    */
-    template <class T>
-    ClassIdentifier<T>::ClassIdentifier()
+        @param name The name of the Class
+    */
+    template <class T>
+    ClassIdentifier<T>::ClassIdentifier(const std::string& name)
     {
         this->objects_ = new ObjectList<T>;
+        this->name_ = name;
+        this->identifierMap_s[name] = this;
     }
 
@@ -236,9 +243,5 @@
 
         // It's a singleton, so maybe we have to create it first
-        if (!pointer_s)
-        {
-            COUT(4) << "*** Register Class in " << name << "-Singleton -> Create Singleton." << std::endl;
-            pointer_s = new ClassIdentifier();
-        }
+        ClassIdentifier<T>::createIdentifier(name);
 
         // Check if at least one object of the given type was created
@@ -258,16 +261,19 @@
 
     /**
-        @returns the Identifier itself.
-    */
-    template <class T>
-    ClassIdentifier<T>* ClassIdentifier<T>::getIdentifier()
-    {
-        if (!pointer_s)
+        @brief Creates the only instance of this class for the template class T.
+        @param name The name of the Class
+    */
+    template <class T>
+    void ClassIdentifier<T>::createIdentifier(const std::string& name)
+    {
+        static bool bFirstCeateIdentifierFunctionCall = true;
+        static ClassIdentifier<T> classIdentifierObject = ClassIdentifier<T>(name);
+
+        if (bFirstCeateIdentifierFunctionCall)
         {
-            COUT(4) << "*** Create Singleton." << std::endl;
-            pointer_s = new ClassIdentifier();
+            COUT(4) << "*** Create Identifier Singleton for " << name << "." << std::endl;
+            pointer_s = &classIdentifierObject;
+            bFirstCeateIdentifierFunctionCall = false;
         }
-
-        return pointer_s;
     }
 
