Index: code/branches/pickup2/src/orxonox/infos/Bot.cc
===================================================================
--- code/branches/pickup2/src/orxonox/infos/Bot.cc	(revision 5942)
+++ code/branches/pickup2/src/orxonox/infos/Bot.cc	(revision 6412)
@@ -94,5 +94,5 @@
         static std::vector<std::string> defaultnames(names, names + sizeof(names) / sizeof(std::string));
 
-        SetConfigValueVector(names_, defaultnames);
+        SetConfigValue(names_, defaultnames);
     }
 }
Index: code/branches/pickup2/src/orxonox/infos/HumanPlayer.cc
===================================================================
--- code/branches/pickup2/src/orxonox/infos/HumanPlayer.cc	(revision 5942)
+++ code/branches/pickup2/src/orxonox/infos/HumanPlayer.cc	(revision 6412)
@@ -35,4 +35,5 @@
 #include "network/Host.h"
 #include "controllers/HumanController.h"
+#include "controllers/NewHumanController.h"
 #include "gametypes/Gametype.h"
 #include "overlays/OverlayGroup.h"
@@ -50,5 +51,5 @@
 
         this->bHumanPlayer_ = true;
-        this->defaultController_ = Class(HumanController);
+        this->defaultController_ = Class(NewHumanController);
 
         this->humanHud_ = 0;
@@ -163,5 +164,5 @@
         if (this->isInitialized() && this->isLocalPlayer())
         {
-            if (this->getGametype() && this->getGametype()->getHUDTemplate() != "")
+            if (this->getGametype() && !this->getGametype()->getHUDTemplate().empty())
                 this->setGametypeHUDTemplate(this->getGametype()->getHUDTemplate());
             else
@@ -178,5 +179,5 @@
         }
 
-        if (this->isLocalPlayer() && this->humanHudTemplate_ != "" && GameMode::showsGraphics())
+        if (this->isLocalPlayer() && !this->humanHudTemplate_.empty() && GameMode::showsGraphics())
         {
             this->humanHud_ = new OverlayGroup(this);
@@ -194,5 +195,5 @@
         }
 
-        if (this->isLocalPlayer() && this->gametypeHudTemplate_ != "")
+        if (this->isLocalPlayer() && !this->gametypeHudTemplate_.empty())
         {
             this->gametypeHud_ = new OverlayGroup(this);
Index: code/branches/pickup2/src/orxonox/infos/PlayerInfo.cc
===================================================================
--- code/branches/pickup2/src/orxonox/infos/PlayerInfo.cc	(revision 5942)
+++ code/branches/pickup2/src/orxonox/infos/PlayerInfo.cc	(revision 6412)
@@ -50,5 +50,6 @@
         this->controller_ = 0;
         this->controllableEntity_ = 0;
-        this->controllableEntityID_ = CLIENTID_UNKNOWN;
+        this->controllableEntityID_ = OBJECTID_UNKNOWN;
+        this->oldControllableEntity_ = 0;
 
         this->gtinfo_ = 0;
@@ -80,5 +81,4 @@
         registerVariable(this->name_,                 VariableDirection::ToClient, new NetworkCallback<PlayerInfo>(this, &PlayerInfo::changedName));
         registerVariable(this->controllableEntityID_, VariableDirection::ToClient, new NetworkCallback<PlayerInfo>(this, &PlayerInfo::networkcallback_changedcontrollableentityID));
-        registerVariable(this->bReadyToSpawn_,        VariableDirection::ToServer);
         registerVariable(this->gtinfoID_,             VariableDirection::ToClient, new NetworkCallback<PlayerInfo>(this, &PlayerInfo::networkcallback_changedgtinfoID));
     }
@@ -139,5 +139,8 @@
         this->controller_->setPlayer(this);
         if (this->controllableEntity_)
+        {
             this->controller_->setControllableEntity(this->controllableEntity_);
+            this->controllableEntity_->setController(this->controller_);
+        }
         this->changedController();
     }
@@ -148,4 +151,6 @@
             return;
 
+        if (this->oldControllableEntity_)
+            this->stopTemporaryControl();
         if (this->controllableEntity_)
             this->stopControl();
@@ -159,5 +164,27 @@
 
         if (this->controller_)
+        {
             this->controller_->setControllableEntity(entity);
+            this->controllableEntity_->setController(this->controller_);
+        }
+
+        this->changedControllableEntity();
+    }
+
+    void PlayerInfo::startTemporaryControl(ControllableEntity* entity)
+    {
+        if (!entity)
+            return;
+
+//         assert( this->temporaryControllableEntity_==0 );
+
+        this->oldControllableEntity_ = this->controllableEntity_;
+        this->controllableEntity_ = entity;
+        this->controllableEntityID_ = entity->getObjectID();
+
+        entity->setPlayer(this);
+
+        if (this->controller_)
+            this->controller_->setControllableEntity(entity);
 
         this->changedControllableEntity();
@@ -166,4 +193,7 @@
     void PlayerInfo::stopControl()
     {
+        if ( this->oldControllableEntity_ )
+            this->stopTemporaryControl();
+
         ControllableEntity* entity = this->controllableEntity_;
 
@@ -171,4 +201,5 @@
             return;
 
+        this->controllableEntity_->setController(0);
         this->controllableEntity_ = 0;
         this->controllableEntityID_ = OBJECTID_UNKNOWN;
@@ -177,5 +208,27 @@
             this->controller_->setControllableEntity(0);
 
-        entity->removePlayer();
+        if ( GameMode::isMaster() )
+            entity->removePlayer();
+
+        this->changedControllableEntity();
+    }
+
+    void PlayerInfo::stopTemporaryControl()
+    {
+        ControllableEntity* entity = this->controllableEntity_;
+
+        assert( this->controllableEntity_ && this->oldControllableEntity_ );
+        if( !entity || !this->oldControllableEntity_ )
+            return;
+
+        this->controllableEntity_ = this->oldControllableEntity_;
+        this->controllableEntityID_ = this->controllableEntity_->getObjectID();
+        this->oldControllableEntity_ = 0;
+
+        if ( this->controllableEntity_ && this->controller_)
+            this->controller_->setControllableEntity(this->controllableEntity_);
+
+        if ( GameMode::isMaster() )
+            entity->removePlayer();
 
         this->changedControllableEntity();
@@ -196,4 +249,5 @@
     }
 
+
     void PlayerInfo::networkcallback_changedgtinfoID()
     {
Index: code/branches/pickup2/src/orxonox/infos/PlayerInfo.h
===================================================================
--- code/branches/pickup2/src/orxonox/infos/PlayerInfo.h	(revision 5942)
+++ code/branches/pickup2/src/orxonox/infos/PlayerInfo.h	(revision 6412)
@@ -69,4 +69,6 @@
             void startControl(ControllableEntity* entity);
             void stopControl();
+            void startTemporaryControl(ControllableEntity* entity);
+            void stopTemporaryControl();
 
             inline ControllableEntity* getControllableEntity() const
@@ -96,4 +98,5 @@
             Controller* controller_;
             ControllableEntity* controllableEntity_;
+            ControllableEntity* oldControllableEntity_;
             unsigned int controllableEntityID_;
 
