Index: code/trunk/src/orxonox/infos/GametypeInfo.cc
===================================================================
--- code/trunk/src/orxonox/infos/GametypeInfo.cc	(revision 9945)
+++ code/trunk/src/orxonox/infos/GametypeInfo.cc	(revision 10624)
@@ -37,5 +37,5 @@
 #include "core/GameMode.h"
 #include "network/Host.h"
-#include "network/NetworkFunction.h"
+#include "network/NetworkFunctionIncludes.h"
 #include "util/Convert.h"
 
@@ -369,5 +369,5 @@
                 this->changedReadyToSpawn(ready);
             else
-                callMemberNetworkFunction(GametypeInfo, changedReadyToSpawn, this->getObjectID(), player->getClientID(), ready);
+                callMemberNetworkFunction(&GametypeInfo::changedReadyToSpawn, this->getObjectID(), player->getClientID(), ready);
         }
     }
@@ -388,5 +388,5 @@
                     this->changedSpawned(spawned);
             else
-                callMemberNetworkFunction(GametypeInfo, changedSpawned, this->getObjectID(), player->getClientID(), spawned);
+                callMemberNetworkFunction(&GametypeInfo::changedSpawned, this->getObjectID(), player->getClientID(), spawned);
         }
     }
@@ -399,5 +399,5 @@
         if (GameMode::isMaster())
         {
-            callMemberNetworkFunction(GametypeInfo, dispatchAnnounceMessage, this->getObjectID(), NETWORK_PEER_ID_BROADCAST, message);
+            callMemberNetworkFunction(&GametypeInfo::dispatchAnnounceMessage, this->getObjectID(), NETWORK_PEER_ID_BROADCAST, message);
             this->dispatchAnnounceMessage(message);
         }
@@ -411,5 +411,5 @@
                 this->dispatchAnnounceMessage(message);
             else
-                callMemberNetworkFunction(GametypeInfo, dispatchAnnounceMessage, this->getObjectID(), clientID, message);
+                callMemberNetworkFunction(&GametypeInfo::dispatchAnnounceMessage, this->getObjectID(), clientID, message);
         }
     }
@@ -422,5 +422,5 @@
                 this->dispatchKillMessage(message);
             else
-                callMemberNetworkFunction(GametypeInfo, dispatchKillMessage, this->getObjectID(), clientID, message);
+                callMemberNetworkFunction(&GametypeInfo::dispatchKillMessage, this->getObjectID(), clientID, message);
         }
     }
@@ -433,5 +433,5 @@
                 this->dispatchDeathMessage(message);
             else
-                callMemberNetworkFunction(GametypeInfo, dispatchDeathMessage, this->getObjectID(), clientID, message);
+                callMemberNetworkFunction(&GametypeInfo::dispatchDeathMessage, this->getObjectID(), clientID, message);
         }
     }
@@ -444,5 +444,5 @@
                 this->dispatchStaticMessage(message, colour);
             else
-                callMemberNetworkFunction(GametypeInfo, dispatchStaticMessage, this->getObjectID(), clientID, message, colour);
+                callMemberNetworkFunction(&GametypeInfo::dispatchStaticMessage, this->getObjectID(), clientID, message, colour);
         }
     }
@@ -455,5 +455,5 @@
                 this->dispatchFadingMessage(message);
             else
-                callMemberNetworkFunction(GametypeInfo, dispatchFadingMessage, this->getObjectID(), clientID, message);
+                callMemberNetworkFunction(&GametypeInfo::dispatchFadingMessage, this->getObjectID(), clientID, message);
         }
     }
Index: code/trunk/src/orxonox/infos/HumanPlayer.cc
===================================================================
--- code/trunk/src/orxonox/infos/HumanPlayer.cc	(revision 9945)
+++ code/trunk/src/orxonox/infos/HumanPlayer.cc	(revision 10624)
@@ -160,7 +160,7 @@
     }
 
-    void HumanPlayer::changedGametype()
-    {
-        PlayerInfo::changedGametype();
+    void HumanPlayer::switchGametype(Gametype* gametype)
+    {
+        PlayerInfo::switchGametype(gametype);
 
         if (this->isInitialized() && this->isLocalPlayer())
Index: code/trunk/src/orxonox/infos/HumanPlayer.h
===================================================================
--- code/trunk/src/orxonox/infos/HumanPlayer.h	(revision 9945)
+++ code/trunk/src/orxonox/infos/HumanPlayer.h	(revision 10624)
@@ -51,5 +51,5 @@
             void setClientID(unsigned int clientID);
 
-            virtual void changedGametype();
+            virtual void switchGametype(Gametype* gametype);
 
             inline void setHumanHUDTemplate(const std::string& name)
Index: code/trunk/src/orxonox/infos/PlayerInfo.cc
===================================================================
--- code/trunk/src/orxonox/infos/PlayerInfo.cc	(revision 9945)
+++ code/trunk/src/orxonox/infos/PlayerInfo.cc	(revision 10624)
@@ -40,5 +40,5 @@
 namespace orxonox
 {
-    RegisterAbstractClass(PlayerInfo).inheritsFrom(Class(Info));
+    RegisterAbstractClass(PlayerInfo).inheritsFrom<Info>();
 
     PlayerInfo::PlayerInfo(Context* context) : Info(context)
@@ -57,5 +57,5 @@
         this->gtinfo_ = 0;
         this->gtinfoID_ = OBJECTID_UNKNOWN;
-        this->updateGametypeInfo();
+        this->updateGametypeInfo(this->getGametype());
 
         this->registerVariables();
@@ -95,36 +95,41 @@
     }
 
-    void PlayerInfo::changedGametype()
-    {
-        this->updateGametypeInfo();
+    void PlayerInfo::switchGametype(Gametype* gametype)
+    {
+        Gametype* oldGametype = this->getGametype();
+        this->setGametype(StrongPtr<Gametype>(gametype));
+        Gametype* newGametype = this->getGametype();
+
+
+        this->updateGametypeInfo(newGametype);
 
         if (this->isInitialized())
         {
-            if (this->getOldGametype())
+            if (oldGametype)
             {
-                if (this->getGametype())
-                    this->getOldGametype()->playerSwitched(this, this->getGametype());
+                if (newGametype)
+                    oldGametype->playerSwitched(this, newGametype);
                 else
-                    this->getOldGametype()->playerLeft(this);
+                    oldGametype->playerLeft(this);
             }
 
-            if (this->getGametype())
+            if (newGametype)
             {
-                if (this->getOldGametype())
-                    this->getGametype()->playerSwitchedBack(this, this->getOldGametype());
+                if (oldGametype)
+                    newGametype->playerSwitchedBack(this, oldGametype);
                 else
-                    this->getGametype()->playerEntered(this);
+                    newGametype->playerEntered(this);
             }
         }
     }
 
-    void PlayerInfo::updateGametypeInfo()
+    void PlayerInfo::updateGametypeInfo(Gametype* gametype)
     {
         this->gtinfo_ = 0;
         this->gtinfoID_ = OBJECTID_UNKNOWN;
 
-        if (this->getGametype() && this->getGametype()->getGametypeInfo())
-        {
-            this->gtinfo_ = this->getGametype()->getGametypeInfo();
+        if (gametype && gametype->getGametypeInfo())
+        {
+            this->gtinfo_ = gametype->getGametypeInfo();
             this->gtinfoID_ = this->gtinfo_->getObjectID();
         }
@@ -186,5 +191,5 @@
 
         this->controllableEntity_->destroyHud(); // HACK-ish
-        this->previousControllableEntity_.push_back(WeakPtr<ControllableEntity>(this->controllableEntity_));
+        this->previousControllableEntity_.push_back(this->controllableEntity_);
         this->controllableEntity_ = entity;
         this->controllableEntityID_ = entity->getObjectID();
Index: code/trunk/src/orxonox/infos/PlayerInfo.h
===================================================================
--- code/trunk/src/orxonox/infos/PlayerInfo.h	(revision 9945)
+++ code/trunk/src/orxonox/infos/PlayerInfo.h	(revision 10624)
@@ -45,5 +45,5 @@
 
             virtual void changedName();
-            virtual void changedGametype();
+            virtual void switchGametype(Gametype* gametype);
 
             virtual void changedController() {}
@@ -94,5 +94,5 @@
             void networkcallback_changedcontrollableentityID();
             void networkcallback_changedgtinfoID();
-            void updateGametypeInfo();
+            void updateGametypeInfo(Gametype* gametype);
 
             bool bReadyToSpawn_;
