Index: code/branches/objecthierarchie/src/BaseObject.h
===================================================================
--- code/branches/objecthierarchie/src/BaseObject.h	(revision 175)
+++ code/branches/objecthierarchie/src/BaseObject.h	(revision 176)
@@ -11,5 +11,5 @@
         public:
             BaseObject();
-            ~BaseObject();
+            virtual ~BaseObject();
 
             inline bool isA(Identifier* identifier)
Index: code/branches/objecthierarchie/src/ClassHierarchy.h
===================================================================
--- code/branches/objecthierarchie/src/ClassHierarchy.h	(revision 175)
+++ code/branches/objecthierarchie/src/ClassHierarchy.h	(revision 176)
@@ -4,18 +4,18 @@
 #include <string>
 #include <iostream>
-#include <assert.h>
 
 // DONE AND TESTED:
-// - klassenhierarchie aufbauen
-// - isA u.a. vergleiche
-// - in listen einfügen
+// - build class hierarchy
+// - isA, isChildOf, ...
+// - insert into class-lists
+// - ClassIdentifier
 
 // IN WORK:
-// - factory
-// - klassen-identifier
+// - BaseIdentifier
+// - Factory
 
 // TO DO:
-// - durch listen iterieren
-// - searchtree für classname-strings
+// - iterate through lists
+// - searchtree for classname-strings
 
 
@@ -59,6 +59,4 @@
 
         public:
-            Identifier(Identifier* identifier) {};
-            ~Identifier();
             void addObject(OrxonoxClass* object);
             void removeObject(OrxonoxClass* object);
@@ -79,4 +77,6 @@
         private:
             Identifier();
+            Identifier(const Identifier& identifier) {}
+            virtual ~Identifier();
             void initialize(IdentifierList* parents);
 
@@ -94,6 +94,4 @@
 
     // ##### ClassIdentifier #####
-    class A1;
-
     template <class T>
     class ClassIdentifier : public Identifier
@@ -106,4 +104,5 @@
         private:
             ClassIdentifier();
+            ClassIdentifier(const ClassIdentifier<T>& identifier) {}
             ~ClassIdentifier();
 
@@ -168,4 +167,42 @@
     {
         return new T();
+    }
+
+
+    // ##### BaseIdentifier #####
+    template <class B>
+    class BaseIdentifier// : public Identifier
+    {
+        public:
+            BaseIdentifier();
+
+            template <class T>
+            BaseIdentifier<B>& operator= (ClassIdentifier<T>* identifier)
+            {
+                std::cout << "####### Class(" << identifier->getName() << ")->isA( Class(" << ClassIdentifier<B>::getIdentifier()->getName() << ") ) = " << identifier->isA( ClassIdentifier<B>::getIdentifier() ) << "\n";
+                if (!identifier->isA(ClassIdentifier<B>::getIdentifier()))
+                {
+                    std::cout << "Error: Class " << identifier->getName() << " is not a " << ClassIdentifier<B>::getIdentifier()->getName() << "!\n";
+                    std::cout << "Error: BaseIdentifier<" << ClassIdentifier<B>::getIdentifier()->getName() << "> = Class(" << identifier->getName() << ") is forbidden.\n";
+                    std::cout << "Aborting...\n";
+                    abort();
+                }
+                this->identifier_ = identifier;
+                return *this;
+            }
+
+            operator Identifier()
+            {
+                return this->identifier_;
+            }
+
+        private:
+            Identifier* identifier_;
+    };
+
+    template <class B>
+    BaseIdentifier<B>::BaseIdentifier()
+    {
+        this->identifier_ = ClassIdentifier<B>::getIdentifier();
     }
 
Index: code/branches/objecthierarchie/src/orxonox.cc
===================================================================
--- code/branches/objecthierarchie/src/orxonox.cc	(revision 175)
+++ code/branches/objecthierarchie/src/orxonox.cc	(revision 176)
@@ -123,5 +123,5 @@
         test4 = new A3();
 */
-/*
+
         std::cout << "Test 5\n";
         A1* test5_01 = new A1();
@@ -144,4 +144,5 @@
         A3B2C2* test5_18 = new A3B2C2();
 
+/*
         OrxonoxClass* test5;
         for (int i = 0; i <= 18; i++)
@@ -434,4 +435,27 @@
 */
 
+        std::cout << "Test 7\n";
+        std::cout << "1\n";
+        BaseIdentifier<A1B1> test7_01;
+        test7_01 = Class(A1B1C1);
+
+        BaseIdentifier<A1B1> test7_02;
+        test7_02 = Class(A1B1);
+
+//        std::cout << Identifier(test7_02).getName() << "\n";
+
+/*
+        BaseIdentifier<A1B1> test7_03;
+        test7_03 = Class(A1);
+
+        BaseIdentifier<A1B1> test7_04;
+        test7_04 = Class(A1B2);
+
+        BaseIdentifier<A1B1> test7_05;
+        test7_05 = Class(A2);
+*/
+        std::cout << "2\n";
+
+
       }
 
