Index: code/branches/objecthierarchy2/src/core/BaseObject.h
===================================================================
--- code/branches/objecthierarchy2/src/core/BaseObject.h	(revision 2422)
+++ code/branches/objecthierarchy2/src/core/BaseObject.h	(revision 2428)
@@ -135,8 +135,16 @@
             inline Scene* getScene() const { return this->scene_; }
 
-            inline void setGametype(Gametype* gametype) { this->oldGametype_ = this->gametype_; this->gametype_ = gametype; this->changedGametype(); }
+            inline void setGametype(Gametype* gametype)
+            {
+                if (gametype != this->gametype_)
+                {
+                    this->oldGametype_ = this->gametype_;
+                    this->gametype_ = gametype;
+                    this->changedGametype();
+                }
+            }
             inline Gametype* getGametype() const { return this->gametype_; }
             inline Gametype* getOldGametype() const { return this->oldGametype_; }
-            virtual inline void changedGametype() {}
+            virtual void changedGametype() {}
 
             void fireEvent();
@@ -197,4 +205,5 @@
     SUPER_FUNCTION(6, BaseObject, changedMainState, false);
     SUPER_FUNCTION(9, BaseObject, changedName, false);
+    SUPER_FUNCTION(10, BaseObject, changedGametype, false);
 }
 
Index: code/branches/objecthierarchy2/src/core/Super.h
===================================================================
--- code/branches/objecthierarchy2/src/core/Super.h	(revision 2422)
+++ code/branches/objecthierarchy2/src/core/Super.h	(revision 2428)
@@ -265,4 +265,7 @@
     #define SUPER_changedName(classname, functionname, ...) \
         SUPER_NOARGS(classname, functionname)
+
+    #define SUPER_changedGametype(classname, functionname, ...) \
+        SUPER_NOARGS(classname, functionname)
     // (1/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
 
@@ -513,4 +516,8 @@
 
         SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(9, changedName, false)
+            ()
+        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
+
+        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(10, changedGametype, false)
             ()
         SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
@@ -568,4 +575,5 @@
     SUPER_INTRUSIVE_DECLARATION(changedOverlayGroup);
     SUPER_INTRUSIVE_DECLARATION(changedName);
+    SUPER_INTRUSIVE_DECLARATION(changedGametype);
     // (3/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
 
Index: code/branches/objecthierarchy2/src/network/Synchronisable.h
===================================================================
--- code/branches/objecthierarchy2/src/network/Synchronisable.h	(revision 2422)
+++ code/branches/objecthierarchy2/src/network/Synchronisable.h	(revision 2428)
@@ -111,6 +111,6 @@
     static unsigned int popDeletedObject(){ unsigned int i = deletedObjects_.front(); deletedObjects_.pop(); return i; }
 
-    inline unsigned int getObjectID(){return objectID;}
-    inline unsigned int getClassID(){return classID;}
+    inline unsigned int getObjectID() const { return objectID; }
+    inline unsigned int getClassID() const { return classID; }
   protected:
     Synchronisable(BaseObject* creator);
Index: code/branches/objecthierarchy2/src/orxonox/OrxonoxPrereqs.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/OrxonoxPrereqs.h	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/OrxonoxPrereqs.h	(revision 2428)
@@ -187,4 +187,5 @@
     class OverlayGroup;
     class OverlayText;
+    class GametypeStatus;
 
     //gui
Index: code/branches/objecthierarchy2/src/orxonox/objects/controllers/Controller.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/controllers/Controller.cc	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/controllers/Controller.cc	(revision 2428)
@@ -31,4 +31,5 @@
 
 #include "core/CoreIncludes.h"
+#include "overlays/OverlayGroup.h"
 
 namespace orxonox
@@ -42,8 +43,40 @@
         this->player_ = 0;
         this->controllableEntity_ = 0;
+        this->hud_ = 0;
+        this->bUpdateHUD_ = false;
     }
 
     Controller::~Controller()
     {
+        if (this->isInitialized() && this->hud_)
+            delete this->hud_;
+    }
+
+    void Controller::changedControllableEntity()
+    {
+        if (this->bUpdateHUD_)
+        {
+            this->updateHUD();
+            this->bUpdateHUD_ = false;
+        }
+
+        if (this->hud_)
+            this->hud_->setOwner(this->getControllableEntity());
+    }
+
+    void Controller::updateHUD()
+    {
+        if (this->hud_)
+        {
+            delete this->hud_;
+            this->hud_ = 0;
+        }
+
+        if (this->hudtemplate_ != "")
+        {
+            this->hud_ = new OverlayGroup(this);
+            this->hud_->addTemplate(this->hudtemplate_);
+            this->hud_->setOwner(this->getControllableEntity());
+        }
     }
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/controllers/Controller.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/controllers/Controller.h	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/controllers/Controller.h	(revision 2428)
@@ -57,9 +57,31 @@
             inline ControllableEntity* getControllableEntity() const
                 { return this->controllableEntity_; }
-            virtual void changedControllableEntity() {}
+            virtual void changedControllableEntity();
+
+            inline void setHUDTemplate(const std::string& name)
+            {
+                if (name != this->hudtemplate_)
+                {
+                    this->hudtemplate_ = name;
+                    if (this->controllableEntity_)
+                        this->updateHUD();
+                    else
+                        this->bUpdateHUD_ = true;
+                }
+            }
+            inline const std::string& getHUDTemplate() const
+                { return this->hudtemplate_; }
+
+            inline OverlayGroup* getHUD() const
+                { return this->hud_; }
 
         protected:
+            void updateHUD();
+
             PlayerInfo* player_;
             ControllableEntity* controllableEntity_;
+            std::string hudtemplate_;
+            OverlayGroup* hud_;
+            bool bUpdateHUD_;
     };
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.cc	(revision 2428)
@@ -34,4 +34,5 @@
 
 #include "core/CoreIncludes.h"
+#include "core/ConfigValueIncludes.h"
 #include "objects/infos/PlayerInfo.h"
 #include "objects/worldentities/pawns/Spectator.h"
@@ -44,5 +45,5 @@
     CreateUnloadableFactory(Gametype);
 
-    Gametype::Gametype(BaseObject* creator) : BaseObject(creator)
+    Gametype::Gametype(BaseObject* creator) : BaseObject(creator), gtinfo_(creator)
     {
         RegisterObject(Gametype);
@@ -50,12 +51,15 @@
         this->defaultControllableEntity_ = Class(Spectator);
 
-        this->bStarted_ = false;
-        this->bEnded_ = false;
         this->bAutoStart_ = false;
         this->bForceSpawn_ = false;
 
         this->initialStartCountdown_ = 3;
-        this->startCountdown_ = 0;
-        this->bStartCountdownRunning_ = false;
+
+        this->setConfigValues();
+    }
+
+    void Gametype::setConfigValues()
+    {
+        SetConfigValue(initialStartCountdown_, 3.0f);
     }
 
@@ -64,8 +68,8 @@
         SUPER(Gametype, tick, dt);
 
-        if (this->bStartCountdownRunning_ && !this->bStarted_)
-            this->startCountdown_ -= dt;
-
-        if (!this->bStarted_)
+        if (this->gtinfo_.bStartCountdownRunning_ && !this->gtinfo_.bStarted_)
+            this->gtinfo_.startCountdown_ -= dt;
+
+        if (!this->gtinfo_.bStarted_)
             this->checkStart();
         else
@@ -78,5 +82,5 @@
     {
         COUT(0) << "game started" << std::endl;
-        this->bStarted_ = true;
+        this->gtinfo_.bStarted_ = true;
 
         this->spawnPlayersIfRequested();
@@ -86,5 +90,5 @@
     {
         COUT(0) << "game ended" << std::endl;
-        this->bEnded_ = true;
+        this->gtinfo_.bEnded_ = true;
     }
 
@@ -173,5 +177,5 @@
                 it->second = PlayerState::Dead;
 
-                if (!it->first->isReadyToSpawn() || !this->bStarted_)
+                if (!it->first->isReadyToSpawn() || !this->gtinfo_.bStarted_)
                 {
                     SpawnPoint* spawn = this->getBestSpawnPoint(it->first);
@@ -196,12 +200,12 @@
     void Gametype::checkStart()
     {
-        if (!this->bStarted_)
-        {
-            if (this->bStartCountdownRunning_)
-            {
-                if (this->startCountdown_ <= 0)
-                {
-                    this->bStartCountdownRunning_ = false;
-                    this->startCountdown_ = 0;
+        if (!this->gtinfo_.bStarted_)
+        {
+            if (this->gtinfo_.bStartCountdownRunning_)
+            {
+                if (this->gtinfo_.startCountdown_ <= 0)
+                {
+                    this->gtinfo_.bStartCountdownRunning_ = false;
+                    this->gtinfo_.startCountdown_ = 0;
                     this->start();
                 }
@@ -226,6 +230,6 @@
                     if (allplayersready && hashumanplayers)
                     {
-                        this->startCountdown_ = this->initialStartCountdown_;
-                        this->bStartCountdownRunning_ = true;
+                        this->gtinfo_.startCountdown_ = this->initialStartCountdown_;
+                        this->gtinfo_.bStartCountdownRunning_ = true;
                     }
                 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.h	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/gametypes/Gametype.h	(revision 2428)
@@ -38,4 +38,5 @@
 #include "objects/worldentities/ControllableEntity.h"
 #include "objects/Tickable.h"
+#include "objects/infos/GametypeInfo.h"
 
 namespace orxonox
@@ -60,10 +61,15 @@
             virtual ~Gametype() {}
 
+            void setConfigValues();
+
             virtual void tick(float dt);
 
+            inline const GametypeInfo* getGametypeInfo() const
+                { return &this->gtinfo_; }
+
             inline bool hasStarted() const
-                { return this->bStarted_; }
+                { return this->gtinfo_.bStarted_; }
             inline bool hasEnded() const
-                { return this->bEnded_; }
+                { return this->gtinfo_.bEnded_; }
 
             virtual void start();
@@ -88,7 +94,7 @@
 
             inline bool isStartCountdownRunning() const
-                { return this->bStartCountdownRunning_; }
+                { return this->gtinfo_.bStartCountdownRunning_; }
             inline float getStartCountdown() const
-                { return this->startCountdown_; }
+                { return this->gtinfo_.startCountdown_; }
 
         private:
@@ -104,12 +110,10 @@
             void spawnDeadPlayersIfRequested();
 
-            bool bStarted_;
-            bool bEnded_;
+            GametypeInfo gtinfo_;
+
             bool bAutoStart_;
             bool bForceSpawn_;
 
             float initialStartCountdown_;
-            float startCountdown_;
-            bool bStartCountdownRunning_;
 
             std::map<PlayerInfo*, PlayerState::Enum> players_;
Index: code/branches/objecthierarchy2/src/orxonox/objects/infos/CMakeLists.txt
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/infos/CMakeLists.txt	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/infos/CMakeLists.txt	(revision 2428)
@@ -4,4 +4,5 @@
   PlayerInfo.cc
   HumanPlayer.cc
+  GametypeInfo.cc
 )
 
Index: code/branches/objecthierarchy2/src/orxonox/objects/infos/GametypeInfo.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/infos/GametypeInfo.cc	(revision 2428)
+++ code/branches/objecthierarchy2/src/orxonox/objects/infos/GametypeInfo.cc	(revision 2428)
@@ -0,0 +1,61 @@
+/*
+ *   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 "GametypeInfo.h"
+
+#include "core/CoreIncludes.h"
+
+namespace orxonox
+{
+    CreateUnloadableFactory(GametypeInfo);
+
+    GametypeInfo::GametypeInfo(BaseObject* creator) : Info(creator)
+    {
+        RegisterObject(GametypeInfo);
+
+        this->bStarted_ = false;
+        this->bEnded_ = false;
+        this->startCountdown_ = 0;
+        this->bStartCountdownRunning_ = false;
+
+        this->registerVariables();
+    }
+
+    GametypeInfo::~GametypeInfo()
+    {
+    }
+
+    void GametypeInfo::registerVariables()
+    {
+        REGISTERDATA(this->bStarted_,               direction::toclient);
+        REGISTERDATA(this->bEnded_,                 direction::toclient);
+        REGISTERDATA(this->startCountdown_,         direction::toclient);
+        REGISTERDATA(this->bStartCountdownRunning_, direction::toclient);
+    }
+}
Index: code/branches/objecthierarchy2/src/orxonox/objects/infos/GametypeInfo.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/infos/GametypeInfo.h	(revision 2428)
+++ code/branches/objecthierarchy2/src/orxonox/objects/infos/GametypeInfo.h	(revision 2428)
@@ -0,0 +1,66 @@
+/*
+ *   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 _GametypeInfo_H__
+#define _GametypeInfo_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "Info.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport GametypeInfo : public Info
+    {
+        friend class Gametype;
+
+        public:
+            GametypeInfo(BaseObject* creator);
+            virtual ~GametypeInfo();
+
+            void registerVariables();
+
+            inline bool hasStarted() const
+                { return this->bStarted_; }
+            inline bool hasEnded() const
+                { return this->bEnded_; }
+
+            inline bool isStartCountdownRunning() const
+                { return this->bStartCountdownRunning_; }
+            inline float getStartCountdown() const
+                { return this->startCountdown_; }
+
+        private:
+            bool bStarted_;
+            bool bEnded_;
+            bool bStartCountdownRunning_;
+            float startCountdown_;
+    };
+}
+
+#endif /* _GametypeInfo_H__ */
Index: code/branches/objecthierarchy2/src/orxonox/objects/infos/HumanPlayer.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2428)
@@ -37,4 +37,5 @@
 #include "objects/controllers/HumanController.h"
 #include "objects/gametypes/Gametype.h"
+#include "overlays/OverlayGroup.h"
 
 namespace orxonox
@@ -63,4 +64,5 @@
     {
         SetConfigValue(nick_, "Player").callback(this, &HumanPlayer::configvaluecallback_changednick);
+        SetConfigValue(hudtemplate_, "defaultHUD").callback(this, &HumanPlayer::configvaluecallback_changedHUDTemplate);
     }
 
@@ -69,5 +71,5 @@
         REGISTERSTRING(this->synchronize_nick_, direction::toserver, new NetworkCallback<HumanPlayer>(this, &HumanPlayer::networkcallback_changednick));
 
-        REGISTERDATA(this->clientID_,     direction::toclient, new NetworkCallback<HumanPlayer>(this, &HumanPlayer::networkcallback_clientIDchanged));
+        REGISTERDATA(this->clientID_,           direction::toclient, new NetworkCallback<HumanPlayer>(this, &HumanPlayer::networkcallback_clientIDchanged));
         REGISTERDATA(this->server_initialized_, direction::toclient, new NetworkCallback<HumanPlayer>(this, &HumanPlayer::networkcallback_server_initialized));
         REGISTERDATA(this->client_initialized_, direction::toserver, new NetworkCallback<HumanPlayer>(this, &HumanPlayer::networkcallback_client_initialized));
@@ -83,4 +85,9 @@
                 this->setName(this->nick_);
         }
+    }
+
+    void HumanPlayer::configvaluecallback_changedHUDTemplate()
+    {
+        this->changedController();
     }
 
@@ -138,3 +145,14 @@
         this->networkcallback_clientIDchanged();
     }
+
+    void HumanPlayer::changedController()
+    {
+        if (this->getController())
+        {
+            this->getController()->setHUDTemplate(this->hudtemplate_);
+
+            if (this->getController() && this->getController()->getHUD())
+                this->getController()->getHUD()->setOwner(this->getControllableEntity());
+        }
+    }
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/infos/HumanPlayer.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/infos/HumanPlayer.h	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/infos/HumanPlayer.h	(revision 2428)
@@ -51,6 +51,9 @@
             void setClientID(unsigned int clientID);
 
+            virtual void changedController();
+
         protected:
             void configvaluecallback_changednick();
+            void configvaluecallback_changedHUDTemplate();
             void networkcallback_changednick();
             void networkcallback_clientIDchanged();
@@ -60,4 +63,5 @@
             std::string nick_;
             std::string synchronize_nick_;
+            std::string hudtemplate_;
             bool server_initialized_;
             bool client_initialized_;
Index: code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.cc	(revision 2428)
@@ -112,8 +112,12 @@
         if (this->controllableEntity_)
             this->controller_->setControllableEntity(this->controllableEntity_);
+        this->changedController();
     }
 
     void PlayerInfo::startControl(ControllableEntity* entity)
     {
+        if (entity == this->controllableEntity_)
+            return;
+
         if (this->controllableEntity_)
             this->stopControl(this->controllableEntity_);
Index: code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.h	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/infos/PlayerInfo.h	(revision 2428)
@@ -71,4 +71,8 @@
                 { return this->controllableEntity_; }
 
+            inline Controller* getController() const
+                { return this->controller_; }
+            virtual void changedController() {}
+
         protected:
             void createController();
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2428)
@@ -38,4 +38,5 @@
 #include "objects/worldentities/Camera.h"
 #include "objects/worldentities/CameraPosition.h"
+#include "objects/gametypes/Gametype.h"
 #include "overlays/OverlayGroup.h"
 
@@ -59,4 +60,8 @@
         this->bDestroyWhenPlayerLeft_ = false;
 
+        this->gtinfo_ = 0;
+        this->gtinfoID_ = OBJECTID_UNKNOWN;
+        this->changedGametype();
+
         this->velocity_ = Vector3::ZERO;
         this->acceleration_ = Vector3::ZERO;
@@ -98,4 +103,18 @@
 
         XMLPortObject(ControllableEntity, CameraPosition, "camerapositions", addCameraPosition, getCameraPosition, xmlelement, mode);
+    }
+
+    void ControllableEntity::changedGametype()
+    {
+        SUPER(ControllableEntity, changedGametype);
+
+        this->gtinfo_ = 0;
+        this->gtinfoID_ = OBJECTID_UNKNOWN;
+
+        if (this->getGametype() && this->getGametype()->getGametypeInfo())
+        {
+            this->gtinfo_ = this->getGametype()->getGametypeInfo();
+            this->gtinfoID_ = this->gtinfo_->getObjectID();
+        }
     }
 
@@ -199,4 +218,15 @@
     }
 
+    void ControllableEntity::networkcallback_changedgtinfoID()
+    {
+        if (this->gtinfoID_ != OBJECTID_UNKNOWN)
+        {
+            this->gtinfo_ = dynamic_cast<GametypeInfo*>(Synchronisable::getSynchronisable(this->gtinfoID_));
+
+            if (!this->gtinfo_)
+                this->gtinfoID_ = OBJECTID_UNKNOWN;
+        }
+    }
+
     void ControllableEntity::startLocalHumanControl()
     {
@@ -268,4 +298,5 @@
 
         REGISTERDATA(this->playerID_, direction::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::networkcallback_changedplayerID));
+        REGISTERDATA(this->gtinfoID_, direction::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::networkcallback_changedgtinfoID));
     }
 
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2428)
@@ -46,4 +46,6 @@
             virtual void tick(float dt);
             void registerVariables();
+
+            virtual void changedGametype();
 
             virtual void setPlayer(PlayerInfo* player);
@@ -143,4 +145,7 @@
                 { return this->bHasHumanController_; }
 
+            inline const GametypeInfo* getGametypeInfo() const
+                { return this->gtinfo_; }
+
         protected:
             virtual void startLocalHumanControl();
@@ -165,4 +170,5 @@
 
             void networkcallback_changedplayerID();
+            void networkcallback_changedgtinfoID();
 
             unsigned int server_overwrite_;
@@ -190,4 +196,7 @@
             std::list<CameraPosition*> cameraPositions_;
             std::string cameraPositionTemplate_;
+
+            const GametypeInfo* gtinfo_;
+            unsigned int gtinfoID_;
     };
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.cc	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.cc	(revision 2428)
@@ -57,5 +57,4 @@
         this->roll_ = 0;
         this->setHudTemplate("spectatorhud");
-        this->hudmode_ = 0;
 
         this->setDestroyWhenPlayerLeft(true);
@@ -96,5 +95,4 @@
         REGISTERDATA(this->bGreetingFlareVisible_, direction::toclient, new NetworkCallback<Spectator>(this, &Spectator::changedFlareVisibility));
         REGISTERDATA(this->bGreeting_,             direction::toserver, new NetworkCallback<Spectator>(this, &Spectator::changedGreeting));
-        REGISTERDATA(this->hudmode_,               direction::toclient);
     }
 
@@ -112,6 +110,4 @@
     void Spectator::tick(float dt)
     {
-        this->updateHUD();
-
         if (this->hasLocalController())
         {
@@ -193,71 +189,3 @@
         }
     }
-
-    void Spectator::updateHUD()
-    {
-        // <hack>
-        if (Core::isMaster())
-        {
-            if (this->getPlayer() && this->getGametype())
-            {
-                if (!this->getGametype()->hasStarted() && !this->getGametype()->isStartCountdownRunning())
-                {
-                    if (!this->getPlayer()->isReadyToSpawn())
-                        this->hudmode_ = 0;
-                    else
-                        this->hudmode_ = 1;
-                }
-                else if (!this->getGametype()->hasEnded())
-                {
-                    if (this->getGametype()->isStartCountdownRunning())
-                        this->hudmode_ = 2 + 10*(int)ceil(this->getGametype()->getStartCountdown());
-                    else
-                        this->hudmode_ = 3;
-                }
-                else
-                    this->hudmode_ = 4;
-            }
-            else
-                return;
-        }
-
-        if (this->getHUD())
-        {
-            std::string text;
-            int hudmode = this->hudmode_ % 10;
-
-            switch (hudmode)
-            {
-                case 0:
-                    text = "Press [Fire] to start the match";
-                    break;
-                case 1:
-                    text = "Waiting for other players";
-                    break;
-                case 2:
-                    text = convertToString((this->hudmode_ - 2) / 10);
-                    break;
-                case 3:
-                    text = "Press [Fire] to respawn";
-                    break;
-                case 4:
-                    text = "Game has ended";
-                    break;
-                default:;
-            }
-
-            std::map<std::string, OrxonoxOverlay*>::const_iterator it = this->getHUD()->getOverlays().begin();
-            for (; it != this->getHUD()->getOverlays().end(); ++it)
-            {
-                if (it->second->isA(Class(OverlayText)) && it->second->getName() == "state")
-                {
-                    OverlayText* overlay = dynamic_cast<OverlayText*>(it->second);
-                    if (overlay)
-                        overlay->setCaption(text);
-                    break;
-                }
-            }
-        }
-        // </hack>
-    }
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.h	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.h	(revision 2428)
@@ -63,5 +63,4 @@
             void changedGreeting();
             void changedFlareVisibility();
-            void updateHUD();
 
             BillboardSet* greetingFlare_;
@@ -75,6 +74,4 @@
             float pitch_;
             float roll_;
-
-            int hudmode_;
     };
 }
Index: code/branches/objecthierarchy2/src/orxonox/overlays/hud/CMakeLists.txt
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/overlays/hud/CMakeLists.txt	(revision 2422)
+++ code/branches/objecthierarchy2/src/orxonox/overlays/hud/CMakeLists.txt	(revision 2428)
@@ -6,4 +6,5 @@
   HUDHealthBar.cc
   ChatOverlay.cc
+  GametypeStatus.cc
 )
 
Index: code/branches/objecthierarchy2/src/orxonox/overlays/hud/GametypeStatus.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/overlays/hud/GametypeStatus.cc	(revision 2428)
+++ code/branches/objecthierarchy2/src/orxonox/overlays/hud/GametypeStatus.cc	(revision 2428)
@@ -0,0 +1,95 @@
+/*
+ *   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 "GametypeStatus.h"
+
+#include <OgreTextAreaOverlayElement.h>
+
+#include "core/CoreIncludes.h"
+#include "util/Convert.h"
+#include "objects/infos/GametypeInfo.h"
+#include "objects/infos/PlayerInfo.h"
+#include "objects/worldentities/ControllableEntity.h"
+#include "objects/worldentities/pawns/Spectator.h"
+
+namespace orxonox
+{
+    CreateFactory(GametypeStatus);
+
+    GametypeStatus::GametypeStatus(BaseObject* creator) : OverlayText(creator)
+    {
+        RegisterObject(GametypeStatus);
+
+        this->owner_ = 0;
+
+COUT(0) << "created GametypeStatus" << std::endl;
+    }
+
+    GametypeStatus::~GametypeStatus()
+    {
+    }
+
+    void GametypeStatus::tick(float dt)
+    {
+        SUPER(GametypeStatus, tick, dt);
+
+        if (this->owner_ && this->owner_->getGametypeInfo() && this->owner_->getPlayer())
+        {
+            const GametypeInfo* gtinfo = this->owner_->getGametypeInfo();
+            PlayerInfo* pinfo = this->owner_->getPlayer();
+
+            if (!gtinfo->hasStarted() && !gtinfo->isStartCountdownRunning())
+            {
+                if (!pinfo->isReadyToSpawn())
+                    this->setCaption("Press [Fire] to start the match");
+                else
+                    this->setCaption("Waiting for other players");
+            }
+            else if (!gtinfo->hasEnded())
+            {
+                if (gtinfo->isStartCountdownRunning())
+                    this->setCaption(convertToString((int)ceil(gtinfo->getStartCountdown())));
+                else if (this->owner_->isA(Class(Spectator)))
+                    this->setCaption("Press [Fire] to respawn");
+                else
+                    this->setCaption("");
+            }
+            else
+                this->setCaption("Game has ended");
+        }
+    }
+
+
+    void GametypeStatus::changedOwner()
+    {
+        SUPER(GametypeStatus, changedOwner);
+
+        this->owner_ = dynamic_cast<ControllableEntity*>(this->getOwner());
+    }
+}
Index: code/branches/objecthierarchy2/src/orxonox/overlays/hud/GametypeStatus.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/overlays/hud/GametypeStatus.h	(revision 2428)
+++ code/branches/objecthierarchy2/src/orxonox/overlays/hud/GametypeStatus.h	(revision 2428)
@@ -0,0 +1,52 @@
+/*
+ *   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 _GametypeStatus_H__
+#define _GametypeStatus_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "overlays/OverlayText.h"
+#include "objects/Tickable.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport GametypeStatus : public OverlayText, public Tickable
+    {
+        public:
+            GametypeStatus(BaseObject* creator);
+            ~GametypeStatus();
+
+            virtual void tick(float dt);
+            virtual void changedOwner();
+
+        private:
+            ControllableEntity* owner_;
+    };
+}
+#endif /* _GametypeStatus_H__ */
