Index: /code/trunk/src/core/input/InputManager.cc
===================================================================
--- /code/trunk/src/core/input/InputManager.cc	(revision 1787)
+++ /code/trunk/src/core/input/InputManager.cc	(revision 1788)
@@ -109,4 +109,5 @@
         , stateCalibrator_(0)
         , stateEmpty_(0)
+        , stateMaster_(0)
         , bCalibrating_(false)
         , keyboardModifiers_(0)
@@ -201,4 +202,7 @@
             buffer->registerListener(this, &InputManager::_completeCalibration, '\r', true);
             stateCalibrator_->setKeyHandler(buffer);
+
+            stateMaster_ = new ExtendedInputState();
+            stateMaster_->setName("master");
 
             internalState_ |= InternalsReady;
@@ -441,4 +445,8 @@
                     _destroyState((*inputStatesByPriority_.rbegin()).second);
 
+                // destroy the master input state. This might trigger a memory leak
+                // because the user has forgotten to destroy the KeyBinder or any Handler!
+                delete stateMaster_;
+
                 // destroy the devices
                 _destroyKeyboard();
@@ -688,23 +696,38 @@
             // call all the handlers for the held key events
             for (unsigned int iKey = 0; iKey < keysDown_.size(); iKey++)
-                activeStatesTop_[Keyboard]->keyHeld(KeyEvent(keysDown_[iKey], keyboardModifiers_));
+            {
+                KeyEvent kEvt(keysDown_[iKey], keyboardModifiers_);
+                activeStatesTop_[Keyboard]->keyHeld(kEvt);
+                stateMaster_->keyHeld(kEvt);
+            }
 
             // call all the handlers for the held mouse button events
             for (unsigned int iButton = 0; iButton < mouseButtonsDown_.size(); iButton++)
+            {
                 activeStatesTop_[Mouse]->mouseButtonHeld(mouseButtonsDown_[iButton]);
+                stateMaster_->mouseButtonHeld(mouseButtonsDown_[iButton]);
+            }
 
             // call all the handlers for the held joy stick button events
             for (unsigned int iJoyStick  = 0; iJoyStick < joySticksSize_; iJoyStick++)
                 for (unsigned int iButton   = 0; iButton   < joyStickButtonsDown_[iJoyStick].size(); iButton++)
+                {
                     activeStatesTop_[JoyStick0 + iJoyStick]
                         ->joyStickButtonHeld(iJoyStick, joyStickButtonsDown_[iJoyStick][iButton]);
+                    stateMaster_->joyStickButtonHeld(iJoyStick, joyStickButtonsDown_[iJoyStick][iButton]);
+                }
 
             // tick the handlers for each active handler
             for (unsigned int i = 0; i < devicesNum_; ++i)
+            {
                 activeStatesTop_[i]->tickInput(dt, i);
+                if (stateMaster_->isInputDeviceEnabled(i))
+                    stateMaster_->tickInput(dt, i);
+            }
 
             // tick the handler with a general tick afterwards
             for (unsigned int i = 0; i < activeStatesTicked_.size(); ++i)
                 activeStatesTicked_[i]->tickInput(dt);
+            stateMaster_->tickInput(dt);
         }
 
@@ -828,5 +851,9 @@
             keysDown_.push_back(Key(e));
         else
+        {
+            // This happens when XAutoRepeat is set under linux. The KeyPressed event gets then sent
+            // continuously.
             return true;
+        }
 
         // update modifiers
@@ -838,5 +865,7 @@
             keyboardModifiers_ |= KeyboardModifier::Shift; // shift key
 
-        activeStatesTop_[Keyboard]->keyPressed(KeyEvent(e, keyboardModifiers_));
+        KeyEvent kEvt(e, keyboardModifiers_);
+        activeStatesTop_[Keyboard]->keyPressed(kEvt);
+        stateMaster_->keyPressed(kEvt);
 
         return true;
@@ -869,5 +898,7 @@
             keyboardModifiers_ &= ~KeyboardModifier::Shift; // shift key
 
-        activeStatesTop_[Keyboard]->keyReleased(KeyEvent(e, keyboardModifiers_));
+        KeyEvent kEvt(e, keyboardModifiers_);
+        activeStatesTop_[Keyboard]->keyReleased(kEvt);
+        stateMaster_->keyReleased(kEvt);
 
         return true;
@@ -888,6 +919,9 @@
         if (e.state.X.rel != 0 || e.state.Y.rel != 0)
         {
-            activeStatesTop_[Mouse]->mouseMoved(IntVector2(e.state.X.abs, e.state.Y.abs),
-                    IntVector2(e.state.X.rel, e.state.Y.rel), IntVector2(e.state.width, e.state.height));
+            IntVector2 abs(e.state.X.abs, e.state.Y.abs);
+            IntVector2 rel(e.state.X.rel, e.state.Y.rel);
+            IntVector2 clippingSize(e.state.width, e.state.height);
+            activeStatesTop_[Mouse]->mouseMoved(abs, rel, clippingSize);
+            stateMaster_->mouseMoved(abs, rel, clippingSize);
         }
 
@@ -896,4 +930,5 @@
         {
             activeStatesTop_[Mouse]->mouseScrolled(e.state.Z.abs, e.state.Z.rel);
+            stateMaster_->mouseScrolled(e.state.Z.abs, e.state.Z.rel);
         }
 
@@ -919,4 +954,5 @@
 
         activeStatesTop_[Mouse]->mouseButtonPressed((MouseButton::Enum)id);
+        stateMaster_->mouseButtonPressed((MouseButton::Enum)id);
 
         return true;
@@ -944,4 +980,5 @@
 
         activeStatesTop_[Mouse]->mouseButtonReleased((MouseButton::Enum)id);
+        stateMaster_->mouseButtonReleased((MouseButton::Enum)id);
 
         return true;
@@ -980,4 +1017,5 @@
 
         activeStatesTop_[2 + iJoyStick]->joyStickButtonPressed(iJoyStick, (JoyStickButton::Enum)button);
+        stateMaster_->joyStickButtonPressed(iJoyStick, (JoyStickButton::Enum)button);
 
         return true;
@@ -1000,4 +1038,5 @@
 
         activeStatesTop_[2 + iJoyStick]->joyStickButtonReleased(iJoyStick, (JoyStickButton::Enum)button);
+        stateMaster_->joyStickButtonReleased(iJoyStick, (JoyStickButton::Enum)button);
 
         return true;
@@ -1027,4 +1066,5 @@
 
             activeStatesTop_[2 + iJoyStick]->joyStickAxisMoved(iJoyStick, axis, fValue);
+            stateMaster_->joyStickAxisMoved(iJoyStick, axis, fValue);
         }
     }
Index: /code/trunk/src/core/input/InputManager.h
===================================================================
--- /code/trunk/src/core/input/InputManager.h	(revision 1787)
+++ /code/trunk/src/core/input/InputManager.h	(revision 1788)
@@ -129,4 +129,5 @@
         InputState* getState       (const std::string& name);
         InputState* getCurrentState();
+        ExtendedInputState* getMasterInputState() { return this->stateMaster_; }
         bool requestDestroyState   (const std::string& name);
         bool requestEnterState     (const std::string& name);
@@ -200,4 +201,5 @@
         SimpleInputState*                   stateCalibrator_;
         SimpleInputState*                   stateEmpty_;
+        ExtendedInputState*                 stateMaster_;          //!< Always active master input state
 
         std::map<std::string, InputState*>  inputStatesByName_;
Index: /code/trunk/src/orxonox/gamestates/GSGraphics.cc
===================================================================
--- /code/trunk/src/orxonox/gamestates/GSGraphics.cc	(revision 1787)
+++ /code/trunk/src/orxonox/gamestates/GSGraphics.cc	(revision 1788)
@@ -46,4 +46,6 @@
 #include "core/CoreIncludes.h"
 #include "core/input/InputManager.h"
+#include "core/input/KeyBinder.h"
+#include "core/input/ExtendedInputState.h"
 #include "overlays/console/InGameConsole.h"
 #include "gui/GUIManager.h"
@@ -62,4 +64,5 @@
         , console_(0)
         , guiManager_(0)
+        , masterKeyBinder_(0)
         , frameCount_(0)
         , statisticsRefreshCycle_(0)
@@ -108,4 +111,7 @@
         this->renderWindow_->getCustomAttribute("WINDOW", &windowHnd);
         inputManager_->initialise(windowHnd, renderWindow_->getWidth(), renderWindow_->getHeight(), true);
+        // Configure master input state with a KeyBinder
+        //masterKeyBinder_ = new KeyBinder();
+        //inputManager_->getMasterInputState()->addKeyHandler(masterKeyBinder_);
 
         // Load the InGameConsole
@@ -135,4 +141,6 @@
         delete this->console_;
 
+        //inputManager_->getMasterInputState()->removeKeyHandler(this->masterKeyBinder_);
+        //delete this->masterKeyBinder_;
         delete this->inputManager_;
 
Index: /code/trunk/src/orxonox/gamestates/GSGraphics.h
===================================================================
--- /code/trunk/src/orxonox/gamestates/GSGraphics.h	(revision 1787)
+++ /code/trunk/src/orxonox/gamestates/GSGraphics.h	(revision 1788)
@@ -77,4 +77,6 @@
         GUIManager*           guiManager_;
 
+        KeyBinder*            masterKeyBinder_;
+
         // variables for time statistics
         unsigned long         frameCount_;
