Index: code/branches/objecthierarchy2/src/core/BaseObject.cc
===================================================================
--- code/branches/objecthierarchy2/src/core/BaseObject.cc	(revision 2213)
+++ code/branches/objecthierarchy2/src/core/BaseObject.cc	(revision 2254)
@@ -36,4 +36,5 @@
 #include "CoreIncludes.h"
 #include "EventIncludes.h"
+#include "Functor.h"
 #include "XMLPort.h"
 #include "XMLFile.h"
@@ -60,4 +61,7 @@
         this->oldGametype_ = 0;
 
+        this->functorSetMainState_ = 0;
+        this->functorGetMainState_ = 0;
+
         this->setCreator(creator);
         if (this->creator_)
@@ -82,9 +86,17 @@
     BaseObject::~BaseObject()
     {
-        for (std::list<BaseObject*>::const_iterator it = this->events_.begin(); it != this->events_.end(); ++it)
-            (*it)->unregisterEventListener(this);
-
-        for (std::map<BaseObject*, std::string>::const_iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
-            it->first->removeEvent(this);
+        if (this->isInitialized())
+        {
+            for (std::list<BaseObject*>::const_iterator it = this->events_.begin(); it != this->events_.end(); ++it)
+                (*it)->unregisterEventListener(this);
+
+            for (std::map<BaseObject*, std::string>::const_iterator it = this->eventListeners_.begin(); it != this->eventListeners_.end(); ++it)
+                it->first->removeEvent(this);
+
+            if (this->functorSetMainState_)
+                delete this->functorSetMainState_;
+            if (this->functorGetMainState_)
+                delete this->functorGetMainState_;
+        }
     }
 
@@ -100,4 +112,5 @@
         XMLPortParam(BaseObject, "visible", setVisible, isVisible, xmlelement, mode);
         XMLPortParam(BaseObject, "active", setActive, isActive, xmlelement, mode);
+        XMLPortParam(BaseObject, "mainstate", setMainStateName, getMainStateName, xmlelement, mode);
 
         XMLPortObjectTemplate(BaseObject, Template, "templates", addTemplate, getTemplate, xmlelement, mode, Template*);
@@ -279,3 +292,46 @@
         SetEvent(BaseObject, "visibility", setVisible, event);
     }
+
+    void BaseObject::setMainStateName(const std::string& name)
+    {
+        if (this->mainStateName_ != name)
+        {
+            this->mainStateName_ = name;
+            if (this->functorSetMainState_)
+                delete this->functorSetMainState_;
+            if (this->functorGetMainState_)
+                delete this->functorGetMainState_;
+            this->changedMainState();
+            if (!this->functorSetMainState_)
+                COUT(2) << "Warning: \"" << name << "\" is not a valid MainState." << std::endl;
+        }
+    }
+
+    void BaseObject::setMainState(bool state)
+    {
+        if (this->functorSetMainState_)
+            (*this->functorSetMainState_)(state);
+        else
+            COUT(2) << "Warning: No MainState defined in object \"" << this->getName() << "\" (" << this->getIdentifier()->getName() << ")" << std::endl;
+    }
+
+    bool BaseObject::getMainState() const
+    {
+        if (this->functorGetMainState_)
+        {
+            (*this->functorGetMainState_)();
+            return this->functorGetMainState_->getReturnvalue();
+        }
+        else
+        {
+            COUT(2) << "Warning: No MainState defined in object \"" << this->getName() << "\" (" << this->getIdentifier()->getName() << ")" << std::endl;
+            return false;
+        }
+    }
+
+    void BaseObject::changedMainState()
+    {
+        SetMainState(BaseObject, "activity",   setActive,  isActive);
+        SetMainState(BaseObject, "visibility", setVisible, isVisible);
+    }
 }
Index: code/branches/objecthierarchy2/src/core/BaseObject.h
===================================================================
--- code/branches/objecthierarchy2/src/core/BaseObject.h	(revision 2213)
+++ code/branches/objecthierarchy2/src/core/BaseObject.h	(revision 2254)
@@ -36,4 +36,11 @@
 #ifndef _BaseObject_H__
 #define _BaseObject_H__
+
+#define SetMainState(classname, statename, setfunction, getfunction) \
+    if (this->getMainStateName() == statename) \
+    { \
+        this->functorSetMainState_ = createFunctor(&classname::setfunction)->setObject(this); \
+        this->functorGetMainState_ = createFunctor(&classname::getfunction)->setObject(this); \
+    }
 
 #include <map>
@@ -100,4 +107,11 @@
             virtual void changedVisibility() {}
 
+            void setMainState(bool state);
+            bool getMainState() const;
+
+            void setMainStateName(const std::string& name);
+            inline const std::string& getMainStateName() const { return this->mainStateName_; }
+            virtual void changedMainState();
+
             /** @brief Sets a pointer to the xml file that loaded this object. @param file The pointer to the XMLFile */
             inline void setFile(const XMLFile* file) { this->file_ = file; }
@@ -153,6 +167,9 @@
             std::string name_;                          //!< The name of the object
             std::string oldName_;                       //!< The old name of the object
-            mbool bActive_;                             //!< True = the object is active
-            mbool bVisible_;                            //!< True = the object is visible
+            mbool       bActive_;                       //!< True = the object is active
+            mbool       bVisible_;                      //!< True = the object is visible
+            std::string mainStateName_;
+            Functor*    functorSetMainState_;
+            Functor*    functorGetMainState_;
 
         private:
@@ -160,14 +177,14 @@
             Template* getTemplate(unsigned int index) const;
 
-            bool                  bInitialized_;         //!< True if the object was initialized (passed the object registration)
-            const XMLFile*        file_;                 //!< The XMLFile that loaded this object
-            std::string           loaderIndentation_;    //!< Indentation of the debug output in the Loader
-            Namespace*            namespace_;
-            BaseObject*           creator_;
-            Scene*                scene_;
-            Gametype*             gametype_;
-            Gametype*             oldGametype_;
-            std::set<Template*>   templates_;
-            std::map<BaseObject*, std::string> eventListeners_;
+            bool                   bInitialized_;         //!< True if the object was initialized (passed the object registration)
+            const XMLFile*         file_;                 //!< The XMLFile that loaded this object
+            std::string            loaderIndentation_;    //!< Indentation of the debug output in the Loader
+            Namespace*             namespace_;
+            BaseObject*            creator_;
+            Scene*                 scene_;
+            Gametype*              gametype_;
+            Gametype*              oldGametype_;
+            std::set<Template*>    templates_;
+            std::map<BaseObject*,  std::string> eventListeners_;
             std::list<BaseObject*> events_;
             std::map<std::string, EventContainer*> eventContainers_;
@@ -178,4 +195,5 @@
     SUPER_FUNCTION(3, BaseObject, changedVisibility, false);
     SUPER_FUNCTION(4, BaseObject, processEvent, false);
+    SUPER_FUNCTION(6, BaseObject, changedMainState, false);
 }
 
Index: code/branches/objecthierarchy2/src/core/Functor.h
===================================================================
--- code/branches/objecthierarchy2/src/core/Functor.h	(revision 2213)
+++ code/branches/objecthierarchy2/src/core/Functor.h	(revision 2254)
@@ -167,5 +167,5 @@
             }
 
-            FunctorMember* setObject(T* object)
+            FunctorMember<T>* setObject(T* object)
             {
                 this->bConstObject_ = false;
@@ -174,5 +174,5 @@
             }
 
-            FunctorMember* setObject(const T* object)
+            FunctorMember<T>* setObject(const T* object)
             {
                 this->bConstObject_ = true;
Index: code/branches/objecthierarchy2/src/core/Super.h
===================================================================
--- code/branches/objecthierarchy2/src/core/Super.h	(revision 2213)
+++ code/branches/objecthierarchy2/src/core/Super.h	(revision 2254)
@@ -236,4 +236,7 @@
     #define SUPER_changedScale(classname, functionname, ...) \
         SUPER_NOARGS(classname, functionname)
+
+    #define SUPER_changedMainState(classname, functionname, ...) \
+        SUPER_NOARGS(classname, functionname)
     // (1/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
 
@@ -448,4 +451,8 @@
             ()
         SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
+
+        SUPER_FUNCTION_GLOBAL_DECLARATION_PART1(6, changedMainState, false)
+            ()
+        SUPER_FUNCTION_GLOBAL_DECLARATION_PART2;
         // (2/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
 
@@ -496,4 +503,5 @@
     SUPER_INTRUSIVE_DECLARATION(processEvent);
     SUPER_INTRUSIVE_DECLARATION(changedScale);
+    SUPER_INTRUSIVE_DECLARATION(changedMainState);
     // (3/3) --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <-- --> HERE <--
 
Index: code/branches/objecthierarchy2/src/orxonox/OrxonoxPrereqs.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/OrxonoxPrereqs.h	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/OrxonoxPrereqs.h	(revision 2254)
@@ -113,4 +113,5 @@
     class Billboard;
     class BlinkingBillboard;
+    class FadingBillboard;
     class Light;
     class Backlight;
@@ -125,4 +126,9 @@
     class Pawn;
     class SpaceShip;
+
+    class Item;
+    class Engine;
+    class MultiStateEngine;
+    class RotatingEngine;
 
     class Trigger;
Index: code/branches/objecthierarchy2/src/orxonox/objects/CMakeLists.txt
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/CMakeLists.txt	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/CMakeLists.txt	(revision 2254)
@@ -16,4 +16,5 @@
 ADD_SOURCE_DIRECTORY(SRC_FILES gametypes)
 ADD_SOURCE_DIRECTORY(SRC_FILES infos)
+ADD_SOURCE_DIRECTORY(SRC_FILES items)
 #ADD_SOURCE_DIRECTORY(SRC_FILES pickup)
 ADD_SOURCE_DIRECTORY(SRC_FILES quest)
Index: code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.cc	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.cc	(revision 2254)
@@ -44,4 +44,5 @@
     SetConsoleCommand(HumanController, fire,          true).keybindMode(KeybindMode::OnHold);
     SetConsoleCommand(HumanController, altFire,       true).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(HumanController, boost,         true).keybindMode(KeybindMode::OnHold);
     SetConsoleCommand(HumanController, greet,         true);
     SetConsoleCommand(HumanController, use,           true);
@@ -112,4 +113,10 @@
     }
 
+    void HumanController::boost()
+    {
+        if (HumanController::localController_s && HumanController::localController_s->controllableEntity_)
+            HumanController::localController_s->controllableEntity_->boost();
+    }
+
     void HumanController::greet()
     {
Index: code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.h	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/controllers/HumanController.h	(revision 2254)
@@ -54,4 +54,5 @@
             static void altFire();
 
+            static void boost();
             static void greet();
             static void use();
Index: code/branches/objecthierarchy2/src/orxonox/objects/items/CMakeLists.txt
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/items/CMakeLists.txt	(revision 2254)
+++ code/branches/objecthierarchy2/src/orxonox/objects/items/CMakeLists.txt	(revision 2254)
@@ -0,0 +1,7 @@
+SET( SRC_FILES
+  Item.cc
+  Engine.cc
+  MultiStateEngine.cc
+)
+
+ADD_SOURCE_FILES(SRC_FILES)
Index: code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.cc	(revision 2254)
+++ code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.cc	(revision 2254)
@@ -0,0 +1,194 @@
+/*
+ *   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 "Engine.h"
+
+#include "core/CoreIncludes.h"
+#include "core/XMLPort.h"
+#include "objects/worldentities/pawns/SpaceShip.h"
+
+namespace orxonox
+{
+    CreateFactory(Engine);
+
+    Engine::Engine(BaseObject* creator) : Item(creator)
+    {
+        RegisterObject(Engine);
+
+        this->ship_ = 0;
+        this->shipID_ = OBJECTID_UNKNOWN;
+
+        this->boostFactor_ = 1.5;
+        this->speedFactor_ = 1.0;
+
+        this->maxSpeedFront_ = 0.0;
+        this->maxSpeedBack_ = 0.0;
+        this->maxSpeedLeftRight_ = 0.0;
+        this->maxSpeedUpDown_ = 0.0;
+
+        this->accelerationFront_ = 0.0;
+        this->accelerationBrake_ = 0.0;
+        this->accelerationBack_ = 0.0;
+        this->accelerationLeftRight_ = 0.0;
+        this->accelerationUpDown_ = 0.0;
+
+        this->registerVariables();
+    }
+
+    Engine::~Engine()
+    {
+    }
+
+    void Engine::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(Engine, XMLPort, xmlelement, mode);
+
+        XMLPortParam(Engine, "boostfactor", setBoostFactor, getBoostFactor, xmlelement, mode);
+
+        XMLPortParam(Engine, "speedfront",     setMaxSpeedFront,     setMaxSpeedFront,     xmlelement, mode);
+        XMLPortParam(Engine, "speedback",      setMaxSpeedBack,      setMaxSpeedBack,      xmlelement, mode);
+        XMLPortParam(Engine, "speedleftright", setMaxSpeedLeftRight, setMaxSpeedLeftRight, xmlelement, mode);
+        XMLPortParam(Engine, "speedupdown",    setMaxSpeedUpDown,    setMaxSpeedUpDown,    xmlelement, mode);
+
+        XMLPortParam(Engine, "accelerationfront",     setAccelerationFront,     setAccelerationFront,     xmlelement, mode);
+        XMLPortParam(Engine, "accelerationbrake",     setAccelerationBrake,     setAccelerationBrake,     xmlelement, mode);
+        XMLPortParam(Engine, "accelerationback",      setAccelerationBack,      setAccelerationBack,      xmlelement, mode);
+        XMLPortParam(Engine, "accelerationleftright", setAccelerationLeftRight, setAccelerationLeftRight, xmlelement, mode);
+        XMLPortParam(Engine, "accelerationupdown",    setAccelerationUpDown,    setAccelerationUpDown,    xmlelement, mode);
+    }
+
+    void Engine::registerVariables()
+    {
+        REGISTERDATA(this->shipID_, direction::toclient, new NetworkCallback<Engine>(this, &Engine::networkcallback_shipID));
+
+        REGISTERDATA(this->speedFactor_, direction::toclient);
+        REGISTERDATA(this->boostFactor_, direction::toclient);
+
+        REGISTERDATA(this->maxSpeedFront_,     direction::toclient);
+        REGISTERDATA(this->maxSpeedBack_,      direction::toclient);
+        REGISTERDATA(this->maxSpeedLeftRight_, direction::toclient);
+        REGISTERDATA(this->maxSpeedUpDown_,    direction::toclient);
+
+        REGISTERDATA(this->accelerationFront_,     direction::toclient);
+        REGISTERDATA(this->accelerationBrake_,     direction::toclient);
+        REGISTERDATA(this->accelerationBack_,      direction::toclient);
+        REGISTERDATA(this->accelerationLeftRight_, direction::toclient);
+        REGISTERDATA(this->accelerationUpDown_,    direction::toclient);
+    }
+
+    void Engine::networkcallback_shipID()
+    {
+        this->ship_ = 0;
+
+        if (this->shipID_ != OBJECTID_UNKNOWN)
+        {
+            Synchronisable* object = Synchronisable::getSynchronisable(this->shipID_);
+            if (object)
+                this->ship_ = dynamic_cast<SpaceShip*>(object);
+        }
+    }
+
+    void Engine::tick(float dt)
+    {
+        if (!this->ship_)
+        {
+            if (this->shipID_)
+            {
+                this->networkcallback_shipID();
+
+                if (!this->ship_)
+                    return;
+            }
+            else
+                return;
+        }
+
+        if (!this->isActive())
+            return;
+
+        const Vector3& direction = this->getDirection();
+        Vector3 velocity = this->ship_->getVelocity();
+        Vector3 acceleration = Vector3::ZERO;
+
+        float factor = 1.0f / this->speedFactor_;
+        velocity *= factor;
+
+        if (direction.z < 0)
+        {
+            if (this->maxSpeedFront_ != 0)
+            {
+                float boostfactor = (this->ship_->getBoost() ? this->boostFactor_ : 1.0f);
+                acceleration.z = direction.z * this->accelerationFront_ * boostfactor * clamp((this->maxSpeedFront_ - -velocity.z/boostfactor) / this->maxSpeedFront_, 0.0f, 1.0f);
+            }
+        }
+        else if (direction.z > 0)
+        {
+            if (velocity.z < 0)
+                acceleration.z = direction.z * this->accelerationBrake_;
+            else if (this->maxSpeedBack_ != 0)
+                acceleration.z = direction.z * this->accelerationBack_ * clamp((this->maxSpeedBack_ - velocity.z) / this->maxSpeedBack_, 0.0f, 1.0f);
+        }
+
+        if (this->maxSpeedLeftRight_ != 0)
+        {
+            if (direction.x < 0)
+                acceleration.x = direction.x * this->accelerationLeftRight_ * clamp((this->maxSpeedLeftRight_ - -velocity.x) / this->maxSpeedLeftRight_, 0.0f, 1.0f);
+            else if (direction.x > 0)
+                acceleration.x = direction.x * this->accelerationLeftRight_ * clamp((this->maxSpeedLeftRight_ - velocity.x) / this->maxSpeedLeftRight_, 0.0f, 1.0f);
+        }
+
+        if (this->maxSpeedUpDown_ != 0)
+        {
+            if (direction.y < 0)
+                acceleration.y = direction.y * this->accelerationUpDown_ * clamp((this->maxSpeedUpDown_ - -velocity.y) / this->maxSpeedUpDown_, 0.0f, 1.0f);
+            else if (direction.y > 0)
+                acceleration.y = direction.y * this->accelerationUpDown_ * clamp((this->maxSpeedUpDown_ - velocity.y) / this->maxSpeedUpDown_, 0.0f, 1.0f);
+        }
+
+        this->ship_->setAcceleration(acceleration);
+
+        this->ship_->setBoost(false);
+        this->ship_->setSteeringDirection(Vector3::ZERO);
+    }
+
+    void Engine::addToSpaceShip(SpaceShip* ship)
+    {
+        this->ship_ = ship;
+        if (ship)
+            this->shipID_ = ship->getObjectID();
+    }
+
+    const Vector3& Engine::getDirection() const
+    {
+        if (this->ship_)
+            return this->ship_->getSteeringDirection();
+        else
+            return Vector3::ZERO;
+    }
+}
Index: code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.h	(revision 2254)
+++ code/branches/objecthierarchy2/src/orxonox/objects/items/Engine.h	(revision 2254)
@@ -0,0 +1,109 @@
+/*
+ *   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 _Engine_H__
+#define _Engine_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "Item.h"
+#include "objects/Tickable.h"
+#include "util/Math.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport Engine : public Item, public Tickable
+    {
+        public:
+            Engine(BaseObject* creator);
+            virtual ~Engine();
+
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            void registerVariables();
+
+            virtual void tick(float dt);
+
+            virtual void addToSpaceShip(SpaceShip* ship);
+            inline SpaceShip* getShip() const
+                { return this->ship_; }
+
+            inline void setBoostFactor(float factor)
+                { this->boostFactor_ = factor; }
+            inline float getBoostFactor() const
+                { return this->boostFactor_; }
+
+            inline void setSpeedFactor(float factor)
+                { this->speedFactor_ = factor; }
+            inline float getSpeedFactor() const
+                { return this->speedFactor_; }
+
+            inline void setMaxSpeedFront(float speed)
+                { this->maxSpeedFront_ = speed; }
+            inline void setMaxSpeedBack(float speed)
+                { this->maxSpeedBack_ = speed; }
+            inline void setMaxSpeedLeftRight(float speed)
+                { this->maxSpeedLeftRight_ = speed; }
+            inline void setMaxSpeedUpDown(float speed)
+                { this->maxSpeedUpDown_ = speed; }
+
+            inline void setAccelerationFront(float acceleration)
+                { this->accelerationFront_ = acceleration; }
+            inline void setAccelerationBrake(float acceleration)
+                { this->accelerationBrake_ = acceleration; }
+            inline void setAccelerationBack(float acceleration)
+                { this->accelerationBack_ = acceleration; }
+            inline void setAccelerationLeftRight(float acceleration)
+                { this->accelerationLeftRight_ = acceleration; }
+            inline void setAccelerationUpDown(float acceleration)
+                { this->accelerationUpDown_ = acceleration; }
+
+            virtual const Vector3& getDirection() const;
+
+        private:
+            void networkcallback_shipID();
+
+            SpaceShip* ship_;
+            unsigned int shipID_;
+
+            float boostFactor_;
+            float speedFactor_;
+
+            float maxSpeedFront_;
+            float maxSpeedBack_;
+            float maxSpeedLeftRight_;
+            float maxSpeedUpDown_;
+
+            float accelerationFront_;
+            float accelerationBrake_;
+            float accelerationBack_;
+            float accelerationLeftRight_;
+            float accelerationUpDown_;
+    };
+}
+
+#endif /* _Engine_H__ */
Index: code/branches/objecthierarchy2/src/orxonox/objects/items/Item.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/items/Item.cc	(revision 2254)
+++ code/branches/objecthierarchy2/src/orxonox/objects/items/Item.cc	(revision 2254)
@@ -0,0 +1,44 @@
+/*
+ *   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 "Item.h"
+
+#include "core/CoreIncludes.h"
+
+namespace orxonox
+{
+    Item::Item(BaseObject* creator) : BaseObject(creator), Synchronisable(creator)
+    {
+        RegisterObject(Item);
+    }
+
+    Item::~Item()
+    {
+    }
+}
Index: code/branches/objecthierarchy2/src/orxonox/objects/items/Item.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/items/Item.h	(revision 2254)
+++ code/branches/objecthierarchy2/src/orxonox/objects/items/Item.h	(revision 2254)
@@ -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:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _Item_H__
+#define _Item_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "core/BaseObject.h"
+#include "network/Synchronisable.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport Item : public BaseObject, public Synchronisable
+    {
+        public:
+            Item(BaseObject* creator);
+            virtual ~Item();
+    };
+}
+
+#endif /* _Item_H__ */
Index: code/branches/objecthierarchy2/src/orxonox/objects/items/MultiStateEngine.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/items/MultiStateEngine.cc	(revision 2254)
+++ code/branches/objecthierarchy2/src/orxonox/objects/items/MultiStateEngine.cc	(revision 2254)
@@ -0,0 +1,233 @@
+/*
+ *   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 "MultiStateEngine.h"
+
+#include "core/Core.h"
+#include "core/CoreIncludes.h"
+#include "core/XMLPort.h"
+#include "objects/worldentities/pawns/SpaceShip.h"
+
+namespace orxonox
+{
+    static const float FORWARD_EFFECT_VELOCITY_THRESHOLD = 20;
+
+    static const unsigned char STATE_ACTIVE  = 1;
+    static const unsigned char STATE_FORWARD = 2;
+    static const unsigned char STATE_BOOST   = 4;
+    static const unsigned char STATE_BRAKE   = 8;
+
+    CreateFactory(MultiStateEngine);
+
+    MultiStateEngine::MultiStateEngine(BaseObject* creator) : Engine(creator)
+    {
+        RegisterObject(MultiStateEngine);
+
+        this->state_ = 0;
+
+        this->registerVariables();
+    }
+
+    MultiStateEngine::~MultiStateEngine()
+    {
+        if (this->isInitialized() && !this->getShip())
+        {
+            // We have no ship, so the effects are not attached and won't be destroyed automatically
+            for (std::list<WorldEntity*>::const_iterator it = this->activeEffects_.begin(); it != this->activeEffects_.end(); ++it)
+                delete (*it);
+            for (std::list<WorldEntity*>::const_iterator it = this->forwardEffects_.begin(); it != this->forwardEffects_.end(); ++it)
+                delete (*it);
+            for (std::list<WorldEntity*>::const_iterator it = this->boostEffects_.begin(); it != this->boostEffects_.end(); ++it)
+                delete (*it);
+            for (std::list<WorldEntity*>::const_iterator it = this->brakeEffects_.begin(); it != this->brakeEffects_.end(); ++it)
+                delete (*it);
+        }
+    }
+
+    void MultiStateEngine::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(MultiStateEngine, XMLPort, xmlelement, mode);
+
+        XMLPortObject(MultiStateEngine, WorldEntity, "active",  addActiveEffect,  getActiveEffect,  xmlelement, mode);
+        XMLPortObject(MultiStateEngine, WorldEntity, "forward", addForwardEffect, getForwardEffect, xmlelement, mode);
+        XMLPortObject(MultiStateEngine, WorldEntity, "boost",   addBoostEffect,   getBoostEffect,   xmlelement, mode);
+        XMLPortObject(MultiStateEngine, WorldEntity, "brake",   addBrakeEffect,   getBrakeEffect,   xmlelement, mode);
+    }
+
+    void MultiStateEngine::registerVariables()
+    {
+        REGISTERDATA(this->state_, direction::toserver);
+    }
+
+    void MultiStateEngine::tick(float dt)
+    {
+        if (this->getShip())
+        {
+            if (this->getShip()->hasLocalController())
+            {
+                this->setObjectMode(direction::bidirectional);
+
+                const Vector3& direction = this->getDirection();
+                const Vector3& velocity = this->getShip()->getVelocity();
+
+                bool forward = (direction.z < 0 && velocity.z < -FORWARD_EFFECT_VELOCITY_THRESHOLD);
+                bool boost = (this->getShip()->getBoost() && forward);
+                bool brake = (direction.z > 0 && velocity.z < 0);
+                bool active = (direction != Vector3::ZERO && !brake);
+
+                if (active)
+                    this->state_ |= STATE_ACTIVE;
+                else
+                    this->state_ &= ~STATE_ACTIVE;
+
+                if (forward)
+                    this->state_ |= STATE_FORWARD;
+                else
+                    this->state_ &= ~STATE_FORWARD;
+
+                if (boost)
+                    this->state_ |= STATE_BOOST;
+                else
+                    this->state_ &= ~STATE_BOOST;
+
+                if (brake)
+                    this->state_ |= STATE_BRAKE;
+                else
+                    this->state_ &= ~STATE_BRAKE;
+            }
+
+            if (this->getShip()->hasLocalController() || Core::isMaster())
+            {
+                for (std::list<WorldEntity*>::const_iterator it = this->activeEffects_.begin(); it != this->activeEffects_.end(); ++it)
+                    (*it)->setMainState(this->state_ & STATE_ACTIVE);
+                for (std::list<WorldEntity*>::const_iterator it = this->forwardEffects_.begin(); it != this->forwardEffects_.end(); ++it)
+                    (*it)->setMainState(this->state_ & STATE_FORWARD);
+                for (std::list<WorldEntity*>::const_iterator it = this->boostEffects_.begin(); it != this->boostEffects_.end(); ++it)
+                    (*it)->setMainState(this->state_ & STATE_BOOST);
+                for (std::list<WorldEntity*>::const_iterator it = this->brakeEffects_.begin(); it != this->brakeEffects_.end(); ++it)
+                    (*it)->setMainState(this->state_ & STATE_BRAKE);
+            }
+        }
+
+        SUPER(MultiStateEngine, tick, dt);
+    }
+
+    void MultiStateEngine::addToSpaceShip(SpaceShip* ship)
+    {
+        Engine::addToSpaceShip(ship);
+
+        if (!ship)
+            return;
+
+        for (std::list<WorldEntity*>::const_iterator it = this->activeEffects_.begin(); it != this->activeEffects_.end(); ++it)
+            ship->attach(*it);
+        for (std::list<WorldEntity*>::const_iterator it = this->forwardEffects_.begin(); it != this->forwardEffects_.end(); ++it)
+            ship->attach(*it);
+        for (std::list<WorldEntity*>::const_iterator it = this->boostEffects_.begin(); it != this->boostEffects_.end(); ++it)
+            ship->attach(*it);
+        for (std::list<WorldEntity*>::const_iterator it = this->brakeEffects_.begin(); it != this->brakeEffects_.end(); ++it)
+            ship->attach(*it);
+    }
+
+    void MultiStateEngine::addActiveEffect(WorldEntity* effect)
+    {
+        this->activeEffects_.push_back(effect);
+        if (this->getShip())
+            this->getShip()->attach(effect);
+    }
+
+    void MultiStateEngine::addForwardEffect(WorldEntity* effect)
+    {
+        this->forwardEffects_.push_back(effect);
+        if (this->getShip())
+            this->getShip()->attach(effect);
+    }
+
+    void MultiStateEngine::addBoostEffect(WorldEntity* effect)
+    {
+        this->boostEffects_.push_back(effect);
+        if (this->getShip())
+            this->getShip()->attach(effect);
+    }
+
+    void MultiStateEngine::addBrakeEffect(WorldEntity* effect)
+    {
+        this->brakeEffects_.push_back(effect);
+        if (this->getShip())
+            this->getShip()->attach(effect);
+    }
+
+    WorldEntity* MultiStateEngine::getActiveEffect(unsigned int index) const
+    {
+        unsigned int i = 0;
+        for (std::list<WorldEntity*>::const_iterator it = this->activeEffects_.begin(); it != this->activeEffects_.end(); ++it)
+        {
+            if (i == index)
+                return (*it);
+            ++i;
+        }
+        return 0;
+    }
+
+    WorldEntity* MultiStateEngine::getForwardEffect(unsigned int index) const
+    {
+        unsigned int i = 0;
+        for (std::list<WorldEntity*>::const_iterator it = this->forwardEffects_.begin(); it != this->forwardEffects_.end(); ++it)
+        {
+            if (i == index)
+                return (*it);
+            ++i;
+        }
+        return 0;
+    }
+
+    WorldEntity* MultiStateEngine::getBoostEffect(unsigned int index) const
+    {
+        unsigned int i = 0;
+        for (std::list<WorldEntity*>::const_iterator it = this->boostEffects_.begin(); it != this->boostEffects_.end(); ++it)
+        {
+            if (i == index)
+                return (*it);
+            ++i;
+        }
+        return 0;
+    }
+
+    WorldEntity* MultiStateEngine::getBrakeEffect(unsigned int index) const
+    {
+        unsigned int i = 0;
+        for (std::list<WorldEntity*>::const_iterator it = this->brakeEffects_.begin(); it != this->brakeEffects_.end(); ++it)
+        {
+            if (i == index)
+                return (*it);
+            ++i;
+        }
+        return 0;
+    }
+}
Index: code/branches/objecthierarchy2/src/orxonox/objects/items/MultiStateEngine.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/items/MultiStateEngine.h	(revision 2254)
+++ code/branches/objecthierarchy2/src/orxonox/objects/items/MultiStateEngine.h	(revision 2254)
@@ -0,0 +1,70 @@
+/*
+ *   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 _MultiStateEngine_H__
+#define _MultiStateEngine_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "Engine.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport MultiStateEngine : public Engine
+    {
+        public:
+            MultiStateEngine(BaseObject* creator);
+            virtual ~MultiStateEngine();
+
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            void registerVariables();
+
+            virtual void tick(float dt);
+
+            virtual void addToSpaceShip(SpaceShip* ship);
+
+            void addActiveEffect(WorldEntity* effect);
+            void addForwardEffect(WorldEntity* effect);
+            void addBoostEffect(WorldEntity* effect);
+            void addBrakeEffect(WorldEntity* effect);
+
+            WorldEntity* getActiveEffect(unsigned int index) const;
+            WorldEntity* getForwardEffect(unsigned int index) const;
+            WorldEntity* getBoostEffect(unsigned int index) const;
+            WorldEntity* getBrakeEffect(unsigned int index) const;
+
+        private:
+            unsigned char state_;
+            std::list<WorldEntity*> activeEffects_;
+            std::list<WorldEntity*> forwardEffects_;
+            std::list<WorldEntity*> boostEffects_;
+            std::list<WorldEntity*> brakeEffects_;
+    };
+}
+
+#endif /* _MultiStateEngine_H__ */
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Backlight.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Backlight.cc	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Backlight.cc	(revision 2254)
@@ -43,5 +43,5 @@
     CreateFactory(Backlight);
 
-    Backlight::Backlight(BaseObject* creator) : Billboard(creator)
+    Backlight::Backlight(BaseObject* creator) : FadingBillboard(creator)
     {
         RegisterObject(Backlight);
@@ -53,6 +53,4 @@
         this->length_ = 1.0f;
         this->lifetime_ = 0.001f;
-        this->turnofftime_ = 0.5f;
-        this->bTurningOff_ = false;
         this->maxelements_ = 1;
 
@@ -102,5 +100,4 @@
         XMLPortParam(Backlight, "elements",      setMaxElements,   getMaxElements,   xmlelement, mode).defaultValues(10);
         XMLPortParam(Backlight, "lifetime",      setLifetime,      getLifetime,      xmlelement, mode).defaultValues(1.0f);
-        XMLPortParam(Backlight, "turnofftime",   setTurnOffTime,   getTurnOffTime,   xmlelement, mode).defaultValues(0.5f);
         XMLPortParam(Backlight, "trailmaterial", setTrailMaterial, getTrailMaterial, xmlelement, mode);
     }
@@ -117,8 +114,8 @@
     void Backlight::changedColour()
     {
-        Billboard::changedColour();
-
-        if (this->ribbonTrail_ && this->isActive() && this->tickcount_ >= 2)
-            this->ribbonTrail_->setInitialColour(0, this->getColour());
+        FadingBillboard::changedColour();
+
+        if (this->ribbonTrail_ && this->tickcount_ >= 2)
+            this->ribbonTrail_->setInitialColour(0, this->getFadedColour());
     }
 
@@ -165,18 +162,28 @@
     }
 
-    void Backlight::changedActivity()
-    {
-        SUPER(Backlight, changedActivity);
+    void Backlight::startturnonoff()
+    {
+        FadingBillboard::startturnonoff();
+
+        if (this->ribbonTrail_ && this->isActive() && this->isVisible())
+            this->ribbonTrail_->setVisible(true);
+    }
+
+    void Backlight::stopturnonoff()
+    {
+        this->postprocessingtime_ = max(0.0f, this->lifetime_ - this->turnofftime_);
+
+        FadingBillboard::stopturnonoff();
 
         if (this->ribbonTrail_)
-        {
-            if (this->isActive())
-                this->ribbonTrail_->setInitialColour(0, this->getColour());
-            else
-            {
-                this->bTurningOff_ = true;
-                this->turnofftimer_.setTimer(this->turnofftime_, false, this, createExecutor(createFunctor(&Backlight::stopturnoff)));
-            }
-        }
+            this->ribbonTrail_->setInitialColour(0, this->getFadedColour());
+    }
+
+    void Backlight::poststopturnonoff()
+    {
+        FadingBillboard::poststopturnonoff();
+
+        if (this->ribbonTrail_)
+            this->ribbonTrail_->setVisible(false);
     }
 
@@ -187,9 +194,4 @@
         this->update_width();
         this->update_length();
-    }
-
-    void Backlight::stopturnoff()
-    {
-        this->bTurningOff_ = false;
     }
 
@@ -212,7 +214,11 @@
         }
 
-        if (this->bTurningOff_ && this->ribbonTrail_)
-        {
-            this->ribbonTrail_->setInitialColour(0, this->ribbonTrail_->getInitialColour(0) - this->getColour() / this->turnofftime_ * dt);
+        SUPER(Backlight, tick, dt);
+
+        if (this->ribbonTrail_ && this->changedirection_ != 0)
+        {
+            // we use alpha_blend, only adjust alpha
+            const ColourValue& colour = this->getColour();
+            this->ribbonTrail_->setInitialColour(0, colour.r, colour.g, colour.b, this->getFadedColour().a);
         }
     }
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Backlight.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Backlight.h	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Backlight.h	(revision 2254)
@@ -31,11 +31,9 @@
 
 #include "OrxonoxPrereqs.h"
-#include "Billboard.h"
-#include "objects/Tickable.h"
-#include "tools/Timer.h"
+#include "FadingBillboard.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport Backlight : public Billboard, public Tickable
+    class _OrxonoxExport Backlight : public FadingBillboard
     {
         public:
@@ -47,5 +45,4 @@
 
             virtual void tick(float dt);
-            virtual void changedActivity();
             virtual void changedVisibility();
 
@@ -59,9 +56,4 @@
             inline float getLifetime() const
                 { return this->lifetime_; }
-
-            inline void setTurnOffTime(float turnofftime)
-                { this->turnofftime_ = turnofftime; }
-            inline float getTurnOffTime() const
-                { return this->turnofftime_; }
 
             inline void setLength(float length)
@@ -83,5 +75,7 @@
 
         private:
-            void stopturnoff();
+            virtual void startturnonoff();
+            virtual void stopturnonoff();
+            virtual void poststopturnonoff();
             virtual void changedColour();
             void update_width();
@@ -96,10 +90,7 @@
             float length_;
             float lifetime_;
-            float turnofftime_;
-            bool bTurningOff_;
             size_t maxelements_;
             std::string trailmaterial_;
             char tickcount_;
-            Timer<Backlight> turnofftimer_;
     };
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Billboard.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Billboard.cc	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Billboard.cc	(revision 2254)
@@ -94,4 +94,5 @@
         if (!this->billboard_.getBillboardSet())
         {
+/*
             if (this->getScene() && this->getScene()->getSceneManager() && (this->material_ != ""))
             {
@@ -101,4 +102,5 @@
                 this->billboard_.setVisible(this->isVisible());
             }
+*/
         }
         else
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Billboard.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Billboard.h	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Billboard.h	(revision 2254)
@@ -62,4 +62,7 @@
 
         protected:
+            inline BillboardSet& getBillboardSet()
+                { return this->billboard_; }
+
             virtual void changedColour();
 
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/CMakeLists.txt
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/CMakeLists.txt	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/CMakeLists.txt	(revision 2254)
@@ -8,4 +8,5 @@
   Billboard.cc
   BlinkingBillboard.cc
+  FadingBillboard.cc
   Light.cc
   Camera.cc
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2254)
@@ -48,5 +48,7 @@
         RegisterObject(ControllableEntity);
 
-        this->bControlled_ = false;
+        this->bHasLocalController_ = false;
+        this->bHasHumanController_ = false;
+
         this->server_overwrite_ = 0;
         this->client_overwrite_ = 0;
@@ -74,6 +76,6 @@
         if (this->isInitialized())
         {
-            if (this->bControlled_)
-                this->stopLocalControl();
+            if (this->bHasLocalController_)
+                this->stopLocalHumanControl();
 
             if (this->hud_)
@@ -156,8 +158,10 @@
         this->player_ = player;
         this->playerID_ = player->getObjectID();
-        this->bControlled_ = (player->isLocalPlayer() && player->isHumanPlayer());
-        if (this->bControlled_)
-        {
-            this->startLocalControl();
+        this->bHasLocalController_ = player->isLocalPlayer();
+        this->bHasHumanController_ = player->isHumanPlayer();
+
+        if (this->bHasLocalController_ && this->bHasHumanController_)
+        {
+            this->startLocalHumanControl();
 
             if (!Core::isMaster())
@@ -172,10 +176,11 @@
     void ControllableEntity::removePlayer()
     {
-        if (this->bControlled_)
-            this->stopLocalControl();
+        if (this->bHasLocalController_ && this->bHasHumanController_)
+            this->stopLocalHumanControl();
 
         this->player_ = 0;
         this->playerID_ = OBJECTID_UNKNOWN;
-        this->bControlled_ = false;
+        this->bHasLocalController_ = false;
+        this->bHasHumanController_ = false;
         this->setObjectMode(direction::toclient);
 
@@ -195,5 +200,5 @@
     }
 
-    void ControllableEntity::startLocalControl()
+    void ControllableEntity::startLocalHumanControl()
     {
 //        std::cout << this->getObjectID() << " ###### start local control" << std::endl;
@@ -214,5 +219,5 @@
     }
 
-    void ControllableEntity::stopLocalControl()
+    void ControllableEntity::stopLocalHumanControl()
     {
 //        std::cout << "###### stop local control" << std::endl;
@@ -237,5 +242,5 @@
                 this->server_position_ = this->node_->getPosition();
             }
-            else if (this->bControlled_)
+            else if (this->bHasLocalController_)
             {
 //                COUT(2) << "setting client position" << endl;
@@ -251,5 +256,5 @@
 
         REGISTERDATA(this->client_overwrite_,   direction::toserver);
-        
+
         REGISTERDATA(this->server_position_,    direction::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerPosition));
         REGISTERDATA(this->server_velocity_,    direction::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerVelocity));
@@ -267,5 +272,5 @@
     void ControllableEntity::processServerPosition()
     {
-        if (!this->bControlled_)
+        if (!this->bHasLocalController_)
             this->node_->setPosition(this->server_position_);
     }
@@ -273,5 +278,5 @@
     void ControllableEntity::processServerVelocity()
     {
-        if (!this->bControlled_)
+        if (!this->bHasLocalController_)
             this->velocity_ = this->server_velocity_;
     }
@@ -279,5 +284,5 @@
     void ControllableEntity::processServerOrientation()
     {
-        if (!this->bControlled_)
+        if (!this->bHasLocalController_)
             this->node_->setOrientation(this->server_orientation_);
     }
@@ -285,5 +290,5 @@
     void ControllableEntity::processOverwrite()
     {
-        if (this->bControlled_)
+        if (this->bHasLocalController_)
         {
             this->setPosition(this->server_position_);
@@ -334,5 +339,5 @@
             ++this->server_overwrite_;
         }
-        else if (this->bControlled_)
+        else if (this->bHasLocalController_)
         {
             this->node_->setPosition(position);
@@ -349,5 +354,5 @@
             ++this->server_overwrite_;
         }
-        else if (this->bControlled_)
+        else if (this->bHasLocalController_)
         {
             this->velocity_ = velocity;
@@ -364,5 +369,5 @@
             ++this->server_overwrite_;
         }
-        else if (this->bControlled_)
+        else if (this->bHasLocalController_)
         {
             this->node_->translate(distance, relativeTo);
@@ -379,5 +384,5 @@
             ++this->server_overwrite_;
         }
-        else if (this->bControlled_)
+        else if (this->bHasLocalController_)
         {
             this->node_->setOrientation(orientation);
@@ -394,5 +399,5 @@
             ++this->server_overwrite_;
         }
-        else if (this->bControlled_)
+        else if (this->bHasLocalController_)
         {
             this->node_->rotate(rotation, relativeTo);
@@ -409,5 +414,5 @@
             ++this->server_overwrite_;
         }
-        else if (this->bControlled_)
+        else if (this->bHasLocalController_)
         {
             this->node_->yaw(angle, relativeTo);
@@ -424,5 +429,5 @@
             ++this->server_overwrite_;
         }
-        else if (this->bControlled_)
+        else if (this->bHasLocalController_)
         {
             this->node_->pitch(angle, relativeTo);
@@ -439,5 +444,5 @@
             ++this->server_overwrite_;
         }
-        else if (this->bControlled_)
+        else if (this->bHasLocalController_)
         {
             this->node_->roll(angle, relativeTo);
@@ -454,5 +459,5 @@
             ++this->server_overwrite_;
         }
-        else if (this->bControlled_)
+        else if (this->bHasLocalController_)
         {
             this->node_->lookAt(target, relativeTo, localDirectionVector);
@@ -469,5 +474,5 @@
             ++this->server_overwrite_;
         }
-        else if (this->bControlled_)
+        else if (this->bHasLocalController_)
         {
             this->node_->setDirection(direction, relativeTo, localDirectionVector);
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2254)
@@ -68,4 +68,5 @@
             virtual void altFire() {}
 
+            virtual void boost() {}
             virtual void greet() {}
             virtual void use() {}
@@ -123,13 +124,15 @@
                 { return this->cameraPositionTemplate_; }
 
+            inline bool hasLocalController() const
+                { return this->bHasLocalController_; }
+            inline bool hasHumanController() const
+                { return this->bHasHumanController_; }
+
         protected:
-            virtual void startLocalControl();
-            virtual void stopLocalControl();
+            virtual void startLocalHumanControl();
+            virtual void stopLocalHumanControl();
 
             inline void setHudTemplate(const std::string& name)
                 { this->hudtemplate_ = name; }
-
-            inline bool isLocallyControlled() const
-                { return this->bControlled_; }
 
             Vector3 acceleration_;
@@ -154,5 +157,7 @@
             Vector3 velocity_;
 
-            bool bControlled_;
+            bool bHasLocalController_;
+            bool bHasHumanController_;
+
             Vector3 server_position_;
             Vector3 client_position_;
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/FadingBillboard.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/FadingBillboard.cc	(revision 2254)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/FadingBillboard.cc	(revision 2254)
@@ -0,0 +1,163 @@
+/*
+ *   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 "FadingBillboard.h"
+
+#include "core/CoreIncludes.h"
+#include "core/Executor.h"
+#include "core/XMLPort.h"
+
+namespace orxonox
+{
+    CreateFactory(FadingBillboard);
+
+    FadingBillboard::FadingBillboard(BaseObject* creator) : Billboard(creator)
+    {
+        RegisterObject(FadingBillboard);
+
+        this->turnontime_ = 0.0f;
+        this->turnofftime_ = 0.0f;
+        this->postprocessingtime_ = 0.0f;
+        this->changedirection_ = 0;
+
+        this->fadedColour_ = ColourValue::White;
+
+        this->registerVariables();
+    }
+
+    FadingBillboard::~FadingBillboard()
+    {
+    }
+
+    void FadingBillboard::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(FadingBillboard, XMLPort, xmlelement, mode);
+
+        XMLPortParam(FadingBillboard, "turnontime",  setTurnOnTime,  getTurnOnTime,  xmlelement, mode).defaultValues(0.5f);
+        XMLPortParam(FadingBillboard, "turnofftime", setTurnOffTime, getTurnOffTime, xmlelement, mode).defaultValues(0.5f);
+    }
+
+    void FadingBillboard::registerVariables()
+    {
+        REGISTERDATA(this->turnontime_,         direction::toclient);
+        REGISTERDATA(this->turnofftime_,        direction::toclient);
+    }
+
+    void FadingBillboard::changedColour()
+    {
+        Billboard::changedColour();
+
+        if (this->isActive())
+            this->fadedColour_ = this->getColour();
+        else
+            this->fadedColour_ = ColourValue::ZERO;
+
+        this->getBillboardSet().setColour(this->fadedColour_);
+    }
+
+    void FadingBillboard::changedActivity()
+    {
+        SUPER(FadingBillboard, changedActivity);
+
+        this->startturnonoff();
+    }
+
+    void FadingBillboard::changedVisibility()
+    {
+        SUPER(FadingBillboard, changedVisibility);
+
+        if (this->isVisible() && !this->isActive() && this->changedirection_ == 0)
+        {
+            // Billboard shouldn't be visible
+            this->getBillboardSet().setVisible(false);
+        }
+    }
+
+    void FadingBillboard::startturnonoff()
+    {
+        if (this->isActive())
+        {
+            this->changedirection_ = 1;
+            this->turnonofftimer_.setTimer(this->turnontime_, false, this, createExecutor(createFunctor(&FadingBillboard::stopturnonoff)));
+
+            if (this->isVisible())
+                this->getBillboardSet().setVisible(true);
+        }
+        else
+        {
+            this->changedirection_ = -1;
+            this->turnonofftimer_.setTimer(this->turnofftime_, false, this, createExecutor(createFunctor(&FadingBillboard::stopturnonoff)));
+        }
+    }
+
+    void FadingBillboard::stopturnonoff()
+    {
+        if (this->changedirection_ > 0)
+        {
+            this->fadedColour_ = this->getColour();
+            this->getBillboardSet().setColour(this->fadedColour_);
+        }
+        else if (this->changedirection_ < 0)
+        {
+            this->fadedColour_ = ColourValue::ZERO;
+            this->getBillboardSet().setColour(this->fadedColour_);
+            this->turnonofftimer_.setTimer(this->postprocessingtime_, false, this, createExecutor(createFunctor(&FadingBillboard::poststopturnonoff)));
+        }
+        this->changedirection_ = 0;
+    }
+
+    void FadingBillboard::poststopturnonoff()
+    {
+        this->getBillboardSet().setVisible(false);
+    }
+
+    void FadingBillboard::tick(float dt)
+    {
+        if (this->changedirection_ > 0 && (this->fadedColour_.a < this->getColour().a))
+        {
+            ColourValue colour = this->fadedColour_ + this->getColour() / this->turnontime_ * dt;
+
+            if (colour.a < this->getColour().a)
+            {
+                this->fadedColour_ = colour;
+                this->getBillboardSet().setColour(this->fadedColour_);
+            }
+        }
+        else if (this->changedirection_ < 0 && (this->fadedColour_.a > 0))
+        {
+            ColourValue colour = this->fadedColour_ - this->getColour() / this->turnofftime_ * dt;
+
+            if (colour.a > 0)
+            {
+                this->fadedColour_ = colour;
+                this->getBillboardSet().setColour(this->fadedColour_);
+            }
+        }
+    }
+}
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/FadingBillboard.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/FadingBillboard.h	(revision 2254)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/FadingBillboard.h	(revision 2254)
@@ -0,0 +1,80 @@
+/*
+ *   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 _FadingBillboard_H__
+#define _FadingBillboard_H__
+
+#include "OrxonoxPrereqs.h"
+#include "Billboard.h"
+#include "objects/Tickable.h"
+#include "tools/Timer.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport FadingBillboard : public Billboard, public Tickable
+    {
+        public:
+            FadingBillboard(BaseObject* creator);
+            virtual ~FadingBillboard();
+
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            void registerVariables();
+
+            virtual void tick(float dt);
+            virtual void changedActivity();
+            virtual void changedVisibility();
+
+            inline void setTurnOnTime(float turnontime)
+                { this->turnontime_ = turnontime; }
+            inline float getTurnOnTime() const
+                { return this->turnontime_; }
+
+            inline void setTurnOffTime(float turnofftime)
+                { this->turnofftime_ = turnofftime; }
+            inline float getTurnOffTime() const
+                { return this->turnofftime_; }
+
+            inline const ColourValue& getFadedColour() const
+                { return this->fadedColour_; }
+
+        protected:
+            virtual void startturnonoff();
+            virtual void stopturnonoff();
+            virtual void poststopturnonoff();
+            virtual void changedColour();
+
+            float turnontime_;
+            float turnofftime_;
+            float postprocessingtime_;
+            Timer<FadingBillboard> turnonofftimer_;
+            char changedirection_;
+            ColourValue fadedColour_;
+    };
+}
+
+#endif /* _FadingBillboard_H__ */
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Light.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Light.cc	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/Light.cc	(revision 2254)
@@ -163,5 +163,6 @@
     void Light::changedType()
     {
-        this->light_->setType(this->type_);
+        if (this->light_)
+            this->light_->setType(this->type_);
     }
 
@@ -170,5 +171,6 @@
         SUPER(Light, changedVisibility);
 
-        this->light_->setVisible(this->isVisible());
+        if (this->light_)
+            this->light_->setVisible(this->isVisible());
     }
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/WorldEntity.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2254)
@@ -76,4 +76,7 @@
                 delete (*it);
 
+            if (this->parent_)
+                this->detachFromParent();
+
             if (this->getScene()->getSceneManager())
                 this->getScene()->getSceneManager()->destroySceneNode(this->node_->getName());
@@ -100,4 +103,6 @@
     void WorldEntity::registerVariables()
     {
+        REGISTERSTRING(this->mainStateName_, direction::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::changedMainState));
+
         REGISTERDATA(this->bActive_,  direction::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::changedActivity));
         REGISTERDATA(this->bVisible_, direction::toclient, new NetworkCallback<WorldEntity>(this, &WorldEntity::changedVisibility));
@@ -122,4 +127,10 @@
     void WorldEntity::attach(WorldEntity* object)
     {
+        if (object == this)
+        {
+            COUT(2) << "Warning: Can't attach a WorldEntity to itself." << std::endl;
+            return;
+        }
+
         if (object->getParent())
             object->detachFromParent();
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/SpaceShip.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/SpaceShip.cc	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/SpaceShip.cc	(revision 2254)
@@ -32,6 +32,8 @@
 #include "core/CoreIncludes.h"
 #include "core/ConfigValueIncludes.h"
+#include "core/Template.h"
 #include "core/XMLPort.h"
 #include "util/Math.h"
+#include "objects/items/Engine.h"
 
 namespace orxonox
@@ -45,8 +47,9 @@
         this->zeroDegree_ = 0;
 
-        this->maxSpeed_ = 0;
-        this->maxSecondarySpeed_ = 0;
+        this->bBoost_ = false;
+        this->steering_ = Vector3::ZERO;
+        this->engine_ = 0;
+
         this->maxRotation_ = 0;
-        this->translationAcceleration_ = 0;
         this->rotationAcceleration_ = 0;
         this->translationDamping_ = 0;
@@ -66,4 +69,6 @@
     SpaceShip::~SpaceShip()
     {
+        if (this->isInitialized() && this->engine_)
+            delete this->engine_;
     }
 
@@ -72,8 +77,6 @@
         SUPER(SpaceShip, XMLPort, xmlelement, mode);
 
-        XMLPortParam(SpaceShip, "maxspeed",          setMaxSpeed,          getMaxSpeed,          xmlelement, mode);
-        XMLPortParam(SpaceShip, "maxsecondaryspeed", setMaxSecondarySpeed, getMaxSecondarySpeed, xmlelement, mode);
+        XMLPortParam(SpaceShip, "engine",            setEngineTemplate,    getEngineTemplate,    xmlelement, mode);
         XMLPortParam(SpaceShip, "maxrotation",       setMaxRotation,       getMaxRotation,       xmlelement, mode);
-        XMLPortParam(SpaceShip, "transacc",          setTransAcc,          getTransAcc,          xmlelement, mode);
         XMLPortParam(SpaceShip, "rotacc",            setRotAcc,            getRotAcc,            xmlelement, mode);
         XMLPortParam(SpaceShip, "transdamp",         setTransDamp,         getTransDamp,         xmlelement, mode);
@@ -82,8 +85,5 @@
     void SpaceShip::registerVariables()
     {
-        REGISTERDATA(this->maxSpeed_,                direction::toclient);
-        REGISTERDATA(this->maxSecondarySpeed_,       direction::toclient);
         REGISTERDATA(this->maxRotation_,             direction::toclient);
-        REGISTERDATA(this->translationAcceleration_, direction::toclient);
         REGISTERDATA(this->rotationAcceleration_,    direction::toclient);
         REGISTERDATA(this->translationDamping_,      direction::toclient);
@@ -97,5 +97,5 @@
     void SpaceShip::tick(float dt)
     {
-        if (this->isLocallyControlled())
+        if (this->hasLocalController())
         {
             // #####################################
@@ -104,16 +104,4 @@
 
             Vector3 velocity = this->getVelocity();
-            if (velocity.x > this->maxSecondarySpeed_)
-                velocity.x = this->maxSecondarySpeed_;
-            if (velocity.x < -this->maxSecondarySpeed_)
-                velocity.x = -this->maxSecondarySpeed_;
-            if (velocity.y > this->maxSecondarySpeed_)
-                velocity.y = this->maxSecondarySpeed_;
-            if (velocity.y < -this->maxSecondarySpeed_)
-                velocity.y = -this->maxSecondarySpeed_;
-            if (velocity.z > this->maxSecondarySpeed_)
-                velocity.z = this->maxSecondarySpeed_;
-            if (velocity.z < -this->maxSpeed_)
-                velocity.z = -this->maxSpeed_;
 
             // normalize velocity and acceleration
@@ -144,5 +132,5 @@
 
 
-        if (this->isLocallyControlled())
+        if (this->hasLocalController())
         {
             this->yaw(this->yawRotation_ * dt);
@@ -153,8 +141,4 @@
             this->roll(this->rollRotation_ * dt);
 
-            this->acceleration_.x = 0;
-            this->acceleration_.y = 0;
-            this->acceleration_.z = 0;
-
             this->yawRotation_   = this->zeroDegree_;
             this->pitchRotation_ = this->zeroDegree_;
@@ -165,15 +149,15 @@
     void SpaceShip::moveFrontBack(const Vector2& value)
     {
-        this->acceleration_.z = -this->translationAcceleration_ * value.x;
+        this->steering_.z = -value.x;
     }
 
     void SpaceShip::moveRightLeft(const Vector2& value)
     {
-        this->acceleration_.x = this->translationAcceleration_ * value.x;
+        this->steering_.x = value.x;
     }
 
     void SpaceShip::moveUpDown(const Vector2& value)
     {
-        this->acceleration_.y = this->translationAcceleration_ * value.x;
+        this->steering_.y = value.x;
     }
 
@@ -211,3 +195,37 @@
     {
     }
+
+    void SpaceShip::boost()
+    {
+        this->bBoost_ = true;
+    }
+
+    void SpaceShip::loadEngineTemplate()
+    {
+        if (this->enginetemplate_ != "")
+        {
+            Template* temp = Template::getTemplate(this->enginetemplate_);
+
+            if (temp)
+            {
+                Identifier* identifier = temp->getBaseclassIdentifier();
+
+                if (identifier)
+                {
+                    BaseObject* object = identifier->fabricate(this);
+                    this->engine_ = dynamic_cast<Engine*>(object);
+
+                    if (this->engine_)
+                    {
+                        this->engine_->addTemplate(temp);
+                        this->engine_->addToSpaceShip(this);
+                    }
+                    else
+                    {
+                        delete object;
+                    }
+                }
+            }
+        }
+    }
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/SpaceShip.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/SpaceShip.h	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/SpaceShip.h	(revision 2254)
@@ -56,13 +56,8 @@
 
             virtual void fire();
+            virtual void boost();
 
-            void setMaxSpeed(float value)
-                { this->maxSpeed_ = value; }
-            void setMaxSecondarySpeed(float value)
-                { this->maxSecondarySpeed_ = value; }
             void setMaxRotation(const Degree& value)
                 { this->maxRotation_ = value; }
-            void setTransAcc(float value)
-                { this->translationAcceleration_ = value; }
             void setRotAcc(const Degree& value)
                 { this->rotationAcceleration_ = value; }
@@ -70,12 +65,6 @@
                 { this->translationDamping_ = value; }
 
-            inline float getMaxSpeed() const
-                { return this->maxSpeed_; }
-            inline float getMaxSecondarySpeed() const
-                { return this->maxSecondarySpeed_; }
             inline float getMaxRotation() const
                 { return this->maxRotation_.valueDegrees(); }
-            inline float getTransAcc() const
-                { return this->translationAcceleration_; }
             inline float getRotAcc() const
                 { return this->rotationAcceleration_.valueDegrees(); }
@@ -83,10 +72,24 @@
                 { return this->translationDamping_; }
 
+            inline void setSteeringDirection(const Vector3& direction)
+                { this->steering_ = direction; }
+            inline const Vector3& getSteeringDirection() const
+                { return this->steering_; }
+
+            inline void setBoost(bool bBoost)
+                { this->bBoost_ = bBoost; }
+            inline bool getBoost() const
+                { return this->bBoost_; }
+
+            inline void setEngineTemplate(const std::string& temp)
+                { this->enginetemplate_ = temp; this->loadEngineTemplate(); }
+            inline const std::string& getEngineTemplate() const
+                { return this->enginetemplate_; }
+
         protected:
             bool bInvertYAxis_;
 
-            float maxSpeed_;
-            float maxSecondarySpeed_;
-            float translationAcceleration_;
+            bool bBoost_;
+            Vector3 steering_;
             float translationDamping_;
 
@@ -98,4 +101,10 @@
             Degree yawRotation_;
             Degree rollRotation_;
+
+        private:
+            void loadEngineTemplate();
+
+            std::string enginetemplate_;
+            Engine* engine_;
     };
 }
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.cc
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.cc	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.cc	(revision 2254)
@@ -106,5 +106,5 @@
         this->updateHUD();
 
-        if (this->isLocallyControlled())
+        if (this->hasLocalController())
         {
             Vector3 velocity = this->getVelocity();
@@ -121,5 +121,5 @@
         SUPER(Spectator, tick, dt);
 
-        if (this->isLocallyControlled())
+        if (this->hasLocalController())
         {
             this->setVelocity(Vector3::ZERO);
@@ -134,8 +134,8 @@
     }
 
-    void Spectator::startLocalControl()
-    {
-        ControllableEntity::startLocalControl();
-//        if (this->isLocallyControlled())
+    void Spectator::startLocalHumanControl()
+    {
+        ControllableEntity::startLocalHumanControl();
+//        if (this->hasLocalController())
 //            this->testmesh_->setVisible(false);
     }
Index: code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.h
===================================================================
--- code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.h	(revision 2213)
+++ code/branches/objecthierarchy2/src/orxonox/objects/worldentities/pawns/Spectator.h	(revision 2254)
@@ -46,5 +46,5 @@
 
             virtual void setPlayer(PlayerInfo* player);
-            virtual void startLocalControl();
+            virtual void startLocalHumanControl();
 
             virtual void moveFrontBack(const Vector2& value);
