Index: code/branches/objecthierarchy2/src/core/Core.cc
===================================================================
--- code/branches/objecthierarchy2/src/core/Core.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/core/Core.cc	(revision 2361)
@@ -56,6 +56,7 @@
         RegisterRootObject(Core);
 
-        assert(singletonRef_s == 0);
-        singletonRef_s = this;
+        assert(this->singletonRef_s == 0);
+        this->singletonRef_s = this;
+        this->bInitializeRandomNumberGenerator_ = false;
 
         this->setConfigValues();
@@ -80,4 +81,5 @@
         SetConfigValue(softDebugLevelShell_, 1).description("The maximal level of debug output shown in the ingame shell").callback(this, &Core::debugLevelChanged);
         SetConfigValue(language_, Language::getLanguage().defaultLanguage_).description("The language of the ingame text").callback(this, &Core::languageChanged);
+        SetConfigValue(bInitializeRandomNumberGenerator_, true).description("If true, all random actions are different each time you start the game").callback(this, &Core::initializeRandomNumberGenerator);
     }
 
@@ -174,3 +176,14 @@
         ResetConfigValue(language_);
     }
+
+    void Core::initializeRandomNumberGenerator()
+    {
+        static bool bInitialized = false;
+        if (!bInitialized && this->bInitializeRandomNumberGenerator_)
+        {
+            srand(time(0));
+            rand();
+            bInitialized = true;
+        }
+    }
 }
Index: code/branches/objecthierarchy2/src/core/Core.h
===================================================================
--- code/branches/objecthierarchy2/src/core/Core.h	(revision 2358)
+++ code/branches/objecthierarchy2/src/core/Core.h	(revision 2361)
@@ -78,4 +78,5 @@
             Core(const Core&);
             void resetLanguageIntern();
+            void initializeRandomNumberGenerator();
 
             int softDebugLevel_;                            //!< The debug level
@@ -84,4 +85,5 @@
             int softDebugLevelShell_;                       //!< The debug level for the ingame shell
             std::string language_;                          //!< The language
+            bool bInitializeRandomNumberGenerator_;          //!< If true, srand(time(0)) is called
 
             static bool bShowsGraphics_s;                   //!< global variable that tells whether to show graphics
Index: code/branches/objecthierarchy2/src/core/Super.h
===================================================================
--- code/branches/objecthierarchy2/src/core/Super.h	(revision 2358)
+++ code/branches/objecthierarchy2/src/core/Super.h	(revision 2361)
@@ -99,4 +99,5 @@
             \
             static void apply(void* temp) {} \
+            \
             static void apply(baseclass* temp) \
             { \
@@ -104,4 +105,11 @@
                 for (std::set<const Identifier*>::iterator it = identifier->getDirectChildrenIntern().begin(); it != identifier->getDirectChildrenIntern().end(); ++it) \
                 { \
+                    if (((ClassIdentifier<T>*)(*it))->bSuperFunctionCaller_##functionname##_isFallback_ && ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_) \
+                    { \
+                        delete ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_; \
+                        ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_ = 0; \
+                        ((ClassIdentifier<T>*)(*it))->bSuperFunctionCaller_##functionname##_isFallback_ = false; \
+                    } \
+                    \
                     if (!((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_) \
                     { \
@@ -163,4 +171,13 @@
                 for (std::set<const Identifier*>::iterator it = identifier->getDirectChildrenIntern().begin(); it != identifier->getDirectChildrenIntern().end(); ++it)
                 {
+                    // Check if the caller is a fallback-caller
+                    if (((ClassIdentifier<T>*)(*it))->bSuperFunctionCaller_##functionname##_isFallback_ && ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_)
+                    {
+                        // Delete the fallback caller an prepare to get a real caller
+                        delete ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_;
+                        ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_ = 0;
+                        ((ClassIdentifier<T>*)(*it))->bSuperFunctionCaller_##functionname##_isFallback_ = false;
+                    }
+
                     // Check if there's not already a caller
                     if (!((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_)
@@ -183,5 +200,5 @@
         struct SuperFunctionCondition<functionnumber, baseclass, 0, templatehack2> \
         { \
-            // The check function just behaves like the fallback - it advances to the check for the next super-function (functionnumber + 1)
+            // The check function acts like the fallback - it advances to the check for the next super-function (functionnumber + 1)
             static void check() \
             { \
@@ -301,4 +318,20 @@
             }; \
             \
+            class _CoreExport SuperFunctionCaller_##functionname \
+            { \
+                public: \
+                    virtual void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) = 0; \
+                    virtual ~SuperFunctionCaller_##functionname () {} \
+            }; \
+            \
+            template <class T> \
+            class SuperFunctionClassCaller_purevirtualfallback_##functionname : public SuperFunctionCaller_##functionname \
+            { \
+                public: \
+                    inline void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) \
+                    { \
+                    } \
+            }; \
+            \
             template <class T> \
             struct SuperFunctionInitialization<functionnumber, T> \
@@ -306,5 +339,6 @@
                 static void initialize(ClassIdentifier<T>* identifier) \
                 { \
-                    identifier->superFunctionCaller_##functionname##_ = 0; \
+                    identifier->superFunctionCaller_##functionname##_ = new SuperFunctionClassCaller_purevirtualfallback_##functionname <T>; \
+                    identifier->bSuperFunctionCaller_##functionname##_isFallback_ = true; \
                     SuperFunctionInitialization<functionnumber + 1, T>::initialize(identifier); \
                 } \
@@ -322,11 +356,4 @@
             }; \
             \
-            class _CoreExport SuperFunctionCaller_##functionname \
-            { \
-                public: \
-                    virtual void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) = 0; \
-                    virtual ~SuperFunctionCaller_##functionname () {} \
-            }; \
-            \
             template <class T> \
             class SuperFunctionClassCaller_##functionname : public SuperFunctionCaller_##functionname \
@@ -375,5 +402,25 @@
         };
 
-        // Initializes the SuperFunctionCaller-pointer with zero.
+        // Baseclass of the super-function caller. The real call will be done by a
+        // templatized subclass through the virtual () operator.
+        class _CoreExport SuperFunctionCaller_##functionname
+        {
+            public:
+                virtual void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) = 0;
+                virtual ~SuperFunctionCaller_##functionname () {}
+        };
+
+        // Fallback if the base is pure virtual
+        template <class T>
+        class SuperFunctionClassCaller_purevirtualfallback_##functionname : public SuperFunctionCaller_##functionname
+        {
+            public:
+                // Fallback does nothing
+                inline void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) )
+                {
+                }
+        };
+
+        // Initializes the SuperFunctionCaller-pointer with a fallback caller in case the base function is pure virtual
         template <class T>
         struct SuperFunctionInitialization<functionnumber, T>
@@ -381,5 +428,6 @@
             static void initialize(ClassIdentifier<T>* identifier)
             {
-                identifier->superFunctionCaller_##functionname##_ = 0;
+                identifier->superFunctionCaller_##functionname##_ = new SuperFunctionClassCaller_purevirtualfallback_##functionname <T>;
+                identifier->bSuperFunctionCaller_##functionname##_isFallback_ = true;
 
                 // Calls the initialization of the next super-function (functionnumber + 1)
@@ -400,13 +448,4 @@
                 SuperFunctionDestruction<functionnumber + 1, T>::destroy(identifier);
             }
-        };
-
-        // Baseclass of the super-function caller. The real call will be done by a
-        // templatized subclass through the virtual () operator.
-        class _CoreExport SuperFunctionCaller_##functionname
-        {
-            public:
-                virtual void operator()( SUPER_CALL_ARGUMENTS##hasarguments(__VA_ARGS__) ) = 0;
-                virtual ~SuperFunctionCaller_##functionname () {}
         };
 
@@ -497,5 +536,6 @@
         #ifndef SUPER_INTRUSIVE_DECLARATION
           #define SUPER_INTRUSIVE_DECLARATION(functionname) \
-            SuperFunctionCaller_##functionname * superFunctionCaller_##functionname##_
+            SuperFunctionCaller_##functionname * superFunctionCaller_##functionname##_; \
+            bool bSuperFunctionCaller_##functionname##_isFallback_
         #endif
 
Index: code/branches/objecthierarchy2/src/orxonox/objects/Radar.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/Radar.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/objects/Radar.cc	(revision 2361)
@@ -99,4 +99,6 @@
     void Radar::tick(float dt)
     {
+        SUPER(Radar, tick, dt);
+
         if (this->focus_ != *(this->itFocus_))
         {
Index: code/branches/objecthierarchy2/src/orxonox/objects/Scene.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/Scene.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/objects/Scene.cc	(revision 2361)
@@ -167,4 +167,6 @@
     void Scene::tick(float dt)
     {
+        SUPER(Scene, tick, dt);
+
         if (!Core::showsGraphics())
         {
Index: code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc	(revision 2361)
@@ -62,4 +62,6 @@
     void Gametype::tick(float dt)
     {
+        SUPER(Gametype, tick, dt);
+
         if (this->bStartCountdownRunning_ && !this->bStarted_)
             this->startCountdown_ -= dt;
@@ -150,7 +152,4 @@
         if (this->spawnpoints_.size() > 0)
         {
-            srand(time(0));
-            rnd();
-
             unsigned int randomspawn = (unsigned int)rnd(this->spawnpoints_.size());
             unsigned int index = 0;
Index: code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.cc	(revision 2361)
@@ -144,4 +144,6 @@
             return;
 
+        SUPER(Engine, tick, dt);
+
         const Vector3& direction = this->getDirection();
         Vector3 velocity = this->ship_->getVelocity();
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/BlinkingBillboard.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/BlinkingBillboard.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/BlinkingBillboard.cc	(revision 2361)
@@ -75,4 +75,6 @@
     void BlinkingBillboard::tick(float dt)
     {
+        SUPER(BlinkingBillboard, tick, dt);
+
         if (Core::isMaster() && this->isActive())
         {
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Camera.cc	(revision 2361)
@@ -94,4 +94,5 @@
     void Camera::tick(float dt)
     {
+        SUPER(Camera, tick, dt);
 /*
         // this stuff here may need some adjustments
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2361)
@@ -232,4 +232,6 @@
         if (this->isActive())
         {
+            SUPER(ControllableEntity, tick, dt);
+
             this->velocity_ += (dt * this->acceleration_);
             this->node_->translate(dt * this->velocity_, Ogre::Node::TS_LOCAL);
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/FadingBillboard.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/FadingBillboard.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/FadingBillboard.cc	(revision 2361)
@@ -140,4 +140,6 @@
     void FadingBillboard::tick(float dt)
     {
+        SUPER(FadingBillboard, tick, dt);
+
         if (this->changedirection_ > 0 && (this->fadedColour_.a < this->getColour().a))
         {
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/MovableEntity.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/MovableEntity.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/MovableEntity.cc	(revision 2361)
@@ -74,4 +74,6 @@
         if (this->isActive())
         {
+            SUPER(MovableEntity, tick, dt);
+
             this->velocity_ += (dt * this->acceleration_);
             this->node_->translate(dt * this->velocity_);
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/triggers/Trigger.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/triggers/Trigger.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/triggers/Trigger.cc	(revision 2361)
@@ -106,4 +106,6 @@
     if (!this->BaseObject::isActive())
         return;
+
+    SUPER(Trigger, tick, dt);
 
     bool newTriggered = this->isTriggered() ^ this->bInvertMode_;
Index: code/branches/objecthierarchy2/src/orxonox/overlays/debug/DebugFPSText.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/overlays/debug/DebugFPSText.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/overlays/debug/DebugFPSText.cc	(revision 2361)
@@ -49,4 +49,6 @@
     void DebugFPSText::tick(float dt)
     {
+        SUPER(DebugFPSText, tick, dt);
+
         float fps = GraphicsEngine::getInstance().getAverageFramesPerSecond();
         this->setCaption(convertToString(fps));
Index: code/branches/objecthierarchy2/src/orxonox/overlays/debug/DebugRTRText.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/overlays/debug/DebugRTRText.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/overlays/debug/DebugRTRText.cc	(revision 2361)
@@ -49,4 +49,6 @@
     void DebugRTRText::tick(float dt)
     {
+        SUPER(DebugRTRText, tick, dt);
+
         float rtr = GraphicsEngine::getInstance().getAverageTickTime();
         this->setCaption(convertToString(rtr));
Index: code/branches/objecthierarchy2/src/orxonox/overlays/hud/HUDNavigation.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/overlays/hud/HUDNavigation.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/overlays/hud/HUDNavigation.cc	(revision 2361)
@@ -129,4 +129,6 @@
     void HUDNavigation::tick(float dt)
     {
+        SUPER(HUDNavigation, tick, dt);
+
         if (!Radar::getInstance().getFocus())
         {
Index: code/branches/objecthierarchy2/src/orxonox/overlays/hud/HUDSpeedBar.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/overlays/hud/HUDSpeedBar.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/overlays/hud/HUDSpeedBar.cc	(revision 2361)
@@ -52,4 +52,6 @@
     void HUDSpeedBar::tick(float dt)
     {
+        SUPER(HUDSpeedBar, tick, dt);
+
         if (this->owner_ && this->owner_->getEngine())
         {
Index: code/branches/objecthierarchy2/src/orxonox/tools/Shader.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/tools/Shader.cc	(revision 2358)
+++ code/branches/objecthierarchy2/src/orxonox/tools/Shader.cc	(revision 2361)
@@ -101,4 +101,6 @@
     void Shader::tick(float dt)
     {
+        SUPER(Shader, tick, dt);
+
         if (this->bLoadCompositor_ && !this->bViewportInitialized_ && this->scenemanager_ && this->scenemanager_->getCurrentViewport())
         {
Index: code/branches/objecthierarchy2/src/util/Convert.h
===================================================================
--- code/branches/objecthierarchy2/src/util/Convert.h	(revision 2358)
+++ code/branches/objecthierarchy2/src/util/Convert.h	(revision 2361)
@@ -460,5 +460,5 @@
             else
               *output = "false";
-            return false;
+            return true;
         }
     };
