Index: code/branches/gui/src/orxonox/gamestates/GSGUI.cc
===================================================================
--- code/branches/gui/src/orxonox/gamestates/GSGUI.cc	(revision 1661)
+++ code/branches/gui/src/orxonox/gamestates/GSGUI.cc	(revision 1662)
@@ -33,6 +33,4 @@
 #include "core/input/InputManager.h"
 #include "core/input/SimpleInputState.h"
-#include "core/input/KeyBinder.h"
-#include "overlays/console/InGameConsole.h"
 #include "gui/GUIManager.h"
 
Index: code/branches/gui/src/orxonox/gamestates/GSGraphics.cc
===================================================================
--- code/branches/gui/src/orxonox/gamestates/GSGraphics.cc	(revision 1661)
+++ code/branches/gui/src/orxonox/gamestates/GSGraphics.cc	(revision 1662)
@@ -35,12 +35,11 @@
 #include <OgreWindowEventUtilities.h>
 
+#include "core/ConsoleCommand.h"
+#include "core/ConfigValueIncludes.h"
 #include "core/input/InputManager.h"
-#include "core/input/SimpleInputState.h"
-#include "core/input/KeyBinder.h"
 #include "core/Core.h"
-
-#include "GraphicsEngine.h"
 #include "overlays/console/InGameConsole.h"
 #include "gui/GUIManager.h"
+#include "GraphicsEngine.h"
 
 namespace orxonox
@@ -88,27 +87,45 @@
         guiManager_ = new GUIManager();
         guiManager_->initialise();
+
+        // use the ogre timer class to measure time.
+        timer_ = new Ogre::Timer();
+
+        // add console commands
+        FunctorMember<GSGraphics>* functor = createFunctor(&GSGraphics::exitGame);
+        functor->setObject(this);
+        CommandExecutor::addConsoleCommandShortcut(createConsoleCommand(functor, "exit"));
     }
 
     void GSGraphics::leave()
     {
-        if (this->guiManager_)
-          delete guiManager_;
-
-        if (this->console_)
-          delete this->console_;
-
-        if (inputManager_)
-          delete inputManager_;
-
-        // TODO: deintialise graphics
-    }
-
+        delete this->timer_;
+
+        delete this->guiManager_;
+
+        delete this->console_;
+
+        delete this->inputManager_;
+
+        // TODO: destroy render window
+    }
+
+    /**
+        Main loop of the orxonox game.
+        We use the Ogre::Timer to measure time since it uses the most precise
+        method an a platform (however the windows timer lacks time when under
+        heavy kernel load!).
+        There is a simple mechanism to measure the average time spent in our
+        ticks as it may indicate performance issues.
+        A note about the Ogre::FrameListener: Even though we don't use them,
+        they still get called. However, the delta times are not correct (except
+        for timeSinceLastFrame, which is the most important). A little research
+        as shown that there is probably only one FrameListener that doesn't even
+        need the time. So we shouldn't run into problems.
+    */
     bool GSGraphics::tick(float dt)
     {
+        // note: paramter 'dt' is of no meaning
+
         Ogre::Root& ogreRoot = Ogre::Root::getSingleton();
-
-        // use the ogre timer class to measure time.
-        if (!timer_)
-            timer_ = new Ogre::Timer();
 
         unsigned long frameCount = 0;
@@ -146,4 +163,7 @@
                     this->getActiveChild()->tick(dt);
 
+                // tick console
+                this->console_->tick(dt);
+
                 // get current time once again
                 timeAfterTick = timer_->getMicroseconds();
Index: code/branches/gui/src/orxonox/gamestates/GSGraphics.h
===================================================================
--- code/branches/gui/src/orxonox/gamestates/GSGraphics.h	(revision 1661)
+++ code/branches/gui/src/orxonox/gamestates/GSGraphics.h	(revision 1662)
@@ -31,5 +31,7 @@
 
 #include "OrxonoxPrereqs.h"
+#include <OgrePrerequisites.h>
 #include "core/GameState.h"
+#include "core/OrxonoxClass.h"
 
 namespace orxonox
@@ -43,4 +45,6 @@
         bool tick(float dt);
         void setConfigValues();
+
+        void exitGame() { this->bAbort_ = true; }
 
     private:
Index: code/branches/gui/src/orxonox/gamestates/GSLevel.cc
===================================================================
--- code/branches/gui/src/orxonox/gamestates/GSLevel.cc	(revision 1661)
+++ code/branches/gui/src/orxonox/gamestates/GSLevel.cc	(revision 1662)
@@ -23,5 +23,5 @@
  *      Reto Grieder
  *   Co-authors:
- *      ...
+ *      Fabian 'x3n' Landau
  *
  */
@@ -30,11 +30,16 @@
 #include "GSLevel.h"
 
-#include "GraphicsEngine.h"
 #include "core/ConsoleCommand.h"
 #include "core/input/InputManager.h"
 #include "core/input/SimpleInputState.h"
 #include "core/input/KeyBinder.h"
+#include "core/Loader.h"
 #include "overlays/console/InGameConsole.h"
 #include "gui/GUIManager.h"
+#include "objects/Backlight.h"
+#include "tools/ParticleInterface.h"
+#include "Radar.h"
+#include "Settings.h"
+#include "GraphicsEngine.h"
 
 namespace orxonox
@@ -43,4 +48,8 @@
         : GameState("level")
         , timefactor_(1.0f)
+        , keyBinder_(0)
+        , radar_(0)
+        , startLevel_(0)
+        , hud_(0)
     {
     }
@@ -52,15 +61,57 @@
     void GSLevel::enter()
     {
-        KeyBinder* keyBinder = new KeyBinder();
-        keyBinder->loadBindings();
-        InputManager::getInstance().createInputState<SimpleInputState>("game", 20)->setHandler(keyBinder);
+        keyBinder_ = new KeyBinder();
+        keyBinder_->loadBindings();
+        InputManager::getInstance().createInputState<SimpleInputState>("game", 20)->setHandler(keyBinder_);
+
+        // create Ogre SceneManager for the level
+        GraphicsEngine::getInstance().createNewScene();
+
+        // Start the Radar
+        this->radar_ = new Radar();
+
+        // Load the HUD
+        COUT(3) << "Orxonox: Loading HUD" << std::endl;
+        hud_ = new Level(Settings::getDataPath() + "overlay/hud.oxo");
+        Loader::load(hud_);
+
+        // call the loader
+        COUT(0) << "Loading level..." << std::endl;
+        startLevel_ = new Level(Settings::getDataPath() + "levels/sample.oxw");
+        Loader::open(startLevel_);
 
         // add console commands
-        //ConsoleCommand* command = createConsoleCommand(createFunctor(&classname::function), )
-        //CommandExecutor::addConsoleCommandShortcut(command);
+        FunctorMember<GSLevel>* functor = createFunctor(&GSLevel::setTimeFactor);
+        functor->setObject(this);
+        CommandExecutor::addConsoleCommandShortcut(createConsoleCommand(functor, "setTimeFactor"));
+
+        // level is loaded: we can start capturing the input
+        InputManager::getInstance().requestEnterState("game");
     }
 
     void GSLevel::leave()
     {
+        InputManager::getInstance().requestLeaveState("game");
+
+        // TODO: Remove and destroy console command
+
+        Loader::unload(startLevel_);
+        delete this->startLevel_;
+
+        Loader::unload(hud_);
+        delete this->hud_;
+
+        // this call will delete every BaseObject!
+        // But currently this will call methods of objects that exist no more
+        // The only 'memory leak' is the ParticleSpawer. They would be deleted here
+        // and call a sceneNode method that has already been destroy by the corresponding space ship.
+        //Loader::close();
+
+        delete this->radar_;
+
+        // TODO: delete SceneManager
+
+        InputManager::getInstance().destroyState("game");
+        delete this->keyBinder_;
     }
 
@@ -74,4 +125,5 @@
             it->tick(dt * this->timefactor_);
 
+        // TODO: split file into server/client/standalone
         // call server/client with normal dt
         //if (client_g)
@@ -87,13 +139,13 @@
         Changes the speed of Orxonox
     */
-    //void GSLevel::setTimeFactor(float factor)
-    //{
-    //    float change = factor / Orxonox::getInstance().getTimeFactor();
-    //    Orxonox::getInstance().timefactor_ = factor;
-    //    for (Iterator<ParticleInterface> it = ObjectList<ParticleInterface>::begin(); it; ++it)
-    //        it->setSpeedFactor(it->getSpeedFactor() * change);
+    void GSLevel::setTimeFactor(float factor)
+    {
+        float change = factor / this->timefactor_;
+        this->timefactor_ = factor;
+        for (Iterator<ParticleInterface> it = ObjectList<ParticleInterface>::begin(); it; ++it)
+            it->setSpeedFactor(it->getSpeedFactor() * change);
 
-    //    for (Iterator<Backlight> it = ObjectList<Backlight>::begin(); it; ++it)
-    //        it->setTimeFactor(Orxonox::getInstance().getTimeFactor());
-    //}
+        for (Iterator<Backlight> it = ObjectList<Backlight>::begin(); it; ++it)
+            it->setTimeFactor(timefactor_);
+    }
 }
Index: code/branches/gui/src/orxonox/gamestates/GSLevel.h
===================================================================
--- code/branches/gui/src/orxonox/gamestates/GSLevel.h	(revision 1661)
+++ code/branches/gui/src/orxonox/gamestates/GSLevel.h	(revision 1662)
@@ -49,5 +49,10 @@
         void setTimeFactor(float factor);
 
-        float                 timefactor_;       //!< A factor to change the gamespeed
+        float timefactor_;       //!< A factor to change the gamespeed
+
+        KeyBinder*            keyBinder_;        //!< tool that loads and manages the input bindings
+        Radar*                radar_;            //!< represents the Radar (not the HUD part)
+        Level*                startLevel_;       //!< current hard coded default level
+        Level*                hud_;              //!< 'level' object fo the HUD
     };
 }
Index: code/branches/gui/src/orxonox/gamestates/GSRoot.cc
===================================================================
--- code/branches/gui/src/orxonox/gamestates/GSRoot.cc	(revision 1661)
+++ code/branches/gui/src/orxonox/gamestates/GSRoot.cc	(revision 1662)
@@ -30,5 +30,4 @@
 #include "GSRoot.h"
 
-#include <cassert>
 #include "core/Factory.h"
 #include "core/ConfigFileManager.h"
@@ -36,5 +35,5 @@
 #include "core/ConsoleCommand.h"
 #include "core/Debug.h"
-//#include "core/Exception.h"
+#include "core/Exception.h"
 #include "core/TclBind.h"
 #include "core/Core.h"
@@ -65,7 +64,4 @@
         Factory::createClassHierarchy();
 
-        // TODO: config values
-        //setConfigValues();
-
         const Settings::CommandLineArgument* dataPath = Settings::getCommandLineArgument("dataPath");
         assert(dataPath);
@@ -81,7 +77,12 @@
         TclBind::getInstance().setDataPath(Settings::getDataPath());
 
+        // initialise graphics engine. Doesn't load the render window yet!
         graphicsEngine_ = new GraphicsEngine();
         graphicsEngine_->setup();       // creates ogre root and other essentials
 
+        // console commands
+        FunctorMember<GSRoot>* functor = createFunctor(&GSRoot::loadGame);
+        functor->setObject(this);
+        CommandExecutor::addConsoleCommandShortcut(createConsoleCommand(functor, "loadGame"));
     }
 
@@ -98,3 +99,12 @@
         return true;
     }
+
+    /**
+    @brief
+        Requests a state.
+    */
+    void GSRoot::loadGame(const std::string& name)
+    {
+        this->requestState(name);
+    }
 }
Index: code/branches/gui/src/orxonox/gamestates/GSRoot.h
===================================================================
--- code/branches/gui/src/orxonox/gamestates/GSRoot.h	(revision 1661)
+++ code/branches/gui/src/orxonox/gamestates/GSRoot.h	(revision 1662)
@@ -42,4 +42,5 @@
 
         bool tick(float dt);
+        void loadGame(const std::string& name);
 
     private:
