Index: code/branches/core3/src/core/ConfigFileManager.cc
===================================================================
--- code/branches/core3/src/core/ConfigFileManager.cc	(revision 1658)
+++ code/branches/core3/src/core/ConfigFileManager.cc	(revision 1676)
@@ -327,5 +327,5 @@
         file.close();
 
-        COUT(3) << "Loaded config file \"" << this->filename_ << "\"." << std::endl;
+        COUT(0) << "Loaded config file \"" << this->filename_ << "\"." << std::endl;
 
         // Save the file in case something changed (like stripped whitespaces)
Index: code/branches/core3/src/core/Factory.cc
===================================================================
--- code/branches/core3/src/core/Factory.cc	(revision 1658)
+++ code/branches/core3/src/core/Factory.cc	(revision 1676)
@@ -98,4 +98,8 @@
         }
         (*getFactoryPointer()->identifierStringMap_.begin()).second->stopCreatingHierarchy();
+/*
+        for (it = Identifier::getIdentifierMapIntern().begin(); it != Identifier::getIdentifierMapIntern().end(); ++it)
+            (*it).second->createSuperFunctionCaller();
+*/
         COUT(3) << "*** Factory: Finished class-hierarchy creation" << std::endl;
     }
Index: code/branches/core3/src/core/Identifier.cc
===================================================================
--- code/branches/core3/src/core/Identifier.cc	(revision 1658)
+++ code/branches/core3/src/core/Identifier.cc	(revision 1676)
@@ -145,4 +145,7 @@
                 // Tell the parent we're one of it's direct children
                 (*it)->getDirectChildrenIntern().insert((*it)->getDirectChildrenIntern().end(), this);
+
+                // Create the super-function dependencies
+                (*it)->createSuperFunctionCaller();
             }
         }
Index: code/branches/core3/src/core/Identifier.h
===================================================================
--- code/branches/core3/src/core/Identifier.h	(revision 1658)
+++ code/branches/core3/src/core/Identifier.h	(revision 1676)
@@ -62,4 +62,6 @@
 #include "MetaObjectList.h"
 #include "Iterator.h"
+#undef SUPER_INTRUSIVE
+#include "Super.h"
 #include "util/Debug.h"
 #include "util/String.h"
@@ -224,4 +226,6 @@
             static Identifier* getIdentifierSingleton(const std::string& name, Identifier* proposal);
 
+            virtual void createSuperFunctionCaller() const = 0;
+
             /** @brief Returns the map that stores all Identifiers. @return The map */
             static std::map<std::string, Identifier*>& getIdentifierMapIntern();
@@ -229,8 +233,4 @@
             static std::map<std::string, Identifier*>& getLowercaseIdentifierMapIntern();
 
-            bool bCreatedOneObject_;                                       //!< True if at least one object of the given type was created (used to determine the need of storing the parents)
-            ObjectListBase* objects_;                                      //!< The list of all objects of this class
-
-        private:
             /** @brief Returns the children of the class the Identifier belongs to. @return The list of all children */
             inline std::set<const Identifier*>& getChildrenIntern() const { return (*this->children_); }
@@ -238,4 +238,8 @@
             inline std::set<const Identifier*>& getDirectChildrenIntern() const { return (*this->directChildren_); }
 
+            bool bCreatedOneObject_;                                       //!< True if at least one object of the given type was created (used to determine the need of storing the parents)
+            ObjectListBase* objects_;                                      //!< The list of all objects of this class
+
+        private:
             /**
                 @brief Increases the hierarchyCreatingCounter_s variable, causing all new objects to store their parents.
@@ -295,4 +299,7 @@
     class ClassIdentifier : public Identifier
     {
+        #define SUPER_INTRUSIVE_DECLARATION
+        #include "Super.h"
+
         public:
             static ClassIdentifier<T> *getIdentifier();
@@ -311,5 +318,9 @@
 
         private:
-            ClassIdentifier() {}
+            ClassIdentifier()
+            {
+                #define SUPER_INTRUSIVE_CONSTRUCTOR
+                #include "Super.h"
+            }
             ClassIdentifier(const ClassIdentifier<T>& identifier) {}    // don't copy
             ~ClassIdentifier() {}                                       // don't delete
Index: code/branches/core3/src/orxonox/objects/BillboardProjectile.cc
===================================================================
--- code/branches/core3/src/orxonox/objects/BillboardProjectile.cc	(revision 1658)
+++ code/branches/core3/src/orxonox/objects/BillboardProjectile.cc	(revision 1676)
@@ -48,4 +48,8 @@
             this->scale(0.5);
         }
+
+        std::cout << "a:\n";
+        SUPER(BillboardProjectile, testfunction);
+        std::cout << "b:\n";
     }
 
@@ -66,3 +70,5 @@
         this->billboard_.setVisible(this->isVisible());
     }
+
+    void BillboardProjectile::testfunction() { SUPER(BillboardProjectile, testfunction); std::cout << "2 -> " << std::endl; }
 }
Index: code/branches/core3/src/orxonox/objects/BillboardProjectile.h
===================================================================
--- code/branches/core3/src/orxonox/objects/BillboardProjectile.h	(revision 1658)
+++ code/branches/core3/src/orxonox/objects/BillboardProjectile.h	(revision 1676)
@@ -46,4 +46,5 @@
             virtual void setColour(const ColourValue& colour);
             virtual void changedVisibility();
+            virtual void testfunction();
 
         private:
Index: code/branches/core3/src/orxonox/objects/ParticleProjectile.cc
===================================================================
--- code/branches/core3/src/orxonox/objects/ParticleProjectile.cc	(revision 1658)
+++ code/branches/core3/src/orxonox/objects/ParticleProjectile.cc	(revision 1676)
@@ -33,7 +33,39 @@
 #include "core/CoreIncludes.h"
 #include "core/ConfigValueIncludes.h"
+//#include "util/FastDelegate.h"
+//using namespace fastdelegate;
+
 namespace orxonox
 {
     CreateFactory(ParticleProjectile);
+
+    struct FunctionPointerViewer
+    {
+        void* ptr1_;
+        void* ptr2_;
+
+        void view()
+        {
+            std::cout << ptr1_ << "." << ptr2_ << std::endl;
+        }
+    };
+
+    union FunctionPointerViewer1
+    {
+        FunctionPointerViewer viewer_;
+        void (Projectile::*function_) ();
+    };
+
+    union FunctionPointerViewer2
+    {
+        FunctionPointerViewer viewer_;
+        void (BillboardProjectile::*function_) ();
+    };
+
+    union FunctionPointerViewer3
+    {
+        FunctionPointerViewer viewer_;
+        void (ParticleProjectile::*function_) ();
+    };
 
     ParticleProjectile::ParticleProjectile(SpaceShip* owner) : BillboardProjectile(owner)
@@ -54,4 +86,61 @@
 
         this->setConfigValues();
+/*
+        FunctionPointerViewer1 fpw1;
+        fpw1.function_ = &Projectile::testfunction;
+        FunctionPointerViewer2 fpw2;
+        fpw2.function_ = &BillboardProjectile::testfunction;
+        FunctionPointerViewer3 fpw3;
+        fpw3.function_ = &ParticleProjectile::testfunction;
+
+        std::cout << sizeof(void (Projectile::*) ()) << std::endl;
+        fpw1.viewer_.view();
+        fpw2.viewer_.view();
+        fpw3.viewer_.view();
+
+        {
+            std::cout << "1:" << std::endl;
+            FastDelegate0<> delegate1(this, &ParticleProjectile::testfunction);
+            delegate1();
+            FastDelegate0<> delegate2((BillboardProjectile*)this, &BillboardProjectile::testfunction);
+            delegate2();
+            FastDelegate0<> delegate3(this, &Projectile::testfunction);
+            delegate3();
+        }
+        {
+            std::cout << "2:" << std::endl;
+            BillboardProjectile temp;
+//            FastDelegate0<> delegate1(&temp, &ParticleProjectile::testfunction);
+//            delegate1();
+            FastDelegate0<> delegate2(&temp, &BillboardProjectile::testfunction);
+            delegate2();
+            FastDelegate0<> delegate3(&temp, &Projectile::testfunction);
+            delegate3();
+        }
+        std::cout << "done" << std::endl;
+
+        std::cout << "0:" << std::endl;
+        this->Projectile::testfunction();
+        this->BillboardProjectile::testfunction();
+        this->ParticleProjectile::testfunction();
+        this->testfunction();
+
+        std::cout << "1:" << std::endl;
+        (this->*fpw1.function_)();
+        std::cout << "2:" << std::endl;
+        (this->*fpw2.function_)();
+        std::cout << "3:" << std::endl;
+        (this->*fpw3.function_)();
+        std::cout << "done" << std::endl;
+*/
+        std::cout << "c:\n";
+        SUPER(ParticleProjectile, testfunction);
+        std::cout << "d:\n";
+
+        std::cout << "e:\n";
+        this->testfunction();
+        std::cout << "f:\n";
+
+//        (*((ClassIdentifier<SuperDummy>*)this->getIdentifier())->superFunctionCaller_testfunction_)(this);
     }
 
@@ -72,3 +161,5 @@
         this->particles_->setEnabled(this->isVisible());
     }
+
+    void ParticleProjectile::testfunction() { SUPER(ParticleProjectile, testfunction); std::cout << "3 -> " << std::endl; }
 }
Index: code/branches/core3/src/orxonox/objects/ParticleProjectile.h
===================================================================
--- code/branches/core3/src/orxonox/objects/ParticleProjectile.h	(revision 1658)
+++ code/branches/core3/src/orxonox/objects/ParticleProjectile.h	(revision 1676)
@@ -44,4 +44,5 @@
             virtual ~ParticleProjectile();
             virtual void changedVisibility();
+            virtual void testfunction();
             void setConfigValues();
 
Index: code/branches/core3/src/orxonox/objects/Projectile.cc
===================================================================
--- code/branches/core3/src/orxonox/objects/Projectile.cc	(revision 1658)
+++ code/branches/core3/src/orxonox/objects/Projectile.cc	(revision 1676)
@@ -121,3 +121,5 @@
         delete this;
     }
+
+    void Projectile::testfunction() { std::cout << "1 -> " << std::endl; }
 }
Index: code/branches/core3/src/orxonox/objects/Projectile.h
===================================================================
--- code/branches/core3/src/orxonox/objects/Projectile.h	(revision 1658)
+++ code/branches/core3/src/orxonox/objects/Projectile.h	(revision 1676)
@@ -34,4 +34,6 @@
 #include "WorldEntity.h"
 #include "tools/Timer.h"
+#undef SUPER_INTRUSIVE
+#include "core/Super.h"
 
 namespace orxonox
@@ -45,4 +47,5 @@
             void destroyObject();
             virtual void tick(float dt);
+            virtual void testfunction();
 
             static float getSpeed()
@@ -64,4 +67,53 @@
             Timer<Projectile> destroyTimer_;
     };
+
+    // Partially specialized template (templatehack is now specialized too)
+    template <class T>
+    struct SuperFunctionCondition<0, 0, T>
+    {
+        // Checks if class U isA baseclass and sets the functionpointer if the check returned true
+        static void check()
+        {
+            std::cout << "check superfunction \"testfunction\" in " << ClassIdentifier<T>::getIdentifier()->getName() << std::endl;
+
+            T* temp;
+            SuperFunctionCondition<0, 0, T>::apply(temp);
+
+            std::cout << "done" << std::endl;
+
+            // Calls the condition of the next super-function
+            SuperFunctionCondition<0 + 1, 0, T>::check();
+        }
+
+        static void apply(void* temp)
+        {
+            std::cout << ClassIdentifier<T>::getIdentifier()->getName() << " is not a Projectile" << std::endl;
+            // nop
+        }
+
+        static void apply(Projectile* temp)
+        {
+            std::cout << ClassIdentifier<T>::getIdentifier()->getName() << " is a Projectile" << std::endl;
+            ClassIdentifier<T>* identifier = ClassIdentifier<T>::getIdentifier();
+
+            SuperFunctionCaller_testfunction* superFunctionCaller = 0;
+            // Search for an existing caller within all direct children
+            for (std::set<const Identifier*>::iterator it = identifier->getDirectChildrenIntern().begin(); it != identifier->getDirectChildrenIntern().end(); ++it)
+                if (((ClassIdentifier<T>*)(*it))->superFunctionCaller_testfunction_)
+                    superFunctionCaller = ((ClassIdentifier<T>*)(*it))->superFunctionCaller_testfunction_;
+            // Check if we've found an existing caller - if not, create a new one
+            if (!superFunctionCaller)
+                superFunctionCaller = new SuperFunctionClassCaller_testfunction<T>;
+            // Iterate through all children and assign the caller
+            for (std::set<const Identifier*>::iterator it = identifier->getDirectChildrenIntern().begin(); it != identifier->getDirectChildrenIntern().end(); ++it)
+            {
+                if (!((ClassIdentifier<T>*)(*it))->superFunctionCaller_testfunction_)
+                {
+                    std::cout << "adding functionpointer to " << ((ClassIdentifier<T>*)(*it))->getName() << std::endl;
+                    ((ClassIdentifier<T>*)(*it))->superFunctionCaller_testfunction_ = superFunctionCaller;
+                }
+            }
+        }
+    };
 }
 
