Index: /code/trunk/data/defaultConfig/keybindings.ini
===================================================================
--- /code/trunk/data/defaultConfig/keybindings.ini	(revision 10280)
+++ /code/trunk/data/defaultConfig/keybindings.ini	(revision 10281)
@@ -35,6 +35,6 @@
 KeyF3="OrxonoxOverlay show QuestGUI"
 KeyF4="OrxonoxOverlay show PickupInventory"
-KeyF5="startchat"
-KeyF6=
+KeyF5="reloadLevel"
+KeyF6="startchat"
 KeyF7=
 KeyF8=
Index: /code/trunk/src/orxonox/OrxonoxPrereqs.h
===================================================================
--- /code/trunk/src/orxonox/OrxonoxPrereqs.h	(revision 10280)
+++ /code/trunk/src/orxonox/OrxonoxPrereqs.h	(revision 10281)
@@ -77,4 +77,6 @@
     class Radar;
     class Scene;
+    class GSLevelMemento;
+    struct GSLevelMementoState;
 
     // chat
Index: /code/trunk/src/orxonox/gamestates/GSLevel.cc
===================================================================
--- /code/trunk/src/orxonox/gamestates/GSLevel.cc	(revision 10280)
+++ /code/trunk/src/orxonox/gamestates/GSLevel.cc	(revision 10281)
@@ -29,4 +29,5 @@
 
 #include "GSLevel.h"
+#include "GSLevelMemento.h"
 
 #include <OgreCompositorManager.h>
@@ -37,4 +38,5 @@
 #include "core/input/KeyBinderManager.h"
 #include "core/Core.h"
+#include "core/CoreIncludes.h"
 #include "core/Game.h"
 #include "core/GameMode.h"
@@ -54,7 +56,9 @@
     static const std::string __CC_startMainMenu_name = "startMainMenu";
     static const std::string __CC_changeGame_name = "changeGame";
+    static const std::string __CC_reloadLevel_name = "reloadLevel";
 
     SetConsoleCommand(__CC_startMainMenu_name, &GSLevel::startMainMenu).deactivate();
     SetConsoleCommand(__CC_changeGame_name, &GSLevel::changeGame).defaultValues("").deactivate();
+    SetConsoleCommand(__CC_reloadLevel_name, &GSLevel::reloadLevel).deactivate();
 
     GSLevel::GSLevel(const GameStateInfo& info)
@@ -108,5 +112,8 @@
 
         if (GameMode::isStandalone())
+        {
             ModifyConsoleCommand(__CC_changeGame_name).activate();
+            ModifyConsoleCommand(__CC_reloadLevel_name).setObject(this).activate();
+        }
     }
 
@@ -140,5 +147,8 @@
 
         if (GameMode::isStandalone())
+        {
             ModifyConsoleCommand(__CC_changeGame_name).deactivate();
+            ModifyConsoleCommand(__CC_reloadLevel_name).setObject(NULL).deactivate();
+        }
     }
 
@@ -185,4 +195,28 @@
         else
             orxout(internal_info) << " Try harder!" << endl;
+    }
+
+    void GSLevel::reloadLevel()
+    {
+        // export all states
+        std::vector<GSLevelMementoState*> states;
+        for (ObjectList<GSLevelMemento>::iterator it = ObjectList<GSLevelMemento>::begin(); it != ObjectList<GSLevelMemento>::end(); ++it)
+        {
+            GSLevelMementoState* state = it->exportMementoState();
+            if (state)
+                states.push_back(state);
+        }
+
+        // reload level (or better: reload the whole gamestate)
+        this->deactivate();
+        this->activate();
+
+        // import all states
+        for (ObjectList<GSLevelMemento>::iterator it = ObjectList<GSLevelMemento>::begin(); it != ObjectList<GSLevelMemento>::end(); ++it)
+            it->importMementoState(states);
+
+        // delete states
+        for (size_t i = 0; i < states.size(); ++i)
+            delete states[i];
     }
 
@@ -214,3 +248,14 @@
         Game::getInstance().requestStates("standalone, level");
     }
+
+
+
+    ///////////////////////////////////////////////////////////////////////////
+
+    RegisterAbstractClass(GSLevelMemento).inheritsFrom(Class(OrxonoxInterface));
+
+    GSLevelMemento::GSLevelMemento()
+    {
+        RegisterObject(GSLevelMemento);
+    }
 }
Index: /code/trunk/src/orxonox/gamestates/GSLevel.h
===================================================================
--- /code/trunk/src/orxonox/gamestates/GSLevel.h	(revision 10280)
+++ /code/trunk/src/orxonox/gamestates/GSLevel.h	(revision 10281)
@@ -51,4 +51,6 @@
         static void changeGame(const std::string& level); //!< Terminates the current game and starts a new game.
 
+        void reloadLevel();
+
     protected:
         void loadLevel();
Index: /code/trunk/src/orxonox/gamestates/GSLevelMemento.h
===================================================================
--- /code/trunk/src/orxonox/gamestates/GSLevelMemento.h	(revision 10281)
+++ /code/trunk/src/orxonox/gamestates/GSLevelMemento.h	(revision 10281)
@@ -0,0 +1,69 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _GSLevelMemento_H__
+#define _GSLevelMemento_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "core/class/OrxonoxInterface.h"
+
+namespace orxonox
+{
+    /**
+        @brief This class is an interface for all instances that want to maintain a state beyond the reloading of a level.
+    */
+    class _OrxonoxExport GSLevelMemento : virtual public OrxonoxInterface
+    {
+        friend class GSLevel;
+
+        public:
+            GSLevelMemento(); // Implemented in GSLevel.cc
+
+        protected:
+            /**
+             * Returns the state of this memento. Returns NULL if no state needed to persist.
+             */
+            virtual GSLevelMementoState* exportMementoState() = 0;
+
+            /**
+             * A list of the states of all mementos. must find the correct one by itself.
+             */
+            virtual void importMementoState(const std::vector<GSLevelMementoState*>& states) = 0;
+    };
+
+    /**
+        @brief Represents the state of a memento. Needs to be inherited by the actual state.
+    */
+    struct _OrxonoxExport GSLevelMementoState
+    {
+        virtual ~GSLevelMementoState() {} // virtual destructor for RTTI
+    };
+}
+
+#endif /* _GSLevelMemento_H__ */
Index: /code/trunk/src/orxonox/gametypes/Gametype.cc
===================================================================
--- /code/trunk/src/orxonox/gametypes/Gametype.cc	(revision 10280)
+++ /code/trunk/src/orxonox/gametypes/Gametype.cc	(revision 10281)
@@ -45,4 +45,5 @@
 #include "worldentities/pawns/Pawn.h"
 #include "overlays/OverlayGroup.h"
+#include "Scene.h"
 
 namespace orxonox
@@ -525,3 +526,67 @@
         GSLevel::startMainMenu();
     }
+
+    GSLevelMementoState* Gametype::exportMementoState()
+    {
+        for (std::map<PlayerInfo*, Player>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
+        {
+            if (it->first->isHumanPlayer() && it->first->getControllableEntity() && it->first->getControllableEntity()->getCamera())
+            {
+                Camera* camera = it->first->getControllableEntity()->getCamera();
+
+                GametypeMementoState* state = new GametypeMementoState();
+                state->cameraPosition_ = camera->getWorldPosition();
+                state->cameraOrientation_ = camera->getWorldOrientation();
+                state->sceneName_ = camera->getScene()->getName();
+                return state;
+            }
+        }
+
+        return NULL;
+    }
+
+    void Gametype::importMementoState(const std::vector<GSLevelMementoState*>& states)
+    {
+        // find correct memento state
+        GametypeMementoState* state = NULL;
+        for (size_t i = 0; i < states.size(); ++i)
+        {
+            state = dynamic_cast<GametypeMementoState*>(states[i]);
+            if (state)
+                break;
+        }
+
+        if (!state)
+            return;
+
+        // find correct scene
+        Scene* scene = NULL;
+        for (ObjectList<Scene>::iterator it = ObjectList<Scene>::begin(); it != ObjectList<Scene>::end(); ++it)
+        {
+            if (it->getName() == state->sceneName_)
+            {
+                scene = *it;
+                break;
+            }
+        }
+
+        if (!scene)
+        {
+            orxout(internal_warning) << "Could not find scene with name " << state->sceneName_ << endl;
+            return;
+        }
+
+        // find correct player and assign default entity with original position & orientation
+        for (std::map<PlayerInfo*, Player>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
+        {
+            if (it->first->isHumanPlayer())
+            {
+                ControllableEntity* entity = this->defaultControllableEntity_.fabricate(scene->getContext());
+                entity->setPosition(state->cameraPosition_);
+                entity->setOrientation(state->cameraOrientation_);
+                it->first->startControl(entity);
+                break;
+            }
+        }
+    }
 }
Index: /code/trunk/src/orxonox/gametypes/Gametype.h
===================================================================
--- /code/trunk/src/orxonox/gametypes/Gametype.h	(revision 10280)
+++ /code/trunk/src/orxonox/gametypes/Gametype.h	(revision 10281)
@@ -41,4 +41,5 @@
 #include "infos/GametypeInfo.h"
 #include "tools/Timer.h"
+#include "gamestates/GSLevelMemento.h"
 
 namespace orxonox
@@ -63,5 +64,5 @@
     };
 
-    class _OrxonoxExport Gametype : public BaseObject, public Tickable
+    class _OrxonoxExport Gametype : public BaseObject, public Tickable, public GSLevelMemento
     {
         friend class PlayerInfo;
@@ -172,4 +173,7 @@
             virtual void spawnDeadPlayersIfRequested();
 
+            virtual GSLevelMementoState* exportMementoState();
+            virtual void importMementoState(const std::vector<GSLevelMementoState*>& states);
+
             SmartPtr<GametypeInfo> gtinfo_;
 
@@ -201,4 +205,14 @@
             Timer showMenuTimer_;
     };
+
+    /**
+        @brief Keeps position and orientation of the camera, as well as the name of current scene.
+    */
+    struct _OrxonoxExport GametypeMementoState : public GSLevelMementoState
+    {
+        Vector3 cameraPosition_;
+        Quaternion cameraOrientation_;
+        std::string sceneName_;
+    };
 }
 
