Index: code/branches/objecthierarchie/src/BaseObject.cc
===================================================================
--- code/branches/objecthierarchie/src/BaseObject.cc	(revision 245)
+++ code/branches/objecthierarchie/src/BaseObject.cc	(revision 246)
@@ -12,5 +12,4 @@
     BaseObject::~BaseObject()
     {
-        UnregisterObject();
     }
 }
Index: code/branches/objecthierarchie/src/CMakeLists.txt
===================================================================
--- code/branches/objecthierarchie/src/CMakeLists.txt	(revision 245)
+++ code/branches/objecthierarchie/src/CMakeLists.txt	(revision 246)
@@ -2,6 +2,6 @@
 
 # create a few variables to simplify life
-SET(SRC_FILES orxonox.cc IdentifierList.cc Identifier.cc Factory.cc OrxonoxClass.cc BaseObject.cc test1.cc test2.cc test3.cc)
-SET(INC_FILES IdentifierIncludes.h Identifier.h Factory.h ClassFactory.h IdentifierList.h ObjectList.h Iterator.h OrxonoxClass.h BaseObject.h Test.h test1.h test2.h test3.h)
+SET(SRC_FILES orxonox.cc IdentifierList.cc Identifier.cc MetaObjectList.cc Factory.cc OrxonoxClass.cc BaseObject.cc test1.cc test2.cc test3.cc)
+SET(INC_FILES IdentifierIncludes.h Identifier.h Factory.h ClassFactory.h IdentifierList.h ObjectList.h MetaObjectList.h Iterator.h OrxonoxClass.h BaseObject.h Test.h test1.h test2.h test3.h)
 
 #Creates an executable
Index: code/branches/objecthierarchie/src/Identifier.h
===================================================================
--- code/branches/objecthierarchie/src/Identifier.h	(revision 245)
+++ code/branches/objecthierarchie/src/Identifier.h	(revision 246)
@@ -8,5 +8,5 @@
 #include "Factory.h"
 
-#define HIERARCHY_VERBOSE true
+#define HIERARCHY_VERBOSE false
 
 
@@ -30,7 +30,4 @@
 
         public:
-            virtual void removeObject(OrxonoxClass* object) const = 0;
-            virtual void removeObjectIntern(OrxonoxClass* object, bool bIterateForwards) const = 0;
-
             inline void addFactory(BaseFactory* factory) { this->factory_ = factory; }
             BaseObject* fabricate();
@@ -93,6 +90,4 @@
             static ClassIdentifier<T>* getIdentifier();
             static void addObject(T* object);
-            void removeObject(OrxonoxClass* object) const;
-            void removeObjectIntern(OrxonoxClass* object, bool bIterateForwards) const;
 
         private:
@@ -172,33 +167,5 @@
         std::cout << "*** Added object to " << ClassIdentifier<T>::getIdentifier()->getName() << "-list.\n";
 #endif
-        ClassIdentifier<T>::getIdentifier()->objects_->add(object);
-    }
-
-    template <class T>
-    void ClassIdentifier<T>::removeObject(OrxonoxClass* object) const
-    {
-        bool bIterateForwards = !Identifier::isCreatingHierarchy();
-
-        this->removeObjectIntern(object, bIterateForwards);
-
-        IdentifierListElement* temp = this->parents_.first_;
-        while (temp)
-        {
-            temp->identifier_->removeObjectIntern(object, bIterateForwards);
-            temp = temp->next_;
-        }
-    }
-
-    template <class T>
-    void ClassIdentifier<T>::removeObjectIntern(OrxonoxClass* object, bool bIterateForwards) const
-    {
-#if HIERARCHY_VERBOSE
-        if (bIterateForwards)
-            std::cout << "*** Removed object from " << this->name_ << "-list, iterating forwards.\n";
-        else
-            std::cout << "*** Removed object from " << this->name_ << "-list, iterating backwards.\n";
-#endif
-
-        this->objects_->remove(object, bIterateForwards);
+        object->getMetaList()->add(ClassIdentifier<T>::getIdentifier()->objects_, ClassIdentifier<T>::getIdentifier()->objects_->add(object));
     }
 
Index: code/branches/objecthierarchie/src/IdentifierIncludes.h
===================================================================
--- code/branches/objecthierarchie/src/IdentifierIncludes.h	(revision 245)
+++ code/branches/objecthierarchie/src/IdentifierIncludes.h	(revision 246)
@@ -2,6 +2,6 @@
 #include "Factory.h"
 #include "ClassFactory.h"
-#include "IdentifierList.h"
-#include "ObjectList.h"
+//#include "IdentifierList.h"
+//#include "ObjectList.h"
 #include "Iterator.h"
 #include "OrxonoxClass.h"
@@ -37,7 +37,4 @@
 #endif
 
-#define UnregisterObject() \
-    this->getIdentifier()->removeObject(this)
-
 #define Class(ClassName) \
     ClassIdentifier<ClassName>::getIdentifier()
Index: code/branches/objecthierarchie/src/MetaObjectList.cc
===================================================================
--- code/branches/objecthierarchie/src/MetaObjectList.cc	(revision 246)
+++ code/branches/objecthierarchie/src/MetaObjectList.cc	(revision 246)
@@ -0,0 +1,20 @@
+#include "MetaObjectList.h"
+
+namespace orxonox
+{
+    MetaObjectList::MetaObjectList()
+    {
+        this->first_ = 0;
+    }
+
+    MetaObjectList::~MetaObjectList()
+    {
+        BaseMetaObjectListElement* temp;
+        while (this->first_)
+        {
+            temp = this->first_->next_;
+            delete this->first_;
+            this->first_ = temp;
+        }
+    }
+}
Index: code/branches/objecthierarchie/src/MetaObjectList.h
===================================================================
--- code/branches/objecthierarchie/src/MetaObjectList.h	(revision 246)
+++ code/branches/objecthierarchie/src/MetaObjectList.h	(revision 246)
@@ -0,0 +1,83 @@
+#ifndef _MetaObjectList_H__
+#define _MetaObjectList_H__
+
+#include "ObjectList.h"
+#include "Identifier.h"
+
+namespace orxonox
+{
+    class BaseMetaObjectListElement
+    {
+        public:
+            virtual ~BaseMetaObjectListElement() {};
+
+            BaseMetaObjectListElement* next_;
+    };
+
+    // ###############################
+    // ###  MetaObjectListElement  ###
+    // ###############################
+    template <class T>
+    class MetaObjectListElement : public BaseMetaObjectListElement
+    {
+        public:
+            MetaObjectListElement(ObjectList<T>* list, ObjectListElement<T>* element);
+            ~MetaObjectListElement();
+
+            ObjectListElement<T>* element_;
+            ObjectList<T>* list_;
+    };
+
+    template <class T>
+    MetaObjectListElement<T>::MetaObjectListElement(ObjectList<T>* list, ObjectListElement<T>* element)
+    {
+        this->element_ = element;
+        this->list_ = list;
+        this->next_ = 0;
+    }
+
+    template <class T>
+    MetaObjectListElement<T>::~MetaObjectListElement()
+    {
+        if (this->element_->next_)
+            this->element_->next_->prev_ = this->element_->prev_;
+        else
+            this->list_->last_ = this->element_->prev_;
+
+        if (this->element_->prev_)
+            this->element_->prev_->next_ = this->element_->next_;
+        else
+            this->list_->first_ = this->element_->next_;
+
+
+#if HIERARCHY_VERBOSE
+        std::cout << "*** Removing Object from " << ClassIdentifier<T>::getIdentifier()->getName() << "-list.\n";
+#endif
+        delete this->element_;
+    }
+
+
+    // ###############################
+    // ###       ObjectList        ###
+    // ###############################
+    class MetaObjectList
+    {
+        public:
+            MetaObjectList();
+            ~MetaObjectList();
+            template <class T>
+            void add(ObjectList<T>* list, ObjectListElement<T>* element);
+
+            BaseMetaObjectListElement* first_;
+    };
+
+    template <class T>
+    void MetaObjectList::add(ObjectList<T>* list, ObjectListElement<T>* element)
+    {
+        BaseMetaObjectListElement* temp = this->first_;
+        this->first_ = new MetaObjectListElement<T>(list, element);
+        this->first_->next_ = temp;
+    }
+}
+
+#endif
Index: code/branches/objecthierarchie/src/ObjectList.h
===================================================================
--- code/branches/objecthierarchie/src/ObjectList.h	(revision 245)
+++ code/branches/objecthierarchie/src/ObjectList.h	(revision 246)
@@ -44,5 +44,5 @@
             ObjectList();
             ~ObjectList();
-            void add(T* object);
+            ObjectListElement<T>* add(T* object);
             void remove(OrxonoxClass* object, bool bIterateForwards = true);
 
@@ -71,5 +71,5 @@
 
     template <class T>
-    void ObjectList<T>::add(T* object)
+    ObjectListElement<T>* ObjectList<T>::add(T* object)
     {
         if (!this->last_)
@@ -85,4 +85,6 @@
             temp->next_ = this->last_;
         }
+
+        return this->last_;
     }
 
Index: code/branches/objecthierarchie/src/OrxonoxClass.cc
===================================================================
--- code/branches/objecthierarchie/src/OrxonoxClass.cc	(revision 245)
+++ code/branches/objecthierarchie/src/OrxonoxClass.cc	(revision 246)
@@ -7,4 +7,6 @@
         this->identifier_ = 0;
         this->parents_ = 0;
+
+        this->metaList_ = new MetaObjectList;
     }
 
@@ -13,4 +15,6 @@
         if (this->parents_)
             delete this->parents_;
+
+        delete this->metaList_;
     }
 }
Index: code/branches/objecthierarchie/src/OrxonoxClass.h
===================================================================
--- code/branches/objecthierarchie/src/OrxonoxClass.h	(revision 245)
+++ code/branches/objecthierarchie/src/OrxonoxClass.h	(revision 246)
@@ -4,4 +4,6 @@
 #include "Identifier.h"
 #include "IdentifierList.h"
+#include "ObjectList.h"
+#include "MetaObjectList.h"
 
 namespace orxonox
@@ -12,12 +14,14 @@
             OrxonoxClass();
             virtual ~OrxonoxClass();
-            Identifier* getIdentifier() const { return this->identifier_; }
-            void setIdentifier(Identifier* identifier) { this->identifier_ = identifier; }
-            IdentifierList* getParents() const { return this->parents_; }
-            void setParents(IdentifierList* parents) { this->parents_ = parents; }
+            inline Identifier* getIdentifier() const { return this->identifier_; }
+            inline void setIdentifier(Identifier* identifier) { this->identifier_ = identifier; }
+            inline IdentifierList* getParents() const { return this->parents_; }
+            inline void setParents(IdentifierList* parents) { this->parents_ = parents; }
+            inline MetaObjectList* getMetaList() { return this->metaList_; }
 
         private:
             Identifier* identifier_;
             IdentifierList* parents_;
+            MetaObjectList* metaList_;
     };
 }
Index: code/branches/objecthierarchie/src/orxonox.cc
===================================================================
--- code/branches/objecthierarchie/src/orxonox.cc	(revision 245)
+++ code/branches/objecthierarchie/src/orxonox.cc	(revision 246)
@@ -407,6 +407,6 @@
         delete test8_02;
         delete test8_03;
-*/
-/*
+
+
         std::cout << "Test 9\n";
         std::cout << "1\n";
@@ -441,5 +441,4 @@
         Identifier* test10_03 = Class(A3B1C1);
 
-
         BaseObject* test10_04 = test10_01->fabricate();
         BaseObject* test10_05 = test10_02->fabricate();
@@ -451,29 +450,15 @@
 
         std::cout << "1\n";
-        int count = 0;
-        for (Iterator<BaseObject> it; it != 0; ++it)
-            count++;
+        int count;
+        count = 0; for (Iterator<BaseObject> it; it != 0; ++it) { count++; }
         std::cout << "Anzahl BaseObjects: " << count << "\n";
-
-        count = 0;
-        for (Iterator<A1> it; it != 0; ++it)
-            count++;
+        count = 0; for (Iterator<A1> it; it != 0; ++it) { count++; }
         std::cout << "Anzahl A1: " << count << "\n";
-
-        count = 0;
-        for (Iterator<A1B1> it; it; ++it)
-            count++;
+        count = 0; for (Iterator<A1B1> it; it; ++it) { count++; }
         std::cout << "Anzahl A1B1: " << count << "\n";
-
-        count = 0;
-        for (Iterator<A1B1C1> it; it; ++it)
-            count++;
+        count = 0; for (Iterator<A1B1C1> it; it; ++it) { count++; }
         std::cout << "Anzahl A1B1C1: " << count << "\n";
-
-        count = 0;
-        for (Iterator<A2> it; it; ++it)
-            count++;
+        count = 0; for (Iterator<A2> it; it; ++it) { count++; }
         std::cout << "Anzahl A2: " << count << "\n";
-
 
         std::cout << "2\n";
@@ -494,4 +479,15 @@
         }
 
+        count = 0; for (Iterator<BaseObject> it; it != 0; ++it) { count++; }
+        std::cout << "Anzahl BaseObjects: " << count << "\n";
+        count = 0; for (Iterator<A1> it; it != 0; ++it) { count++; }
+        std::cout << "Anzahl A1: " << count << "\n";
+        count = 0; for (Iterator<A1B1> it; it; ++it) { count++; }
+        std::cout << "Anzahl A1B1: " << count << "\n";
+        count = 0; for (Iterator<A1B1C1> it; it; ++it) { count++; }
+        std::cout << "Anzahl A1B1C1: " << count << "\n";
+        count = 0; for (Iterator<A2> it; it; ++it) { count++; }
+        std::cout << "Anzahl A2: " << count << "\n";
+
         for (Iterator<A2B1C1> it; it; ++it)
             std::cout << "Name: " << it->name_ << "\n";
@@ -504,4 +500,15 @@
         delete test10_08;
 
+        count = 0; for (Iterator<BaseObject> it; it != 0; ++it) { count++; }
+        std::cout << "Anzahl BaseObjects: " << count << "\n";
+        count = 0; for (Iterator<A1> it; it != 0; ++it) { count++; }
+        std::cout << "Anzahl A1: " << count << "\n";
+        count = 0; for (Iterator<A1B1> it; it; ++it) { count++; }
+        std::cout << "Anzahl A1B1: " << count << "\n";
+        count = 0; for (Iterator<A1B1C1> it; it; ++it) { count++; }
+        std::cout << "Anzahl A1B1C1: " << count << "\n";
+        count = 0; for (Iterator<A2> it; it; ++it) { count++; }
+        std::cout << "Anzahl A2: " << count << "\n";
+
         std::cout << "5\n";
         for (Iterator<A2B1C1> it; it; ++it)
@@ -515,4 +522,15 @@
         delete test10_09;
 
+        count = 0; for (Iterator<BaseObject> it; it != 0; ++it) { count++; }
+        std::cout << "Anzahl BaseObjects: " << count << "\n";
+        count = 0; for (Iterator<A1> it; it != 0; ++it) { count++; }
+        std::cout << "Anzahl A1: " << count << "\n";
+        count = 0; for (Iterator<A1B1> it; it; ++it) { count++; }
+        std::cout << "Anzahl A1B1: " << count << "\n";
+        count = 0; for (Iterator<A1B1C1> it; it; ++it) { count++; }
+        std::cout << "Anzahl A1B1C1: " << count << "\n";
+        count = 0; for (Iterator<A2> it; it; ++it) { count++; }
+        std::cout << "Anzahl A2: " << count << "\n";
+
         std::cout << "8\n";
         for (Iterator<A2B1C1> it; it; ++it)
@@ -525,4 +543,15 @@
         std::cout << "10\n";
         delete test10_10;
+
+        count = 0; for (Iterator<BaseObject> it; it != 0; ++it) { count++; }
+        std::cout << "Anzahl BaseObjects: " << count << "\n";
+        count = 0; for (Iterator<A1> it; it != 0; ++it) { count++; }
+        std::cout << "Anzahl A1: " << count << "\n";
+        count = 0; for (Iterator<A1B1> it; it; ++it) { count++; }
+        std::cout << "Anzahl A1B1: " << count << "\n";
+        count = 0; for (Iterator<A1B1C1> it; it; ++it) { count++; }
+        std::cout << "Anzahl A1B1C1: " << count << "\n";
+        count = 0; for (Iterator<A2> it; it; ++it) { count++; }
+        std::cout << "Anzahl A2: " << count << "\n";
 
         std::cout << "11\n";
