Index: code/branches/pickup/src/orxonox/worldentities/BigExplosion.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/BigExplosion.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/BigExplosion.cc	(revision 5935)
@@ -90,5 +90,5 @@
             this->setVelocity(velocity);
 
-            this->destroyTimer_.setTimer(rnd(2, 4), false, this, createExecutor(createFunctor(&BigExplosion::stop)));
+            this->destroyTimer_.setTimer(rnd(2, 4), false, createExecutor(createFunctor(&BigExplosion::stop, this)));
         }
         this->registerVariables();
@@ -226,10 +226,10 @@
             {
                 this->debris1_->detachOgreObject(this->debrisFire1_->getParticleSystem());
-                delete this->debrisFire1_;
+                this->debrisFire1_->destroy();
             }
             if (this->debrisSmoke1_)
             {
                 this->debris1_->detachOgreObject(this->debrisSmoke1_->getParticleSystem());
-                delete this->debrisSmoke1_;
+                this->debrisSmoke1_->destroy();
             }
 
@@ -237,10 +237,10 @@
             {
                 this->debris2_->detachOgreObject(this->debrisFire2_->getParticleSystem());
-                delete this->debrisFire2_;
+                this->debrisFire2_->destroy();
             }
             if (this->debrisSmoke2_)
             {
                 this->debris2_->detachOgreObject(this->debrisSmoke2_->getParticleSystem());
-                delete this->debrisSmoke2_;
+                this->debrisSmoke2_->destroy();
             }
 
@@ -248,10 +248,10 @@
             {
                 this->debris3_->detachOgreObject(this->debrisFire3_->getParticleSystem());
-                delete this->debrisFire3_;
+                this->debrisFire3_->destroy();
             }
             if (this->debrisSmoke3_)
             {
                 this->debris3_->detachOgreObject(this->debrisSmoke3_->getParticleSystem());
-                delete this->debrisSmoke3_;
+                this->debrisSmoke3_->destroy();
             }
 
@@ -259,10 +259,10 @@
             {
                 this->debris4_->detachOgreObject(this->debrisFire4_->getParticleSystem());
-                delete this->debrisFire4_;
+                this->debrisFire4_->destroy();
             }
             if (this->debrisSmoke4_)
             {
                 this->debris4_->detachOgreObject(this->debrisSmoke4_->getParticleSystem());
-                delete this->debrisSmoke4_;
+                this->debrisSmoke4_->destroy();
             }
         }
@@ -329,11 +329,6 @@
         {
             this->bStop_ = true;
-            this->destroyTimer_.setTimer(1.0f, false, this, createExecutor(createFunctor(&BigExplosion::destroy)));
-        }
-    }
-
-    void BigExplosion::destroy()
-    {
-        delete this;
+            this->destroyTimer_.setTimer(1.0f, false, createExecutor(createFunctor(&BigExplosion::destroy, this)));
+        }
     }
 
Index: code/branches/pickup/src/orxonox/worldentities/BigExplosion.h
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/BigExplosion.h	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/BigExplosion.h	(revision 5935)
@@ -57,5 +57,4 @@
             void checkStop();
             void stop();
-            void destroy();
             void init();
             void initZero();
@@ -98,6 +97,6 @@
             ParticleInterface*    explosionFire_;
 
-            LODParticle::Value      LOD_;
-            Timer<BigExplosion> destroyTimer_;
+            LODParticle::Value    LOD_;
+            Timer                 destroyTimer_;
     };
 }
Index: code/branches/pickup/src/orxonox/worldentities/CameraPosition.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/CameraPosition.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/CameraPosition.cc	(revision 5935)
@@ -46,5 +46,5 @@
         this->bRenderCamera_ = false;
 
-        this->setObjectMode(0x0);
+        this->setSyncMode(0x0);
     }
 
Index: code/branches/pickup/src/orxonox/worldentities/ControllableEntity.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/ControllableEntity.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/ControllableEntity.cc	(revision 5935)
@@ -96,14 +96,14 @@
 
             if (this->xmlcontroller_)
-                delete this->xmlcontroller_;
+                this->xmlcontroller_->destroy();
 
             if (this->hud_)
-                delete this->hud_;
+                this->hud_->destroy();
 
             if (this->camera_)
-                delete this->camera_;
-
-            for (std::list<CameraPosition*>::const_iterator it = this->cameraPositions_.begin(); it != this->cameraPositions_.end(); ++it)
-                delete (*it);
+                this->camera_->destroy();
+
+            for (std::list<SmartPtr<CameraPosition> >::const_iterator it = this->cameraPositions_.begin(); it != this->cameraPositions_.end(); ++it)
+                (*it)->destroy();
 
             if (this->getScene()->getSceneManager())
@@ -153,5 +153,5 @@
     {
         unsigned int i = 0;
-        for (std::list<CameraPosition*>::const_iterator it = this->cameraPositions_.begin(); it != this->cameraPositions_.end(); ++it)
+        for (std::list<SmartPtr<CameraPosition> >::const_iterator it = this->cameraPositions_.begin(); it != this->cameraPositions_.end(); ++it)
         {
             if (i == index)
@@ -172,5 +172,5 @@
             else if (this->cameraPositions_.size() > 0)
             {
-                for (std::list<CameraPosition*>::const_iterator it = this->cameraPositions_.begin(); it != this->cameraPositions_.end(); ++it)
+                for (std::list<SmartPtr<CameraPosition> >::const_iterator it = this->cameraPositions_.begin(); it != this->cameraPositions_.end(); ++it)
                 {
                     if ((*it) == this->camera_->getParent())
@@ -238,5 +238,5 @@
             {
                 this->client_overwrite_ = this->server_overwrite_;
-                this->setObjectMode(ObjectDirection::Bidirectional);
+                this->setSyncMode(ObjectDirection::Bidirectional);
             }
         }
@@ -254,10 +254,10 @@
         this->bHasLocalController_ = false;
         this->bHasHumanController_ = false;
-        this->setObjectMode(ObjectDirection::ToClient);
+        this->setSyncMode(ObjectDirection::ToClient);
 
         this->changedPlayer();
 
         if (this->bDestroyWhenPlayerLeft_)
-            delete this;
+            this->destroy();
     }
 
@@ -275,5 +275,5 @@
     void ControllableEntity::startLocalHumanControl()
     {
-        if (!this->camera_)
+        if (!this->camera_ && GameMode::showsGraphics())
         {
             this->camera_ = new Camera(this);
@@ -287,5 +287,5 @@
         }
 
-        if (!this->hud_)
+        if (!this->hud_ && GameMode::showsGraphics())
         {
             if (this->hudtemplate_ != "")
@@ -303,5 +303,5 @@
         {
             this->camera_->detachFromParent();
-            delete this->camera_;
+            this->camera_->destroy();
             this->camera_ = 0;
         }
@@ -309,5 +309,5 @@
         if (this->hud_)
         {
-            delete this->hud_;
+            this->hud_->destroy();
             this->hud_ = 0;
         }
@@ -333,5 +333,5 @@
         if (parent)
         {
-            for (std::list<CameraPosition*>::iterator it = this->cameraPositions_.begin(); it != this->cameraPositions_.end(); ++it)
+            for (std::list<SmartPtr<CameraPosition> >::iterator it = this->cameraPositions_.begin(); it != this->cameraPositions_.end(); ++it)
                 if ((*it)->getIsAbsolute())
                     parent->attach((*it));
Index: code/branches/pickup/src/orxonox/worldentities/ControllableEntity.h
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/ControllableEntity.h	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/ControllableEntity.h	(revision 5935)
@@ -104,5 +104,5 @@
             void addCameraPosition(CameraPosition* position);
             CameraPosition* getCameraPosition(unsigned int index) const;
-            inline const std::list<CameraPosition*>& getCameraPositions() const
+            inline const std::list<SmartPtr<CameraPosition> >& getCameraPositions() const
                 { return this->cameraPositions_; }
 
@@ -198,5 +198,5 @@
             float mouseLookSpeed_;
             Ogre::SceneNode* cameraPositionRootNode_;
-            std::list<CameraPosition*> cameraPositions_;
+            std::list<SmartPtr<CameraPosition> > cameraPositions_;
             std::string cameraPositionTemplate_;
             Controller* xmlcontroller_;
Index: code/branches/pickup/src/orxonox/worldentities/ExplosionChunk.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/ExplosionChunk.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/ExplosionChunk.cc	(revision 5935)
@@ -79,5 +79,5 @@
             this->setVelocity(velocity);
 
-            this->destroyTimer_.setTimer(rnd(1, 2), false, this, createExecutor(createFunctor(&ExplosionChunk::stop)));
+            this->destroyTimer_.setTimer(rnd(1, 2), false, createExecutor(createFunctor(&ExplosionChunk::stop, this)));
         }
 
@@ -92,10 +92,10 @@
             {
                 this->detachOgreObject(this->fire_->getParticleSystem());
-                delete this->fire_;
+                this->fire_->destroy();
             }
             if (this->smoke_)
             {
                 this->detachOgreObject(this->smoke_->getParticleSystem());
-                delete this->smoke_;
+                this->smoke_->destroy();
             }
         }
@@ -132,11 +132,6 @@
         {
             this->bStop_ = true;
-            this->destroyTimer_.setTimer(1.0f, false, this, createExecutor(createFunctor(&ExplosionChunk::destroy)));
+            this->destroyTimer_.setTimer(1.0f, false, createExecutor(createFunctor(&ExplosionChunk::destroy, this)));
         }
-    }
-
-    void ExplosionChunk::destroy()
-    {
-        delete this;
     }
 
Index: code/branches/pickup/src/orxonox/worldentities/ExplosionChunk.h
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/ExplosionChunk.h	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/ExplosionChunk.h	(revision 5935)
@@ -55,11 +55,10 @@
             void checkStop();
             void stop();
-            void destroy();
 
             bool                  bStop_;
             ParticleInterface*    fire_;
             ParticleInterface*    smoke_;
-            LODParticle::Value      LOD_;
-            Timer<ExplosionChunk> destroyTimer_;
+            LODParticle::Value    LOD_;
+            Timer                 destroyTimer_;
     };
 }
Index: code/branches/pickup/src/orxonox/worldentities/MovableEntity.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/MovableEntity.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/MovableEntity.cc	(revision 5935)
@@ -61,5 +61,5 @@
         if (this->isInitialized())
             if (this->continuousResynchroTimer_)
-                delete this->continuousResynchroTimer_;
+                this->continuousResynchroTimer_->destroy();
     }
 
@@ -98,5 +98,5 @@
     void MovableEntity::clientConnected(unsigned int clientID)
     {
-        this->resynchronizeTimer_.setTimer(rnd() * MAX_RESYNCHRONIZE_TIME, false, this, createExecutor(createFunctor(&MovableEntity::resynchronize)));
+        this->resynchronizeTimer_.setTimer(rnd() * MAX_RESYNCHRONIZE_TIME, false, createExecutor(createFunctor(&MovableEntity::resynchronize, this)));
     }
 
@@ -110,6 +110,6 @@
         {
             // Resynchronise every few seconds because we only work with velocities (no positions)
-            continuousResynchroTimer_ = new Timer<MovableEntity>(CONTINUOUS_SYNCHRONIZATION_TIME + rnd(-1, 1),
-                true, this, createExecutor(createFunctor(&MovableEntity::resynchronize)), false);
+            continuousResynchroTimer_ = new Timer(CONTINUOUS_SYNCHRONIZATION_TIME + rnd(-1, 1),
+                true, createExecutor(createFunctor(&MovableEntity::resynchronize, this)), false);
         }
 
Index: code/branches/pickup/src/orxonox/worldentities/MovableEntity.h
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/MovableEntity.h	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/MovableEntity.h	(revision 5935)
@@ -96,6 +96,6 @@
             Quaternion overwrite_orientation_;
 
-            Timer<MovableEntity> resynchronizeTimer_;
-            Timer<MovableEntity>* continuousResynchroTimer_;
+            Timer resynchronizeTimer_;
+            Timer* continuousResynchroTimer_;
 
             Pawn* owner_;
Index: code/branches/pickup/src/orxonox/worldentities/SpawnPoint.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/SpawnPoint.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/SpawnPoint.cc	(revision 5935)
@@ -50,5 +50,5 @@
             COUT(1) << "Error: SpawnPoint has no Gametype" << std::endl;
 
-        this->setObjectMode(0x0);
+        this->setSyncMode(0x0);
     }
 
Index: code/branches/pickup/src/orxonox/worldentities/SpawnPoint.h
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/SpawnPoint.h	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/SpawnPoint.h	(revision 5935)
@@ -33,5 +33,5 @@
 
 #include <string>
-#include "core/Identifier.h"
+#include "core/SubclassIdentifier.h"
 #include "worldentities/StaticEntity.h"
 
Index: code/branches/pickup/src/orxonox/worldentities/WorldEntity.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/WorldEntity.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/WorldEntity.cc	(revision 5935)
@@ -119,5 +119,5 @@
             {
                 if ((*it)->getDeleteWithParent())
-                    delete (*(it++));
+                    (*(it++))->destroy();
                 else
                 {
@@ -132,5 +132,5 @@
                 delete this->physicalBody_;
             }
-            delete this->collisionShape_;
+            this->collisionShape_->destroy();
 
             this->node_->detachAllObjects();
@@ -175,5 +175,5 @@
     void WorldEntity::registerVariables()
     {
-        registerVariable(this->mainStateName_,  VariableDirection::ToClient, new NetworkCallback<WorldEntity>(this, &WorldEntity::changedMainState));
+        registerVariable(this->mainStateName_,  VariableDirection::ToClient, new NetworkCallback<WorldEntity>(this, &WorldEntity::changedMainStateName));
 
         registerVariable(this->bActive_,        VariableDirection::ToClient, new NetworkCallback<WorldEntity>(this, &WorldEntity::changedActivity));
Index: code/branches/pickup/src/orxonox/worldentities/pawns/Destroyer.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/pawns/Destroyer.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/pawns/Destroyer.cc	(revision 5935)
@@ -40,5 +40,5 @@
         RegisterObject(Destroyer);
 
-        UnderAttack* gametype = orxonox_cast<UnderAttack*>(this->getGametype());
+        UnderAttack* gametype = orxonox_cast<UnderAttack*>(this->getGametype().get());
         if (gametype)
         {
Index: code/branches/pickup/src/orxonox/worldentities/pawns/Pawn.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/pawns/Pawn.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/pawns/Pawn.cc	(revision 5935)
@@ -36,5 +36,4 @@
 #include "network/NetworkFunction.h"
 
-#include "interfaces/PawnListener.h"
 #include "PawnManager.h"
 #include "infos/PlayerInfo.h"
@@ -93,9 +92,6 @@
         if (this->isInitialized())
         {
-            for (ObjectList<PawnListener>::iterator it = ObjectList<PawnListener>::begin(); it != ObjectList<PawnListener>::end(); ++it)
-                it->destroyedPawn(this);
-
             if (this->weaponSystem_)
-                delete this->weaponSystem_;
+                this->weaponSystem_->destroy();
         }
     }
Index: code/branches/pickup/src/orxonox/worldentities/pawns/SpaceShip.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 5935)
@@ -75,5 +75,5 @@
     {
         if (this->isInitialized() && this->engine_)
-            delete this->engine_;
+            this->engine_->destroy();
     }
 
@@ -207,5 +207,5 @@
                     else
                     {
-                        delete object;
+                        object->destroy();
                     }
                 }
Index: code/branches/pickup/src/orxonox/worldentities/pawns/Spectator.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/pawns/Spectator.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/pawns/Spectator.cc	(revision 5935)
@@ -145,5 +145,5 @@
         ControllableEntity::setPlayer(player);
 
-//        this->setObjectMode(ObjectDirection::ToClient);
+//        this->setSyncMode(ObjectDirection::ToClient);
     }
 
Index: code/branches/pickup/src/orxonox/worldentities/pawns/TeamBaseMatchBase.cc
===================================================================
--- code/branches/pickup/src/orxonox/worldentities/pawns/TeamBaseMatchBase.cc	(revision 5815)
+++ code/branches/pickup/src/orxonox/worldentities/pawns/TeamBaseMatchBase.cc	(revision 5935)
@@ -31,5 +31,5 @@
 
 #include "core/CoreIncludes.h"
-#include "interfaces/PawnListener.h"
+#include "controllers/ArtificialController.h"
 #include "interfaces/TeamColourable.h"
 #include "gametypes/TeamBaseMatch.h"
@@ -45,5 +45,5 @@
         this->state_ = BaseState::Uncontrolled;
 
-        TeamBaseMatch* gametype = orxonox_cast<TeamBaseMatch*>(this->getGametype());
+        TeamBaseMatch* gametype = orxonox_cast<TeamBaseMatch*>(this->getGametype().get());
         if (gametype)
         {
@@ -58,5 +58,5 @@
         this->fireEvent();
 
-        TeamDeathmatch* gametype = orxonox_cast<TeamDeathmatch*>(this->getGametype());
+        TeamDeathmatch* gametype = orxonox_cast<TeamDeathmatch*>(this->getGametype().get());
         if (!gametype)
             return;
@@ -92,6 +92,6 @@
 
         // Call this so bots stop shooting at the base after they converted it
-        for (ObjectList<PawnListener>::iterator it = ObjectList<PawnListener>::begin(); it != ObjectList<PawnListener>::end(); ++it)
-            it->destroyedPawn(this);
+        for (ObjectList<ArtificialController>::iterator it = ObjectList<ArtificialController>::begin(); it != ObjectList<ArtificialController>::end(); ++it)
+            it->abandonTarget(this);
     }
 }
