Index: code/branches/objecthierarchy2/bin/def_keybindings.ini
===================================================================
--- code/branches/objecthierarchy2/bin/def_keybindings.ini	(revision 2461)
+++ code/branches/objecthierarchy2/bin/def_keybindings.ini	(revision 2462)
@@ -100,5 +100,5 @@
 KeyPageDown=
 KeyPageUp=
-KeyPause=
+KeyPause=pause
 KeyPeriod=
 KeyPlayPause=
Index: code/branches/objecthierarchy2/src/orxonox/gamestates/GSRoot.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/gamestates/GSRoot.cc	(revision 2461)
+++ code/branches/objecthierarchy2/src/orxonox/gamestates/GSRoot.cc	(revision 2462)
@@ -69,4 +69,6 @@
         : RootGameState("root")
         , timeFactor_(1.0f)
+        , bPaused_(false)
+        , timeFactorPauseBackup_(1.0f)
         , settings_(0)
         , tclBind_(0)
@@ -78,4 +80,5 @@
 
         this->ccSetTimeFactor_ = 0;
+        this->ccPause_ = 0;
     }
 
@@ -125,21 +128,35 @@
             setThreadAffinity((unsigned int)(limitToCPU - 1));
 
-        // add console commands
-        FunctorMember<GSRoot>* functor1 = createFunctor(&GSRoot::exitGame);
-        functor1->setObject(this);
-        ccExit_ = createConsoleCommand(functor1, "exit");
-        CommandExecutor::addConsoleCommandShortcut(ccExit_);
-
-        // add console commands
-        FunctorMember01<GameStateBase, const std::string&>* functor2 = createFunctor(&GameStateBase::requestState);
-        functor2->setObject(this);
-        ccSelectGameState_ = createConsoleCommand(functor2, "selectGameState");
-        CommandExecutor::addConsoleCommandShortcut(ccSelectGameState_);
-
-        // time factor console command
-        FunctorMember<GSRoot>* functor = createFunctor(&GSRoot::setTimeFactor);
-        functor->setObject(this);
-        ccSetTimeFactor_ = createConsoleCommand(functor, "setTimeFactor");
-        CommandExecutor::addConsoleCommandShortcut(ccSetTimeFactor_).accessLevel(AccessLevel::Offline).defaultValue(0, 1.0);;
+        {
+            // add console commands
+            FunctorMember<GSRoot>* functor = createFunctor(&GSRoot::exitGame);
+            functor->setObject(this);
+            this->ccExit_ = createConsoleCommand(functor, "exit");
+            CommandExecutor::addConsoleCommandShortcut(this->ccExit_);
+        }
+
+        {
+            // add console commands
+            FunctorMember01<GameStateBase, const std::string&>* functor = createFunctor(&GameStateBase::requestState);
+            functor->setObject(this);
+            this->ccSelectGameState_ = createConsoleCommand(functor, "selectGameState");
+            CommandExecutor::addConsoleCommandShortcut(this->ccSelectGameState_);
+        }
+
+        {
+            // time factor console command
+            FunctorMember<GSRoot>* functor = createFunctor(&GSRoot::setTimeFactor);
+            functor->setObject(this);
+            this->ccSetTimeFactor_ = createConsoleCommand(functor, "setTimeFactor");
+            CommandExecutor::addConsoleCommandShortcut(this->ccSetTimeFactor_).accessLevel(AccessLevel::Offline).defaultValue(0, 1.0);
+        }
+
+        {
+            // time factor console command
+            FunctorMember<GSRoot>* functor = createFunctor(&GSRoot::pause);
+            functor->setObject(this);
+            this->ccPause_ = createConsoleCommand(functor, "pause");
+            CommandExecutor::addConsoleCommandShortcut(this->ccPause_).accessLevel(AccessLevel::Offline);
+        }
     }
 
@@ -161,4 +178,10 @@
             delete this->ccSetTimeFactor_;
             this->ccSetTimeFactor_ = 0;
+        }
+
+        if (this->ccPause_)
+        {
+            delete this->ccPause_;
+            this->ccPause_ = 0;
         }
     }
@@ -229,10 +252,33 @@
         if (Core::isMaster())
         {
-            TimeFactorListener::timefactor_s = factor;
-
-            for (ObjectList<TimeFactorListener>::iterator it = ObjectList<TimeFactorListener>::begin(); it != ObjectList<TimeFactorListener>::end(); ++it)
-                it->changedTimeFactor(factor, this->timeFactor_);
-
-            this->timeFactor_ = factor;
+            if (!this->bPaused_)
+            {
+                TimeFactorListener::timefactor_s = factor;
+
+                for (ObjectList<TimeFactorListener>::iterator it = ObjectList<TimeFactorListener>::begin(); it != ObjectList<TimeFactorListener>::end(); ++it)
+                    it->changedTimeFactor(factor, this->timeFactor_);
+
+                this->timeFactor_ = factor;
+            }
+            else
+                this->timeFactorPauseBackup_ = factor;
+        }
+    }
+
+    void GSRoot::pause()
+    {
+        if (Core::isMaster())
+        {
+            if (!this->bPaused_)
+            {
+                this->timeFactorPauseBackup_ = this->timeFactor_;
+                this->setTimeFactor(0.0f);
+                this->bPaused_ = true;
+            }
+            else
+            {
+                this->bPaused_ = false;
+                this->setTimeFactor(this->timeFactorPauseBackup_);
+            }
         }
     }
Index: code/branches/objecthierarchy2/src/orxonox/gamestates/GSRoot.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/gamestates/GSRoot.h	(revision 2461)
+++ code/branches/objecthierarchy2/src/orxonox/gamestates/GSRoot.h	(revision 2462)
@@ -50,4 +50,5 @@
         // when taking the function address.
         void setTimeFactor(float factor);
+        void pause();
         float getTimeFactor() { return this->timeFactor_; }
 
@@ -61,4 +62,6 @@
 
         float                 timeFactor_;       //!< A factor that sets the gamespeed. 1 is normal.
+        bool                  bPaused_;
+        float                 timeFactorPauseBackup_;
         Settings*             settings_;
         TclBind*              tclBind_;
@@ -71,4 +74,5 @@
         ConsoleCommand*       ccSelectGameState_;
         ConsoleCommand*       ccSetTimeFactor_;
+        ConsoleCommand*       ccPause_;
     };
 
Index: code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.cc	(revision 2461)
+++ code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.cc	(revision 2462)
@@ -33,4 +33,6 @@
 #include "core/ConsoleCommand.h"
 #include "objects/worldentities/ControllableEntity.h"
+#include "objects/worldentities/pawns/Pawn.h"
+#include "objects/gametypes/Gametype.h"
 
 namespace orxonox
@@ -48,4 +50,7 @@
     SetConsoleCommand(HumanController, use,           true);
     SetConsoleCommand(HumanController, switchCamera,  true);
+    SetConsoleCommand(HumanController, suicide,       true);
+    SetConsoleCommand(HumanController, addBots,       true).defaultValues(1);
+    SetConsoleCommand(HumanController, killBots,      true).defaultValues(0);
 
     CreateUnloadableFactory(HumanController);
@@ -136,3 +141,25 @@
             HumanController::localController_s->controllableEntity_->switchCamera();
     }
+
+    void HumanController::suicide()
+    {
+        if (HumanController::localController_s && HumanController::localController_s->controllableEntity_)
+        {
+            Pawn* pawn = dynamic_cast<Pawn*>(HumanController::localController_s->controllableEntity_);
+            if (pawn)
+                pawn->kill();
+        }
+    }
+
+    void HumanController::addBots(unsigned int amount)
+    {
+        if (HumanController::localController_s && HumanController::localController_s->controllableEntity_ && HumanController::localController_s->controllableEntity_->getGametype())
+            HumanController::localController_s->controllableEntity_->getGametype()->addBots(amount);
+    }
+
+    void HumanController::killBots(unsigned int amount)
+    {
+        if (HumanController::localController_s && HumanController::localController_s->controllableEntity_ && HumanController::localController_s->controllableEntity_->getGametype())
+            HumanController::localController_s->controllableEntity_->getGametype()->killBots(amount);
+    }
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.h	(revision 2461)
+++ code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.h	(revision 2462)
@@ -59,4 +59,9 @@
             static void switchCamera();
 
+            static void suicide();
+
+            static void addBots(unsigned int amount);
+            static void killBots(unsigned int amount = 0);
+
         private:
             static HumanController* localController_s;
Index: code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc	(revision 2461)
+++ code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc	(revision 2462)
@@ -36,4 +36,5 @@
 #include "core/ConfigValueIncludes.h"
 #include "objects/infos/PlayerInfo.h"
+#include "objects/infos/Bot.h"
 #include "objects/worldentities/pawns/Spectator.h"
 #include "objects/worldentities/SpawnPoint.h"
@@ -50,12 +51,17 @@
         RegisterObject(Gametype);
 
+        this->setGametype(this);
+
         this->defaultControllableEntity_ = Class(Spectator);
 
         this->bAutoStart_ = false;
         this->bForceSpawn_ = false;
+        this->numberOfBots_ = 0;
 
         this->initialStartCountdown_ = 3;
 
         this->setConfigValues();
+
+        this->addBots(this->numberOfBots_);
     }
 
@@ -65,4 +71,5 @@
         SetConfigValue(bAutoStart_, false);
         SetConfigValue(bForceSpawn_, false);
+        SetConfigValue(numberOfBots_, 0);
     }
 
@@ -293,3 +300,22 @@
         }
     }
+
+    void Gametype::addBots(unsigned int amount)
+    {
+        for (unsigned int i = 0; i < amount; ++i)
+            new Bot(this);
+    }
+
+    void Gametype::killBots(unsigned int amount)
+    {
+        unsigned int i = 0;
+        for (ObjectList<Bot>::iterator it = ObjectList<Bot>::begin(); (it != ObjectList<Bot>::end()) && ((amount == 0) || (i < amount)); )
+        {
+            if (it->getGametype() == this)
+            {
+                delete (*(it++));
+                ++i;
+            }
+        }
+    }
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.h	(revision 2461)
+++ code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.h	(revision 2462)
@@ -98,4 +98,7 @@
                 { return this->gtinfo_.startCountdown_; }
 
+            void addBots(unsigned int amount);
+            void killBots(unsigned int amount = 0);
+
         private:
             virtual SpawnPoint* getBestSpawnPoint(PlayerInfo* player) const;
@@ -116,4 +119,5 @@
 
             float initialStartCountdown_;
+            unsigned int numberOfBots_;
 
             std::map<PlayerInfo*, PlayerState::Enum> players_;
Index: code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2461)
+++ code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2462)
@@ -65,4 +65,7 @@
                 this->controller_ = 0;
             }
+
+            if (this->getGametype())
+                this->getGametype()->playerLeft(this);
         }
     }
Index: code/branches/objecthierarchy2/src/orxonox/overlays/hud/HUDBar.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/overlays/hud/HUDBar.cc	(revision 2461)
+++ code/branches/objecthierarchy2/src/orxonox/overlays/hud/HUDBar.cc	(revision 2462)
@@ -84,5 +84,6 @@
         this->bar_->setMaterialName(materialname);
 
-        this->setValue(0.0f);
+        this->value_ = 1.0f;  // initielize with 1.0f to trigger a change when calling setValue(0.0f) on the line below
+        this->setValue(0.0f); // <--
         this->setRightToLeft(false);
         this->setAutoColour(true);
