Index: /code/branches/core6/src/libraries/core/object/Iterator.h
===================================================================
--- /code/branches/core6/src/libraries/core/object/Iterator.h	(revision 9595)
+++ /code/branches/core6/src/libraries/core/object/Iterator.h	(revision 9596)
@@ -56,5 +56,4 @@
 #include "core/CorePrereqs.h"
 
-#include "core/class/Identifier.h"
 #include "ObjectListBase.h"
 
@@ -78,17 +77,6 @@
             inline Iterator()
             {
-                this->element_ = 0;
-                this->list_ = 0;
-            }
-
-            /**
-                @brief Constructor: Sets this element to the exported element.
-                @param exp The exported element
-            */
-            inline Iterator(const ObjectListBase::Export& exp)
-            {
-                this->element_ = exp.element_;
-                this->list_ = exp.list_;
-                this->list_->registerIterator(this);
+                this->element_ = NULL;
+                this->list_ = NULL;
             }
 
@@ -100,6 +88,5 @@
             {
                 this->element_ = other.element_;
-                this->list_ = other.list_;
-                this->list_->registerIterator(this);
+                this->registerIterator();
             }
 
@@ -108,10 +95,8 @@
                 @param element The element
             */
-            template <class O>
-            inline Iterator(ObjectListElement<O>* element)
+            inline Iterator(ObjectListBaseElement* element)
             {
                 this->element_ = element;
-                this->list_ = ClassIdentifier<O>::getIdentifier()->getObjects();
-                this->list_->registerIterator(this);
+                this->registerIterator();
             }
 
@@ -124,6 +109,5 @@
             {
                 this->element_ = other.element_;
-                this->list_ = ClassIdentifier<O>::getIdentifier()->getObjects();
-                this->list_->registerIterator(this);
+                this->registerIterator();
             }
 
@@ -133,21 +117,5 @@
             inline ~Iterator()
             {
-                this->list_->unregisterIterator(this);
-            }
-
-            /**
-                @brief Assigns an exported element.
-                @param exp The exported element
-            */
-            inline Iterator<T>& operator=(const ObjectListBase::Export& exp)
-            {
-                if (this->list_)
-                    this->list_->unregisterIterator(this);
-
-                this->element_ = exp.element_;
-                this->list_ = exp.list_;
-                this->list_->registerIterator(this);
-
-                return (*this);
+                this->unregisterIterator();
             }
 
@@ -158,10 +126,7 @@
             inline Iterator<T>& operator=(const Iterator<T>& other)
             {
-                if (this->list_)
-                    this->list_->unregisterIterator(this);
-
-                this->element_ = other.element_;
-                this->list_ = other.list_;
-                this->list_->registerIterator(this);
+                this->unregisterIterator();
+                this->element_ = other.element_;
+                this->registerIterator();
 
                 return (*this);
@@ -172,13 +137,9 @@
                 @param element The element
             */
-            template <class O>
-            inline Iterator<T>& operator=(ObjectListElement<O>* element)
-            {
-                if (this->list_)
-                    this->list_->unregisterIterator(this);
-
+            inline Iterator<T>& operator=(ObjectListBaseElement* element)
+            {
+                this->unregisterIterator();
                 this->element_ = element;
-                this->list_ = ClassIdentifier<O>::getIdentifier()->getObjects();
-                this->list_->registerIterator(this);
+                this->registerIterator();
 
                 return (*this);
@@ -192,10 +153,7 @@
             inline Iterator<T>& operator=(const ObjectListIterator<O>& other)
             {
-                if (this->list_)
-                    this->list_->unregisterIterator(this);
-
-                this->element_ = other.element_;
-                this->list_ = ClassIdentifier<O>::getIdentifier()->getObjects();
-                this->list_->registerIterator(this);
+                this->unregisterIterator();
+                this->element_ = other.element_;
+                this->registerIterator();
 
                 return (*this);
@@ -268,5 +226,5 @@
             inline operator bool() const
             {
-                return (this->element_ != 0);
+                return (this->element_ != NULL);
             }
 
@@ -301,7 +259,30 @@
             }
 
-        protected:
-            ObjectListBaseElement* element_;       //!< The element the Iterator points at
-            ObjectListBase* list_;                 //!< The list wherein the element is
+        private:
+            /**
+             * @brief Registers the Iterator at the list to which it belongs
+             */
+            inline void registerIterator()
+            {
+                if (this->element_)
+                {
+                    this->list_ = this->element_->list_;
+                    this->list_->registerIterator(this);
+                }
+                else
+                    this->list_ = NULL;
+            }
+
+            /**
+             * @brief Unregisters the Iterator from the list (if any)
+             */
+            inline void unregisterIterator()
+            {
+                if (this->list_)
+                    this->list_->unregisterIterator(this);
+            }
+
+            ObjectListBaseElement* element_;    //!< The element the Iterator points at
+            ObjectListBase* list_;              //!< The list in which the Iterator registered itself
     };
 }
Index: /code/branches/core6/src/libraries/core/object/MetaObjectList.cc
===================================================================
--- /code/branches/core6/src/libraries/core/object/MetaObjectList.cc	(revision 9595)
+++ /code/branches/core6/src/libraries/core/object/MetaObjectList.cc	(revision 9596)
@@ -48,5 +48,4 @@
     MetaObjectListElement::~MetaObjectListElement()
     {
-        this->list_->removeElement(this->element_);
         delete this->element_;
     }
Index: /code/branches/core6/src/libraries/core/object/ObjectList.h
===================================================================
--- /code/branches/core6/src/libraries/core/object/ObjectList.h	(revision 9595)
+++ /code/branches/core6/src/libraries/core/object/ObjectList.h	(revision 9596)
@@ -72,5 +72,5 @@
             {
                 ObjectListBase* list = ClassIdentifier<T>::getIdentifier()->getObjects();
-                return static_cast<ObjectListElement<T>*>(list->begin().element_);
+                return static_cast<ObjectListElement<T>*>(list->begin());
             }
 
@@ -79,5 +79,5 @@
             {
                 ObjectListBase* list = ClassIdentifier<T>::getIdentifier()->getObjects();
-                return static_cast<ObjectListElement<T>*>(list->end().element_);
+                return static_cast<ObjectListElement<T>*>(list->end());
             }
 
@@ -86,5 +86,5 @@
             {
                 ObjectListBase* list = ClassIdentifier<T>::getIdentifier()->getObjects();
-                return static_cast<ObjectListElement<T>*>(list->rbegin().element_);
+                return static_cast<ObjectListElement<T>*>(list->rbegin());
             }
 
@@ -93,5 +93,5 @@
             {
                 ObjectListBase* list = ClassIdentifier<T>::getIdentifier()->getObjects();
-                return static_cast<ObjectListElement<T>*>(list->rend().element_);
+                return static_cast<ObjectListElement<T>*>(list->rend());
             }
     };
Index: /code/branches/core6/src/libraries/core/object/ObjectListBase.cc
===================================================================
--- /code/branches/core6/src/libraries/core/object/ObjectListBase.cc	(revision 9595)
+++ /code/branches/core6/src/libraries/core/object/ObjectListBase.cc	(revision 9596)
@@ -41,4 +41,9 @@
 namespace orxonox
 {
+    ObjectListBaseElement::~ObjectListBaseElement()
+    {
+        this->list_->removeElement(this);
+    }
+
     /**
         @brief Constructor: Sets default values.
Index: /code/branches/core6/src/libraries/core/object/ObjectListBase.h
===================================================================
--- /code/branches/core6/src/libraries/core/object/ObjectListBase.h	(revision 9595)
+++ /code/branches/core6/src/libraries/core/object/ObjectListBase.h	(revision 9596)
@@ -56,9 +56,11 @@
                 @param objectBase The object to store
             */
-            ObjectListBaseElement(Listable* objectBase) : next_(0), prev_(0), objectBase_(objectBase) {}
+            ObjectListBaseElement(Listable* object, ObjectListBase* list) : next_(0), prev_(0), objectBase_(object), list_(list) {}
+            ~ObjectListBaseElement();
 
             ObjectListBaseElement* next_;       //!< The next element in the list
             ObjectListBaseElement* prev_;       //!< The previous element in the list
-            Listable* objectBase_;
+            Listable* objectBase_;              //!< The object
+            ObjectListBase* list_;              //!< The list
     };
 
@@ -72,5 +74,5 @@
     {
         public:
-            ObjectListElement(T* object) : ObjectListBaseElement(static_cast<Listable*>(object)), object_(object) {}
+            ObjectListElement(T* object, ObjectListBase* list) : ObjectListBaseElement(static_cast<Listable*>(object), list), object_(object) {}
             T* object_;              //!< The object
     };
@@ -99,25 +101,17 @@
             template <class T>
             inline ObjectListBaseElement* add(T* object)
-                { return this->addElement(new ObjectListElement<T>(object)); }
+                { return this->addElement(new ObjectListElement<T>(object, this)); }
 
             ObjectListBaseElement* addElement(ObjectListBaseElement* element);
             void removeElement(ObjectListBaseElement* element);
 
-            /// Helper struct, used to export an element and the list to an instance of Iterator.
-            struct Export
-            {
-                Export(ObjectListBase* list, ObjectListBaseElement* element) : list_(list), element_(element) {}
-                ObjectListBase* list_;
-                ObjectListBaseElement* element_;
-            };
-
             /// Returns a pointer to the first element in the list. Works only with Iterator.
-            inline Export begin() { return ObjectListBase::Export(this, this->first_); }
+            inline ObjectListBaseElement* begin() { return this->first_; }
             /// Returns a pointer to the element after the last element in the list. Works only with Iterator.
-            inline Export end() { return ObjectListBase::Export(this, 0); }
+            inline ObjectListBaseElement* end() { return 0; }
             /// Returns a pointer to the last element in the list. Works only with Iterator.
-            inline Export rbegin() { return ObjectListBase::Export(this, this->last_); }
+            inline ObjectListBaseElement* rbegin() { return this->last_; }
             /// Returns a pointer to the element in front of the first element in the list. Works only with Iterator.
-            inline Export rend() { return ObjectListBase::Export(this, 0); }
+            inline ObjectListBaseElement* rend() { return 0; }
 
             inline void registerIterator(void* iterator) { this->iterators_.push_back(iterator); }
