Index: code/branches/physics/src/orxonox/CMakeLists.txt
===================================================================
--- code/branches/physics/src/orxonox/CMakeLists.txt	(revision 2407)
+++ code/branches/physics/src/orxonox/CMakeLists.txt	(revision 2408)
@@ -57,5 +57,5 @@
   objects/worldentities/StaticEntity.cc
   objects/worldentities/MovableEntity.cc
-  objects/worldentities/LinearEntity.cc
+  objects/worldentities/MobileEntity.cc
   objects/worldentities/ControllableEntity.cc
   objects/worldentities/Model.cc
Index: code/branches/physics/src/orxonox/OrxonoxPrereqs.h
===================================================================
--- code/branches/physics/src/orxonox/OrxonoxPrereqs.h	(revision 2407)
+++ code/branches/physics/src/orxonox/OrxonoxPrereqs.h	(revision 2408)
@@ -104,7 +104,7 @@
     class WorldEntity;
     class StaticEntity;
+    class MobileEntity;
+    class ControllableEntity;
     class MovableEntity;
-    class ControllableEntity;
-    class LinearEntity;
     class Sublevel;
 
Index: code/branches/physics/src/orxonox/objects/weaponSystem/projectiles/Projectile.cc
===================================================================
--- code/branches/physics/src/orxonox/objects/weaponSystem/projectiles/Projectile.cc	(revision 2407)
+++ code/branches/physics/src/orxonox/objects/weaponSystem/projectiles/Projectile.cc	(revision 2408)
@@ -46,5 +46,5 @@
     float Projectile::speed_s = 5000;
 
-    Projectile::Projectile(BaseObject* creator, Weapon* owner) : MovableEntity(creator), owner_(owner)
+    Projectile::Projectile(BaseObject* creator, Weapon* owner) : MobileEntity(creator), owner_(owner)
     {
         RegisterObject(Projectile);
Index: code/branches/physics/src/orxonox/objects/weaponSystem/projectiles/Projectile.h
===================================================================
--- code/branches/physics/src/orxonox/objects/weaponSystem/projectiles/Projectile.h	(revision 2407)
+++ code/branches/physics/src/orxonox/objects/weaponSystem/projectiles/Projectile.h	(revision 2408)
@@ -32,10 +32,10 @@
 #include "OrxonoxPrereqs.h"
 
-#include "objects/worldentities/MovableEntity.h"
+#include "objects/worldentities/MobileEntity.h"
 #include "tools/Timer.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport Projectile : public MovableEntity
+    class _OrxonoxExport Projectile : public MobileEntity
     {
         public:
Index: code/branches/physics/src/orxonox/objects/worldentities/ControllableEntity.cc
===================================================================
--- code/branches/physics/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2407)
+++ code/branches/physics/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2408)
@@ -44,5 +44,5 @@
     CreateFactory(ControllableEntity);
 
-    ControllableEntity::ControllableEntity(BaseObject* creator) : MovableEntity(creator)
+    ControllableEntity::ControllableEntity(BaseObject* creator) : MobileEntity(creator)
     {
         RegisterObject(ControllableEntity);
@@ -226,5 +226,5 @@
     void ControllableEntity::tick(float dt)
     {
-        MovableEntity::tick(dt);
+        MobileEntity::tick(dt);
 
         if (this->isActive())
Index: code/branches/physics/src/orxonox/objects/worldentities/ControllableEntity.h
===================================================================
--- code/branches/physics/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2407)
+++ code/branches/physics/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2408)
@@ -32,9 +32,9 @@
 #include "OrxonoxPrereqs.h"
 
-#include "MovableEntity.h"
+#include "MobileEntity.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport ControllableEntity : public MovableEntity
+    class _OrxonoxExport ControllableEntity : public MobileEntity
     {
         public:
Index: code/branches/physics/src/orxonox/objects/worldentities/LinearEntity.cc
===================================================================
--- code/branches/physics/src/orxonox/objects/worldentities/LinearEntity.cc	(revision 2407)
+++ 	(revision )
@@ -1,117 +1,0 @@
-/*
- *   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 "LinearEntity.h"
-
-#include "core/CoreIncludes.h"
-#include "core/XMLPort.h"
-#include "core/Executor.h"
-#include "tools/Timer.h"
-
-namespace orxonox
-{
-    static const float MAX_RESYNCHRONIZE_TIME = 3.0f;
-
-    CreateFactory(LinearEntity);
-
-    LinearEntity::LinearEntity(BaseObject* creator) : MovableEntity(creator)
-    {
-        RegisterObject(LinearEntity);
-
-        this->overwrite_position_    = Vector3::ZERO;
-        this->overwrite_orientation_ = Quaternion::IDENTITY;
-
-        this->registerVariables();
-    }
-
-    LinearEntity::~LinearEntity()
-    {
-    }
-
-    void LinearEntity::XMLPort(Element& xmlelement, XMLPort::Mode mode)
-    {
-        SUPER(LinearEntity, XMLPort, xmlelement, mode);
-    }
-
-    void LinearEntity::registerVariables()
-    {
-        REGISTERDATA(this->linearVelocity_,        network::direction::toclient, new network::NetworkCallback<LinearEntity>(this, &LinearEntity::processLinearVelocity));
-        REGISTERDATA(this->angularVelocity_,       network::direction::toclient, new network::NetworkCallback<LinearEntity>(this, &LinearEntity::processAngularVelocity));
-
-        REGISTERDATA(this->overwrite_position_,    network::direction::toclient, new network::NetworkCallback<LinearEntity>(this, &LinearEntity::overwritePosition));
-        REGISTERDATA(this->overwrite_orientation_, network::direction::toclient, new network::NetworkCallback<LinearEntity>(this, &LinearEntity::overwriteOrientation));
-    }
-
-    void LinearEntity::tick(float dt)
-    {
-        MovableEntity::tick(dt);
-
-        if (this->isActive())
-        {
-        }
-    }
-
-    void LinearEntity::overwritePosition()
-    {
-        this->setPosition(this->overwrite_position_);
-    }
-
-    void LinearEntity::overwriteOrientation()
-    {
-        this->setOrientation(this->overwrite_orientation_);
-    }
-
-    void LinearEntity::clientConnected(unsigned int clientID)
-    {
-        resynchronize();
-        new Timer<LinearEntity>(rnd() * MAX_RESYNCHRONIZE_TIME, true, this, createExecutor(createFunctor(&LinearEntity::resynchronize)), false);
-    }
-
-    void LinearEntity::clientDisconnected(unsigned int clientID)
-    {
-    }
-
-    void LinearEntity::resynchronize()
-    {
-        positionChanged(false);
-        orientationChanged(false);
-    }
-
-    void LinearEntity::positionChanged(bool bContinuous)
-    {
-        if (!bContinuous)
-            this->overwrite_position_ = this->getPosition();
-    }
-
-    void LinearEntity::orientationChanged(bool bContinuous)
-    {
-        if (!bContinuous)
-            this->overwrite_orientation_ = this->getOrientation();
-    }
-}
Index: code/branches/physics/src/orxonox/objects/worldentities/LinearEntity.h
===================================================================
--- code/branches/physics/src/orxonox/objects/worldentities/LinearEntity.h	(revision 2407)
+++ 	(revision )
@@ -1,70 +1,0 @@
-/*
- *   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 _LinearEntity_H__
-#define _LinearEntity_H__
-
-#include "OrxonoxPrereqs.h"
-
-#include "MovableEntity.h"
-#include "network/ClientConnectionListener.h"
-
-namespace orxonox
-{
-    class _OrxonoxExport LinearEntity : public MovableEntity, public network::ClientConnectionListener
-    {
-        public:
-            LinearEntity(BaseObject* creator);
-            virtual ~LinearEntity();
-
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
-            virtual void tick(float dt);
-            void registerVariables();
-
-        private:
-            void clientConnected(unsigned int clientID);
-            void clientDisconnected(unsigned int clientID);
-            void resynchronize();
-
-            inline void processLinearVelocity()
-                { this->setVelocity(this->linearVelocity_); }
-            inline void processAngularVelocity()
-                { this->setAngularVelocity(this->angularVelocity_); }
-
-            void overwritePosition();
-            void overwriteOrientation();
-
-            void positionChanged(bool bContinuous);
-            void orientationChanged(bool bContinuous);
-
-            Vector3 overwrite_position_;
-            Quaternion overwrite_orientation_;
-    };
-}
-
-#endif /* _LinearEntity_H__ */
Index: code/branches/physics/src/orxonox/objects/worldentities/MobileEntity.cc
===================================================================
--- code/branches/physics/src/orxonox/objects/worldentities/MobileEntity.cc	(revision 2408)
+++ code/branches/physics/src/orxonox/objects/worldentities/MobileEntity.cc	(revision 2408)
@@ -0,0 +1,308 @@
+/*
+ *   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:
+ *      Reto Grieder
+ *   Co-authors:
+ *      Martin Stypinski
+ *
+ */
+
+#include "OrxonoxStableHeaders.h"
+#include "MobileEntity.h"
+
+#include "BulletDynamics/Dynamics/btRigidBody.h"
+
+#include "util/Debug.h"
+#include "util/MathConvert.h"
+#include "util/Exception.h"
+#include "core/CoreIncludes.h"
+#include "core/XMLPort.h"
+
+#include "objects/Scene.h"
+
+namespace orxonox
+{
+    MobileEntity::MobileEntity(BaseObject* creator) : WorldEntity(creator)
+    {
+        RegisterObject(MobileEntity);
+
+        this->linearAcceleration_  = Vector3::ZERO;
+        this->linearVelocity_      = Vector3::ZERO;
+        this->angularAcceleration_ = Vector3::ZERO;
+        this->angularVelocity_     = Vector3::ZERO;
+
+        this->registerVariables();
+    }
+
+    MobileEntity::~MobileEntity()
+    {
+    }
+
+    void MobileEntity::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(MobileEntity, XMLPort, xmlelement, mode);
+
+        XMLPortParamTemplate(MobileEntity, "velocity",     setVelocity,     getVelocity,     xmlelement, mode, const Vector3&);
+        XMLPortParamTemplate(MobileEntity, "rotationaxis", setRotationAxis, getRotationAxis, xmlelement, mode, const Vector3&);
+        XMLPortParam(MobileEntity, "rotationrate", setRotationRate, getRotationRate, xmlelement, mode);
+    }
+
+    void MobileEntity::registerVariables()
+    {
+    }
+
+    void MobileEntity::tick(float dt)
+    {
+        if (this->isActive())
+        {
+            // Check whether Bullet doesn't do the physics for us
+            if (!this->isDynamic())
+            {
+                // Linear part
+                this->linearVelocity_.x += this->linearAcceleration_.x * dt;
+                this->linearVelocity_.y += this->linearAcceleration_.y * dt;
+                this->linearVelocity_.z += this->linearAcceleration_.z * dt;
+                linearVelocityChanged(true);
+                this->node_->translate(this->linearVelocity_ * dt);
+                positionChanged(true);
+
+                // Angular part
+                // Note: angularVelocity_ is a Quaternion with w = 0 while angularAcceleration_ is a Vector3
+                this->angularVelocity_.x += angularAcceleration_.x * dt;
+                this->angularVelocity_.y += angularAcceleration_.y * dt;
+                this->angularVelocity_.z += angularAcceleration_.z * dt;
+                angularVelocityChanged(true);
+                // Calculate new orientation with quaternion derivative. This is about 30% faster than with angle/axis method.
+                float mult = dt * 0.5;
+                // TODO: this could be optimized by writing it out. The calls currently create 4 new Quaternions!
+                Quaternion newOrientation(0.0f, this->angularVelocity_.x * mult, this->angularVelocity_.y * mult, this->angularVelocity_.z * mult);
+                newOrientation = this->node_->getOrientation() + newOrientation * this->node_->getOrientation();
+                newOrientation.normalise();
+                this->node_->setOrientation(newOrientation);
+                orientationChanged(true);
+            }
+        }
+    }
+
+    void MobileEntity::setPosition(const Vector3& position)
+    {
+        if (this->isDynamic())
+        {
+            btTransform transf = this->physicalBody_->getWorldTransform();
+            transf.setOrigin(btVector3(position.x, position.y, position.z));
+            this->physicalBody_->setWorldTransform(transf);
+        }
+
+        this->node_->setPosition(position);
+        positionChanged(false);
+    }
+
+    void MobileEntity::translate(const Vector3& distance, Ogre::Node::TransformSpace relativeTo)
+    {
+        if (this->isDynamic())
+        {
+            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot translate physical object relative \
+                                                          to any other space than TS_LOCAL.");
+            this->physicalBody_->translate(btVector3(distance.x, distance.y, distance.z));
+        }
+
+        this->node_->translate(distance, relativeTo);
+        positionChanged(false);
+    }
+
+    void MobileEntity::setOrientation(const Quaternion& orientation)
+    {
+        if (this->isDynamic())
+        {
+            btTransform transf = this->physicalBody_->getWorldTransform();
+            transf.setRotation(btQuaternion(orientation.x, orientation.y, orientation.z, orientation.w));
+            this->physicalBody_->setWorldTransform(transf);
+        }
+
+        this->node_->setOrientation(orientation);
+        orientationChanged(false);
+    }
+
+    void MobileEntity::rotate(const Quaternion& rotation, Ogre::Node::TransformSpace relativeTo)
+    {
+        if (this->isDynamic())
+        {
+            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot rotate physical object relative \
+                                                          to any other space than TS_LOCAL.");
+            btTransform transf = this->physicalBody_->getWorldTransform();
+            this->physicalBody_->setWorldTransform(transf * btTransform(btQuaternion(rotation.x, rotation.y, rotation.z, rotation.w)));
+        }
+
+        this->node_->rotate(rotation, relativeTo);
+        orientationChanged(false);
+    }
+
+    void MobileEntity::yaw(const Degree& angle, Ogre::Node::TransformSpace relativeTo)
+    {
+        if (this->isDynamic())
+        {
+            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot yaw physical object relative \
+                                                          to any other space than TS_LOCAL.");
+            btTransform transf = this->physicalBody_->getWorldTransform();
+            btTransform rotation(btQuaternion(angle.valueRadians(), 0.0f, 0.0f));
+            this->physicalBody_->setWorldTransform(transf * rotation);
+        }
+
+        this->node_->yaw(angle, relativeTo);
+        orientationChanged(false);
+    }
+
+    void MobileEntity::pitch(const Degree& angle, Ogre::Node::TransformSpace relativeTo)
+    {
+        if (this->isDynamic())
+        {
+            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot pitch physical object relative \
+                                                          to any other space than TS_LOCAL.");
+            btTransform transf = this->physicalBody_->getWorldTransform();
+            btTransform rotation(btQuaternion(0.0f, angle.valueRadians(), 0.0f));
+            this->physicalBody_->setWorldTransform(transf * rotation);
+        }
+
+        this->node_->pitch(angle, relativeTo);
+        orientationChanged(false);
+    }
+
+    void MobileEntity::roll(const Degree& angle, Ogre::Node::TransformSpace relativeTo)
+    {
+        if (this->isDynamic())
+        {
+            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot roll physical object relative \
+                                                          to any other space than TS_LOCAL.");
+            btTransform transf = this->physicalBody_->getWorldTransform();
+            btTransform rotation(btQuaternion(angle.valueRadians(), 0.0f, 0.0f));
+            this->physicalBody_->setWorldTransform(transf * rotation);
+        }
+
+        this->node_->roll(angle, relativeTo);
+        orientationChanged(false);
+    }
+
+    void MobileEntity::lookAt(const Vector3& target, Ogre::Node::TransformSpace relativeTo, const Vector3& localDirectionVector)
+    {
+        if (this->isDynamic())
+        {
+            ThrowException(NotImplemented, "ControllableEntity::lookAt() is not yet supported for physical objects.");
+            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot align physical object relative \
+                                                          to any other space than TS_LOCAL.");
+        }
+
+        this->node_->lookAt(target, relativeTo, localDirectionVector);
+        orientationChanged(false);
+    }
+
+    void MobileEntity::setDirection(const Vector3& direction, Ogre::Node::TransformSpace relativeTo, const Vector3& localDirectionVector)
+    {
+        if (this->isDynamic())
+        {
+            ThrowException(NotImplemented, "ControllableEntity::setDirection() is not yet supported for physical objects.");
+            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot align physical object relative \
+                                                          to any other space than TS_LOCAL.");
+        }
+
+        this->node_->setDirection(direction, relativeTo, localDirectionVector);
+        orientationChanged(false);
+    }
+
+    void MobileEntity::setVelocity(const Vector3& velocity)
+    {
+        if (this->isDynamic())
+            this->physicalBody_->setLinearVelocity(btVector3(velocity.x, velocity.y, velocity.z));
+
+        this->linearVelocity_ = velocity;
+        linearVelocityChanged(false);
+    }
+
+    void MobileEntity::setAngularVelocity(const Vector3& velocity)
+    {
+        if (this->isDynamic())
+            this->physicalBody_->setAngularVelocity(btVector3(velocity.x, velocity.y, velocity.z));
+
+        this->angularVelocity_ = velocity;
+        angularVelocityChanged(false);
+    }
+
+    void MobileEntity::setAcceleration(const Vector3& acceleration)
+    {
+        if (this->isDynamic())
+            this->physicalBody_->applyCentralForce(btVector3(acceleration.x * this->getMass(), acceleration.y * this->getMass(), acceleration.z * this->getMass()));
+
+        this->linearAcceleration_ = acceleration;
+    }
+
+    void MobileEntity::setAngularAcceleration(const Vector3& acceleration)
+    {
+        if (this->isDynamic())
+        {
+            btVector3 inertia(btVector3(1, 1, 1) / this->physicalBody_->getInvInertiaDiagLocal());
+            this->physicalBody_->applyTorque(btVector3(acceleration.x, acceleration.y, acceleration.z) * inertia);
+        }
+
+        this->angularAcceleration_ = acceleration;
+    }
+
+    bool MobileEntity::isCollisionTypeLegal(WorldEntity::CollisionType type) const
+    {
+        if (type == WorldEntity::Static)
+        {
+            ThrowException(PhysicsViolation, "Cannot tell a MobileEntity to have static collision type");
+            return false;
+        }
+        else
+            return true;
+    }
+
+    void MobileEntity::setWorldTransform(const btTransform& worldTrans)
+    {
+        // We use a dynamic body. So we translate our node accordingly.
+        this->node_->setPosition(Vector3(worldTrans.getOrigin().x(), worldTrans.getOrigin().y(), worldTrans.getOrigin().z()));
+        this->node_->setOrientation(Quaternion(worldTrans.getRotation().w(), worldTrans.getRotation().x(), worldTrans.getRotation().y(), worldTrans.getRotation().z()));
+        this->linearVelocity_.x = this->physicalBody_->getLinearVelocity().x();
+        this->linearVelocity_.y = this->physicalBody_->getLinearVelocity().y();
+        this->linearVelocity_.z = this->physicalBody_->getLinearVelocity().z();
+        this->angularVelocity_.x = this->physicalBody_->getAngularVelocity().x();
+        this->angularVelocity_.y = this->physicalBody_->getAngularVelocity().y();
+        this->angularVelocity_.z = this->physicalBody_->getAngularVelocity().z();
+        linearVelocityChanged(true);
+        angularVelocityChanged(true);
+        positionChanged(true);
+        orientationChanged(true);
+    }
+
+    void MobileEntity::getWorldTransform(btTransform& worldTrans) const
+    {
+        // We use a kinematic body
+        worldTrans.setOrigin(btVector3(node_->getPosition().x, node_->getPosition().y, node_->getPosition().z));
+        worldTrans.setRotation(btQuaternion(node_->getOrientation().x, node_->getOrientation().y, node_->getOrientation().z, node_->getOrientation().w));
+        if (this->isDynamic())
+        {
+            // This function gets called only once for dynamic objects to set the initial conditions
+            // We have to set the velocities too.
+            this->physicalBody_->setLinearVelocity(btVector3(linearVelocity_.x, linearVelocity_.y, linearVelocity_.z));
+            this->physicalBody_->setAngularVelocity(btVector3(angularVelocity_.x, angularVelocity_.y, angularVelocity_.z));
+        }
+    }
+}
Index: code/branches/physics/src/orxonox/objects/worldentities/MobileEntity.h
===================================================================
--- code/branches/physics/src/orxonox/objects/worldentities/MobileEntity.h	(revision 2408)
+++ code/branches/physics/src/orxonox/objects/worldentities/MobileEntity.h	(revision 2408)
@@ -0,0 +1,123 @@
+/*
+ *   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:
+ *      Reto Grieder
+ *   Co-authors:
+ *      Martin Stypinski
+ *
+ */
+
+#ifndef _MobileEntity_H__
+#define _MobileEntity_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "WorldEntity.h"
+#include "objects/Tickable.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport MobileEntity : public WorldEntity, public Tickable
+    {
+        public:
+            MobileEntity(BaseObject* creator);
+            virtual ~MobileEntity();
+
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void tick(float dt);
+            void registerVariables();
+
+            using WorldEntity::setPosition;
+            using WorldEntity::translate;
+            using WorldEntity::setOrientation;
+            using WorldEntity::rotate;
+            using WorldEntity::yaw;
+            using WorldEntity::pitch;
+            using WorldEntity::roll;
+            using WorldEntity::lookAt;
+            using WorldEntity::setDirection;
+
+            void setPosition(const Vector3& position);
+            void translate(const Vector3& distance, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
+            void setOrientation(const Quaternion& orientation);
+            void rotate(const Quaternion& rotation, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
+            void yaw(const Degree& angle, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
+            void pitch(const Degree& angle, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
+            void roll(const Degree& angle, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
+            void lookAt(const Vector3& target, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL, const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z);
+            void setDirection(const Vector3& direction, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL, const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z);
+
+            void setVelocity(const Vector3& velocity);
+            inline void setVelocity(float x, float y, float z)
+                { this->setVelocity(Vector3(x, y, z)); }
+            inline const Vector3& getVelocity() const
+                { return this->linearVelocity_; }
+
+            void setAngularVelocity(const Vector3& velocity);
+            inline void setAngularVelocity(float x, float y, float z)
+                { this->setAngularVelocity(Vector3(x, y, z)); }
+            inline const Vector3& getAngularVelocity() const
+                { return this->linearAcceleration_; }
+
+            void setAcceleration(const Vector3& acceleration);
+            inline void setAcceleration(float x, float y, float z)
+                { this->setAcceleration(Vector3(x, y, z)); }
+            inline const Vector3& getAcceleration() const
+                { return this->linearAcceleration_; }
+
+            void setAngularAcceleration(const Vector3& acceleration);
+            inline void setAngularAcceleration(float x, float y, float z)
+                { this->setAngularAcceleration(Vector3(x, y, z)); }
+            inline const Vector3& getAngularAcceleration() const
+                { return this->angularAcceleration_; }
+
+            inline void setRotationRate(Degree rate)
+                { this->setAngularVelocity(this->getAngularVelocity().normalisedCopy() * rate.valueRadians()); }
+            inline Degree getRotationRate() const
+                { return Degree(this->getAngularVelocity().length()); }
+
+            inline void setRotationAxis(const Vector3& axis)
+                { this->setAngularVelocity(axis * this->getAngularVelocity().length()); }
+            inline Vector3 getRotationAxis() const
+                { return this->getAngularVelocity().normalisedCopy(); }
+
+        protected:
+            Vector3 linearAcceleration_;
+            Vector3 linearVelocity_;
+            Vector3 angularAcceleration_;
+            Vector3 angularVelocity_;
+
+        private:
+            virtual void positionChanged       (bool bContinuous) = 0;
+            virtual void orientationChanged    (bool bContinuous) = 0;
+            virtual void linearVelocityChanged (bool bContinuous) { }
+            virtual void angularVelocityChanged(bool bContinuous) { }
+
+            virtual bool isCollisionTypeLegal(WorldEntity::CollisionType type) const;
+
+            // Bullet btMotionState related
+            void setWorldTransform(const btTransform& worldTrans);
+            void getWorldTransform(btTransform& worldTrans) const;
+    };
+}
+
+#endif /* _MobileEntity_H__ */
Index: code/branches/physics/src/orxonox/objects/worldentities/MovableEntity.cc
===================================================================
--- code/branches/physics/src/orxonox/objects/worldentities/MovableEntity.cc	(revision 2407)
+++ code/branches/physics/src/orxonox/objects/worldentities/MovableEntity.cc	(revision 2408)
@@ -21,7 +21,7 @@
  *
  *   Author:
- *      Reto Grieder
+ *      Fabian 'x3n' Landau
  *   Co-authors:
- *      Martin Stypinski
+ *      ...
  *
  */
@@ -30,24 +30,21 @@
 #include "MovableEntity.h"
 
-#include "BulletDynamics/Dynamics/btRigidBody.h"
-
-#include "util/Debug.h"
-#include "util/MathConvert.h"
-#include "util/Exception.h"
 #include "core/CoreIncludes.h"
 #include "core/XMLPort.h"
-
-#include "objects/Scene.h"
+#include "core/Executor.h"
+#include "tools/Timer.h"
 
 namespace orxonox
 {
-    MovableEntity::MovableEntity(BaseObject* creator) : WorldEntity(creator)
+    static const float MAX_RESYNCHRONIZE_TIME = 3.0f;
+
+    CreateFactory(MovableEntity);
+
+    MovableEntity::MovableEntity(BaseObject* creator) : MobileEntity(creator)
     {
         RegisterObject(MovableEntity);
 
-        this->linearAcceleration_  = Vector3::ZERO;
-        this->linearVelocity_      = Vector3::ZERO;
-        this->angularAcceleration_ = Vector3::ZERO;
-        this->angularVelocity_     = Vector3::ZERO;
+        this->overwrite_position_    = Vector3::ZERO;
+        this->overwrite_orientation_ = Quaternion::IDENTITY;
 
         this->registerVariables();
@@ -61,248 +58,60 @@
     {
         SUPER(MovableEntity, XMLPort, xmlelement, mode);
-
-        XMLPortParamTemplate(MovableEntity, "velocity",     setVelocity,     getVelocity,     xmlelement, mode, const Vector3&);
-        XMLPortParamTemplate(MovableEntity, "rotationaxis", setRotationAxis, getRotationAxis, xmlelement, mode, const Vector3&);
-        XMLPortParam(MovableEntity, "rotationrate", setRotationRate, getRotationRate, xmlelement, mode);
     }
 
     void MovableEntity::registerVariables()
     {
+        REGISTERDATA(this->linearVelocity_,        network::direction::toclient, new network::NetworkCallback<MovableEntity>(this, &MovableEntity::processLinearVelocity));
+        REGISTERDATA(this->angularVelocity_,       network::direction::toclient, new network::NetworkCallback<MovableEntity>(this, &MovableEntity::processAngularVelocity));
+
+        REGISTERDATA(this->overwrite_position_,    network::direction::toclient, new network::NetworkCallback<MovableEntity>(this, &MovableEntity::overwritePosition));
+        REGISTERDATA(this->overwrite_orientation_, network::direction::toclient, new network::NetworkCallback<MovableEntity>(this, &MovableEntity::overwriteOrientation));
     }
 
     void MovableEntity::tick(float dt)
     {
+        MobileEntity::tick(dt);
+
         if (this->isActive())
         {
-            // Check whether Bullet doesn't do the physics for us
-            if (!this->isDynamic())
-            {
-                // Linear part
-                this->linearVelocity_.x += this->linearAcceleration_.x * dt;
-                this->linearVelocity_.y += this->linearAcceleration_.y * dt;
-                this->linearVelocity_.z += this->linearAcceleration_.z * dt;
-                linearVelocityChanged(true);
-                this->node_->translate(this->linearVelocity_ * dt);
-                positionChanged(true);
-
-                // Angular part
-                // Note: angularVelocity_ is a Quaternion with w = 0 while angularAcceleration_ is a Vector3
-                this->angularVelocity_.x += angularAcceleration_.x * dt;
-                this->angularVelocity_.y += angularAcceleration_.y * dt;
-                this->angularVelocity_.z += angularAcceleration_.z * dt;
-                angularVelocityChanged(true);
-                // Calculate new orientation with quaternion derivative. This is about 30% faster than with angle/axis method.
-                float mult = dt * 0.5;
-                // TODO: this could be optimized by writing it out. The calls currently create 4 new Quaternions!
-                Quaternion newOrientation(0.0f, this->angularVelocity_.x * mult, this->angularVelocity_.y * mult, this->angularVelocity_.z * mult);
-                newOrientation = this->node_->getOrientation() + newOrientation * this->node_->getOrientation();
-                newOrientation.normalise();
-                this->node_->setOrientation(newOrientation);
-                orientationChanged(true);
-            }
         }
     }
 
-    void MovableEntity::setPosition(const Vector3& position)
+    void MovableEntity::overwritePosition()
     {
-        if (this->isDynamic())
-        {
-            btTransform transf = this->physicalBody_->getWorldTransform();
-            transf.setOrigin(btVector3(position.x, position.y, position.z));
-            this->physicalBody_->setWorldTransform(transf);
-        }
-
-        this->node_->setPosition(position);
-        positionChanged(false);
+        this->setPosition(this->overwrite_position_);
     }
 
-    void MovableEntity::translate(const Vector3& distance, Ogre::Node::TransformSpace relativeTo)
+    void MovableEntity::overwriteOrientation()
     {
-        if (this->isDynamic())
-        {
-            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot translate physical object relative \
-                                                          to any other space than TS_LOCAL.");
-            this->physicalBody_->translate(btVector3(distance.x, distance.y, distance.z));
-        }
-
-        this->node_->translate(distance, relativeTo);
-        positionChanged(false);
+        this->setOrientation(this->overwrite_orientation_);
     }
 
-    void MovableEntity::setOrientation(const Quaternion& orientation)
+    void MovableEntity::clientConnected(unsigned int clientID)
     {
-        if (this->isDynamic())
-        {
-            btTransform transf = this->physicalBody_->getWorldTransform();
-            transf.setRotation(btQuaternion(orientation.x, orientation.y, orientation.z, orientation.w));
-            this->physicalBody_->setWorldTransform(transf);
-        }
+        resynchronize();
+        new Timer<MovableEntity>(rnd() * MAX_RESYNCHRONIZE_TIME, true, this, createExecutor(createFunctor(&MovableEntity::resynchronize)), false);
+    }
 
-        this->node_->setOrientation(orientation);
+    void MovableEntity::clientDisconnected(unsigned int clientID)
+    {
+    }
+
+    void MovableEntity::resynchronize()
+    {
+        positionChanged(false);
         orientationChanged(false);
     }
 
-    void MovableEntity::rotate(const Quaternion& rotation, Ogre::Node::TransformSpace relativeTo)
+    void MovableEntity::positionChanged(bool bContinuous)
     {
-        if (this->isDynamic())
-        {
-            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot rotate physical object relative \
-                                                          to any other space than TS_LOCAL.");
-            btTransform transf = this->physicalBody_->getWorldTransform();
-            this->physicalBody_->setWorldTransform(transf * btTransform(btQuaternion(rotation.x, rotation.y, rotation.z, rotation.w)));
-        }
-
-        this->node_->rotate(rotation, relativeTo);
-        orientationChanged(false);
+        if (!bContinuous)
+            this->overwrite_position_ = this->getPosition();
     }
 
-    void MovableEntity::yaw(const Degree& angle, Ogre::Node::TransformSpace relativeTo)
+    void MovableEntity::orientationChanged(bool bContinuous)
     {
-        if (this->isDynamic())
-        {
-            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot yaw physical object relative \
-                                                          to any other space than TS_LOCAL.");
-            btTransform transf = this->physicalBody_->getWorldTransform();
-            btTransform rotation(btQuaternion(angle.valueRadians(), 0.0f, 0.0f));
-            this->physicalBody_->setWorldTransform(transf * rotation);
-        }
-
-        this->node_->yaw(angle, relativeTo);
-        orientationChanged(false);
-    }
-
-    void MovableEntity::pitch(const Degree& angle, Ogre::Node::TransformSpace relativeTo)
-    {
-        if (this->isDynamic())
-        {
-            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot pitch physical object relative \
-                                                          to any other space than TS_LOCAL.");
-            btTransform transf = this->physicalBody_->getWorldTransform();
-            btTransform rotation(btQuaternion(0.0f, angle.valueRadians(), 0.0f));
-            this->physicalBody_->setWorldTransform(transf * rotation);
-        }
-
-        this->node_->pitch(angle, relativeTo);
-        orientationChanged(false);
-    }
-
-    void MovableEntity::roll(const Degree& angle, Ogre::Node::TransformSpace relativeTo)
-    {
-        if (this->isDynamic())
-        {
-            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot roll physical object relative \
-                                                          to any other space than TS_LOCAL.");
-            btTransform transf = this->physicalBody_->getWorldTransform();
-            btTransform rotation(btQuaternion(angle.valueRadians(), 0.0f, 0.0f));
-            this->physicalBody_->setWorldTransform(transf * rotation);
-        }
-
-        this->node_->roll(angle, relativeTo);
-        orientationChanged(false);
-    }
-
-    void MovableEntity::lookAt(const Vector3& target, Ogre::Node::TransformSpace relativeTo, const Vector3& localDirectionVector)
-    {
-        if (this->isDynamic())
-        {
-            ThrowException(NotImplemented, "ControllableEntity::lookAt() is not yet supported for physical objects.");
-            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot align physical object relative \
-                                                          to any other space than TS_LOCAL.");
-        }
-
-        this->node_->lookAt(target, relativeTo, localDirectionVector);
-        orientationChanged(false);
-    }
-
-    void MovableEntity::setDirection(const Vector3& direction, Ogre::Node::TransformSpace relativeTo, const Vector3& localDirectionVector)
-    {
-        if (this->isDynamic())
-        {
-            ThrowException(NotImplemented, "ControllableEntity::setDirection() is not yet supported for physical objects.");
-            OrxAssert(relativeTo == Ogre::Node::TS_LOCAL, "Cannot align physical object relative \
-                                                          to any other space than TS_LOCAL.");
-        }
-
-        this->node_->setDirection(direction, relativeTo, localDirectionVector);
-        orientationChanged(false);
-    }
-
-    void MovableEntity::setVelocity(const Vector3& velocity)
-    {
-        if (this->isDynamic())
-            this->physicalBody_->setLinearVelocity(btVector3(velocity.x, velocity.y, velocity.z));
-
-        this->linearVelocity_ = velocity;
-        linearVelocityChanged(false);
-    }
-
-    void MovableEntity::setAngularVelocity(const Vector3& velocity)
-    {
-        if (this->isDynamic())
-            this->physicalBody_->setAngularVelocity(btVector3(velocity.x, velocity.y, velocity.z));
-
-        this->angularVelocity_ = velocity;
-        angularVelocityChanged(false);
-    }
-
-    void MovableEntity::setAcceleration(const Vector3& acceleration)
-    {
-        if (this->isDynamic())
-            this->physicalBody_->applyCentralForce(btVector3(acceleration.x * this->getMass(), acceleration.y * this->getMass(), acceleration.z * this->getMass()));
-
-        this->linearAcceleration_ = acceleration;
-    }
-
-    void MovableEntity::setAngularAcceleration(const Vector3& acceleration)
-    {
-        if (this->isDynamic())
-        {
-            btVector3 inertia(btVector3(1, 1, 1) / this->physicalBody_->getInvInertiaDiagLocal());
-            this->physicalBody_->applyTorque(btVector3(acceleration.x, acceleration.y, acceleration.z) * inertia);
-        }
-
-        this->angularAcceleration_ = acceleration;
-    }
-
-    bool MovableEntity::isCollisionTypeLegal(WorldEntity::CollisionType type) const
-    {
-        if (type == WorldEntity::Static)
-        {
-            ThrowException(PhysicsViolation, "Cannot tell a MovableEntity to have static collision type");
-            return false;
-        }
-        else
-            return true;
-    }
-
-    void MovableEntity::setWorldTransform(const btTransform& worldTrans)
-    {
-        // We use a dynamic body. So we translate our node accordingly.
-        this->node_->setPosition(Vector3(worldTrans.getOrigin().x(), worldTrans.getOrigin().y(), worldTrans.getOrigin().z()));
-        this->node_->setOrientation(Quaternion(worldTrans.getRotation().w(), worldTrans.getRotation().x(), worldTrans.getRotation().y(), worldTrans.getRotation().z()));
-        this->linearVelocity_.x = this->physicalBody_->getLinearVelocity().x();
-        this->linearVelocity_.y = this->physicalBody_->getLinearVelocity().y();
-        this->linearVelocity_.z = this->physicalBody_->getLinearVelocity().z();
-        this->angularVelocity_.x = this->physicalBody_->getAngularVelocity().x();
-        this->angularVelocity_.y = this->physicalBody_->getAngularVelocity().y();
-        this->angularVelocity_.z = this->physicalBody_->getAngularVelocity().z();
-        linearVelocityChanged(true);
-        angularVelocityChanged(true);
-        positionChanged(true);
-        orientationChanged(true);
-    }
-
-    void MovableEntity::getWorldTransform(btTransform& worldTrans) const
-    {
-        // We use a kinematic body
-        worldTrans.setOrigin(btVector3(node_->getPosition().x, node_->getPosition().y, node_->getPosition().z));
-        worldTrans.setRotation(btQuaternion(node_->getOrientation().x, node_->getOrientation().y, node_->getOrientation().z, node_->getOrientation().w));
-        if (this->isDynamic())
-        {
-            // This function gets called only once for dynamic objects to set the initial conditions
-            // We have to set the velocities too.
-            this->physicalBody_->setLinearVelocity(btVector3(linearVelocity_.x, linearVelocity_.y, linearVelocity_.z));
-            this->physicalBody_->setAngularVelocity(btVector3(angularVelocity_.x, angularVelocity_.y, angularVelocity_.z));
-        }
+        if (!bContinuous)
+            this->overwrite_orientation_ = this->getOrientation();
     }
 }
Index: code/branches/physics/src/orxonox/objects/worldentities/MovableEntity.h
===================================================================
--- code/branches/physics/src/orxonox/objects/worldentities/MovableEntity.h	(revision 2407)
+++ code/branches/physics/src/orxonox/objects/worldentities/MovableEntity.h	(revision 2408)
@@ -21,7 +21,7 @@
  *
  *   Author:
- *      Reto Grieder
+ *      Fabian 'x3n' Landau
  *   Co-authors:
- *      Martin Stypinski
+ *      ...
  *
  */
@@ -32,10 +32,10 @@
 #include "OrxonoxPrereqs.h"
 
-#include "WorldEntity.h"
-#include "objects/Tickable.h"
+#include "MobileEntity.h"
+#include "network/ClientConnectionListener.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport MovableEntity : public WorldEntity, public Tickable
+    class _OrxonoxExport MovableEntity : public MobileEntity, public network::ClientConnectionListener
     {
         public:
@@ -47,75 +47,22 @@
             void registerVariables();
 
-            using WorldEntity::setPosition;
-            using WorldEntity::translate;
-            using WorldEntity::setOrientation;
-            using WorldEntity::rotate;
-            using WorldEntity::yaw;
-            using WorldEntity::pitch;
-            using WorldEntity::roll;
-            using WorldEntity::lookAt;
-            using WorldEntity::setDirection;
+        private:
+            void clientConnected(unsigned int clientID);
+            void clientDisconnected(unsigned int clientID);
+            void resynchronize();
 
-            void setPosition(const Vector3& position);
-            void translate(const Vector3& distance, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
-            void setOrientation(const Quaternion& orientation);
-            void rotate(const Quaternion& rotation, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
-            void yaw(const Degree& angle, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
-            void pitch(const Degree& angle, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
-            void roll(const Degree& angle, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
-            void lookAt(const Vector3& target, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL, const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z);
-            void setDirection(const Vector3& direction, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL, const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z);
+            inline void processLinearVelocity()
+                { this->setVelocity(this->linearVelocity_); }
+            inline void processAngularVelocity()
+                { this->setAngularVelocity(this->angularVelocity_); }
 
-            void setVelocity(const Vector3& velocity);
-            inline void setVelocity(float x, float y, float z)
-                { this->setVelocity(Vector3(x, y, z)); }
-            inline const Vector3& getVelocity() const
-                { return this->linearVelocity_; }
+            void overwritePosition();
+            void overwriteOrientation();
 
-            void setAngularVelocity(const Vector3& velocity);
-            inline void setAngularVelocity(float x, float y, float z)
-                { this->setAngularVelocity(Vector3(x, y, z)); }
-            inline const Vector3& getAngularVelocity() const
-                { return this->linearAcceleration_; }
+            void positionChanged(bool bContinuous);
+            void orientationChanged(bool bContinuous);
 
-            void setAcceleration(const Vector3& acceleration);
-            inline void setAcceleration(float x, float y, float z)
-                { this->setAcceleration(Vector3(x, y, z)); }
-            inline const Vector3& getAcceleration() const
-                { return this->linearAcceleration_; }
-
-            void setAngularAcceleration(const Vector3& acceleration);
-            inline void setAngularAcceleration(float x, float y, float z)
-                { this->setAngularAcceleration(Vector3(x, y, z)); }
-            inline const Vector3& getAngularAcceleration() const
-                { return this->angularAcceleration_; }
-
-            inline void setRotationRate(Degree rate)
-                { this->setAngularVelocity(this->getAngularVelocity().normalisedCopy() * rate.valueRadians()); }
-            inline Degree getRotationRate() const
-                { return Degree(this->getAngularVelocity().length()); }
-
-            inline void setRotationAxis(const Vector3& axis)
-                { this->setAngularVelocity(axis * this->getAngularVelocity().length()); }
-            inline Vector3 getRotationAxis() const
-                { return this->getAngularVelocity().normalisedCopy(); }
-
-        protected:
-            Vector3 linearAcceleration_;
-            Vector3 linearVelocity_;
-            Vector3 angularAcceleration_;
-            Vector3 angularVelocity_;
-
-        private:
-            virtual void positionChanged       (bool bContinuous) = 0;
-            virtual void orientationChanged    (bool bContinuous) = 0;
-            virtual void linearVelocityChanged (bool bContinuous) { }
-            virtual void angularVelocityChanged(bool bContinuous) { }
-
-            virtual bool isCollisionTypeLegal(WorldEntity::CollisionType type) const;
-
-            // Bullet btMotionState related
-            void setWorldTransform(const btTransform& worldTrans);
-            void getWorldTransform(btTransform& worldTrans) const;
+            Vector3 overwrite_position_;
+            Quaternion overwrite_orientation_;
     };
 }
Index: code/branches/physics/src/orxonox/objects/worldentities/WorldEntity.cc
===================================================================
--- code/branches/physics/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2407)
+++ code/branches/physics/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2408)
@@ -344,5 +344,5 @@
             ThrowException(PhysicsViolation, "Warning: Cannot set the collision type at run time.");
 
-        // Check for type legality. Could be StaticEntity or MovableEntity
+        // Check for type legality. Could be StaticEntity or MobileEntity
         if (!this->isCollisionTypeLegal(type))
             return; // exception gets issued anyway
