Index: /code/trunk/src/orxonox/objects/gametypes/Gametype.cc
===================================================================
--- /code/trunk/src/orxonox/objects/gametypes/Gametype.cc	(revision 2889)
+++ /code/trunk/src/orxonox/objects/gametypes/Gametype.cc	(revision 2890)
@@ -229,4 +229,13 @@
         if (it != this->players_.end())
             it->second.frags_++;
+    }
+
+    int Gametype::getScore(PlayerInfo* player) const
+    {
+        std::map<PlayerInfo*, Player>::const_iterator it = this->players_.find(player);
+        if (it != this->players_.end())
+            return it->second.frags_;
+        else
+            return 0;
     }
 
Index: /code/trunk/src/orxonox/objects/gametypes/Gametype.h
===================================================================
--- /code/trunk/src/orxonox/objects/gametypes/Gametype.h	(revision 2889)
+++ /code/trunk/src/orxonox/objects/gametypes/Gametype.h	(revision 2890)
@@ -107,4 +107,6 @@
                 { return this->players_; }
 
+            int getScore(PlayerInfo* player) const;
+
             inline void registerSpawnPoint(SpawnPoint* spawnpoint)
                 { this->spawnpoints_.insert(spawnpoint); }
Index: /code/trunk/src/orxonox/objects/gametypes/Pong.cc
===================================================================
--- /code/trunk/src/orxonox/objects/gametypes/Pong.cc	(revision 2889)
+++ /code/trunk/src/orxonox/objects/gametypes/Pong.cc	(revision 2890)
@@ -53,4 +53,6 @@
         this->bat_[0] = 0;
         this->bat_[1] = 0;
+
+        this->setHUDTemplate("PongHUD");
 
         this->starttimer_.setTimer(1.0, false, this, createExecutor(createFunctor(&Pong::startBall)));
@@ -181,3 +183,19 @@
             this->ball_->setSpeed(this->center_->getBallSpeed());
     }
+
+    PlayerInfo* Pong::getLeftPlayer() const
+    {
+        if (this->bat_ && this->bat_[0])
+            return this->bat_[0]->getPlayer();
+        else
+            return 0;
+    }
+
+    PlayerInfo* Pong::getRightPlayer() const
+    {
+        if (this->bat_ && this->bat_[1])
+            return this->bat_[1]->getPlayer();
+        else
+            return 0;
+    }
 }
Index: /code/trunk/src/orxonox/objects/gametypes/Pong.h
===================================================================
--- /code/trunk/src/orxonox/objects/gametypes/Pong.h	(revision 2889)
+++ /code/trunk/src/orxonox/objects/gametypes/Pong.h	(revision 2890)
@@ -53,4 +53,7 @@
                 { this->center_ = center; }
 
+            PlayerInfo* getLeftPlayer() const;
+            PlayerInfo* getRightPlayer() const;
+
         protected:
             void startBall();
Index: /code/trunk/src/orxonox/objects/infos/HumanPlayer.cc
===================================================================
--- /code/trunk/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2889)
+++ /code/trunk/src/orxonox/objects/infos/HumanPlayer.cc	(revision 2890)
@@ -173,7 +173,4 @@
         if (this->humanHud_)
             this->humanHud_->setOwner(this->getControllableEntity());
-
-        if (this->gametypeHud_)
-            this->gametypeHud_->setOwner(this->getControllableEntity());
     }
 
@@ -206,5 +203,5 @@
             this->gametypeHud_ = new OverlayGroup(this);
             this->gametypeHud_->addTemplate(this->gametypeHudTemplate_);
-            this->gametypeHud_->setOwner(this->getControllableEntity());
+            this->gametypeHud_->setOwner(this->getGametype());
         }
     }
Index: /code/trunk/src/orxonox/overlays/OrxonoxOverlay.h
===================================================================
--- /code/trunk/src/orxonox/overlays/OrxonoxOverlay.h	(revision 2889)
+++ /code/trunk/src/orxonox/overlays/OrxonoxOverlay.h	(revision 2890)
@@ -154,5 +154,5 @@
         virtual void changedVisibility();
 
-        inline void setOwner(ControllableEntity* owner)
+        inline void setOwner(BaseObject* owner)
         {
             if (this->owner_ != owner)
@@ -162,5 +162,5 @@
             }
         }
-        inline ControllableEntity* getOwner() const
+        inline BaseObject* getOwner() const
             { return this->owner_; }
         virtual void changedOwner() {}
@@ -206,5 +206,5 @@
             We could also use the ObjectList, but that doesn't guarantee XMLPort(.) was called and is slower. */
         static std::map<std::string, OrxonoxOverlay*> overlays_s;
-        ControllableEntity* owner_;
+        BaseObject* owner_;
         OverlayGroup* group_;
   };
Index: /code/trunk/src/orxonox/overlays/OverlayGroup.cc
===================================================================
--- /code/trunk/src/orxonox/overlays/OverlayGroup.cc	(revision 2889)
+++ /code/trunk/src/orxonox/overlays/OverlayGroup.cc	(revision 2890)
@@ -63,6 +63,6 @@
     OverlayGroup::~OverlayGroup()
     {
-        for (std::map<std::string, OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
-            delete it->second;
+        for (std::set<OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
+            delete (*it);
     }
 
@@ -83,17 +83,17 @@
     }
 
-    //! Scales every element in the map.
+    //! Scales every element in the set.
     void OverlayGroup::setScale(const Vector2& scale)
     {
-        for (std::map<std::string, OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
-            (*it).second->scale(scale / this->scale_);
+        for (std::set<OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
+            (*it)->scale(scale / this->scale_);
         this->scale_ = scale;
     }
 
-    //! Scrolls every element in the map.
+    //! Scrolls every element in the set.
     void OverlayGroup::setScroll(const Vector2& scroll)
     {
-        for (std::map<std::string, OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
-            (*it).second->scroll(scroll - this->scroll_);
+        for (std::set<OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
+            (*it)->scroll(scroll - this->scroll_);
         this->scroll_ = scroll;
     }
@@ -101,5 +101,5 @@
     /**
     @brief
-        Adds an element to the map (used when loading with XMLPort).
+        Adds an element to the set (used when loading with XMLPort).
     @remarks
         The names of the OrxonoxOverlays have to be unique!
@@ -107,15 +107,8 @@
     void OverlayGroup::addElement(OrxonoxOverlay* element)
     {
-        if (hudElements_.find(element->getName()) != hudElements_.end())
-        {
-            COUT(1) << "Ambiguous names encountered while load the HUD overlays" << std::endl;
-        }
-        else
-        {
-            hudElements_[element->getName()] = element;
-            element->setVisible(this->isVisible());
-            if (this->owner_)
-                element->setOwner(this->owner_);
-        }
+        hudElements_.insert(element);
+        element->setVisible(this->isVisible());
+        if (this->owner_)
+            element->setOwner(this->owner_);
     }
 
@@ -125,8 +118,8 @@
         if (index < this->hudElements_.size())
         {
-            std::map<std::string, OrxonoxOverlay*>::const_iterator it = hudElements_.begin();
+            std::set<OrxonoxOverlay*>::const_iterator it = hudElements_.begin();
             for (unsigned int i = 0; i != index; ++it, ++i)
                 ;
-            return (*it).second;
+            return (*it);
         }
         else
@@ -137,14 +130,14 @@
     void OverlayGroup::changedVisibility()
     {
-        for (std::map<std::string, OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
-            (*it).second->setVisible(this->isVisible());
+        for (std::set<OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
+            (*it)->setVisible(this->isVisible());
     }
 
-    void OverlayGroup::setOwner(ControllableEntity* owner)
+    void OverlayGroup::setOwner(BaseObject* owner)
     {
         this->owner_ = owner;
 
-        for (std::map<std::string, OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
-            (*it).second->setOwner(owner);
+        for (std::set<OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
+            (*it)->setOwner(owner);
     }
 
Index: /code/trunk/src/orxonox/overlays/OverlayGroup.h
===================================================================
--- /code/trunk/src/orxonox/overlays/OverlayGroup.h	(revision 2889)
+++ /code/trunk/src/orxonox/overlays/OverlayGroup.h	(revision 2890)
@@ -37,5 +37,5 @@
 #include "OrxonoxPrereqs.h"
 
-#include <map>
+#include <set>
 #include <OgrePrerequisites.h>
 #include "core/BaseObject.h"
@@ -64,11 +64,11 @@
         static void scrollGroup(const std::string& name, const Vector2& scroll);
 
-        inline const std::map<std::string, OrxonoxOverlay*>& getOverlays() const
+        inline const std::set<OrxonoxOverlay*>& getOverlays() const
             { return this->hudElements_; }
 
         void changedVisibility();
 
-        void setOwner(ControllableEntity* owner);
-        inline ControllableEntity* getOwner() const
+        void setOwner(BaseObject* owner);
+        inline BaseObject* getOwner() const
             { return this->owner_; }
 
@@ -89,8 +89,8 @@
 
     private:
-        std::map<std::string, OrxonoxOverlay*> hudElements_;    //!< Contains all the OrxonoxOverlays of the this group.
-        Vector2 scale_;                                         //!< Current scale (independent of the elements).
-        Vector2 scroll_;                                        //!< Current scrolling offset.
-        ControllableEntity* owner_;                             //!< The owner of this OverlayGroup
+        std::set<OrxonoxOverlay*> hudElements_;    //!< Contains all the OrxonoxOverlays of the this group.
+        Vector2 scale_;                            //!< Current scale (independent of the elements).
+        Vector2 scroll_;                           //!< Current scrolling offset.
+        BaseObject* owner_;                        //!< The owner of this OverlayGroup
     };
 }
Index: /code/trunk/src/orxonox/overlays/hud/CMakeLists.txt
===================================================================
--- /code/trunk/src/orxonox/overlays/hud/CMakeLists.txt	(revision 2889)
+++ /code/trunk/src/orxonox/overlays/hud/CMakeLists.txt	(revision 2890)
@@ -7,3 +7,4 @@
   ChatOverlay.cc
   GametypeStatus.cc
+  PongScore.cc
 )
Index: /code/trunk/src/orxonox/overlays/hud/PongScore.cc
===================================================================
--- /code/trunk/src/orxonox/overlays/hud/PongScore.cc	(revision 2890)
+++ /code/trunk/src/orxonox/overlays/hud/PongScore.cc	(revision 2890)
@@ -0,0 +1,139 @@
+/*
+ *   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 "PongScore.h"
+
+#include <OgreTextAreaOverlayElement.h>
+
+#include "core/CoreIncludes.h"
+#include "core/XMLPort.h"
+#include "util/Convert.h"
+#include "objects/gametypes/Pong.h"
+#include "objects/infos/PlayerInfo.h"
+
+namespace orxonox
+{
+    CreateFactory(PongScore);
+
+    PongScore::PongScore(BaseObject* creator) : OverlayText(creator)
+    {
+        RegisterObject(PongScore);
+
+        this->owner_ = 0;
+
+        this->bShowName_ = false;
+        this->bShowScore_ = false;
+        this->bShowLeftPlayer_ = false;
+        this->bShowRightPlayer_ = false;
+    }
+
+    PongScore::~PongScore()
+    {
+    }
+
+    void PongScore::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(PongScore, XMLPort, xmlelement, mode);
+
+        XMLPortParam(PongScore, "showname",        setShowName,        getShowName,        xmlelement, mode).defaultValues(false);
+        XMLPortParam(PongScore, "showscore",       setShowScore,       getShowScore,       xmlelement, mode).defaultValues(false);
+        XMLPortParam(PongScore, "showleftplayer",  setShowLeftPlayer,  getShowLeftPlayer,  xmlelement, mode).defaultValues(false);
+        XMLPortParam(PongScore, "showrightplayer", setShowRightPlayer, getShowRightPlayer, xmlelement, mode).defaultValues(false);
+    }
+
+    void PongScore::tick(float dt)
+    {
+        SUPER(PongScore, tick, dt);
+
+        if (this->owner_)
+        {
+            PlayerInfo* player1 = this->owner_->getLeftPlayer();
+            PlayerInfo* player2 = this->owner_->getRightPlayer();
+
+            std::string name1;
+            std::string name2;
+
+            std::string score1 = "0";
+            std::string score2 = "0";
+
+            if (player1)
+            {
+                name1 = player1->getName();
+                score1 = convertToString(this->owner_->getScore(player1));
+            }
+
+            if (player2)
+            {
+                name2 = player2->getName();
+                score2 = convertToString(this->owner_->getScore(player2));
+            }
+
+            std::string output1;
+            if (this->bShowLeftPlayer_)
+            {
+                if (this->bShowName_ && this->bShowScore_ && player1)
+                    output1 = name1 + " - " + score1;
+                else if (this->bShowScore_)
+                    output1 = score1;
+                else if (this->bShowName_)
+                    output1 = name1;
+            }
+
+            std::string output2;
+            if (this->bShowRightPlayer_)
+            {
+                if (this->bShowName_ && this->bShowScore_ && player2)
+                    output2 = score2 + " - " + name2;
+                else if (this->bShowScore_)
+                    output2 = score2;
+                else if (this->bShowName_)
+                    output2 = name2;
+            }
+
+            std::string output = "PONG";
+            if (this->bShowName_ || this->bShowScore_)
+            {
+                if (this->bShowLeftPlayer_ && this->bShowRightPlayer_)
+                    output = output1 + ":" + output2;
+                else if (this->bShowLeftPlayer_ || this->bShowRightPlayer_)
+                    output = output1 + output2;
+            }
+
+            this->setCaption(output);
+        }
+    }
+
+
+    void PongScore::changedOwner()
+    {
+        SUPER(PongScore, changedOwner);
+
+        this->owner_ = dynamic_cast<Pong*>(this->getOwner());
+    }
+}
Index: /code/trunk/src/orxonox/overlays/hud/PongScore.h
===================================================================
--- /code/trunk/src/orxonox/overlays/hud/PongScore.h	(revision 2890)
+++ /code/trunk/src/orxonox/overlays/hud/PongScore.h	(revision 2890)
@@ -0,0 +1,77 @@
+/*
+ *   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 _PongScore_H__
+#define _PongScore_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "overlays/OverlayText.h"
+#include "objects/Tickable.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport PongScore : public OverlayText, public Tickable
+    {
+        public:
+            PongScore(BaseObject* creator);
+            ~PongScore();
+
+            virtual void tick(float dt);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void changedOwner();
+
+            inline void setShowName(bool value)
+                { this->bShowName_ = value; }
+            inline bool getShowName() const
+                { return this->bShowName_; }
+
+            inline void setShowScore(bool value)
+                { this->bShowScore_ = value; }
+            inline bool getShowScore() const
+                { return this->bShowScore_; }
+
+            inline void setShowLeftPlayer(bool value)
+                { this->bShowLeftPlayer_ = value; }
+            inline bool getShowLeftPlayer() const
+                { return this->bShowLeftPlayer_; }
+
+            inline void setShowRightPlayer(bool value)
+                { this->bShowRightPlayer_ = value; }
+            inline bool getShowRightPlayer() const
+                { return this->bShowRightPlayer_; }
+
+        private:
+            Pong* owner_;
+            bool bShowName_;
+            bool bShowScore_;
+            bool bShowLeftPlayer_;
+            bool bShowRightPlayer_;
+    };
+}
+#endif /* _PongScore_H__ */
