Index: code/trunk/src/orxonox/objects/infos/GametypeInfo.cc
===================================================================
--- code/trunk/src/orxonox/objects/infos/GametypeInfo.cc	(revision 2710)
+++ code/trunk/src/orxonox/objects/infos/GametypeInfo.cc	(revision 2826)
@@ -58,4 +58,5 @@
         registerVariable(this->startCountdown_,         variableDirection::toclient);
         registerVariable(this->bStartCountdownRunning_, variableDirection::toclient);
+        registerVariable(this->hudtemplate_,            variableDirection::toclient);
     }
 }
Index: code/trunk/src/orxonox/objects/infos/GametypeInfo.h
===================================================================
--- code/trunk/src/orxonox/objects/infos/GametypeInfo.h	(revision 2710)
+++ code/trunk/src/orxonox/objects/infos/GametypeInfo.h	(revision 2826)
@@ -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/trunk/src/orxonox/objects/infos/HumanPlayer.cc
===================================================================
--- code/trunk/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2710)
+++ code/trunk/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2826)
@@ -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_;
+        }
     }
 
@@ -89,5 +100,5 @@
     void HumanPlayer::configvaluecallback_changedHUDTemplate()
     {
-        this->changedController();
+        this->setHumanHUDTemplate(this->hudtemplate_);
     }
 
@@ -111,4 +122,5 @@
 
             this->createController();
+            this->updateHumanHUD();
         }
     }
@@ -146,12 +158,53 @@
     }
 
-    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());
+
+        if (this->gametypeHud_)
+            this->gametypeHud_->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->getControllableEntity());
         }
     }
Index: code/trunk/src/orxonox/objects/infos/HumanPlayer.h
===================================================================
--- code/trunk/src/orxonox/objects/infos/HumanPlayer.h	(revision 2710)
+++ code/trunk/src/orxonox/objects/infos/HumanPlayer.h	(revision 2826)
@@ -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/trunk/src/orxonox/objects/infos/PlayerInfo.cc
===================================================================
--- code/trunk/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2710)
+++ code/trunk/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2826)
@@ -141,4 +141,6 @@
         if (this->controller_)
             this->controller_->setControllableEntity(entity);
+
+        this->changedControllableEntity();
     }
 
@@ -155,4 +157,6 @@
             if (callback)
                 entity->removePlayer();
+
+            this->changedControllableEntity();
         }
     }
Index: code/trunk/src/orxonox/objects/infos/PlayerInfo.h
===================================================================
--- code/trunk/src/orxonox/objects/infos/PlayerInfo.h	(revision 2710)
+++ code/trunk/src/orxonox/objects/infos/PlayerInfo.h	(revision 2826)
@@ -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:
