Index: code/trunk/data/gui/scripts/HostMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/HostMenu.lua	(revision 7875)
+++ code/trunk/data/gui/scripts/HostMenu.lua	(revision 7876)
@@ -104,6 +104,5 @@
         local level = P.levelList[index+1]
         if level ~= nil then
-            orxonox.LevelManager:getInstance():setDefaultLevel(level:getXMLFilename())
-            orxonox.execute(P.multiplayerMode)
+            orxonox.execute(P.multiplayerMode .. " " .. level:getXMLFilename())
             hideAllMenuSheets()
         end
Index: code/trunk/data/gui/scripts/MultiplayerMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/MultiplayerMenu.lua	(revision 7875)
+++ code/trunk/data/gui/scripts/MultiplayerMenu.lua	(revision 7876)
@@ -75,13 +75,13 @@
 
 function P.MultiplayerJoinButton_clicked(e)
-    local choice = winMgr:getWindow("orxonox/MultiplayerListbox"):getFirstSelectedItem()   
+    local choice = winMgr:getWindow("orxonox/MultiplayerListbox"):getFirstSelectedItem()
+    local destination = nil
     if choice then
-        local client = orxonox.Client:getInstance()
         local index = tolua.cast(choice, "CEGUI::ListboxItem"):getID()
-        client:setDestination( P.serverList[index][2], 55556 )
+        destination = P.serverList[index][2]
     else
         return
     end
-    orxonox.execute("startClient")
+    orxonox.execute("startClient " .. destination)
     hideAllMenuSheets()
 end
Index: code/trunk/data/gui/scripts/SingleplayerMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/SingleplayerMenu.lua	(revision 7875)
+++ code/trunk/data/gui/scripts/SingleplayerMenu.lua	(revision 7876)
@@ -74,6 +74,5 @@
         local level = P.levelList[index+1]
         if level ~= nil then
-            orxonox.LevelManager:getInstance():setDefaultLevel(level:getXMLFilename())
-            orxonox.execute("startGame")
+            orxonox.execute("startGame " .. level:getXMLFilename())
             hideAllMenuSheets()
         end
Index: code/trunk/src/libraries/core/GUIManager.cc
===================================================================
--- code/trunk/src/libraries/core/GUIManager.cc	(revision 7875)
+++ code/trunk/src/libraries/core/GUIManager.cc	(revision 7876)
@@ -62,4 +62,5 @@
 #include "Core.h"
 #include "CoreIncludes.h"
+#include "Game.h"
 #include "GraphicsManager.h"
 #include "LuaState.h"
@@ -522,3 +523,4 @@
             this->mouseLeft();
     }
+
 }
Index: code/trunk/src/orxonox/gamestates/GSLevel.cc
===================================================================
--- code/trunk/src/orxonox/gamestates/GSLevel.cc	(revision 7875)
+++ code/trunk/src/orxonox/gamestates/GSLevel.cc	(revision 7876)
@@ -51,4 +51,10 @@
     DeclareGameState(GSLevel, "level", false, false);
 
+    static const std::string __CC_startMainMenu_name = "startMainMenu";
+    static const std::string __CC_changeGame_name = "changeGame";
+
+    SetConsoleCommand(__CC_startMainMenu_name, &GSLevel::startMainMenu).deactivate();
+    SetConsoleCommand(__CC_changeGame_name, &GSLevel::changeGame).defaultValues(BLANKSTRING).deactivate();
+
     GSLevel::GSLevel(const GameStateInfo& info)
         : GameState(info)
@@ -94,5 +100,10 @@
             // connect the HumanPlayer to the game
             PlayerManager::getInstance().clientConnected(0);
-        }
+
+            ModifyConsoleCommand(__CC_startMainMenu_name).activate();
+        }
+
+        if (GameMode::isStandalone())
+            ModifyConsoleCommand(__CC_changeGame_name).activate();
     }
 
@@ -121,5 +132,10 @@
             InputManager::getInstance().destroyState("guiKeysOnly");
             InputManager::getInstance().destroyState("guiMouseOnly");
-        }
+
+            ModifyConsoleCommand(__CC_startMainMenu_name  ).deactivate();
+        }
+
+        if (GameMode::isStandalone())
+            ModifyConsoleCommand(__CC_changeGame_name).deactivate();
     }
 
@@ -166,3 +182,31 @@
             COUT(3) << " Try harder!" << std::endl;
     }
+
+    /**
+    @brief
+        Starts the MainMenu.
+    */
+    /*static*/ void GSLevel::startMainMenu(void)
+    {
+        // HACK
+        Game::getInstance().popState();
+        Game::getInstance().popState();
+    }
+
+    /**
+    @brief
+        Terminates the current game and starts a new game.
+    @param level
+        The filename of the level to be started.
+    */
+    /*static*/ void GSLevel::changeGame(const std::string& level)
+    {
+        if(level != BLANKSTRING)
+            LevelManager::getInstance().setDefaultLevel(level);
+
+        // HACK
+        Game::getInstance().popState();
+        Game::getInstance().popState();
+        Game::getInstance().requestStates("standalone, level");
+    }
 }
Index: code/trunk/src/orxonox/gamestates/GSLevel.h
===================================================================
--- code/trunk/src/orxonox/gamestates/GSLevel.h	(revision 7875)
+++ code/trunk/src/orxonox/gamestates/GSLevel.h	(revision 7876)
@@ -49,4 +49,7 @@
         void update(const Clock& time);
 
+        static void startMainMenu(void); //!< Starts the MainMenu
+        static void changeGame(const std::string& level); //!< Terminates the current game and starts a new game.
+
     protected:
         void loadLevel();
Index: code/trunk/src/orxonox/gamestates/GSMainMenu.cc
===================================================================
--- code/trunk/src/orxonox/gamestates/GSMainMenu.cc	(revision 7875)
+++ code/trunk/src/orxonox/gamestates/GSMainMenu.cc	(revision 7876)
@@ -31,11 +31,14 @@
 #include <OgreSceneManager.h>
 
-#include "core/input/KeyBinderManager.h"
-#include "core/Game.h"
 #include "core/ConfigValueIncludes.h"
 #include "core/CoreIncludes.h"
+#include "core/Game.h"
 #include "core/GraphicsManager.h"
 #include "core/GUIManager.h"
 #include "core/command/ConsoleCommand.h"
+#include "core/input/KeyBinderManager.h"
+#include "network/Client.h"
+#include "util/StringUtils.h"
+#include "LevelManager.h"
 #include "Scene.h"
 #include "sound/AmbientSound.h"
@@ -52,12 +55,10 @@
     static const std::string __CC_startClient_name          = "startClient";
     static const std::string __CC_startDedicated_name       = "startDedicated";
-    static const std::string __CC_startMainMenu_name        = "startMainMenu";
     static const std::string __CC_setMainMenuSoundPath_name = "setMMSoundPath";
 
-    SetConsoleCommand(__CC_startStandalone_name,      &GSMainMenu::startStandalone).deactivate();
-    SetConsoleCommand(__CC_startServer_name,          &GSMainMenu::startServer    ).deactivate();
-    SetConsoleCommand(__CC_startClient_name,          &GSMainMenu::startClient    ).deactivate();
-    SetConsoleCommand(__CC_startDedicated_name,       &GSMainMenu::startDedicated ).deactivate();
-    SetConsoleCommand(__CC_startMainMenu_name,        &GSMainMenu::startMainMenu  ).deactivate();
+    SetConsoleCommand(__CC_startStandalone_name,      &GSMainMenu::startStandalone).defaultValues(BLANKSTRING).deactivate();
+    SetConsoleCommand(__CC_startServer_name,          &GSMainMenu::startServer    ).defaultValues(BLANKSTRING).deactivate();
+    SetConsoleCommand(__CC_startClient_name,          &GSMainMenu::startClient    ).defaultValues(BLANKSTRING).deactivate();
+    SetConsoleCommand(__CC_startDedicated_name,       &GSMainMenu::startDedicated ).defaultValues(BLANKSTRING).deactivate();
     SetConsoleCommand(__CC_setMainMenuSoundPath_name, &GSMainMenu::setMainMenuSoundPath).hide();
 
@@ -106,5 +107,4 @@
         ModifyConsoleCommand(__CC_startClient_name    ).activate();
         ModifyConsoleCommand(__CC_startDedicated_name ).activate();
-        ModifyConsoleCommand(__CC_startMainMenu_name  ).activate();
         ModifyConsoleCommand(__CC_setMainMenuSoundPath_name).setObject(this);
 
@@ -138,5 +138,4 @@
         ModifyConsoleCommand(__CC_startClient_name    ).deactivate();
         ModifyConsoleCommand(__CC_startDedicated_name ).deactivate();
-        ModifyConsoleCommand(__CC_startMainMenu_name  ).deactivate();
         ModifyConsoleCommand(__CC_setMainMenuSoundPath_name).setObject(0);
     }
@@ -171,38 +170,68 @@
     }
 
-    void GSMainMenu::startStandalone()
-    {
-        // HACK - HACK
+    /**
+    @brief
+        Start a level in standalone mode.
+    @param level
+        The filename of the level to be started. If empty, the default level is started.
+    */
+    void GSMainMenu::startStandalone(const std::string& level)
+    {
+        if(level != BLANKSTRING)
+            LevelManager::getInstance().setDefaultLevel(level);
+
+        // HACK
         Game::getInstance().popState();
         Game::getInstance().requestStates("standalone, level");
     }
 
-    void GSMainMenu::startServer()
-    {
-        // HACK - HACK
+    /**
+    @brief
+        Start a level in server mode.
+    @param level
+        The filename of the level to be started. If empty, the default level is started.
+    */
+    void GSMainMenu::startServer(const std::string& level)
+    {
+        if(level != BLANKSTRING)
+            LevelManager::getInstance().setDefaultLevel(level);
+
+        // HACK
         Game::getInstance().popState();
         Game::getInstance().requestStates("server, level");
     }
 
-    void GSMainMenu::startClient()
-    {
-        // HACK - HACK
+    /**
+    @brief
+        Connect to a game as client.
+    @param destination
+        The destination to connect to. If empty, the client connects to the default destination.
+    */
+    void GSMainMenu::startClient(const std::string& destination)
+    {
+        if(destination != BLANKSTRING)
+            Client::getInstance()->setDestination(destination, NETWORK_PORT);
+
+        // HACK
         Game::getInstance().popState();
         Game::getInstance().requestStates("client, level");
     }
 
-    void GSMainMenu::startDedicated()
-    {
-        // HACK - HACK
+    /**
+    @brief
+        Start a level in dedicated mode.
+    @param level
+        The filename of the level to be started. If empty, the default level is started.
+    */
+    void GSMainMenu::startDedicated(const std::string& level)
+    {
+        if(level != BLANKSTRING)
+            LevelManager::getInstance().setDefaultLevel(level);
+
+        // HACK
         Game::getInstance().popState();
         Game::getInstance().popState();
         Game::getInstance().requestStates("server, level");
     }
-    void GSMainMenu::startMainMenu()
-    {
-        // HACK - HACK
-        Game::getInstance().popState();
-        Game::getInstance().popState();
-        Game::getInstance().requestStates("mainmenu");
-    }
+
 }
Index: code/trunk/src/orxonox/gamestates/GSMainMenu.h
===================================================================
--- code/trunk/src/orxonox/gamestates/GSMainMenu.h	(revision 7875)
+++ code/trunk/src/orxonox/gamestates/GSMainMenu.h	(revision 7876)
@@ -53,9 +53,8 @@
         void setMainMenuSoundPath(const std::string& path);
 
-        static void startStandalone();
-        static void startServer();
-        static void startClient();
-        static void startDedicated();
-        static void startMainMenu();
+        static void startStandalone(const std::string& level = BLANKSTRING); //!< Start a level in standalone mode.
+        static void startServer(const std::string& level = BLANKSTRING); //!< Start a level in server mode.
+        static void startClient(const std::string& destination = BLANKSTRING); //!< Connect to a game as client.
+        static void startDedicated(const std::string& level = BLANKSTRING); //!< Start a level in dedicated mode.
         static void startIOConsole();
 
