Index: /code/branches/objecthierarchy/src/orxonox/CMakeLists.txt
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/CMakeLists.txt	(revision 1967)
+++ /code/branches/objecthierarchy/src/orxonox/CMakeLists.txt	(revision 1968)
@@ -45,4 +45,5 @@
   objects/worldentities/WorldEntity.cc
   objects/worldentities/PositionableEntity.cc
+  objects/worldentities/MovableEntity.cc
 #  objects/Backlight.cc
   objects/Camera.cc
Index: /code/branches/objecthierarchy/src/orxonox/objects/Backlight.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/Backlight.h	(revision 1967)
+++ /code/branches/objecthierarchy/src/orxonox/objects/Backlight.h	(revision 1968)
@@ -33,5 +33,4 @@
 
 #include "WorldEntity.h"
-#include "tools/Timer.h"
 #include "tools/BillboardSet.h"
 
Index: /code/branches/objecthierarchy/src/orxonox/objects/infos/LevelInfo.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/infos/LevelInfo.cc	(revision 1967)
+++ /code/branches/objecthierarchy/src/orxonox/objects/infos/LevelInfo.cc	(revision 1968)
@@ -89,9 +89,7 @@
     void LevelInfo::setGametype(const std::string& gametype)
     {
-        std::cout << "0: " << gametype << std::endl;
         Identifier* identifier = ClassByString(gametype);
         if (identifier)
         {
-            std::cout << "1: " << identifier->getName() << std::endl;
             this->gametype_ = gametype;
             this->gametypeIdentifier_ = identifier;
Index: /code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.cc	(revision 1968)
+++ /code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.cc	(revision 1968)
@@ -0,0 +1,170 @@
+/*
+ *   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 "MovableEntity.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(MovableEntity);
+
+    MovableEntity::MovableEntity()
+    {
+        RegisterObject(MovableEntity);
+
+        this->registerVariables();
+    }
+
+    MovableEntity::~MovableEntity()
+    {
+    }
+
+    void MovableEntity::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(MovableEntity, XMLPort, xmlelement, mode);
+
+        XMLPortParamTemplate(MovableEntity, "velocity", setVelocity, getVelocity, xmlelement, mode, const Vector3&);
+        XMLPortParamTemplate(MovableEntity, "rotationaxis", setRotationAxis, getRotationAxis, xmlelement, mode, const Vector3&);
+        XMLPortParamTemplate(MovableEntity, "rotationrate", setRotationRate, getRotationRate, xmlelement, mode, const Radian&);
+    }
+
+    void MovableEntity::tick(float dt)
+    {
+        if (this->isActive())
+        {
+            this->velocity_ += (dt * this->acceleration_);
+            this->node_->translate(dt * this->velocity_);
+
+            this->rotationRate_ += (dt * this->momentum_);
+            this->node_->rotate(this->rotationAxis_, this->rotationRate_  * dt);
+        }
+
+        std::cout << this->getPosition() << std::endl;
+    }
+
+    void MovableEntity::registerVariables()
+    {
+        REGISTERDATA(this->velocity_.x, network::direction::toclient);
+        REGISTERDATA(this->velocity_.y, network::direction::toclient);
+        REGISTERDATA(this->velocity_.z, network::direction::toclient);
+
+        REGISTERDATA(this->rotationAxis_.x, network::direction::toclient);
+        REGISTERDATA(this->rotationAxis_.y, network::direction::toclient);
+        REGISTERDATA(this->rotationAxis_.z, network::direction::toclient);
+
+        REGISTERDATA(this->rotationRate_, network::direction::toclient);
+
+        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::overwritePosition()
+    {
+        this->node_->setPosition(this->overwrite_position_);
+    }
+
+    void MovableEntity::overwriteOrientation()
+    {
+        this->node_->setOrientation(this->overwrite_orientation_);
+    }
+
+    void MovableEntity::clientConnected(unsigned int clientID)
+    {
+        new Timer<MovableEntity>(rnd() * MAX_RESYNCHRONIZE_TIME, false, this, createExecutor(createFunctor(&MovableEntity::resynchronize)), true);
+    }
+
+    void MovableEntity::clientDisconnected(unsigned int clientID)
+    {
+    }
+
+    void MovableEntity::resynchronize()
+    {
+        this->overwrite_position_ = this->getPosition();
+        this->overwrite_orientation_ = this->getOrientation();
+    }
+
+    void MovableEntity::setPosition(const Vector3& position)
+    {
+        this->node_->setPosition(position);
+        this->overwrite_position_ = this->node_->getPosition();
+    }
+
+    void MovableEntity::translate(const Vector3& distance, Ogre::Node::TransformSpace relativeTo)
+    {
+        this->node_->translate(distance, relativeTo);
+        this->overwrite_position_ = this->node_->getPosition();
+    }
+
+    void MovableEntity::setOrientation(const Quaternion& orientation)
+    {
+        this->node_->setOrientation(orientation);
+        this->overwrite_orientation_ = this->node_->getOrientation();
+    }
+
+    void MovableEntity::rotate(const Quaternion& rotation, Ogre::Node::TransformSpace relativeTo)
+    {
+        this->node_->rotate(rotation, relativeTo);
+        this->overwrite_orientation_ = this->node_->getOrientation();
+    }
+
+    void MovableEntity::yaw(const Radian& angle, Ogre::Node::TransformSpace relativeTo)
+    {
+        this->node_->yaw(angle, relativeTo);
+        this->overwrite_orientation_ = this->node_->getOrientation();
+    }
+
+    void MovableEntity::pitch(const Radian& angle, Ogre::Node::TransformSpace relativeTo)
+    {
+        this->node_->pitch(angle, relativeTo);
+        this->overwrite_orientation_ = this->node_->getOrientation();
+    }
+
+    void MovableEntity::roll(const Radian& angle, Ogre::Node::TransformSpace relativeTo)
+    {
+        this->node_->roll(angle, relativeTo);
+        this->overwrite_orientation_ = this->node_->getOrientation();
+    }
+
+    void MovableEntity::lookAt(const Vector3& target, Ogre::Node::TransformSpace relativeTo, const Vector3& localDirectionVector)
+    {
+        this->node_->lookAt(target, relativeTo, localDirectionVector);
+        this->overwrite_orientation_ = this->node_->getOrientation();
+    }
+
+    void MovableEntity::setDirection(const Vector3& direction, Ogre::Node::TransformSpace relativeTo, const Vector3& localDirectionVector)
+    {
+        this->node_->setDirection(direction, relativeTo, localDirectionVector);
+        this->overwrite_orientation_ = this->node_->getOrientation();
+    }
+}
Index: /code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.h	(revision 1968)
+++ /code/branches/objecthierarchy/src/orxonox/objects/worldentities/MovableEntity.h	(revision 1968)
@@ -0,0 +1,121 @@
+/*
+ *   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 _MovableEntity_H__
+#define _MovableEntity_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "WorldEntity.h"
+#include "objects/Tickable.h"
+#include "network/ClientConnectionListener.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport MovableEntity : public WorldEntity, public Tickable, public network::ClientConnectionListener
+    {
+        public:
+            MovableEntity();
+            virtual ~MovableEntity();
+
+            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::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 Radian& angle, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
+            void pitch(const Radian& angle, Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_LOCAL);
+            void roll(const Radian& 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 setVelocity(const Vector3& velocity)
+                { this->velocity_ = velocity; }
+            inline void setVelocity(float x, float y, float z)
+                { this->velocity_.x = x; this->velocity_.y = y; this->velocity_.z = z; }
+            inline const Vector3& getVelocity() const
+                { return this->velocity_; }
+
+            inline void setAcceleration(const Vector3& acceleration)
+                { this->acceleration_ = acceleration; }
+            inline void setAcceleration(float x, float y, float z)
+                { this->acceleration_.x = x; this->acceleration_.y = y; this->acceleration_.z = z; }
+            inline const Vector3& getAcceleration() const
+                { return this->acceleration_; }
+
+            inline void setRotationAxis(const Vector3& axis)
+                { this->rotationAxis_ = axis; this->rotationAxis_.normalise(); }
+            inline void setRotationAxis(float x, float y, float z)
+                { this->rotationAxis_.x = x; this->rotationAxis_.y = y; this->rotationAxis_.z = z; rotationAxis_.normalise(); }
+            inline const Vector3& getRotationAxis() const
+                { return this->rotationAxis_; }
+
+            inline void setRotationRate(const Radian& angle)
+                { this->rotationRate_ = angle; }
+            inline void setRotationRate(const Degree& angle)
+                { this->rotationRate_ = angle; }
+            inline const Radian& getRotationRate() const
+                { return this->rotationRate_; }
+
+            inline void setMomentum(const Radian& angle)
+                { this->momentum_ = angle; }
+            inline void setMomentum(const Degree& angle)
+                { this->momentum_ = angle; }
+            inline const Radian& getMomentum() const
+                { return this->momentum_; }
+
+        private:
+            void clientConnected(unsigned int clientID);
+            void clientDisconnected(unsigned int clientID);
+            void resynchronize();
+
+            void overwritePosition();
+            void overwriteOrientation();
+
+            Vector3 velocity_;
+            Vector3 acceleration_;
+            Vector3 rotationAxis_;
+            Radian rotationRate_;
+            Radian momentum_;
+
+            Vector3 overwrite_position_;
+            Quaternion overwrite_orientation_;
+    };
+}
+
+#endif /* _MovableEntity_H__ */
Index: /code/branches/objecthierarchy/src/orxonox/objects/worldentities/PositionableEntity.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/objects/worldentities/PositionableEntity.h	(revision 1967)
+++ /code/branches/objecthierarchy/src/orxonox/objects/worldentities/PositionableEntity.h	(revision 1968)
@@ -43,4 +43,11 @@
             void registerVariables();
 
+            using WorldEntity::setPosition;
+            using WorldEntity::translate;
+            using WorldEntity::setOrientation;
+            using WorldEntity::rotate;
+            using WorldEntity::lookAt;
+            using WorldEntity::setDirection;
+
             inline void setPosition(const Vector3& position)
                 { this->node_->setPosition(position); }
Index: /code/branches/objecthierarchy/src/orxonox/overlays/hud/ChatOverlay.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/overlays/hud/ChatOverlay.cc	(revision 1967)
+++ /code/branches/objecthierarchy/src/orxonox/overlays/hud/ChatOverlay.cc	(revision 1968)
@@ -90,18 +90,13 @@
         COUT(0) << "Chat: " << text << std::endl;
 
-        Timer<ChatOverlay>* timer = new Timer<ChatOverlay>;
-        ExecutorMember<ChatOverlay>* executor = createExecutor(createFunctor(&ChatOverlay::dropMessage));
-        executor->setDefaultValues(timer);
-        timer->setTimer(this->displayTime_, false, this, executor);
+        new Timer<ChatOverlay>(this->displayTime_, false, this, createExecutor(createFunctor(&ChatOverlay::dropMessage)), true);
 
         this->updateOverlayText();
     }
 
-    void ChatOverlay::dropMessage(Timer<ChatOverlay>* timer)
+    void ChatOverlay::dropMessage()
     {
         this->messages_.pop_front();
         this->updateOverlayText();
-
-        delete timer;
     }
 
Index: /code/branches/objecthierarchy/src/orxonox/overlays/hud/ChatOverlay.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/overlays/hud/ChatOverlay.h	(revision 1967)
+++ /code/branches/objecthierarchy/src/orxonox/overlays/hud/ChatOverlay.h	(revision 1968)
@@ -54,5 +54,5 @@
         private:
             void updateOverlayText();
-            void dropMessage(Timer<ChatOverlay>* timer);
+            void dropMessage();
 
             float displayTime_;
Index: /code/branches/objecthierarchy/src/orxonox/tools/Timer.cc
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/tools/Timer.cc	(revision 1967)
+++ /code/branches/objecthierarchy/src/orxonox/tools/Timer.cc	(revision 1968)
@@ -92,4 +92,5 @@
         this->bLoop_ = false;
         this->bActive_ = false;
+        this->bKillAfterCall_ = false;
 
         this->time_ = 0;
@@ -112,4 +113,7 @@
     {
         (*this->executor_)();
+
+        if (this->bKillAfterCall_)
+            delete this;
     }
 
@@ -136,5 +140,5 @@
             {
                 // It's time to call the function
-                if (this->bLoop_)
+                if (this->bLoop_ && !this->bKillAfterCall_)
                 {
                     this->time_ += this->interval_; // Q: Why '+=' and not '='? A: Think about it. It's more accurate like that. Seriously.
Index: /code/branches/objecthierarchy/src/orxonox/tools/Timer.h
===================================================================
--- /code/branches/objecthierarchy/src/orxonox/tools/Timer.h	(revision 1967)
+++ /code/branches/objecthierarchy/src/orxonox/tools/Timer.h	(revision 1968)
@@ -116,11 +116,12 @@
             TimerBase();
 
-            Executor* executor_; //!< The executor of the function that should be called when the time expires
-
-            long long interval_; //!< The time-interval in micro seconds
-            bool bLoop_;         //!< If true, the function gets called every 'interval' seconds
-            bool bActive_;       //!< If true, the Timer ticks and calls the function if the time's up
-
-            long long time_;     //!< Internal variable, counting the time till the next function-call
+            Executor* executor_;  //!< The executor of the function that should be called when the time expires
+
+            long long interval_;  //!< The time-interval in micro seconds
+            bool bLoop_;          //!< If true, the function gets called every 'interval' seconds
+            bool bActive_;        //!< If true, the Timer ticks and calls the function if the time's up
+            bool bKillAfterCall_; //!< If true the timer gets deleted after it called the function
+
+            long long time_;      //!< Internal variable, counting the time till the next function-call
     };
 
@@ -139,7 +140,7 @@
                 @param exeuctor A executor of the function to call
             */
-            Timer(float interval, bool bLoop, T* object, ExecutorMember<T>* exeuctor)
-            {
-                this->setTimer(interval, bLoop, object, exeuctor);
+            Timer(float interval, bool bLoop, T* object, ExecutorMember<T>* exeuctor, bool bKillAfterCall = false)
+            {
+                this->setTimer(interval, bLoop, object, exeuctor, bKillAfterCall);
             }
 
@@ -151,5 +152,5 @@
                 @param exeuctor A executor of the function to call
             */
-            void setTimer(float interval, bool bLoop, T* object, ExecutorMember<T>* executor)
+            void setTimer(float interval, bool bLoop, T* object, ExecutorMember<T>* executor, bool bKillAfterCall = false)
             {
                 this->deleteExecutor();
@@ -162,4 +163,5 @@
 
                 this->time_ = this->interval_;
+                this->bKillAfterCall_ = bKillAfterCall;
             }
     };
@@ -177,7 +179,7 @@
                 @param exeuctor A executor of the function to call
             */
-            StaticTimer(float interval, bool bLoop, ExecutorStatic* executor)
-            {
-                this->setTimer(interval, bLoop, executor);
+            StaticTimer(float interval, bool bLoop, ExecutorStatic* executor, bool bKillAfterCall = false)
+            {
+                this->setTimer(interval, bLoop, executor, bKillAfterCall);
             }
 
@@ -189,5 +191,5 @@
                 @param executor A executor of the function to call
             */
-            void setTimer(float interval, bool bLoop, ExecutorStatic* executor)
+            void setTimer(float interval, bool bLoop, ExecutorStatic* executor, bool bKillAfterCall = false)
             {
                 this->deleteExecutor();
@@ -199,4 +201,5 @@
 
                 this->time_ = this->interval_;
+                this->bKillAfterCall_ = bKillAfterCall;
             }
     };
