Index: code/branches/questsystem5/src/orxonox/objects/infos/Bot.cc
===================================================================
--- code/branches/questsystem5/src/orxonox/objects/infos/Bot.cc	(revision 2777)
+++ code/branches/questsystem5/src/orxonox/objects/infos/Bot.cc	(revision 2907)
@@ -30,5 +30,5 @@
 #include "Bot.h"
 
-#include "core/Core.h"
+#include "core/GameMode.h"
 #include "core/CoreIncludes.h"
 #include "core/ConfigValueIncludes.h"
@@ -46,5 +46,5 @@
 
         this->bHumanPlayer_ = false;
-        this->bLocalPlayer_ = Core::isMaster();
+        this->bLocalPlayer_ = GameMode::isMaster();
         this->bSetUnreadyAfterSpawn_ = false;
         this->setReadyToSpawn(true);
Index: code/branches/questsystem5/src/orxonox/objects/infos/CMakeLists.txt
===================================================================
--- code/branches/questsystem5/src/orxonox/objects/infos/CMakeLists.txt	(revision 2777)
+++ code/branches/questsystem5/src/orxonox/objects/infos/CMakeLists.txt	(revision 2907)
@@ -1,4 +1,5 @@
 ADD_SOURCE_FILES(ORXONOX_SRC_FILES
   Bot.cc
+  PongBot.cc
   Info.cc
   PlayerInfo.cc
Index: code/branches/questsystem5/src/orxonox/objects/infos/GametypeInfo.cc
===================================================================
--- code/branches/questsystem5/src/orxonox/objects/infos/GametypeInfo.cc	(revision 2777)
+++ code/branches/questsystem5/src/orxonox/objects/infos/GametypeInfo.cc	(revision 2907)
@@ -58,4 +58,5 @@
         registerVariable(this->startCountdown_,         variableDirection::toclient);
         registerVariable(this->bStartCountdownRunning_, variableDirection::toclient);
+        registerVariable(this->hudtemplate_,            variableDirection::toclient);
     }
 }
Index: code/branches/questsystem5/src/orxonox/objects/infos/GametypeInfo.h
===================================================================
--- code/branches/questsystem5/src/orxonox/objects/infos/GametypeInfo.h	(revision 2777)
+++ code/branches/questsystem5/src/orxonox/objects/infos/GametypeInfo.h	(revision 2907)
@@ -56,4 +56,7 @@
                 { return this->startCountdown_; }
 
+            inline const std::string& getHUDTemplate() const
+                { return this->hudtemplate_; }
+
         private:
             bool bStarted_;
@@ -61,4 +64,5 @@
             bool bStartCountdownRunning_;
             float startCountdown_;
+            std::string hudtemplate_;
     };
 }
Index: code/branches/questsystem5/src/orxonox/objects/infos/HumanPlayer.cc
===================================================================
--- code/branches/questsystem5/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2777)
+++ code/branches/questsystem5/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2907)
@@ -30,5 +30,5 @@
 #include "HumanPlayer.h"
 
-#include "core/Core.h"
+#include "core/GameMode.h"
 #include "core/CoreIncludes.h"
 #include "core/ConfigValueIncludes.h"
@@ -47,5 +47,5 @@
         RegisterObject(HumanPlayer);
 
-        this->server_initialized_ = Core::isMaster();
+        this->server_initialized_ = GameMode::isMaster();
         this->client_initialized_ = false;
 
@@ -53,4 +53,7 @@
         this->defaultController_ = Class(HumanController);
 
+        this->humanHud_ = 0;
+        this->gametypeHud_ = 0;
+
         this->setConfigValues();
         this->registerVariables();
@@ -59,4 +62,12 @@
     HumanPlayer::~HumanPlayer()
     {
+        if (this->BaseObject::isInitialized())
+        {
+            if (this->humanHud_)
+                delete this->humanHud_;
+
+            if (this->gametypeHud_)
+                delete this->gametypeHud_;
+        }
     }
 
@@ -82,5 +93,5 @@
             this->synchronize_nick_ = this->nick_;
 
-            if (Core::isMaster())
+            if (GameMode::isMaster())
                 this->setName(this->nick_);
         }
@@ -89,5 +100,5 @@
     void HumanPlayer::configvaluecallback_changedHUDTemplate()
     {
-        this->changedController();
+        this->setHumanHUDTemplate(this->hudtemplate_);
     }
 
@@ -105,5 +116,5 @@
             this->client_initialized_ = true;
 
-            if (!Core::isMaster())
+            if (!GameMode::isMaster())
                 this->setObjectMode(objectDirection::bidirectional);
             else
@@ -111,4 +122,5 @@
 
             this->createController();
+            this->updateHumanHUD();
         }
     }
@@ -146,12 +158,50 @@
     }
 
-    void HumanPlayer::changedController()
-    {
-        if (this->getController())
-        {
-            this->getController()->setHUDTemplate(this->hudtemplate_);
-
-            if (this->getController() && this->getController()->getHUD())
-                this->getController()->getHUD()->setOwner(this->getControllableEntity());
+    void HumanPlayer::changedGametype()
+    {
+        PlayerInfo::changedGametype();
+
+        if (this->isInitialized() && this->isLocalPlayer())
+            if (this->getGametype()->getHUDTemplate() != "")
+                this->setGametypeHUDTemplate(this->getGametype()->getHUDTemplate());
+    }
+
+    void HumanPlayer::changedControllableEntity()
+    {
+        PlayerInfo::changedControllableEntity();
+
+        if (this->humanHud_)
+            this->humanHud_->setOwner(this->getControllableEntity());
+    }
+
+    void HumanPlayer::updateHumanHUD()
+    {
+        if (this->humanHud_)
+        {
+            delete this->humanHud_;
+            this->humanHud_ = 0;
+        }
+
+        if (this->isLocalPlayer() && this->humanHudTemplate_ != "")
+        {
+            this->humanHud_ = new OverlayGroup(this);
+            this->humanHud_->addTemplate(this->humanHudTemplate_);
+            this->humanHud_->setOwner(this->getControllableEntity());
+        }
+    }
+
+    void HumanPlayer::updateGametypeHUD()
+    {
+        if (this->gametypeHud_)
+        {
+            delete this->gametypeHud_;
+            this->gametypeHud_ = 0;
+        }
+
+        if (this->isLocalPlayer() && this->gametypeHudTemplate_ != "")
+        {
+            this->gametypeHud_ = new OverlayGroup(this);
+            this->gametypeHud_->addTemplate(this->gametypeHudTemplate_);
+            this->gametypeHud_->setOwner(this->getGametype());
         }
     }
Index: code/branches/questsystem5/src/orxonox/objects/infos/HumanPlayer.h
===================================================================
--- code/branches/questsystem5/src/orxonox/objects/infos/HumanPlayer.h	(revision 2777)
+++ code/branches/questsystem5/src/orxonox/objects/infos/HumanPlayer.h	(revision 2907)
@@ -51,5 +51,32 @@
             void setClientID(unsigned int clientID);
 
-            virtual void changedController();
+            virtual void changedGametype();
+            virtual void changedControllableEntity();
+
+            inline void setHumanHUDTemplate(const std::string& name)
+            {
+                if (name != this->humanHudTemplate_)
+                {
+                    this->humanHudTemplate_ = name;
+                    this->updateHumanHUD();
+                }
+            }
+            inline const std::string& getHumanHUDTemplate() const
+                { return this->humanHudTemplate_; }
+            inline OverlayGroup* getHumanHUD() const
+                { return this->humanHud_; }
+
+            inline void setGametypeHUDTemplate(const std::string& name)
+            {
+                if (name != this->gametypeHudTemplate_)
+                {
+                    this->gametypeHudTemplate_ = name;
+                    this->updateGametypeHUD();
+                }
+            }
+            inline const std::string& getGametypeHUDTemplate() const
+                { return this->gametypeHudTemplate_; }
+            inline OverlayGroup* getGametypeHUD() const
+                { return this->gametypeHud_; }
 
         protected:
@@ -61,4 +88,7 @@
             void networkcallback_client_initialized();
 
+            void updateHumanHUD();
+            void updateGametypeHUD();
+
             std::string nick_;
             std::string synchronize_nick_;
@@ -66,4 +96,9 @@
             bool server_initialized_;
             bool client_initialized_;
+
+            std::string humanHudTemplate_;
+            OverlayGroup* humanHud_;
+            std::string gametypeHudTemplate_;
+            OverlayGroup* gametypeHud_;
     };
 }
Index: code/branches/questsystem5/src/orxonox/objects/infos/PlayerInfo.cc
===================================================================
--- code/branches/questsystem5/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2777)
+++ code/branches/questsystem5/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2907)
@@ -110,4 +110,9 @@
     void PlayerInfo::createController()
     {
+        if (this->controller_)
+        {
+            delete this->controller_;
+            this->controller_ = 0;
+        }
         this->controller_ = this->defaultController_.fabricate(this);
         assert(this->controller_);
@@ -141,4 +146,6 @@
         if (this->controller_)
             this->controller_->setControllableEntity(entity);
+
+        this->changedControllableEntity();
     }
 
@@ -155,4 +162,6 @@
             if (callback)
                 entity->removePlayer();
+
+            this->changedControllableEntity();
         }
     }
Index: code/branches/questsystem5/src/orxonox/objects/infos/PlayerInfo.h
===================================================================
--- code/branches/questsystem5/src/orxonox/objects/infos/PlayerInfo.h	(revision 2777)
+++ code/branches/questsystem5/src/orxonox/objects/infos/PlayerInfo.h	(revision 2907)
@@ -49,4 +49,7 @@
             virtual void changedGametype();
 
+            virtual void changedController() {}
+            virtual void changedControllableEntity() {}
+
             inline bool isHumanPlayer() const
                 { return this->bHumanPlayer_; }
@@ -73,5 +76,4 @@
             inline Controller* getController() const
                 { return this->controller_; }
-            virtual void changedController() {}
 
         protected:
Index: code/branches/questsystem5/src/orxonox/objects/infos/PongBot.cc
===================================================================
--- code/branches/questsystem5/src/orxonox/objects/infos/PongBot.cc	(revision 2907)
+++ code/branches/questsystem5/src/orxonox/objects/infos/PongBot.cc	(revision 2907)
@@ -0,0 +1,46 @@
+/*
+ *   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:
+ *      ...
+ *
+ */
+
+#include "OrxonoxStableHeaders.h"
+#include "PongBot.h"
+
+#include "core/CoreIncludes.h"
+#include "objects/controllers/PongAI.h"
+
+namespace orxonox
+{
+    CreateFactory(PongBot);
+
+    PongBot::PongBot(BaseObject* creator) : Bot(creator)
+    {
+        RegisterObject(PongBot);
+
+        this->defaultController_ = Class(PongAI);
+        this->createController();
+    }
+}
Index: code/branches/questsystem5/src/orxonox/objects/infos/PongBot.h
===================================================================
--- code/branches/questsystem5/src/orxonox/objects/infos/PongBot.h	(revision 2907)
+++ code/branches/questsystem5/src/orxonox/objects/infos/PongBot.h	(revision 2907)
@@ -0,0 +1,46 @@
+/*
+ *   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 _PongBot_H__
+#define _PongBot_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "Bot.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport PongBot : public Bot
+    {
+        public:
+            PongBot(BaseObject* creator);
+            virtual ~PongBot() {}
+    };
+}
+
+#endif /* _PongBot_H__ */
