Index: code/branches/presentation2/src/libraries/core/Core.cc
===================================================================
--- code/branches/presentation2/src/libraries/core/Core.cc	(revision 6120)
+++ code/branches/presentation2/src/libraries/core/Core.cc	(revision 6121)
@@ -51,4 +51,5 @@
 #include "util/Debug.h"
 #include "util/Exception.h"
+#include "util/Scope.h"
 #include "util/SignalHandler.h"
 #include "PathConfig.h"
@@ -81,79 +82,4 @@
 #endif
 
-    /**
-    @brief
-        Helper class for the Core singleton: we cannot derive
-        Core from OrxonoxClass because we need to handle the Identifier
-        destruction in the Core destructor.
-    */
-    class CoreConfiguration : public OrxonoxClass
-    {
-    public:
-        CoreConfiguration()
-        {
-        }
-
-        void initialise()
-        {
-            RegisterRootObject(CoreConfiguration);
-            this->setConfigValues();
-        }
-
-        /**
-            @brief Function to collect the SetConfigValue-macro calls.
-        */
-        void setConfigValues()
-        {
-#ifdef ORXONOX_RELEASE
-            const unsigned int defaultLevelLogFile = 3;
-#else
-            const unsigned int defaultLevelLogFile = 4;
-#endif
-            SetConfigValueGeneric(ConfigFileType::Settings, softDebugLevelLogFile_, "softDebugLevelLogFile", "OutputHandler", defaultLevelLogFile)
-                .description("The maximum level of debug output shown in the log file");
-            OutputHandler::getInstance().setSoftDebugLevel(OutputHandler::logFileOutputListenerName_s, this->softDebugLevelLogFile_);
-
-            SetConfigValue(language_, Language::getInstance().defaultLanguage_)
-                .description("The language of the in game text")
-                .callback(this, &CoreConfiguration::languageChanged);
-            SetConfigValue(bInitializeRandomNumberGenerator_, true)
-                .description("If true, all random actions are different each time you start the game")
-                .callback(this, &CoreConfiguration::initializeRandomNumberGenerator);
-        }
-
-        /**
-            @brief Callback function if the language has changed.
-        */
-        void languageChanged()
-        {
-            // Read the translation file after the language was configured
-            Language::getInstance().readTranslatedLanguageFile();
-        }
-
-        /**
-            @brief Sets the language in the config-file back to the default.
-        */
-        void resetLanguage()
-        {
-            ResetConfigValue(language_);
-        }
-
-        void initializeRandomNumberGenerator()
-        {
-            static bool bInitialized = false;
-            if (!bInitialized && this->bInitializeRandomNumberGenerator_)
-            {
-                srand(static_cast<unsigned int>(time(0)));
-                rand();
-                bInitialized = true;
-            }
-        }
-
-        int softDebugLevelLogFile_;                     //!< The debug level for the log file (belongs to OutputHandler)
-        std::string language_;                          //!< The language
-        bool bInitializeRandomNumberGenerator_;         //!< If true, srand(time(0)) is called
-    };
-
-
     Core::Core(const std::string& cmdLine)
         // Cleanup guard for identifier destruction (incl. XMLPort, configValues, consoleCommands)
@@ -161,5 +87,4 @@
         // Cleanup guard for external console commands that don't belong to an Identifier
         , consoleCommandDestroyer_(CommandExecutor::destroyExternalCommands)
-        , configuration_(new CoreConfiguration()) // Don't yet create config values!
         , bGraphicsLoaded_(false)
     {
@@ -218,4 +143,11 @@
         this->languageInstance_.reset(new Language());
 
+        // Do this soon after the ConfigFileManager has been created to open up the
+        // possibility to configure everything below here
+        ClassIdentifier<Core>::getIdentifier("Core")->initialiseObject(this, "Core", true);
+        // Remove us from the object lists again to avoid problems when destroying the Core
+        this->unregisterObject();
+        this->setConfigValues();
+
         // create persistent io console
         this->ioConsole_.reset(new IOConsole());
@@ -223,8 +155,4 @@
         // creates the class hierarchy for all classes with factories
         Identifier::createClassHierarchy();
-
-        // Do this soon after the ConfigFileManager has been created to open up the
-        // possibility to configure everything below here
-        this->configuration_->initialise();
 
         // Load OGRE excluding the renderer and the render window
@@ -247,4 +175,42 @@
     }
 
+    //! Function to collect the SetConfigValue-macro calls.
+    void Core::setConfigValues()
+    {
+#ifdef ORXONOX_RELEASE
+        const unsigned int defaultLevelLogFile = 3;
+#else
+        const unsigned int defaultLevelLogFile = 4;
+#endif
+        SetConfigValueGeneric(ConfigFileType::Settings, softDebugLevelLogFile_, "softDebugLevelLogFile", "OutputHandler", defaultLevelLogFile)
+            .description("The maximum level of debug output shown in the log file");
+        OutputHandler::getInstance().setSoftDebugLevel(OutputHandler::logFileOutputListenerName_s, this->softDebugLevelLogFile_);
+
+        SetConfigValue(language_, Language::getInstance().defaultLanguage_)
+            .description("The language of the in game text")
+            .callback(this, &Core::languageChanged);
+        SetConfigValue(bInitRandomNumberGenerator_, true)
+            .description("If true, all random actions are different each time you start the game")
+            .callback(this, &Core::initRandomNumberGenerator);
+    }
+
+    //! Callback function if the language has changed.
+    void Core::languageChanged()
+    {
+        // Read the translation file after the language was configured
+        Language::getInstance().readTranslatedLanguageFile();
+    }
+
+    void Core::initRandomNumberGenerator()
+    {
+        static bool bInitialized = false;
+        if (!bInitialized && this->bInitRandomNumberGenerator_)
+        {
+            srand(static_cast<unsigned int>(time(0)));
+            rand();
+            bInitialized = true;
+        }
+    }
+
     void Core::loadGraphics()
     {
@@ -296,18 +262,8 @@
     }
 
-    /**
-        @brief Returns the configured language.
-    */
-    /*static*/ const std::string& Core::getLanguage()
-    {
-        return Core::getInstance().configuration_->language_;
-    }
-
-    /**
-        @brief Sets the language in the config-file back to the default.
-    */
-    /*static*/ void Core::resetLanguage()
-    {
-        Core::getInstance().configuration_->resetLanguage();
+    //! Sets the language in the config-file back to the default.
+    void Core::resetLanguage()
+    {
+        ResetConfigValue(language_);
     }
 
Index: code/branches/presentation2/src/libraries/core/Core.h
===================================================================
--- code/branches/presentation2/src/libraries/core/Core.h	(revision 6120)
+++ code/branches/presentation2/src/libraries/core/Core.h	(revision 6121)
@@ -35,13 +35,10 @@
 #include <cassert>
 #include <boost/scoped_ptr.hpp>
-#include "util/OutputHandler.h"
-#include "util/Scope.h"
 #include "util/ScopeGuard.h"
 #include "util/Singleton.h"
+#include "core/OrxonoxClass.h"
 
 namespace orxonox
 {
-    class CoreConfiguration;
-
     /**
     @brief
@@ -50,5 +47,5 @@
         You should only create this singleton once because it destroys the identifiers!
     */
-    class _CoreExport Core : public Singleton<Core>
+    class _CoreExport Core : public Singleton<Core>, public OrxonoxClass
     {
         typedef Loki::ScopeGuardImpl0<void (*)()> SimpleScopeGuard;
@@ -69,9 +66,14 @@
             void setConfigValues();
 
-            static const std::string& getLanguage();
-            static void  resetLanguage();
+            //! Returns the configured language.
+            const std::string& getLanguage()
+                { return this->language_; }
+            void resetLanguage();
 
         private:
             Core(const Core&); //!< Don't use (undefined symbol)
+
+            void languageChanged();
+            void initRandomNumberGenerator();
 
             void preUpdate(const Clock& time);
@@ -82,5 +84,5 @@
 
             void setThreadAffinity(int limitToCPU);
-
+            // MANAGED SINGLETONS/OBJECTS
             // Mind the order for the destruction!
             scoped_ptr<PathConfig>        pathConfig_;
@@ -92,16 +94,19 @@
             scoped_ptr<Language>          languageInstance_;
             scoped_ptr<IOConsole>         ioConsole_;
-            scoped_ptr<CoreConfiguration> configuration_;
             scoped_ptr<TclBind>           tclBind_;
             scoped_ptr<TclThreadManager>  tclThreadManager_;
+            scoped_ptr<Scope<ScopeID::Root> >     rootScope_;
             // graphical
             scoped_ptr<GraphicsManager>   graphicsManager_;     //!< Interface to OGRE
             scoped_ptr<InputManager>      inputManager_;        //!< Interface to OIS
             scoped_ptr<GUIManager>        guiManager_;          //!< Interface to GUI
-            scoped_ptr<Scope<ScopeID::Root> >     rootScope_;
             scoped_ptr<Scope<ScopeID::Graphics> > graphicsScope_;
 
             bool                          bGraphicsLoaded_;
-            static Core* singletonPtr_s;
+            int                           softDebugLevelLogFile_;      //!< The debug level for the log file (belongs to OutputHandler)
+            std::string                   language_;                   //!< The language
+            bool                          bInitRandomNumberGenerator_; //!< If true, srand(time(0)) is called
+
+            static Core*                  singletonPtr_s;
     };
 }
Index: code/branches/presentation2/src/libraries/core/Game.cc
===================================================================
--- code/branches/presentation2/src/libraries/core/Game.cc	(revision 6120)
+++ code/branches/presentation2/src/libraries/core/Game.cc	(revision 6121)
@@ -67,9 +67,5 @@
     Game* Game::singletonPtr_s = 0;
 
-
-    /**
-    @brief
-        Represents one node of the game state tree.
-    */
+    //! Represents one node of the game state tree.
     struct GameStateTreeNode
     {
@@ -79,40 +75,4 @@
     };
 
-
-    /**
-    @brief
-        Another helper class for the Game singleton: we cannot derive
-        Game from OrxonoxClass because we need to handle the Identifier
-        destruction in the Core destructor.
-    */
-    class GameConfiguration : public OrxonoxClass
-    {
-    public:
-        GameConfiguration()
-        {
-            RegisterRootObject(GameConfiguration);
-            this->setConfigValues();
-        }
-
-        void setConfigValues()
-        {
-            SetConfigValue(statisticsRefreshCycle_, 250000)
-                .description("Sets the time in microseconds interval at which average fps, etc. get updated.");
-            SetConfigValue(statisticsAvgLength_, 1000000)
-                .description("Sets the time in microseconds interval at which average fps, etc. gets calculated.");
-            SetConfigValue(fpsLimit_, 50)
-                .description("Sets the desired framerate (0 for no limit).");
-        }
-
-        unsigned int statisticsRefreshCycle_;
-        unsigned int statisticsAvgLength_;
-        unsigned int fpsLimit_;
-    };
-
-
-    /**
-    @brief
-        Non-initialising constructor.
-    */
     Game::Game(const std::string& cmdLine)
         // Destroy factories before the Core!
@@ -137,4 +97,10 @@
         this->core_.reset(new Core(cmdLine));
 
+        // Do this after the Core creation!
+        ClassIdentifier<Game>::getIdentifier("Game")->initialiseObject(this, "Game", true);
+        // Remove us from the object lists again to avoid problems when destroying the Game
+        this->unregisterObject();
+        this->setConfigValues();
+
         // After the core has been created, we can safely instantiate the GameStates that don't require graphics
         for (std::map<std::string, GameStateInfo>::const_iterator it = gameStateDeclarations_s.begin();
@@ -150,7 +116,4 @@
         this->loadedTopStateNode_ = this->rootStateNode_;
         this->loadedStates_.push_back(this->getState(rootStateNode_->name_));
-
-        // Do this after the Core creation!
-        this->configuration_.reset(new GameConfiguration());
     }
 
@@ -161,4 +124,14 @@
     Game::~Game()
     {
+    }
+
+    void Game::setConfigValues()
+    {
+        SetConfigValue(statisticsRefreshCycle_, 250000)
+            .description("Sets the time in microseconds interval at which average fps, etc. get updated.");
+        SetConfigValue(statisticsAvgLength_, 1000000)
+            .description("Sets the time in microseconds interval at which average fps, etc. gets calculated.");
+        SetConfigValue(fpsLimit_, 50)
+            .description("Sets the desired framerate (0 for no limit).");
     }
 
@@ -312,9 +285,9 @@
         this->statisticsTickTimes_.back().tickLength += currentRealTime - currentTime;
         this->periodTickTime_ += currentRealTime - currentTime;
-        if (this->periodTime_ > this->configuration_->statisticsRefreshCycle_)
+        if (this->periodTime_ > this->statisticsRefreshCycle_)
         {
             std::list<StatisticsTickInfo>::iterator it = this->statisticsTickTimes_.begin();
             assert(it != this->statisticsTickTimes_.end());
-            int64_t lastTime = currentTime - this->configuration_->statisticsAvgLength_;
+            int64_t lastTime = currentTime - this->statisticsAvgLength_;
             if (static_cast<int64_t>(it->tickTime) < lastTime)
             {
@@ -333,5 +306,5 @@
             this->avgTickTime_ = static_cast<float>(this->periodTickTime_) / framesPerPeriod / 1000.0f;
 
-            this->periodTime_ -= this->configuration_->statisticsRefreshCycle_;
+            this->periodTime_ -= this->statisticsRefreshCycle_;
         }
     }
@@ -339,6 +312,6 @@
     void Game::updateFPSLimiter()
     {
-        // Why configuration_->fpsLimit_ - 1? No idea, but otherwise the fps rate is always (from 10 to 200!) one frame too high
-        uint32_t nextTime = gameClock_->getMicroseconds() - excessSleepTime_ + static_cast<uint32_t>(1000000.0f / (configuration_->fpsLimit_ - 1));
+        // Why fpsLimit_ - 1? No idea, but otherwise the fps rate is always (from 10 to 200!) one frame too high
+        uint32_t nextTime = gameClock_->getMicroseconds() - excessSleepTime_ + static_cast<uint32_t>(1000000.0f / (fpsLimit_ - 1));
         uint64_t currentRealTime = gameClock_->getRealMicroseconds();
         while (currentRealTime < nextTime - minimumSleepTime_)
Index: code/branches/presentation2/src/libraries/core/Game.h
===================================================================
--- code/branches/presentation2/src/libraries/core/Game.h	(revision 6120)
+++ code/branches/presentation2/src/libraries/core/Game.h	(revision 6121)
@@ -50,4 +50,5 @@
 #include "util/ScopeGuard.h"
 #include "util/Singleton.h"
+#include "core/OrxonoxClass.h"
 
 /**
@@ -61,6 +62,4 @@
 namespace orxonox
 {
-    class GameConfiguration;
-
     //! Helper object required before GameStates are being constructed
     struct GameStateInfo
@@ -78,5 +77,5 @@
         You should only create this singleton once because it owns the Core class! (see remark there)
     */
-    class _CoreExport Game : public Singleton<Game>
+    class _CoreExport Game : public Singleton<Game>, public OrxonoxClass
     {
         friend class Singleton<Game>;
@@ -88,4 +87,6 @@
         Game(const std::string& cmdLine);
         ~Game();
+
+        void setConfigValues();
 
         void setStateHierarchy(const std::string& str);
@@ -160,5 +161,4 @@
         scoped_ptr<Core>                   core_;
         ObjScopeGuard                      gsFactoryDestroyer_;
-        scoped_ptr<GameConfiguration>      configuration_;
 
         GameStateMap                       constructedStates_;
@@ -181,4 +181,9 @@
         unsigned int                       minimumSleepTime_;
 
+        // config values
+        unsigned int                       statisticsRefreshCycle_;
+        unsigned int                       statisticsAvgLength_;
+        unsigned int                       fpsLimit_;
+
         static std::map<std::string, GameStateInfo> gameStateDeclarations_s;
         static Game* singletonPtr_s;        //!< Pointer to the Singleton
Index: code/branches/presentation2/src/libraries/core/Language.cc
===================================================================
--- code/branches/presentation2/src/libraries/core/Language.cc	(revision 6120)
+++ code/branches/presentation2/src/libraries/core/Language.cc	(revision 6121)
@@ -246,7 +246,7 @@
     void Language::readTranslatedLanguageFile()
     {
-        COUT(4) << "Read translated language file (" << Core::getLanguage() << ")." << std::endl;
-
-        std::string filepath = PathConfig::getConfigPathString() + getFilename(Core::getLanguage());
+        COUT(4) << "Read translated language file (" << Core::getInstance().getLanguage() << ")." << std::endl;
+
+        std::string filepath = PathConfig::getConfigPathString() + getFilename(Core::getInstance().getLanguage());
 
         // Open the file
@@ -257,6 +257,6 @@
         {
             COUT(1) << "An error occurred in Language.cc:" << std::endl;
-            COUT(1) << "Error: Couldn't open file " << getFilename(Core::getLanguage()) << " to read the translated language entries!" << std::endl;
-            Core::resetLanguage();
+            COUT(1) << "Error: Couldn't open file " << getFilename(Core::getInstance().getLanguage()) << " to read the translated language entries!" << std::endl;
+            Core::getInstance().resetLanguage();
             COUT(3) << "Info: Reset language to " << this->defaultLanguage_ << "." << std::endl;
             return;
@@ -287,5 +287,5 @@
                 else
                 {
-                    COUT(2) << "Warning: Invalid language entry \"" << lineString << "\" in " << getFilename(Core::getLanguage()) << std::endl;
+                    COUT(2) << "Warning: Invalid language entry \"" << lineString << "\" in " << getFilename(Core::getInstance().getLanguage()) << std::endl;
                 }
             }
Index: code/branches/presentation2/src/libraries/core/Language.h
===================================================================
--- code/branches/presentation2/src/libraries/core/Language.h	(revision 6120)
+++ code/branches/presentation2/src/libraries/core/Language.h	(revision 6121)
@@ -116,5 +116,5 @@
     {
         friend class Singleton<Language>;
-        friend class CoreConfiguration;
+        friend class Core;
 
         public:
Index: code/branches/presentation2/src/libraries/core/OrxonoxClass.cc
===================================================================
--- code/branches/presentation2/src/libraries/core/OrxonoxClass.cc	(revision 6120)
+++ code/branches/presentation2/src/libraries/core/OrxonoxClass.cc	(revision 6121)
@@ -59,10 +59,10 @@
         assert(this->referenceCount_ <= 0);
 
-        delete this->metaList_;
+        this->unregisterObject();
 
         // parents_ exists only if isCreatingHierarchy() of the associated Identifier returned true while creating the class
         if (this->parents_)
             delete this->parents_;
-            
+
         // reset all weak pointers pointing to this object
         for (std::set<WeakPtr<OrxonoxClass>*>::iterator it = this->weakPointers_.begin(); it != this->weakPointers_.end(); )
@@ -77,4 +77,11 @@
         if (this->referenceCount_ == 0)
             delete this;
+    }
+
+    void OrxonoxClass::unregisterObject()
+    {
+        if (this->metaList_)
+            delete this->metaList_;
+        this->metaList_ = 0;
     }
 
Index: code/branches/presentation2/src/libraries/core/OrxonoxClass.h
===================================================================
--- code/branches/presentation2/src/libraries/core/OrxonoxClass.h	(revision 6120)
+++ code/branches/presentation2/src/libraries/core/OrxonoxClass.h	(revision 6121)
@@ -73,4 +73,5 @@
 
             void destroy();
+            void unregisterObject();
 
             /** @brief Function to collect the SetConfigValue-macro calls. */
