Index: /code/branches/miniprojects/src/orxonox/objects/gametypes/CMakeLists.txt
===================================================================
--- /code/branches/miniprojects/src/orxonox/objects/gametypes/CMakeLists.txt	(revision 2819)
+++ /code/branches/miniprojects/src/orxonox/objects/gametypes/CMakeLists.txt	(revision 2820)
@@ -1,4 +1,5 @@
 ADD_SOURCE_FILES(ORXONOX_SRC_FILES
   Gametype.cc
+  Deathmatch.cc
   TeamGametype.cc
 )
Index: /code/branches/miniprojects/src/orxonox/objects/gametypes/Deathmatch.cc
===================================================================
--- /code/branches/miniprojects/src/orxonox/objects/gametypes/Deathmatch.cc	(revision 2820)
+++ /code/branches/miniprojects/src/orxonox/objects/gametypes/Deathmatch.cc	(revision 2820)
@@ -0,0 +1,119 @@
+/*
+ *   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 "Deathmatch.h"
+
+#include "core/CoreIncludes.h"
+#include "objects/infos/PlayerInfo.h"
+#include "objects/worldentities/pawns/Pawn.h"
+
+#include "network/Host.h"
+
+namespace orxonox
+{
+    CreateUnloadableFactory(Deathmatch);
+
+    Deathmatch::Deathmatch(BaseObject* creator) : Gametype(creator)
+    {
+        RegisterObject(Deathmatch);
+    }
+
+    void Deathmatch::start()
+    {
+        Gametype::start();
+
+        COUT(0) << "game started" << std::endl;
+    }
+
+    void Deathmatch::end()
+    {
+        Gametype::end();
+
+        COUT(0) << "game ended" << std::endl;
+    }
+
+    void Deathmatch::playerEntered(PlayerInfo* player)
+    {
+        Gametype::playerEntered(player);
+
+        std::string message = player->getName() + " entered the game";
+        COUT(0) << message << std::endl;
+        Host::Broadcast(message);
+    }
+
+    bool Deathmatch::playerLeft(PlayerInfo* player)
+    {
+        bool valid_player = Gametype::playerLeft(player);
+
+        if (valid_player)
+        {
+            std::string message = player->getName() + " left the game";
+            COUT(0) << message << std::endl;
+            Host::Broadcast(message);
+        }
+
+        return valid_player;
+    }
+
+    bool Deathmatch::playerChangedName(PlayerInfo* player)
+    {
+        bool valid_player = Gametype::playerChangedName(player);
+
+        if (valid_player)
+        {
+            std::string message = player->getOldName() + " changed name to " + player->getName();
+            COUT(0) << message << std::endl;
+            Host::Broadcast(message);
+        }
+
+        return valid_player;
+    }
+
+    void Deathmatch::pawnKilled(Pawn* victim, Pawn* killer)
+    {
+        if (victim && victim->getPlayer())
+        {
+            std::string message;
+            if (killer)
+            {
+                if (killer->getPlayer())
+                    message = victim->getPlayer()->getName() + " was killed by " + killer->getPlayer()->getName();
+                else
+                    message = victim->getPlayer()->getName() + " was killed";
+            }
+            else
+                message = victim->getPlayer()->getName() + " died";
+
+            COUT(0) << message << std::endl;
+            Host::Broadcast(message);
+        }
+
+        Gametype::pawnKilled(victim, killer);
+    }
+}
Index: /code/branches/miniprojects/src/orxonox/objects/gametypes/Deathmatch.h
===================================================================
--- /code/branches/miniprojects/src/orxonox/objects/gametypes/Deathmatch.h	(revision 2820)
+++ /code/branches/miniprojects/src/orxonox/objects/gametypes/Deathmatch.h	(revision 2820)
@@ -0,0 +1,54 @@
+/*
+ *   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 _Deathmatch_H__
+#define _Deathmatch_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "Gametype.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport Deathmatch : public Gametype
+    {
+        public:
+            Deathmatch(BaseObject* creator);
+            virtual ~Deathmatch() {}
+
+            virtual void start();
+            virtual void end();
+            virtual void playerEntered(PlayerInfo* player);
+            virtual bool playerLeft(PlayerInfo* player);
+            virtual bool playerChangedName(PlayerInfo* player);
+
+            virtual void pawnKilled(Pawn* victim, Pawn* killer = 0);
+    };
+}
+
+#endif /* _Deathmatch_H__ */
Index: /code/branches/miniprojects/src/orxonox/objects/gametypes/Gametype.cc
===================================================================
--- /code/branches/miniprojects/src/orxonox/objects/gametypes/Gametype.cc	(revision 2819)
+++ /code/branches/miniprojects/src/orxonox/objects/gametypes/Gametype.cc	(revision 2820)
@@ -44,6 +44,4 @@
 #include "objects/worldentities/Camera.h"
 
-#include "network/Host.h"
-
 namespace orxonox
 {
@@ -105,5 +103,4 @@
         this->addBots(this->numberOfBots_);
 
-        COUT(0) << "game started" << std::endl;
         this->gtinfo_.bStarted_ = true;
 
@@ -113,5 +110,4 @@
     void Gametype::end()
     {
-        COUT(0) << "game ended" << std::endl;
         this->gtinfo_.bEnded_ = true;
     }
@@ -120,11 +116,7 @@
     {
         this->players_[player].state_ = PlayerState::Joined;
-
-        std::string message = player->getName() + " entered the game";
-        COUT(0) << message << std::endl;
-        Host::Broadcast(message);
-    }
-
-    void Gametype::playerLeft(PlayerInfo* player)
+    }
+
+    bool Gametype::playerLeft(PlayerInfo* player)
     {
         std::map<PlayerInfo*, Player>::iterator it = this->players_.find(player);
@@ -132,9 +124,7 @@
         {
             this->players_.erase(it);
-
-            std::string message = player->getName() + " left the game";
-            COUT(0) << message << std::endl;
-            Host::Broadcast(message);
-        }
+            return true;
+        }
+        return false;
     }
 
@@ -147,5 +137,5 @@
     }
 
-    void Gametype::playerChangedName(PlayerInfo* player)
+    bool Gametype::playerChangedName(PlayerInfo* player)
     {
         if (this->players_.find(player) != this->players_.end())
@@ -153,9 +143,8 @@
             if (player->getName() != player->getOldName())
             {
-                std::string message = player->getOldName() + " changed name to " + player->getName();
-                COUT(0) << message << std::endl;
-                Host::Broadcast(message);
-            }
-        }
+                return true;
+            }
+        }
+        return false;
     }
 
@@ -201,21 +190,4 @@
     void Gametype::pawnKilled(Pawn* victim, Pawn* killer)
     {
-        if (victim && victim->getPlayer())
-        {
-            std::string message;
-            if (killer)
-            {
-                if (killer->getPlayer())
-                    message = victim->getPlayer()->getName() + " was killed by " + killer->getPlayer()->getName();
-                else
-                    message = victim->getPlayer()->getName() + " was killed";
-            }
-            else
-                message = victim->getPlayer()->getName() + " died";
-
-            COUT(0) << message << std::endl;
-            Host::Broadcast(message);
-        }
-
         if (victim && victim->getPlayer())
         {
Index: /code/branches/miniprojects/src/orxonox/objects/gametypes/Gametype.h
===================================================================
--- /code/branches/miniprojects/src/orxonox/objects/gametypes/Gametype.h	(revision 2819)
+++ /code/branches/miniprojects/src/orxonox/objects/gametypes/Gametype.h	(revision 2820)
@@ -84,8 +84,8 @@
             virtual void end();
             virtual void playerEntered(PlayerInfo* player);
-            virtual void playerLeft(PlayerInfo* player);
+            virtual bool playerLeft(PlayerInfo* player);
             virtual void playerSwitched(PlayerInfo* player, Gametype* newgametype);
             virtual void playerSwitchedBack(PlayerInfo* player, Gametype* oldgametype);
-            virtual void playerChangedName(PlayerInfo* player);
+            virtual bool playerChangedName(PlayerInfo* player);
 
             virtual void playerScored(Player& player);
Index: /code/branches/miniprojects/src/orxonox/objects/gametypes/TeamGametype.cc
===================================================================
--- /code/branches/miniprojects/src/orxonox/objects/gametypes/TeamGametype.cc	(revision 2819)
+++ /code/branches/miniprojects/src/orxonox/objects/gametypes/TeamGametype.cc	(revision 2820)
@@ -39,5 +39,5 @@
     CreateUnloadableFactory(TeamGametype);
 
-    TeamGametype::TeamGametype(BaseObject* creator) : Gametype(creator)
+    TeamGametype::TeamGametype(BaseObject* creator) : Deathmatch(creator)
     {
         RegisterObject(TeamGametype);
@@ -66,5 +66,5 @@
     void TeamGametype::playerEntered(PlayerInfo* player)
     {
-        Gametype::playerEntered(player);
+        Deathmatch::playerEntered(player);
 
         std::vector<unsigned int> playersperteam(this->teams_, 0);
@@ -88,9 +88,12 @@
     }
 
-    void TeamGametype::playerLeft(PlayerInfo* player)
+    bool TeamGametype::playerLeft(PlayerInfo* player)
     {
-        Gametype::playerLeft(player);
+        bool valid_player = Deathmatch::playerLeft(player);
 
-        this->players_.erase(player);
+        if (valid_player)
+            this->players_.erase(player);
+
+        return valid_player;
     }
 
Index: /code/branches/miniprojects/src/orxonox/objects/gametypes/TeamGametype.h
===================================================================
--- /code/branches/miniprojects/src/orxonox/objects/gametypes/TeamGametype.h	(revision 2819)
+++ /code/branches/miniprojects/src/orxonox/objects/gametypes/TeamGametype.h	(revision 2820)
@@ -34,9 +34,9 @@
 #include <vector>
 
-#include "Gametype.h"
+#include "Deathmatch.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport TeamGametype : public Gametype
+    class _OrxonoxExport TeamGametype : public Deathmatch
     {
         public:
@@ -47,5 +47,5 @@
 
             virtual void playerEntered(PlayerInfo* player);
-            virtual void playerLeft(PlayerInfo* player);
+            virtual bool playerLeft(PlayerInfo* player);
 
             virtual bool allowPawnHit(Pawn* victim, Pawn* originator = 0);
