Index: code/branches/bigships/src/orxonox/worldentities/ControllableEntity.cc
===================================================================
--- code/branches/bigships/src/orxonox/worldentities/ControllableEntity.cc	(revision 8136)
+++ code/branches/bigships/src/orxonox/worldentities/ControllableEntity.cc	(revision 8426)
@@ -84,5 +84,4 @@
         this->client_angular_velocity_ = Vector3::ZERO;
 
-
         this->setConfigValues();
         this->setPriority( Priority::VeryHigh );
Index: code/branches/bigships/src/orxonox/worldentities/ControllableEntity.h
===================================================================
--- code/branches/bigships/src/orxonox/worldentities/ControllableEntity.h	(revision 8136)
+++ code/branches/bigships/src/orxonox/worldentities/ControllableEntity.h	(revision 8426)
@@ -93,5 +93,11 @@
             virtual void reload() {}
 
-            virtual void boost() {}
+            /**
+            @brief Tells the ControllableEntity to either start or stop boosting.
+                   This doesn't mean, that the ControllableEntity will do so, there might be additional restrictions on boosting, but if it can, then it will.
+            @param bBoost If true the ControllableEntity is told to start boosting, if false it is told to stop.
+            */
+            virtual void boost(bool bBoost) {}
+            
             virtual void greet() {}
             virtual void switchCamera();
Index: code/branches/bigships/src/orxonox/worldentities/MobileEntity.cc
===================================================================
--- code/branches/bigships/src/orxonox/worldentities/MobileEntity.cc	(revision 8136)
+++ code/branches/bigships/src/orxonox/worldentities/MobileEntity.cc	(revision 8426)
@@ -143,8 +143,19 @@
     {
         if (this->isDynamic())
+		{
             this->physicalBody_->applyCentralForce(btVector3(acceleration.x * this->getMass(), acceleration.y * this->getMass(), acceleration.z * this->getMass()));
-
+		}
+
+		// If not bullet-managed (deprecated? SpaceShip doesn't use this anymore for movement)
         this->linearAcceleration_ = acceleration;
     }
+
+	void MobileEntity::addAcceleration(const Vector3 &acceleration, const Vector3 &relativePosition)
+	{
+		if(this->isDynamic())
+		{
+			this->physicalBody_->applyForce(this->getMass() * btVector3(acceleration.x, acceleration.y, acceleration.z), btVector3(relativePosition.x, relativePosition.y, relativePosition.z));
+		}
+	}
 
     void MobileEntity::setAngularAcceleration(const Vector3& acceleration)
Index: code/branches/bigships/src/orxonox/worldentities/MobileEntity.h
===================================================================
--- code/branches/bigships/src/orxonox/worldentities/MobileEntity.h	(revision 8136)
+++ code/branches/bigships/src/orxonox/worldentities/MobileEntity.h	(revision 8426)
@@ -70,4 +70,10 @@
                 { return this->linearAcceleration_; }
 
+			// Added for making N engines work with spaceships
+			void addAcceleration(const Vector3& acceleration, const Vector3 &relativePosition);
+			inline void addAcceleration(float x, float y, float z)
+				{ this->addAcceleration(Vector3(x, y, z), Vector3(0,0,0)); }
+			// Getter function above
+
             void setAngularAcceleration(const Vector3& acceleration);
             inline void setAngularAcceleration(float x, float y, float z)
Index: code/branches/bigships/src/orxonox/worldentities/pawns/SpaceShip.cc
===================================================================
--- code/branches/bigships/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 8136)
+++ code/branches/bigships/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 8426)
@@ -37,4 +37,8 @@
 #include "items/Engine.h"
 
+// New as of Booster integration
+#include "Scene.h"
+#include "tools/Shader.h"
+
 namespace orxonox
 {
@@ -53,7 +57,8 @@
         this->localAngularAcceleration_.setValue(0, 0, 0);
         this->bBoost_ = false;
-        this->bPermanentBoost_ = false;
         this->steering_ = Vector3::ZERO;
-        this->engine_ = 0;
+        //this->engine_ = 0;
+		
+        this->boostBlur_ = 0;
 
         this->boostPower_ = 10.0f;
@@ -74,4 +79,5 @@
         this->enableCollisionCallback();
 
+		this->engineTicksNotDone = 0;
         this->setConfigValues();
         this->registerVariables();
@@ -80,6 +86,9 @@
     SpaceShip::~SpaceShip()
     {
-        if (this->isInitialized() && this->engine_)
-            this->engine_->destroy();
+        if (this->isInitialized())
+            this->removeAllEngines();
+		
+        if (this->boostBlur_)
+            this->boostBlur_->destroy();
     }
 
@@ -88,5 +97,5 @@
         SUPER(SpaceShip, XMLPort, xmlelement, mode);
 
-        XMLPortParam(SpaceShip, "engine",            setEngineTemplate,    getEngineTemplate,    xmlelement, mode);
+        //XMLPortParam(SpaceShip, "engine",            setEngineTemplate,    getEngineTemplate,    xmlelement, mode);
         XMLPortParamVariable(SpaceShip, "primaryThrust",  primaryThrust_,  xmlelement, mode);
         XMLPortParamVariable(SpaceShip, "auxilaryThrust", auxilaryThrust_, xmlelement, mode);
@@ -96,4 +105,6 @@
         XMLPortParamVariable(SpaceShip, "boostRate", boostRate_, xmlelement, mode);
         XMLPortParamVariable(SpaceShip, "boostCooldownDuration", boostCooldownDuration_, xmlelement, mode);
+
+		XMLPortObject(SpaceShip, Engine, "engines", addEngine, getEngine, xmlelement, mode);
     }
 
@@ -103,4 +114,8 @@
         registerVariable(this->auxilaryThrust_, VariableDirection::ToClient);
         registerVariable(this->rotationThrust_, VariableDirection::ToClient);
+        registerVariable(this->boostPower_, VariableDirection::ToClient);
+        registerVariable(this->boostPowerRate_, VariableDirection::ToClient);
+        registerVariable(this->boostRate_, VariableDirection::ToClient);
+        registerVariable(this->boostCooldownDuration_, VariableDirection::ToClient);
     }
 
@@ -108,4 +123,10 @@
     {
         SetConfigValue(bInvertYAxis_, false).description("Set this to true for joystick-like mouse behaviour (mouse up = ship down).");
+		
+        SetConfigValueExternal(bEnableMotionBlur_, "GraphicsSettings", "enableMotionBlur", true)
+            .description("Enable or disable the motion blur effect when moving very fast")
+            .callback(this, &SpaceShip::changedEnableMotionBlur);
+        SetConfigValueExternal(blurStrength_, "GraphicsSettings", "blurStrength", 3.0f)
+            .description("Defines the strength of the motion blur effect");
     }
 
@@ -128,14 +149,5 @@
         if (this->hasLocalController())
         {
-/*
-            this->localLinearAcceleration_.setX(this->localLinearAcceleration_.x() * getMass() * this->auxilaryThrust_);
-            this->localLinearAcceleration_.setY(this->localLinearAcceleration_.y() * getMass() * this->auxilaryThrust_);
-            if (this->localLinearAcceleration_.z() > 0)
-                this->localLinearAcceleration_.setZ(this->localLinearAcceleration_.z() * getMass() * this->auxilaryThrust_);
-            else
-                this->localLinearAcceleration_.setZ(this->localLinearAcceleration_.z() * getMass() * this->primaryThrust_);
-            this->physicalBody_->applyCentralForce(physicalBody_->getWorldTransform().getBasis() * this->localLinearAcceleration_);
-            this->localLinearAcceleration_.setValue(0, 0, 0);
-*/
+			// Handle mouse look
             if (!this->isInMouseLook())
             {
@@ -143,11 +155,12 @@
                 this->physicalBody_->applyTorque(physicalBody_->getWorldTransform().getBasis() * this->localAngularAcceleration_);
             }
-
             this->localAngularAcceleration_.setValue(0, 0, 0);
 
+			// Charge boostPower
             if(!this->bBoostCooldown_ && this->boostPower_ < this->initialBoostPower_)
             {
                 this->boostPower_ += this->boostPowerRate_*dt;
             }
+			// Use boostPower
             if(this->bBoost_)
             {
@@ -160,4 +173,25 @@
                 }
             }
+
+			// Enable Blur depending on settings
+			if (this->bEnableMotionBlur_ && !this->boostBlur_ && this->hasLocalController() && this->hasHumanController())
+			{
+				this->boostBlur_ = new Shader(this->getScene()->getSceneManager());
+				this->boostBlur_->setCompositorName("Radial Blur");
+			}
+
+			if (this->boostBlur_) // && this->maxSpeedFront_ != 0 && this->boostFactor_ != 1)
+			{
+				// TODO: this->maxSpeedFront_ gets fastest engine
+				float blur = this->blurStrength_ * clamp((-this->getLocalVelocity().z - 0.0f /*this->maxSpeedFront_*/) / ((150.0f /*boostFactor_*/ - 1) * 1.5f /*this->maxSpeedFront_*/), 0.0f, 1.0f);
+
+				// Show and hide blur effect depending on state of booster
+				if(this->bBoost_)
+					this->boostBlur_->setVisible(blur > 0);
+				else
+					this->boostBlur_->setVisible(false);
+
+				this->boostBlur_->setParameter(0, 0, "sampleStrength", blur);
+			}
         }
     }
@@ -207,69 +241,99 @@
     }
 
-    // TODO: something seems to call this function every tick, could probably handled a little more efficiently!
-    void SpaceShip::setBoost(bool bBoost)
-    {
-        if(bBoost == this->bBoost_)
-            return;
-
-        if(bBoost)
-            this->boost();
-        else
+    void SpaceShip::fire()
+    {
+    }
+
+    /**
+    @brief
+        Starts or stops boosting.
+    @param bBoost
+        Whether to start or stop boosting.
+    */
+    void SpaceShip::boost(bool bBoost)
+    {
+        if(bBoost && !this->bBoostCooldown_)
+            this->bBoost_ = true;
+        if(!bBoost)
+            this->bBoost_ = false;
+    }
+
+	void SpaceShip::addEngine(orxonox::Engine* engine)
+	{
+		//COUT(0)<<"Adding an Engine: " << engine << endl;
+		this->engineList_.push_back(engine);
+		engine->addToSpaceShip(this);
+		this->resetEngineTicks();
+	}
+	bool SpaceShip::hasEngine(Engine* engine)
+	{
+		for(unsigned int i=0; i<this->engineList_.size(); i++)
+		{
+			if(this->engineList_[i]==engine)
+				return true;
+		}
+		return false;
+	}
+	Engine* SpaceShip::getEngine(unsigned int i)
+	{
+		if(this->engineList_.size()>=i)
+			return 0;
+		else
+			return this->engineList_[i];
+	}
+	void SpaceShip::removeAllEngines()
+	{
+		for(unsigned int i=0; i<this->engineList_.size(); i++)
+			this->engineList_[i]->~Engine();
+	}
+
+	void SpaceShip::setSpeedFactor(float factor)
+	{
+		for(unsigned int i=0; i<this->engineList_.size(); i++)
+			this->engineList_[i]->setSpeedFactor(factor);
+	}
+	float SpaceShip::getSpeedFactor() // Calculate mean SpeedFactor.
+	{
+		float ret = 0; unsigned int i = 0;
+		for(; i<this->engineList_.size(); i++)
+			ret += this->engineList_[i]->getSpeedFactor();
+		ret /= (float)i;
+		return ret;
+	}
+	float SpaceShip::getMaxSpeedFront()
+	{
+		float ret=0;
+		for(unsigned int i=0; i<this->engineList_.size(); i++)
+		{
+			if(this->engineList_[i]->getMaxSpeedFront() > ret)
+				ret = this->engineList_[i]->getMaxSpeedFront();
+		}
+		return ret;
+	}
+	float SpaceShip::getBoostFactor()
+	{
+		float ret = 0; unsigned int i=0;
+		for(; i<this->engineList_.size(); i++)
+			ret += this->engineList_[i]->getBoostFactor();
+		ret /= (float)i;
+		return ret;
+	}
+
+    std::vector<PickupCarrier*>* SpaceShip::getCarrierChildren(void) const
+    {
+        std::vector<PickupCarrier*>* list = new std::vector<PickupCarrier*>();
+		for(unsigned int i=0; i<this->engineList_.size(); i++)
+			list->push_back(this->engineList_[i]);
+        return list;
+    }
+	
+	void SpaceShip::changedEnableMotionBlur()
+    {
+        if (!this->bEnableMotionBlur_)
         {
-            this->bBoost_ = false;
+            this->boostBlur_->destroy();
+            this->boostBlur_ = 0;
         }
     }
 
-    void SpaceShip::fire()
-    {
-    }
-
-    void SpaceShip::boost()
-    {
-        if(!this->bBoostCooldown_)
-            this->bBoost_ = true;
-    }
-
-    void SpaceShip::loadEngineTemplate()
-    {
-        if (!this->enginetemplate_.empty())
-        {
-            Template* temp = Template::getTemplate(this->enginetemplate_);
-
-            if (temp)
-            {
-                Identifier* identifier = temp->getBaseclassIdentifier();
-
-                if (identifier)
-                {
-                    BaseObject* object = identifier->fabricate(this);
-                    this->engine_ = orxonox_cast<Engine*>(object);
-
-                    if (this->engine_)
-                    {
-                        this->engine_->addTemplate(temp);
-                        this->engine_->addToSpaceShip(this);
-                    }
-                    else
-                    {
-                        object->destroy();
-                    }
-                }
-            }
-        }
-    }
-
-    void SpaceShip::setEngine(Engine* engine)
-    {
-        this->engine_ = engine;
-        if (engine && engine->getShip() != this)
-            engine->addToSpaceShip(this);
-    }
-
-    std::vector<PickupCarrier*>* SpaceShip::getCarrierChildren(void) const
-    {
-        std::vector<PickupCarrier*>* list = new std::vector<PickupCarrier*>();
-        list->push_back(this->engine_);
-        return list;
-    }
 }
Index: code/branches/bigships/src/orxonox/worldentities/pawns/SpaceShip.h
===================================================================
--- code/branches/bigships/src/orxonox/worldentities/pawns/SpaceShip.h	(revision 8136)
+++ code/branches/bigships/src/orxonox/worldentities/pawns/SpaceShip.h	(revision 8426)
@@ -59,9 +59,17 @@
 
             virtual void fire();
-            virtual void boost();
+            virtual void boost(bool bBoost); // Starts or stops boosting.
 
-            void setEngine(Engine* engine);
-            inline Engine* getEngine() const
-                { return this->engine_; }
+			void addEngine(Engine* engine);
+			bool hasEngine(Engine* engine);
+			Engine* getEngine(unsigned int i); // This one's for XMLPort
+			inline const std::vector<Engine*>& getEngineList()
+				{ return this->engineList_; }
+			void removeAllEngines();
+
+			void setSpeedFactor(float factor);
+			float getSpeedFactor(); // Gets mean speed factor
+			float getMaxSpeedFront(); // gets largest speed forward
+			float getBoostFactor(); // gets mean boost factor
 
             inline void setSteeringDirection(const Vector3& direction)
@@ -69,18 +77,13 @@
             inline const Vector3& getSteeringDirection() const
                 { return this->steering_; }
+			inline void resetEngineTicks()
+				{ this->engineTicksNotDone = this->engineList_.size(); }
+			inline void oneEngineTickDone()
+				{ this->engineTicksNotDone--; }
+			inline const bool hasEngineTicksRemaining()
+				{ return (this->engineTicksNotDone>0); }
 
-            void setBoost(bool 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_; }
-
-            inline void setPermanentBoost(bool bPermanent)
-                { this->bPermanentBoost_ = bPermanent; }
-            inline bool getPermanentBoost() const
-                { return this->bPermanentBoost_; }
 
         protected:
@@ -90,5 +93,4 @@
             bool bBoost_;
             bool bBoostCooldown_;
-            bool bPermanentBoost_;
             float boostPower_;
             float initialBoostPower_;
@@ -106,11 +108,15 @@
             void registerVariables();
             virtual bool isCollisionTypeLegal(WorldEntity::CollisionType type) const;
-
-            void loadEngineTemplate();
             
+			//All things booster
+			void changedEnableMotionBlur();
             void boostCooledDown(void);
 
-            std::string enginetemplate_;
-            Engine* engine_;
+			Shader* boostBlur_;
+            float blurStrength_;
+            bool bEnableMotionBlur_;
+
+			std::vector<Engine*> engineList_;
+			int engineTicksNotDone; // Used for knowing when to reset temporary variables.
             Timer timer_;
     };
