Index: code/trunk/src/orxonox/objects/worldentities/CMakeLists.txt
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/CMakeLists.txt	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/CMakeLists.txt	(revision 3033)
@@ -23,4 +23,5 @@
   PongBall.cc
   PongBat.cc
+  ForceField.cc
 )
 
Index: code/trunk/src/orxonox/objects/worldentities/ForceField.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/ForceField.cc	(revision 3033)
+++ code/trunk/src/orxonox/objects/worldentities/ForceField.cc	(revision 3033)
@@ -0,0 +1,91 @@
+/*
+ *   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:
+ *      Aurelian Jaggi
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include "ForceField.h"
+#include "core/XMLPort.h"
+
+#include "core/CoreIncludes.h"
+#include "objects/worldentities/MobileEntity.h"
+
+namespace orxonox
+{
+  CreateFactory(ForceField);
+
+    ForceField::ForceField(BaseObject* creator) : StaticEntity(creator)
+    {
+      RegisterObject(ForceField);
+
+      //Standard Values
+      this->setDirection(Vector3::ZERO);
+      velocity_ = 100;
+      diameter_ = 500;
+      length_ = 2000;
+    }
+
+    ForceField::~ForceField() {}
+
+    void ForceField::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+      SUPER(ForceField, XMLPort, xmlelement, mode);
+
+      //For correct xml import use: position, direction, velocity, scale
+
+      XMLPortParam(ForceField, "velocity", setVelocity, getVelocity, xmlelement, mode).defaultValues(100);
+      XMLPortParam(ForceField, "diameter", setDiameter, getDiameter, xmlelement, mode).defaultValues(500);
+      XMLPortParam(ForceField, "length"  , setLength  , getLength  , xmlelement, mode).defaultValues(2000);
+    }
+
+    void ForceField::tick(float dt)
+    {
+
+      for (ObjectList<MobileEntity>::iterator it = ObjectList<MobileEntity>::begin(); it != ObjectList<MobileEntity>::end(); ++it)
+      {
+
+        //calculate from
+        Vector3 directionVec = this->getOrientation() * WorldEntity::FRONT;
+        directionVec.normalise();
+
+        Vector3 distanceVec = it->getWorldPosition() - (this->getWorldPosition() + (this->length_ / 2 * directionVec));
+
+        //distance from centervector of the field (
+        float distFromCenterVec = ((it->getWorldPosition() - this->getWorldPosition()).crossProduct(directionVec)).length();
+
+        if (distanceVec.length() < this->length_ / 2 && distFromCenterVec < diameter_ / 2)
+        {
+          //normalize distance from center
+          it->applyCentralForce(((diameter_ / 2 - distFromCenterVec) / (diameter_ / 2)) * directionVec * velocity_);
+        }
+
+      }
+  }
+}
+
+
+
+
+
Index: code/trunk/src/orxonox/objects/worldentities/ForceField.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/ForceField.h	(revision 3033)
+++ code/trunk/src/orxonox/objects/worldentities/ForceField.h	(revision 3033)
@@ -0,0 +1,72 @@
+/*
+ *   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:
+ *      Aurelian Jaggi
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+
+#ifndef _ForceField_H__
+#define _ForceField_H__
+
+#include "StaticEntity.h"
+#include "objects/Tickable.h"
+
+namespace orxonox
+{
+  class _OrxonoxExport ForceField : public StaticEntity, public Tickable
+  {
+    public:
+      ForceField(BaseObject* creator);
+      virtual ~ForceField();
+      virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a CheckPoint object through XML.
+      virtual void tick(float dt);
+
+      inline void setVelocity(float vel)
+        { this->velocity_ = vel; }
+    
+      inline float getVelocity()
+        { return velocity_; }
+    
+      inline void setDiameter(float diam)
+        { this->diameter_ = diam; }
+
+      inline float getDiameter()
+        { return diameter_; }
+ 
+      inline void setLength(float l)
+        { this->length_ = l; }
+
+      inline float getLength()
+        { return length_; }
+
+    private:
+      float velocity_;
+      float diameter_;
+      float length_;
+  };
+}
+
+#endif
+
Index: code/trunk/src/orxonox/objects/worldentities/MobileEntity.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/MobileEntity.cc	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/MobileEntity.cc	(revision 3033)
@@ -166,4 +166,10 @@
     }
 
+    void MobileEntity::applyCentralForce(const Vector3& force)
+    {
+        if (this->isDynamic())
+            this->physicalBody_->applyCentralForce(btVector3(force.x * this->getMass(), force.y * this->getMass(), force.z * this->getMass()));
+    }
+
     bool MobileEntity::isCollisionTypeLegal(WorldEntity::CollisionType type) const
     {
Index: code/trunk/src/orxonox/objects/worldentities/MobileEntity.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/MobileEntity.h	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/MobileEntity.h	(revision 3033)
@@ -75,4 +75,8 @@
                 { return this->angularAcceleration_; }
 
+            void applyCentralForce(const Vector3& force);
+            inline void applyCentralForce(float x, float y, float z)
+                { this->applyCentralForce(Vector3(x, y, z)); }
+
             inline void setRotationRate(Degree rate)
                 { this->setAngularVelocity(this->getAngularVelocity().normalisedCopy() * rate.valueRadians()); }
Index: code/trunk/src/orxonox/objects/worldentities/MovableEntity.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/MovableEntity.cc	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/MovableEntity.cc	(revision 3033)
@@ -35,4 +35,5 @@
 #include "core/Executor.h"
 #include "core/GameMode.h"
+#include "objects/worldentities/pawns/Pawn.h"
 
 namespace orxonox
@@ -67,5 +68,23 @@
     {
         SUPER(MovableEntity, XMLPort, xmlelement, mode);
+
+        XMLPortParam(MovableEntity, "enablecollisiondamage", setEnableCollisionDamage, getEnableCollisionDamage, xmlelement, mode).defaultValues(false);
+        XMLPortParam(MovableEntity, "collisiondamage", setCollisionDamage, getCollisionDamage, xmlelement, mode).defaultValues(1);
     }
+
+    bool MovableEntity::collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint)
+    {
+        if (GameMode::isMaster() && enableCollisionDamage_)
+        {
+            Pawn* victim = dynamic_cast<Pawn*>(otherObject);
+            if (victim)
+            {
+                victim->damage(this->collisionDamage_ * victim->getVelocity().dotProduct(this->getVelocity()));
+            }
+        }
+
+        return false;
+    }
+
 
     void MovableEntity::registerVariables()
Index: code/trunk/src/orxonox/objects/worldentities/MovableEntity.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/MovableEntity.h	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/MovableEntity.h	(revision 3033)
@@ -46,4 +46,5 @@
 
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual bool collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint);
             void registerVariables();
 
@@ -55,4 +56,24 @@
             inline void setOrientation(const Quaternion& orientation)
                 { MobileEntity::setOrientation(orientation); this->overwrite_orientation_ = this->getOrientation(); }
+
+            inline void setOwner(Pawn* owner)
+                { this->owner_ = owner; }
+            inline Pawn* getOwner() const
+                { return this->owner_; }
+
+            inline void setCollisionDamage(float c)
+                { this->collisionDamage_ = c; }
+
+            inline float getCollisionDamage()
+                { return this->collisionDamage_; }
+
+            inline void setEnableCollisionDamage(bool c)
+            { 
+                this->enableCollisionDamage_ = c; 
+                this->enableCollisionCallback();
+            } 
+
+            inline bool getEnableCollisionDamage()
+                { return this->enableCollisionDamage_; }
 
         private:
@@ -76,4 +97,8 @@
             Timer<MovableEntity> resynchronizeTimer_;
             Timer<MovableEntity>* continuousResynchroTimer_;
+
+            Pawn* owner_;
+            float collisionDamage_;
+            bool enableCollisionDamage_;
     };
 }
Index: code/trunk/src/orxonox/objects/worldentities/SpawnPoint.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/SpawnPoint.cc	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/SpawnPoint.cc	(revision 3033)
@@ -95,6 +95,6 @@
     void SpawnPoint::spawn(ControllableEntity* entity)
     {
-        entity->setPosition(this->getPosition());
-        entity->setOrientation(this->getOrientation());
+        entity->setPosition(this->getWorldPosition());
+        entity->setOrientation(this->getWorldOrientation());
     }
 }
Index: code/trunk/src/orxonox/objects/worldentities/pawns/CMakeLists.txt
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/pawns/CMakeLists.txt	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/pawns/CMakeLists.txt	(revision 3033)
@@ -3,3 +3,5 @@
   Pawn.cc
   SpaceShip.cc
+  TeamBaseMatchBase.cc
+  Destroyer.cc
 )
Index: code/trunk/src/orxonox/objects/worldentities/pawns/Destroyer.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/pawns/Destroyer.cc	(revision 3033)
+++ code/trunk/src/orxonox/objects/worldentities/pawns/Destroyer.cc	(revision 3033)
@@ -0,0 +1,49 @@
+/*
+ *   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:
+ *      Matthias Mock
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include "OrxonoxStableHeaders.h"
+#include "Destroyer.h"
+
+#include "core/CoreIncludes.h"
+#include "objects/gametypes/UnderAttack.h"
+
+namespace orxonox
+{
+    CreateFactory(Destroyer);
+
+    Destroyer::Destroyer(BaseObject* creator) : SpaceShip(creator)
+    {
+        RegisterObject(Destroyer);
+
+        UnderAttack* gametype = dynamic_cast<UnderAttack*>(this->getGametype());
+        if (gametype)
+        {
+            gametype->addDestroyer(this);
+        }
+    }
+}
Index: code/trunk/src/orxonox/objects/worldentities/pawns/Destroyer.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/pawns/Destroyer.h	(revision 3033)
+++ code/trunk/src/orxonox/objects/worldentities/pawns/Destroyer.h	(revision 3033)
@@ -0,0 +1,47 @@
+/*
+ *   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:
+ *      Matthias Mock
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _Destroyer_H__
+#define _Destroyer_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "SpaceShip.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport Destroyer : public SpaceShip
+    {
+        public:
+            Destroyer(BaseObject* creator);
+            virtual ~Destroyer() {};
+
+    };
+}
+
+#endif /* _Destroyer_H__ */
Index: code/trunk/src/orxonox/objects/worldentities/pawns/Pawn.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/pawns/Pawn.cc	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/pawns/Pawn.cc	(revision 3033)
@@ -198,4 +198,5 @@
     void Pawn::death()
     {
+        this->setHealth(1);
         if (this->getGametype() && this->getGametype()->allowPawnDeath(this, this->lastHitOriginator_))
         {
@@ -214,6 +215,4 @@
                 this->deatheffect();
         }
-        else
-            this->setHealth(1);
     }
 
Index: code/trunk/src/orxonox/objects/worldentities/pawns/TeamBaseMatchBase.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/pawns/TeamBaseMatchBase.cc	(revision 3033)
+++ code/trunk/src/orxonox/objects/worldentities/pawns/TeamBaseMatchBase.cc	(revision 3033)
@@ -0,0 +1,88 @@
+/*
+ *   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:
+ *      Val Mikos
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+
+#include "TeamBaseMatchBase.h"
+#include "core/CoreIncludes.h"
+#include "objects/gametypes/TeamBaseMatch.h"
+#include "objects/Teamcolourable.h"
+
+namespace orxonox
+{
+    CreateFactory(TeamBaseMatchBase);
+
+    TeamBaseMatchBase::TeamBaseMatchBase(BaseObject* creator) : Pawn(creator)
+    {
+        RegisterObject(TeamBaseMatchBase);
+
+        this->state_ = BaseState::uncontrolled;
+
+        TeamBaseMatch* gametype = dynamic_cast<TeamBaseMatch*>(this->getGametype());
+        if (gametype)
+        {
+            gametype->addBase(this);
+        }
+    }
+
+    void TeamBaseMatchBase::changeTeamColour()
+    {
+        this->fireEvent();
+
+        TeamDeathmatch* gametype = dynamic_cast<TeamDeathmatch*>(this->getGametype());
+        if (!gametype)
+            return;
+
+        ColourValue colour;
+
+        switch (this->state_)
+        {
+            case BaseState::controlTeam1:
+                colour = gametype->getTeamColour(0);
+                break;
+            case BaseState::controlTeam2:
+                colour = gametype->getTeamColour(1);
+                break;
+            case BaseState::uncontrolled:
+            default:
+                colour = ColourValue(0.5, 0.5, 0.7, 1.0);
+                break;
+        }
+
+
+        std::set<WorldEntity*> attachments = this->getAttachedObjects();
+        for (std::set<WorldEntity*>::iterator it = attachments.begin(); it != attachments.end(); ++it)
+        {
+            if ((*it)->isA(Class(Teamcolourable)))
+            {
+                Teamcolourable* tc = dynamic_cast<Teamcolourable*>(*it);
+                tc->setTeamColour(colour);
+            }
+        }
+    }
+}
+
Index: code/trunk/src/orxonox/objects/worldentities/pawns/TeamBaseMatchBase.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/pawns/TeamBaseMatchBase.h	(revision 3033)
+++ code/trunk/src/orxonox/objects/worldentities/pawns/TeamBaseMatchBase.h	(revision 3033)
@@ -0,0 +1,81 @@
+/*
+ *   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:
+ *      Val Mikos
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _TeamBaseMatchBase_H__
+#define _TeamBaseMatchBase_H__
+
+#include "Pawn.h"
+
+namespace orxonox
+{
+
+
+    namespace BaseState
+    {
+        enum Enum
+        {
+            uncontrolled,
+            controlTeam1,
+            controlTeam2,
+        };
+    }
+
+
+    class _OrxonoxExport TeamBaseMatchBase : public Pawn
+    {
+        public:
+            TeamBaseMatchBase(BaseObject* creator);
+
+            // if class closes, close everything
+            virtual ~TeamBaseMatchBase() {}
+
+
+
+            // Set the state of a base to whatever the argument of the function is
+            void setState(BaseState::Enum state)
+            {
+                this->state_ = state;
+                this->changeTeamColour();
+            }
+
+
+            // Get the state of a base as a return value
+            BaseState::Enum getState() const
+            {
+                return this->state_;
+            }
+
+
+        protected:
+            void changeTeamColour();
+
+            BaseState::Enum state_;
+    };
+}
+
+#endif /* _TeamBaseMatchBase_H__ */
Index: code/trunk/src/orxonox/objects/worldentities/triggers/CMakeLists.txt
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/CMakeLists.txt	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/CMakeLists.txt	(revision 3033)
@@ -4,3 +4,4 @@
   EventTrigger.cc
   PlayerTrigger.cc
+  CheckPoint.cc
 )
Index: code/trunk/src/orxonox/objects/worldentities/triggers/CheckPoint.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/CheckPoint.cc	(revision 3033)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/CheckPoint.cc	(revision 3033)
@@ -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:
+ *      Aurelian Jaggi
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include "OrxonoxStableHeaders.h"
+#include "CheckPoint.h"
+
+#include "core/CoreIncludes.h"
+#include "core/XMLPort.h"
+
+#include "objects/gametypes/Asteroids.h"
+#include "orxonox/objects/worldentities/pawns/Pawn.h"
+
+namespace orxonox
+{
+  CreateFactory(CheckPoint);
+
+  CheckPoint::CheckPoint(BaseObject* creator) : DistanceTrigger(creator)
+  {
+    RegisterObject(CheckPoint);
+
+    this->setStayActive(true);
+    this->setDistance(50);
+    this->bIsFirst_ = false;
+    this->bIsDestination_ = false;
+    //this->setVisible(true);
+
+    this->notifyMaskUpdate();
+  }
+
+  CheckPoint::~CheckPoint()
+  {
+  }
+
+  void CheckPoint::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+  {
+    SUPER(CheckPoint, XMLPort, xmlelement, mode);
+
+    XMLPortParam(CheckPoint, "isfirst", setFirst, getFirst, xmlelement, mode).defaultValues(false);
+    XMLPortParam(CheckPoint, "isdestination", setDestination, getDestination, xmlelement, mode).defaultValues(false);
+    XMLPortParam(CheckPoint, "addtime", setAddTime, getAddTime, xmlelement, mode).defaultValues(30);
+  }
+
+  void CheckPoint::triggered(bool bIsTriggered)
+  {
+    DistanceTrigger::triggered(bIsTriggered);
+
+    Asteroids* gametype = dynamic_cast<Asteroids*>(this->getGametype());
+    if (gametype)
+    {
+        gametype->addTime(addTime_);
+
+        if (bIsTriggered && bIsFirst_)
+        {
+            gametype->setTimeLimit(addTime_);
+            gametype->firstCheckpointReached(true);
+        }
+
+        if (bIsTriggered && bIsDestination_)
+        {
+            gametype->end();
+        }
+     }
+  }
+
+  void CheckPoint::notifyMaskUpdate()
+  {
+      this->targetMask_.exclude(Class(BaseObject));
+      this->targetMask_.include(Class(Pawn));
+  }
+}
Index: code/trunk/src/orxonox/objects/worldentities/triggers/CheckPoint.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/CheckPoint.h	(revision 3033)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/CheckPoint.h	(revision 3033)
@@ -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:
+ *      Aurelian Jaggi
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+/**
+    @file
+    @brief
+*/
+
+#ifndef _CheckPoint_H__
+#define _CheckPoint_H__
+
+#include "DistanceTrigger.h"
+
+namespace orxonox
+{
+  class _OrxonoxExport CheckPoint : public DistanceTrigger
+  {
+    public:
+      CheckPoint(BaseObject* creator);
+      virtual ~CheckPoint();
+
+      virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a CheckPoint object through XML.
+
+    private:
+      virtual void triggered(bool bIsTriggered);
+      virtual void notifyMaskUpdate();
+
+      inline void setDestination(bool isDestination)
+        { bIsDestination_ = isDestination; }
+
+      inline bool getDestination()
+        { return bIsDestination_; }
+
+      inline void setFirst(bool isFirst)
+        { this->bIsFirst_ = isFirst; }
+
+      inline bool getFirst()
+        { return this->bIsFirst_; }
+
+      inline void setAddTime(float time)
+        { this->addTime_ = time; }
+
+      inline bool getAddTime()
+        { return this->addTime_; }
+
+      bool bIsFirst_;
+      bool bIsDestination_;
+      float addTime_;
+  };
+}
+
+#endif /* _CheckPoint_H__ */
Index: code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.cc	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.cc	(revision 3033)
@@ -35,5 +35,5 @@
 #include "core/XMLPort.h"
 
-#include "orxonox/objects/worldentities/ControllableEntity.h"
+#include "orxonox/objects/worldentities/pawns/Pawn.h"
 
 namespace orxonox
@@ -109,4 +109,6 @@
     WEMask.include(Class(WorldEntity));
     this->targetMask_ *= WEMask;
+
+    this->notifyMaskUpdate();
   }
 
@@ -133,5 +135,5 @@
         if(this->isForPlayer())
 	{
-          ControllableEntity* player = dynamic_cast<ControllableEntity*>(entity);
+          Pawn* player = dynamic_cast<Pawn*>(entity);
 	  this->setTriggeringPlayer(player);
 	}
Index: code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.h	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.h	(revision 3033)
@@ -63,7 +63,9 @@
     protected:
       virtual bool isTriggered(TriggerMode mode);
+      virtual void notifyMaskUpdate() {}
+
+      ClassTreeMask targetMask_;
 
     private:
-      ClassTreeMask targetMask_;
       std::set<Ogre::Node*> targetSet_;
       float distance_;
Index: code/trunk/src/orxonox/objects/worldentities/triggers/PlayerTrigger.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/PlayerTrigger.h	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/PlayerTrigger.h	(revision 3033)
@@ -60,5 +60,5 @@
         @return Returns a pointer to the ControllableEntity that triggered the PlayerTrigger.
         */
-        inline ControllableEntity* getTriggeringPlayer(void) const
+        inline Pawn* getTriggeringPlayer(void) const
             { return this->player_; }
         
@@ -77,5 +77,5 @@
         @param player A pointer to the ControllableEntity that triggered the PlayerTrigger.
         */
-        inline void setTriggeringPlayer(ControllableEntity* player)
+        inline void setTriggeringPlayer(Pawn* player)
            { this->player_ = player; }
 
@@ -88,5 +88,5 @@
         
     private:
-        ControllableEntity* player_; //!< The player that triggered the PlayerTrigger.
+        Pawn* player_; //!< The player that triggered the PlayerTrigger.
         bool isForPlayer_; //!< Is true when the PlayerTrigger schould be set to normally be triggered by ControllableEntities.
     
Index: code/trunk/src/orxonox/objects/worldentities/triggers/Trigger.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/Trigger.cc	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/Trigger.cc	(revision 3033)
@@ -102,5 +102,5 @@
     {
       this->bFirstTick_ = false;
-      this->fireEvent(false);
+      this->triggered(false);
     }
 
@@ -144,5 +144,5 @@
       this->bTriggered_ = (newState & 0x1);
       this->bActive_ = newState & 2;
-      this->fireEvent(this->bActive_);
+      this->triggered(this->bActive_);
       this->stateChanges_.pop();
       if (this->stateChanges_.size() != 0)
@@ -160,4 +160,9 @@
     else
       this->setBillboardColour(ColourValue(1.0, 0.0, 0.0));
+  }
+
+  void Trigger::triggered(bool bIsTriggered)
+  {
+    this->fireEvent(bIsTriggered);
   }
 
Index: code/trunk/src/orxonox/objects/worldentities/triggers/Trigger.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/Trigger.h	(revision 3028)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/Trigger.h	(revision 3033)
@@ -89,4 +89,7 @@
         { return this->remainingActivations_; }
 
+      inline void setVisible(bool visibility)
+        { this->debugBillboard_.setVisible(visibility); }
+
       void setDelay(float delay);
       inline float getDelay() const
@@ -101,4 +104,5 @@
       inline bool isTriggered() { return this->isTriggered(this->mode_); }
       virtual bool isTriggered(TriggerMode mode);
+      virtual void triggered(bool bIsTriggered);
 
     private:
