Index: code/trunk/src/libraries/core/CorePrereqs.h
===================================================================
--- code/trunk/src/libraries/core/CorePrereqs.h	(revision 9975)
+++ code/trunk/src/libraries/core/CorePrereqs.h	(revision 9978)
@@ -106,4 +106,5 @@
             OnHold,
             OnRelease,
+            OnPressAndRelease,
             None
         };
Index: code/trunk/src/libraries/core/input/Button.cc
===================================================================
--- code/trunk/src/libraries/core/input/Button.cc	(revision 9975)
+++ code/trunk/src/libraries/core/input/Button.cc	(revision 9978)
@@ -138,4 +138,6 @@
                     else if (token == "onrelease")
                         mode = KeybindMode::OnRelease;
+                    else if (token == "onpressandrelease")
+                        mode = KeybindMode::OnPressAndRelease;
                     else if (token == "onhold")
                         mode = KeybindMode::OnHold;
@@ -216,5 +218,5 @@
                         {
                             mode = eval.getConsoleCommand()->getKeybindMode();
-                            commands[mode].push_back(cmd);
+                            this->addCommand(cmd, mode, commands);
                         }
                     }
@@ -232,5 +234,5 @@
                         cmd->setFixedKeybindMode(true);
 
-                    commands[mode].push_back(cmd);
+                    this->addCommand(cmd, mode, commands);
                 }
             }
@@ -251,4 +253,17 @@
     }
 
+    inline void Button::addCommand(BaseCommand* cmd, KeybindMode::Value mode, std::vector<BaseCommand*> commands[3])
+    {
+        if (mode == KeybindMode::OnPressAndRelease)
+        {
+            BaseCommand* cmd2 = cmd->clone();
+
+            commands[KeybindMode::OnPress].push_back(cmd);
+            commands[KeybindMode::OnRelease].push_back(cmd2); // clone
+        }
+        else
+            commands[mode].push_back(cmd);
+    }
+
     inline void Button::parseError(const std::string& message, bool serious)
     {
Index: code/trunk/src/libraries/core/input/Button.h
===================================================================
--- code/trunk/src/libraries/core/input/Button.h	(revision 9975)
+++ code/trunk/src/libraries/core/input/Button.h	(revision 9978)
@@ -75,4 +75,5 @@
     private:
         void parseError(const std::string& message, bool serious);
+        void addCommand(BaseCommand* cmd, KeybindMode::Value mode, std::vector<BaseCommand*> commands[3]);
     };
 
Index: code/trunk/src/libraries/core/input/InputCommands.h
===================================================================
--- code/trunk/src/libraries/core/input/InputCommands.h	(revision 9975)
+++ code/trunk/src/libraries/core/input/InputCommands.h	(revision 9978)
@@ -67,4 +67,6 @@
             { return this->bFixedKeybindMode_; }
 
+        virtual BaseCommand* clone() = 0;
+
     private:
         bool bFixedKeybindMode_;
@@ -76,4 +78,5 @@
         bool execute(float abs = 1.0f, float rel = 1.0f);
         CommandEvaluation* getEvaluation();
+        virtual SimpleCommand* clone() { return new SimpleCommand(*this); }
 
         CommandEvaluation evaluation_;
@@ -103,4 +106,5 @@
         bool execute(float abs = 1.0f, float rel = 1.0f);
         CommandEvaluation* getEvaluation();
+        virtual ParamCommand* clone() { return new ParamCommand(*this); }
 
         float scale_;
Index: code/trunk/src/libraries/core/input/KeyBinder.h
===================================================================
--- code/trunk/src/libraries/core/input/KeyBinder.h	(revision 9975)
+++ code/trunk/src/libraries/core/input/KeyBinder.h	(revision 9978)
@@ -195,8 +195,8 @@
 
     inline void KeyBinder::buttonPressed (const KeyEvent& evt)
-    { assert(!keys_[evt.getKeyCode()].name_.empty()); keys_[evt.getKeyCode()].execute(KeybindMode::OnPress); }
+    { assert(!keys_[evt.getKeyCode()].name_.empty()); keys_[evt.getKeyCode()].execute(KeybindMode::OnPress, 1); }
 
     inline void KeyBinder::buttonReleased(const KeyEvent& evt)
-    { assert(!keys_[evt.getKeyCode()].name_.empty()); keys_[evt.getKeyCode()].execute(KeybindMode::OnRelease); }
+    { assert(!keys_[evt.getKeyCode()].name_.empty()); keys_[evt.getKeyCode()].execute(KeybindMode::OnRelease, 0); }
 
     inline void KeyBinder::buttonHeld    (const KeyEvent& evt)
@@ -205,8 +205,8 @@
 
     inline void KeyBinder::buttonPressed (MouseButtonCode::ByEnum button)
-    { mouseButtons_[button].execute(KeybindMode::OnPress); }
+    { mouseButtons_[button].execute(KeybindMode::OnPress, 1); }
 
     inline void KeyBinder::buttonReleased(MouseButtonCode::ByEnum button)
-    { mouseButtons_[button].execute(KeybindMode::OnRelease); }
+    { mouseButtons_[button].execute(KeybindMode::OnRelease, 0); }
 
     inline void KeyBinder::buttonHeld    (MouseButtonCode::ByEnum button)
@@ -215,8 +215,8 @@
 
     inline void KeyBinder::buttonPressed (unsigned int device, JoyStickButtonCode::ByEnum button)
-    { (*joyStickButtons_[device])[button].execute(KeybindMode::OnPress); }
+    { (*joyStickButtons_[device])[button].execute(KeybindMode::OnPress, 1); }
 
     inline void KeyBinder::buttonReleased(unsigned int device, JoyStickButtonCode::ByEnum button)
-    { (*joyStickButtons_[device])[button].execute(KeybindMode::OnRelease); }
+    { (*joyStickButtons_[device])[button].execute(KeybindMode::OnRelease, 0); }
 
     inline void KeyBinder::buttonHeld    (unsigned int device, JoyStickButtonCode::ByEnum button)
