Index: /code/branches/core/src/orxonox/Orxonox.cc
===================================================================
--- /code/branches/core/src/orxonox/Orxonox.cc	(revision 810)
+++ /code/branches/core/src/orxonox/Orxonox.cc	(revision 811)
@@ -754,4 +754,5 @@
         std::cout << "2\n";
 */
+
         std::cout << "Test 13\n";
 
@@ -833,5 +834,5 @@
         std::cout << "Mask 2:\n";
         TestClassTreeMask(test13_2);
-
+/*
         ClassTreeMask test13_3;
         test13_3.include(Class(A1));
@@ -967,4 +968,26 @@
 
         std::cout << "9\n";
+*/
+
+        std::cout << "Test 14\n";
+        std::cout << "1\n";
+
+        SubclassIdentifier<A1> test14_1;
+        test14_1 = Class(A1B1C1);
+        std::cout << test14_1.getIdentifier()->getName() << std::endl;
+
+        SubclassIdentifier<A1> test14_2 = Class(A1B1C2);
+        std::cout << test14_2.getIdentifier()->getName() << std::endl;
+
+        SubclassIdentifier<Interface1> test14_3;
+        test14_3 = Class(A2B2C1);
+        std::cout << test14_3.getIdentifier()->getName() << std::endl;
+
+        SubclassIdentifier<A1B2> test14_4;
+        test14_4 = Class(A1B2C1);
+        std::cout << test14_4.getIdentifier()->getName() << std::endl;
+
+        SubclassIdentifier<BaseObject> test14_5 = Class(Test1);
+        std::cout << test14_5.getIdentifier()->getName() << std::endl;
 
 //    startRenderLoop();
Index: /code/branches/core/src/orxonox/core/ClassFactory.h
===================================================================
--- /code/branches/core/src/orxonox/core/ClassFactory.h	(revision 810)
+++ /code/branches/core/src/orxonox/core/ClassFactory.h	(revision 811)
@@ -72,7 +72,7 @@
     bool ClassFactory<T>::create(const std::string& name)
     {
-        COUT(4) << "*** Create entry for " << name << " in Factory." << std::endl;
-        ClassManager<T>::getIdentifier(name)->addFactory(new ClassFactory<T>);
-        Factory::add(name, ClassManager<T>::getIdentifier(name));
+        COUT(4) << "*** ClassFactory: Create entry for " << name << " in Factory." << std::endl;
+        ClassManager<T>::getIdentifier()->addFactory(new ClassFactory<T>);
+        Factory::add(name, ClassManager<T>::getIdentifier());
 
         return true;
Index: /code/branches/core/src/orxonox/core/ClassManager.h
===================================================================
--- /code/branches/core/src/orxonox/core/ClassManager.h	(revision 810)
+++ /code/branches/core/src/orxonox/core/ClassManager.h	(revision 811)
@@ -63,5 +63,5 @@
         public:
             static ClassManager<T>* getSingleton();
-            static ClassIdentifier<T>* getIdentifier(const std::string& name);
+            static ClassIdentifier<T>* getIdentifier();
             static const std::string& getName();
 
@@ -96,15 +96,18 @@
 
     /**
-        @brief Creates the only instance of this class for the template class T and retrieves a unique Identifier.
+        @brief Creates the only instance of this class for the template class T and retrieves a unique Identifier for the given name.
         @return The unique Identifier
     */
     template <class T>
-    ClassIdentifier<T>* ClassManager<T>::getIdentifier(const std::string& name)
+    ClassIdentifier<T>* ClassManager<T>::getIdentifier()
     {
         // Check if the ClassManager is already initialized
         if (!ClassManager<T>::getSingleton()->bInitialized_)
         {
+            // Get the name of the class
+            std::string name = typeid(T).name();
+
             // It's not -> retrieve the ClassIdentifier through IdentifierDistributor
-            COUT(4) << "*** Create Identifier Singleton." << std::endl;
+            COUT(4) << "*** ClassManager: Request Identifier Singleton for " << name << "." << std::endl;
 
             // First create a ClassIdentifier in case there's no instance existing yet
@@ -116,5 +119,14 @@
             // If the retrieved Identifier differs from our proposal, we don't need the proposal any more
             if (temp != ClassManager<T>::getSingleton()->identifier_)
+            {
+                COUT(4) << "*** ClassManager: Requested Identifier for " << name << " was already existing and got assigned." << std::endl;
+
+                // Delete the unnecessary proposal
                 delete temp;
+            }
+            else
+            {
+                COUT(4) << "*** ClassManager: Requested Identifier for " << name << " was not yet existing and got created." << std::endl;
+            }
 
             ClassManager<T>::getSingleton()->bInitialized_ = true;
Index: /code/branches/core/src/orxonox/core/ClassTreeMask.cc
===================================================================
--- /code/branches/core/src/orxonox/core/ClassTreeMask.cc	(revision 810)
+++ /code/branches/core/src/orxonox/core/ClassTreeMask.cc	(revision 811)
@@ -247,5 +247,5 @@
     ClassTreeMask::ClassTreeMask()
     {
-        this->root_ = new ClassTreeMaskNode(ClassManager<BaseObject>::getIdentifier("BaseObject"), true);
+        this->root_ = new ClassTreeMaskNode(ClassManager<BaseObject>::getIdentifier(), true);
     }
 
@@ -256,5 +256,5 @@
     ClassTreeMask::ClassTreeMask(const ClassTreeMask& other)
     {
-        this->root_ = new ClassTreeMaskNode(ClassManager<BaseObject>::getIdentifier("BaseObject"), true);
+        this->root_ = new ClassTreeMaskNode(ClassManager<BaseObject>::getIdentifier(), true);
         for (ClassTreeMaskIterator it = other.root_; it; ++it)
             this->add(it->getClass(), it->isIncluded());
@@ -354,5 +354,5 @@
     {
         delete this->root_;
-        this->root_ = new ClassTreeMaskNode(ClassManager<BaseObject>::getIdentifier("BaseObject"), true);
+        this->root_ = new ClassTreeMaskNode(ClassManager<BaseObject>::getIdentifier(), true);
     }
 
Index: /code/branches/core/src/orxonox/core/ConfigValueContainer.cc
===================================================================
--- /code/branches/core/src/orxonox/core/ConfigValueContainer.cc	(revision 810)
+++ /code/branches/core/src/orxonox/core/ConfigValueContainer.cc	(revision 811)
@@ -870,4 +870,5 @@
         if (!file.is_open())
         {
+            COUT(1) << "An error occurred in ConfigValueContainer:" << std::endl;
             COUT(1) << "Error: Couldn't open config-file " << filename << " to read the config values!" << std::endl;
             return;
@@ -916,4 +917,5 @@
         if (!file.is_open())
         {
+            COUT(1) << "An error occurred in ConfigValueContainer:" << std::endl;
             COUT(1) << "Error: Couldn't open config-file " << filename << " to write the config values!" << std::endl;
             return;
Index: /code/branches/core/src/orxonox/core/CoreIncludes.h
===================================================================
--- /code/branches/core/src/orxonox/core/CoreIncludes.h	(revision 810)
+++ /code/branches/core/src/orxonox/core/CoreIncludes.h	(revision 811)
@@ -58,8 +58,8 @@
 */
 #define InternRegisterObject(ClassName, bRootClass) \
-    this->setIdentifier(orxonox::ClassManager<ClassName>::getIdentifier(#ClassName)->registerClass(this->getParents(), #ClassName, bRootClass)); \
+    this->setIdentifier(orxonox::ClassManager<ClassName>::getIdentifier()->registerClass(this->getParents(), #ClassName, bRootClass)); \
     if (orxonox::Identifier::isCreatingHierarchy() && this->getParents()) \
         this->getParents()->add(this->getIdentifier()); \
-    orxonox::ClassManager<ClassName>::getIdentifier(#ClassName)->addObject(this)
+    orxonox::ClassManager<ClassName>::getIdentifier()->addObject(this)
 
 /**
@@ -112,5 +112,5 @@
 */
 #define Class(ClassName) \
-    ClassManager<ClassName>::getIdentifier(#ClassName)
+    ClassManager<ClassName>::getIdentifier()
 
 /**
Index: /code/branches/core/src/orxonox/core/Factory.cc
===================================================================
--- /code/branches/core/src/orxonox/core/Factory.cc	(revision 810)
+++ /code/branches/core/src/orxonox/core/Factory.cc	(revision 811)
@@ -84,5 +84,5 @@
     void Factory::createClassHierarchy()
     {
-        COUT(3) << "*** Factory -> Create class-hierarchy" << std::endl;
+        COUT(3) << "*** Factory: Create class-hierarchy" << std::endl;
         std::map<std::string, Identifier*>::iterator it;
         it = getFactoryPointer()->identifierStringMap_.begin();
@@ -95,5 +95,5 @@
         }
         (*getFactoryPointer()->identifierStringMap_.begin()).second->stopCreatingHierarchy();
-        COUT(3) << "*** Factory -> Finished class-hierarchy creation" << std::endl;
+        COUT(3) << "*** Factory: Finished class-hierarchy creation" << std::endl;
     }
 
Index: /code/branches/core/src/orxonox/core/Identifier.cc
===================================================================
--- /code/branches/core/src/orxonox/core/Identifier.cc	(revision 810)
+++ /code/branches/core/src/orxonox/core/Identifier.cc	(revision 811)
@@ -70,5 +70,5 @@
     void Identifier::initialize(const IdentifierList* parents)
     {
-        COUT(4) << "*** Initialize " << this->name_ << "-Singleton." << std::endl;
+        COUT(4) << "*** Identifier: Initialize " << this->name_ << "-Singleton." << std::endl;
         this->bCreatedOneObject_ = true;
 
@@ -99,4 +99,5 @@
         {
             // Abstract classes don't have a factory and therefore can't create new objects
+            COUT(1) << "An error occurred in Identifier:" << std::endl;
             COUT(1) << "Error: Cannot create an object of type '" << this->name_ << "'. Class is abstract." << std::endl;
             COUT(1) << "Aborting..." << std::endl;
Index: /code/branches/core/src/orxonox/core/Identifier.h
===================================================================
--- /code/branches/core/src/orxonox/core/Identifier.h	(revision 810)
+++ /code/branches/core/src/orxonox/core/Identifier.h	(revision 811)
@@ -147,5 +147,5 @@
             {
                 hierarchyCreatingCounter_s++;
-                COUT(4) << "*** Increased Hierarchy-Creating-Counter to " << hierarchyCreatingCounter_s << std::endl;
+                COUT(4) << "*** Identifier: Increased Hierarchy-Creating-Counter to " << hierarchyCreatingCounter_s << std::endl;
             }
 
@@ -156,5 +156,5 @@
             {
                 hierarchyCreatingCounter_s--;
-                COUT(4) << "*** Decreased Hierarchy-Creating-Counter to " << hierarchyCreatingCounter_s << std::endl;
+                COUT(4) << "*** Identifier: Decreased Hierarchy-Creating-Counter to " << hierarchyCreatingCounter_s << std::endl;
             }
 
@@ -228,5 +228,5 @@
     ClassIdentifier<T>* ClassIdentifier<T>::registerClass(const IdentifierList* parents, const std::string& name, bool bRootClass)
     {
-        COUT(4) << "*** Register Class in " << name << "-Singleton." << std::endl;
+        COUT(4) << "*** ClassIdentifier: Register Class in " << name << "-Singleton." << std::endl;
 
         // Check if at least one object of the given type was created
@@ -236,5 +236,5 @@
             this->setName(name);
 
-            COUT(4) << "*** Register Class in " << name << "-Singleton -> Initialize Singleton." << std::endl;
+            COUT(4) << "*** ClassIdentifier: Register Class in " << name << "-Singleton -> Initialize Singleton." << std::endl;
             if (bRootClass)
                 this->initialize(NULL); // If a class is derived from two interfaces, the second interface might think it's derived from the first because of the order of constructor-calls. Thats why we set parents to zero in that case.
@@ -267,5 +267,5 @@
     void ClassIdentifier<T>::addObject(T* object)
     {
-        COUT(4) << "*** Added object to " << this->getName() << "-list." << std::endl;
+        COUT(4) << "*** ClassIdentifier: Added object to " << this->getName() << "-list." << std::endl;
         object->getMetaList().add(this->objects_, this->objects_->add(object));
     }
@@ -299,12 +299,5 @@
             SubclassIdentifier()
             {
-                std::string name = ClassManager<T>::getName();
-
-                if (name != "unknown")
-                    this->subclassIdentifier_ = ClassManager<T>::getIdentifier(name);
-                else
-                    this->subclassIdentifier_ = 0;
-
-                this->identifier_ = this->subclassIdentifier_;
+                this->identifier_ = ClassManager<T>::getIdentifier();
             }
 
@@ -315,11 +308,4 @@
             SubclassIdentifier(Identifier* identifier)
             {
-                std::string name = ClassManager<T>::getName();
-
-                if (name != "unknown")
-                    this->subclassIdentifier_ = ClassManager<T>::getIdentifier(name);
-                else
-                    this->subclassIdentifier_ = 0;
-
                 this->identifier_ = identifier;
             }
@@ -332,8 +318,9 @@
             SubclassIdentifier<T>& operator=(Identifier* identifier)
             {
-                if (!identifier->isA(this->subclassIdentifier_))
+                if (!identifier->isA(ClassManager<T>::getIdentifier()))
                 {
-                    COUT(1) << "Error: Class " << identifier->getName() << " is not a " << this->subclassIdentifier_->getName() << "!" << std::endl;
-                    COUT(1) << "Error: SubclassIdentifier<" << this->subclassIdentifier_->getName() << "> = Class(" << identifier->getName() << ") is forbidden." << std::endl;
+                    COUT(1) << "An error occurred in SubclassIdentifier:" << std::endl;
+                    COUT(1) << "Error: Class " << identifier->getName() << " is not a " << ClassManager<T>::getIdentifier()->getName() << "!" << std::endl;
+                    COUT(1) << "Error: SubclassIdentifier<" << ClassManager<T>::getIdentifier()->getName() << "> = Class(" << identifier->getName() << ") is forbidden." << std::endl;
                     COUT(1) << "Aborting..." << std::endl;
                     abort();
@@ -380,5 +367,6 @@
                     if (this->identifier_)
                     {
-                        COUT(1) << "Error: Class " << this->identifier_->getName() << " is not a " << this->subclassIdentifier_->getName() << "!" << std::endl;
+                        COUT(1) << "An error occurred in SubclassIdentifier:" << std::endl;
+                        COUT(1) << "Error: Class " << this->identifier_->getName() << " is not a " << ClassManager<T>::getIdentifier()->getName() << "!" << std::endl;
                         COUT(1) << "Error: Couldn't fabricate a new Object." << std::endl;
                         COUT(1) << "Aborting..." << std::endl;
@@ -386,4 +374,5 @@
                     else
                     {
+                        COUT(1) << "An error occurred in SubclassIdentifier:" << std::endl;
                         COUT(1) << "Error: Couldn't fabricate a new Object - Identifier is undefined." << std::endl;
                         COUT(1) << "Aborting..." << std::endl;
@@ -416,5 +405,4 @@
         private:
             Identifier* identifier_;            //!< The assigned identifier
-            Identifier* subclassIdentifier_;    //!< The identifier of the subclass
     };
 }
Index: /code/branches/core/src/orxonox/core/Language.cc
===================================================================
--- /code/branches/core/src/orxonox/core/Language.cc	(revision 810)
+++ /code/branches/core/src/orxonox/core/Language.cc	(revision 811)
@@ -161,5 +161,5 @@
     void Language::addEntry(const LanguageEntryName& name, const std::string& entry)
     {
-        COUT(5) << "Called addEntry with\n  name: " << name << "\n  entry: " <<  entry << std::endl;
+        COUT(5) << "Language: Called addEntry with\n  name: " << name << "\n  entry: " <<  entry << std::endl;
         std::map<std::string, LanguageEntry*>::const_iterator it = this->languageEntries_.find(name);
         if (it == this->languageEntries_.end())
@@ -197,5 +197,5 @@
         {
             // Uh, oh, an undefined entry was requested: return the default string
-            COUT(2) << "Error: Language entry \"" << name << "\" not found!" << std::endl;
+            COUT(2) << "Warning: Language entry \"" << name << "\" not found!" << std::endl;
             return this->defaultTranslation_;
         }
@@ -230,4 +230,5 @@
         if (!file.is_open())
         {
+            COUT(1) << "An error occurred in Language:" << std::endl;
             COUT(1) << "Error: Couldn't open file " << getFileName(this->defaultLanguage_) << " to read the default language entries!" << std::endl;
             return;
@@ -271,4 +272,5 @@
         if (!file.is_open())
         {
+            COUT(1) << "An error occurred in Language:" << std::endl;
             COUT(1) << "Error: Couldn't open file " << getFileName(this->language_) << " to read the translated language entries!" << std::endl;
             ResetConfigValue(language_);
@@ -314,5 +316,5 @@
     void Language::writeDefaultLanguageFile() const
     {
-        COUT(4) << "Write default language file." << std::endl;
+        COUT(4) << "Language: Write default language file." << std::endl;
 
         // Open the file
@@ -322,4 +324,5 @@
         if (!file.is_open())
         {
+            COUT(1) << "An error occurred in Language:" << std::endl;
             COUT(1) << "Error: Couldn't open file " << getFileName(this->defaultLanguage_) << " to write the default language entries!" << std::endl;
             return;
Index: /code/branches/core/src/orxonox/core/MetaObjectList.h
===================================================================
--- /code/branches/core/src/orxonox/core/MetaObjectList.h	(revision 810)
+++ /code/branches/core/src/orxonox/core/MetaObjectList.h	(revision 811)
@@ -99,5 +99,5 @@
 
 
-        COUT(4) << "*** Removing Object from " << this->element_->object_->getIdentifier()->getName() << "-list." << std::endl;
+        COUT(4) << "*** MetaObjectList: Removing Object from " << this->element_->object_->getIdentifier()->getName() << "-list." << std::endl;
         delete this->element_;
     }
Index: /code/branches/core/src/orxonox/objects/Test.h
===================================================================
--- /code/branches/core/src/orxonox/objects/Test.h	(revision 810)
+++ /code/branches/core/src/orxonox/objects/Test.h	(revision 811)
@@ -74,4 +74,5 @@
         public:
             A1B2() { RegisterObject(A1B2); }
+            virtual void test() = 0;
     };
 
@@ -116,4 +117,5 @@
         public:
             A1B2C1() { RegisterObject(A1B2C1); }
+            void test() { std::cout << "test!\n"; }
     };
 
@@ -158,5 +160,5 @@
     CreateFactory(A3);
     CreateFactory(A1B1);
-    CreateFactory(A1B2);
+//    CreateFactory(A1B2);
     CreateFactory(A2B1);
     CreateFactory(A2B2);
