Index: /code/branches/core5/src/libraries/core/Core.cc
===================================================================
--- /code/branches/core5/src/libraries/core/Core.cc	(revision 5849)
+++ /code/branches/core5/src/libraries/core/Core.cc	(revision 5850)
@@ -264,4 +264,7 @@
         // create a shell
         this->shell_.reset(new Shell());
+
+        // Create singletons that always exist (in other libraries)
+        this->rootScope_.reset(new Scope<ScopeID::Root>());
     }
 
@@ -289,4 +292,7 @@
             inputManager_->getMousePosition(), graphicsManager_->isFullScreen()));
 
+        // Create singletons associated with graphics (in other libraries)
+        graphicsScope_.reset(new Scope<ScopeID::Graphics>());
+
         unloader.Dismiss();
 
@@ -296,6 +302,7 @@
     void Core::unloadGraphics()
     {
-        this->guiManager_.reset();;
-        this->inputManager_.reset();;
+        this->graphicsScope_.reset();
+        this->guiManager_.reset();
+        this->inputManager_.reset();
         this->graphicsManager_.reset();
 
@@ -420,4 +427,6 @@
     void Core::preUpdate(const Clock& time)
     {
+        // singletons from other libraries
+        Scope<ScopeID::Root>::update(time);
         if (this->bGraphicsLoaded_)
         {
@@ -426,4 +435,6 @@
             // process gui events
             this->guiManager_->update(time);
+            // graphics singletons from other libraries
+            Scope<ScopeID::Graphics>::update(time);
         }
         // process thread commands
Index: /code/branches/core5/src/libraries/core/Core.h
===================================================================
--- /code/branches/core5/src/libraries/core/Core.h	(revision 5849)
+++ /code/branches/core5/src/libraries/core/Core.h	(revision 5850)
@@ -36,4 +36,5 @@
 #include <boost/scoped_ptr.hpp>
 #include "util/OutputHandler.h"
+#include "util/Scope.h"
 #include "util/ScopeGuard.h"
 #include "util/Singleton.h"
@@ -100,4 +101,6 @@
             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_;
Index: /code/branches/core5/src/libraries/util/Scope.h
===================================================================
--- /code/branches/core5/src/libraries/util/Scope.h	(revision 5849)
+++ /code/branches/core5/src/libraries/util/Scope.h	(revision 5850)
@@ -31,7 +31,8 @@
 
 #include "UtilPrereqs.h"
+
 #include <cassert>
+#include <map>
 #include <set>
-#include <map>
 #include "Debug.h"
 
@@ -45,11 +46,12 @@
         enum Value
         {
-            GSRoot,
-            GSGraphics,
-            GSLevel
+            Root,
+            Graphics
         };
     }
 
-    class ScopeListener; // Forward declaration
+    // Forward declarations
+    class ScopeListener;
+    class Clock;
 
     /**
@@ -87,4 +89,6 @@
             //! Gets called if the scope is deactivated
             virtual void deactivated() = 0;
+            //! Gets called if the scope is updated
+            virtual void updated(const Clock& time) = 0;
 
         private:
@@ -136,4 +140,14 @@
                 return (ScopeManager::instanceCounts_s[scope] > 0);
             }
+
+            //! Update method for the ScopeListeners (to implement singleton updates)
+            static void update(const Clock& time)
+            {
+                if (isActive())
+                {
+                    for (typename std::set<ScopeListener*>::iterator it = ScopeManager::listeners_s[scope].begin(); it != ScopeManager::listeners_s[scope].end(); )
+                        (*(it++))->updated(time);
+                }
+            }
     };
 }
Index: /code/branches/core5/src/libraries/util/ScopedSingleton.h
===================================================================
--- /code/branches/core5/src/libraries/util/ScopedSingleton.h	(revision 5849)
+++ /code/branches/core5/src/libraries/util/ScopedSingleton.h	(revision 5850)
@@ -37,4 +37,5 @@
 namespace orxonox
 {
+    class Clock;
     /**
     @brief
@@ -59,9 +60,14 @@
                 assert(Scope<scope>::isActive());
 
-                if (!T::singletonPtr_s && Scope<scope>::isActive())
+                if (!T::singletonPtr_s)
                     T::singletonPtr_s = new T();
 
                 return *T::singletonPtr_s;
             }
+
+            //! Update method for singletons like the ingame console
+            virtual void updated(const Clock& time) { static_cast<T*>(this)->update(time); }
+            //! Empty update method for the static polymorphism
+            void update(const Clock& time) { }
 
         protected:
@@ -85,5 +91,5 @@
             {
                 // The ScopedSingleton shouldn't be active bevor the scope is activated -> always assertion failed
-                assert(T::singletonPtr_s == 0 && false);
+                assert(false);
             }
 
Index: /code/branches/core5/src/modules/questsystem/QuestManager.h
===================================================================
--- /code/branches/core5/src/modules/questsystem/QuestManager.h	(revision 5849)
+++ /code/branches/core5/src/modules/questsystem/QuestManager.h	(revision 5850)
@@ -50,7 +50,4 @@
 namespace orxonox
 {
-
-    typedef ScopedSingleton<QuestManager, ScopeID::GSLevel> ScopedSingletonQuestManagerGSLevel; // workaround for tolua
-
     /**
     @brief
@@ -60,9 +57,10 @@
         Damian 'Mozork' Frick
     */
-    class _QuestsystemExport QuestManager : public ScopedSingletonQuestManagerGSLevel, public orxonox::OrxonoxClass
-    {
+    class _QuestsystemExport QuestManager
 // tolua_end
+        : public ScopedSingleton<QuestManager, ScopeID::Root>, public orxonox::OrxonoxClass
+    { // tolua_export
 
-            friend class ScopedSingleton<QuestManager, ScopeID::GSLevel>;
+            friend class ScopedSingleton<QuestManager, ScopeID::Root>;
             friend class QuestGUI;
 
@@ -72,5 +70,5 @@
 
             //! Returns a reference to the single instance of the Quest Manager.
-            static QuestManager& getInstance() { return ScopedSingleton<QuestManager, ScopeID::GSLevel>::getInstance(); } // tolua_export
+            static QuestManager& getInstance() { return ScopedSingleton<QuestManager, ScopeID::Root>::getInstance(); } // tolua_export
 
             //! Retreive the main window for the GUI. 
Index: /code/branches/core5/src/modules/questsystem/notifications/NotificationManager.h
===================================================================
--- /code/branches/core5/src/modules/questsystem/notifications/NotificationManager.h	(revision 5849)
+++ /code/branches/core5/src/modules/questsystem/notifications/NotificationManager.h	(revision 5850)
@@ -46,5 +46,4 @@
 namespace orxonox
 {
-
     /**
     @brief
@@ -54,7 +53,7 @@
         Damian 'Mozork' Frick
     */
-    class _QuestsystemExport NotificationManager : public ScopedSingleton<NotificationManager, ScopeID::GSLevel>, public OrxonoxClass
+    class _QuestsystemExport NotificationManager : public ScopedSingleton<NotificationManager, ScopeID::Root>, public OrxonoxClass
     {
-            friend class ScopedSingleton<NotificationManager, ScopeID::GSLevel>;
+            friend class ScopedSingleton<NotificationManager, ScopeID::Root>;
         public:
             NotificationManager();
Index: /code/branches/core5/src/orxonox/CameraManager.cc
===================================================================
--- /code/branches/core5/src/orxonox/CameraManager.cc	(revision 5849)
+++ /code/branches/core5/src/orxonox/CameraManager.cc	(revision 5850)
@@ -34,4 +34,5 @@
 #include "util/StringUtils.h"
 #include "core/GameMode.h"
+#include "core/GraphicsManager.h"
 #include "core/GUIManager.h"
 #include "core/ObjectList.h"
@@ -44,6 +45,6 @@
     CameraManager* CameraManager::singletonPtr_s = 0;
 
-    CameraManager::CameraManager(Ogre::Viewport* viewport)
-        : viewport_(viewport)
+    CameraManager::CameraManager()
+        : viewport_(GraphicsManager::getInstance().getViewport())
     {
         this->fallbackCamera_ = 0;
Index: /code/branches/core5/src/orxonox/CameraManager.h
===================================================================
--- /code/branches/core5/src/orxonox/CameraManager.h	(revision 5849)
+++ /code/branches/core5/src/orxonox/CameraManager.h	(revision 5850)
@@ -41,14 +41,15 @@
 #include <list>
 #include "util/OgreForwardRefs.h"
-#include "util/Singleton.h"
+#include "util/ScopedSingleton.h"
+#include "core/OrxonoxClass.h"
 #include "core/SmartPtr.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport CameraManager : public Singleton<CameraManager>
+    class _OrxonoxExport CameraManager : public ScopedSingleton<CameraManager, ScopeID::Graphics>, public OrxonoxClass
     {
-            friend class Singleton<CameraManager>;
+            friend class ScopedSingleton<CameraManager, ScopeID::Graphics>;
         public:
-            CameraManager(Ogre::Viewport* viewport);
+            CameraManager();
             ~CameraManager();
 
Index: /code/branches/core5/src/orxonox/LevelManager.h
===================================================================
--- /code/branches/core5/src/orxonox/LevelManager.h	(revision 5849)
+++ /code/branches/core5/src/orxonox/LevelManager.h	(revision 5850)
@@ -36,5 +36,5 @@
 #include <string>
 
-#include "util/Singleton.h"
+#include "util/ScopedSingleton.h"
 #include "core/OrxonoxClass.h"
 
@@ -44,7 +44,7 @@
     class _OrxonoxExport LevelManager
     // tolua_end
-        : public Singleton<LevelManager>, public OrxonoxClass
+        : public ScopedSingleton<LevelManager, ScopeID::Root>, public OrxonoxClass
     { // tolua_export
-            friend class Singleton<LevelManager>;
+            friend class ScopedSingleton<LevelManager, ScopeID::Root>;
         public:
             LevelManager();
@@ -63,5 +63,5 @@
 
             static LevelManager* getInstancePtr() { return singletonPtr_s; }
-            static LevelManager& getInstance()    { return Singleton<LevelManager>::getInstance(); } // tolua_export
+            static LevelManager& getInstance()    { return ScopedSingleton<LevelManager, ScopeID::Root>::getInstance(); } // tolua_export
 
         private:
Index: /code/branches/core5/src/orxonox/PlayerManager.h
===================================================================
--- /code/branches/core5/src/orxonox/PlayerManager.h	(revision 5849)
+++ /code/branches/core5/src/orxonox/PlayerManager.h	(revision 5850)
@@ -34,12 +34,12 @@
 #include <cassert>
 #include <map>
-#include "util/Singleton.h"
+#include "util/ScopedSingleton.h"
 #include "network/ClientConnectionListener.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport PlayerManager : public Singleton<PlayerManager>, public ClientConnectionListener
+    class _OrxonoxExport PlayerManager : public ScopedSingleton<PlayerManager, ScopeID::Root>, public ClientConnectionListener
     {
-            friend class Singleton<PlayerManager>;
+            friend class ScopedSingleton<PlayerManager, ScopeID::Root>;
         public:
             PlayerManager();
Index: /code/branches/core5/src/orxonox/gamestates/GSGraphics.cc
===================================================================
--- /code/branches/core5/src/orxonox/gamestates/GSGraphics.cc	(revision 5849)
+++ /code/branches/core5/src/orxonox/gamestates/GSGraphics.cc	(revision 5850)
@@ -46,6 +46,4 @@
 #include "core/Loader.h"
 #include "core/XMLFile.h"
-#include "overlays/InGameConsole.h"
-#include "sound/SoundManager.h"
 
 // HACK:
@@ -58,6 +56,4 @@
     GSGraphics::GSGraphics(const GameStateInfo& info)
         : GameState(info)
-        , console_(0)
-        , soundManager_(0)
         , masterKeyBinder_(0)
         , masterInputState_(0)
@@ -100,11 +96,4 @@
         masterKeyBinder_->loadBindings("masterKeybindings.ini");
 
-        // Load the SoundManager
-        soundManager_ = new SoundManager();
-
-        // Load the InGameConsole
-        console_ = new InGameConsole();
-        console_->initialise();
-
         // add console command to toggle GUI
         this->ccToggleGUI_ = createConsoleCommand(createFunctor(&GSGraphics::toggleGUI, this), "toggleGUI");
@@ -131,10 +120,6 @@
 */
 
-        this->console_->destroy();
-
         Loader::unload(this->debugOverlay_);
         delete this->debugOverlay_;
-
-        this->soundManager_->destroy();
 
         // HACK: (destroys a resource smart pointer)
@@ -170,6 +155,4 @@
             Game::getInstance().requestState("mainMenu");
         }
-
-        this->console_->update(time);
     }
 }
Index: /code/branches/core5/src/orxonox/gamestates/GSGraphics.h
===================================================================
--- /code/branches/core5/src/orxonox/gamestates/GSGraphics.h	(revision 5849)
+++ /code/branches/core5/src/orxonox/gamestates/GSGraphics.h	(revision 5850)
@@ -60,8 +60,4 @@
 
     private:
-        // managed singletons
-        InGameConsole*        console_;
-        SoundManager*         soundManager_;        //!< Keeps track of SoundBase objects
-
         KeyBinder*            masterKeyBinder_;     //!< Key binder for master key bindings
         InputState*           masterInputState_;    //!< Special input state for master input
Index: /code/branches/core5/src/orxonox/gamestates/GSLevel.cc
===================================================================
--- /code/branches/core5/src/orxonox/gamestates/GSLevel.cc	(revision 5849)
+++ /code/branches/core5/src/orxonox/gamestates/GSLevel.cc	(revision 5850)
@@ -41,14 +41,10 @@
 #include "core/Game.h"
 #include "core/GameMode.h"
-#include "core/GraphicsManager.h"
 #include "core/GUIManager.h"
 #include "core/Loader.h"
 #include "core/XMLFile.h"
 
-#include "tools/interfaces/Tickable.h"
-#include "CameraManager.h"
 #include "LevelManager.h"
 #include "PlayerManager.h"
-#include "infos/HumanPlayer.h"
 
 namespace orxonox
@@ -65,5 +61,4 @@
         , guiMouseOnlyInputState_(0)
         , guiKeysOnlyInputState_(0)
-        , cameraManager_(0)
     {
         RegisterObject(GSLevel);
@@ -98,12 +93,5 @@
             guiKeysOnlyInputState_ = InputManager::getInstance().createInputState("guiKeysOnly");
             guiKeysOnlyInputState_->setKeyHandler(GUIManager::getInstancePtr());
-
-            // create the global CameraManager
-            this->cameraManager_ = new CameraManager(GraphicsManager::getInstance().getViewport());
-        }
-
-        this->playerManager_ = new PlayerManager();
-
-        this->scope_GSLevel_ = new Scope<ScopeID::GSLevel>();
+        }
 
         if (GameMode::isMaster())
@@ -126,5 +114,5 @@
             
             // connect the HumanPlayer to the game
-            this->playerManager_->clientConnected(0);
+            PlayerManager::getInstance().clientConnected(0);
         }
     }
@@ -165,5 +153,5 @@
         {
             // disconnect the HumanPlayer
-            this->playerManager_->clientDisconnected(0);
+            PlayerManager::getInstance().clientDisconnected(0);
             
             // unload all compositors (this is only necessary because we don't yet destroy all resources!)
@@ -184,22 +172,4 @@
         if (GameMode::isMaster())
             this->unloadLevel();
-
-        if (this->cameraManager_)
-        {
-            delete this->cameraManager_;
-            this->cameraManager_ = 0;
-        }
-
-        if (this->playerManager_)
-        {
-            this->playerManager_->destroy();
-            this->playerManager_ = 0;
-        }
-
-        if (this->scope_GSLevel_)
-        {
-            delete this->scope_GSLevel_;
-            this->scope_GSLevel_ = NULL;
-        }
 
         if (GameMode::showsGraphics())
Index: /code/branches/core5/src/orxonox/gamestates/GSLevel.h
===================================================================
--- /code/branches/core5/src/orxonox/gamestates/GSLevel.h	(revision 5849)
+++ /code/branches/core5/src/orxonox/gamestates/GSLevel.h	(revision 5850)
@@ -33,5 +33,4 @@
 
 #include <string>
-#include "util/Scope.h"
 #include "core/OrxonoxClass.h"
 #include "core/GameState.h"
@@ -67,7 +66,4 @@
         InputState*              guiMouseOnlyInputState_;  //!< input state if we only need the mouse to use the GUI
         InputState*              guiKeysOnlyInputState_;   //!< input state if we only need the keys to use the GUI
-        CameraManager*           cameraManager_;           //!< camera manager for this level
-        PlayerManager*           playerManager_;           //!< player manager for this level
-        Scope<ScopeID::GSLevel>* scope_GSLevel_;
 
         //##### ConfigValues #####
Index: /code/branches/core5/src/orxonox/gamestates/GSRoot.cc
===================================================================
--- /code/branches/core5/src/orxonox/gamestates/GSRoot.cc	(revision 5849)
+++ /code/branches/core5/src/orxonox/gamestates/GSRoot.cc	(revision 5850)
@@ -37,5 +37,4 @@
 #include "tools/interfaces/TimeFactorListener.h"
 #include "tools/interfaces/Tickable.h"
-#include "LevelManager.h"
 
 namespace orxonox
@@ -70,7 +69,4 @@
         this->ccPause_ = createConsoleCommand(createFunctor(&GSRoot::pause, this), "pause");
         CommandExecutor::addConsoleCommandShortcut(this->ccPause_).accessLevel(AccessLevel::Offline);
-
-        // create the LevelManager
-        this->levelManager_ = new LevelManager();
     }
 
@@ -90,6 +86,4 @@
         }
 */
-
-        this->levelManager_->destroy();
     }
 
Index: /code/branches/core5/src/orxonox/gamestates/GSRoot.h
===================================================================
--- /code/branches/core5/src/orxonox/gamestates/GSRoot.h	(revision 5849)
+++ /code/branches/core5/src/orxonox/gamestates/GSRoot.h	(revision 5850)
@@ -56,6 +56,4 @@
         float                 timeFactorPauseBackup_;
 
-        LevelManager*         levelManager_;            //!< global level manager
-
         // console commands
         ConsoleCommand*       ccSetTimeFactor_;
Index: /code/branches/core5/src/orxonox/overlays/InGameConsole.cc
===================================================================
--- /code/branches/core5/src/orxonox/overlays/InGameConsole.cc	(revision 5849)
+++ /code/branches/core5/src/orxonox/overlays/InGameConsole.cc	(revision 5850)
@@ -85,4 +85,5 @@
 
         this->setConfigValues();
+        this->initialise();
     }
 
Index: /code/branches/core5/src/orxonox/overlays/InGameConsole.h
===================================================================
--- /code/branches/core5/src/orxonox/overlays/InGameConsole.h	(revision 5849)
+++ /code/branches/core5/src/orxonox/overlays/InGameConsole.h	(revision 5850)
@@ -36,5 +36,5 @@
 
 #include "util/OgreForwardRefs.h"
-#include "util/Singleton.h"
+#include "util/ScopedSingleton.h"
 #include "core/Shell.h"
 #include "core/WindowEventListener.h"
@@ -42,7 +42,7 @@
 namespace orxonox
 {
-    class _OrxonoxExport InGameConsole : public Singleton<InGameConsole>, public ShellListener, public WindowEventListener
+    class _OrxonoxExport InGameConsole : public ScopedSingleton<InGameConsole, ScopeID::Graphics>, public ShellListener, public WindowEventListener
     {
-        friend class Singleton<InGameConsole>;
+        friend class ScopedSingleton<InGameConsole, ScopeID::Graphics>;
     public: // functions
         InGameConsole();
Index: /code/branches/core5/src/orxonox/sound/SoundManager.h
===================================================================
--- /code/branches/core5/src/orxonox/sound/SoundManager.h	(revision 5849)
+++ /code/branches/core5/src/orxonox/sound/SoundManager.h	(revision 5850)
@@ -32,5 +32,5 @@
 #include <cassert>
 #include <list>
-#include "util/Singleton.h"
+#include "util/ScopedSingleton.h"
 #include "tools/interfaces/Tickable.h"
 
@@ -43,7 +43,7 @@
      *
      */
-    class _OrxonoxExport SoundManager : public Singleton<SoundManager>, public Tickable
+    class _OrxonoxExport SoundManager : public ScopedSingleton<SoundManager, ScopeID::Graphics>, public Tickable
     {
-        friend class Singleton<SoundManager>;
+        friend class ScopedSingleton<SoundManager, ScopeID::Graphics>;
     public:
         SoundManager();
