Index: code/branches/ppspickups1/src/orxonox/interfaces/PickupCarrier.h
===================================================================
--- code/branches/ppspickups1/src/orxonox/interfaces/PickupCarrier.h	(revision 6551)
+++ code/branches/ppspickups1/src/orxonox/interfaces/PickupCarrier.h	(revision 6607)
@@ -48,9 +48,4 @@
 {
 
-    //! Pre-declarations.
-    class Pickup;
-    class HealthPickup;
-    class MetaPickup;
-
     /**
     @brief
@@ -66,9 +61,10 @@
         friend class HealthPickup;
         friend class MetaPickup;
-        
+        friend class SpeedPickup;
+
         public:
             PickupCarrier(); //!< Constructor.
             virtual ~PickupCarrier(); //!< Destructor.
-            
+
             /**
             @brief Can be called to pick up a Pickupable.
@@ -86,5 +82,5 @@
                     return pickedUp;
                 }
-                
+
             /**
             @brief Can be called to drop a Pickupable.
@@ -94,5 +90,5 @@
             */
             bool drop(Pickupable* pickup, bool drop = true)
-                { 
+                {
                     bool dropped = this->pickups_.erase(pickup) == 1;
                     if(dropped && drop)
@@ -103,5 +99,5 @@
                     return dropped;
                 }
-                
+
             /**
             @brief Can be used to check whether the PickupCarrier or a child of his is a target ot the input Pickupable.
@@ -113,5 +109,5 @@
                     if(pickup->isTarget(this)) //!< If the PickupCarrier itself is a target.
                         return true;
-                    
+
                     //! Go recursively through all children to check whether they are a target.
                     std::list<PickupCarrier*>* children = this->getCarrierChildren();
@@ -121,11 +117,11 @@
                             return true;
                     }
-                    
+
                     children->clear();
                     delete children;
-                    
+
                     return false;
                 }
-                
+
             /**
             @brief Get the carrier that is both a child of the PickupCarrier (or the PickupCarrier itself) and a target of the input Pickupable.
@@ -137,8 +133,8 @@
                     if(!this->isTarget(pickup))
                         return NULL;
-                    
+
                     if(pickup->isTarget(this)) //!< If the PickupCarrier itself is a target.
                         return this;
-                    
+
                     //! Go recursively through all children to check whether they are the target.
                     std::list<PickupCarrier*>* children = this->getCarrierChildren();
@@ -148,11 +144,11 @@
                             return *it;
                     }
-                    
+
                     children->clear();
                     delete children;
-                    
+
                     return NULL;
                 }
-                
+
             /**
             @brief Get the (absolute) position of the PickupCarrier.
@@ -161,11 +157,11 @@
             */
             virtual const Vector3& getCarrierPosition(void) = 0;
-            
-        protected:        
+
+        protected:
             /**
             @brief Get all direct children of this PickupSpawner.
                    This method needs to be implemented by any direct derivative class of PickupCarrier.
                    The returned list will be deleted by the methods calling this function.
-            @return Returns a pointer to a list of all direct children. 
+            @return Returns a pointer to a list of all direct children.
             */
             virtual std::list<PickupCarrier*>* getCarrierChildren(void) = 0;
@@ -176,5 +172,5 @@
             */
             virtual PickupCarrier* getCarrierParent(void) = 0;
-                            
+
             /**
             @brief Get all Pickupables this PickupCarrier has.
@@ -183,8 +179,8 @@
             std::set<Pickupable*>& getPickups(void)
                 { return this->pickups_; }
-        
+
         private:
             std::set<Pickupable*> pickups_; //!< The list of Pickupables carried by this PickupCarrier.
-            
+
     };
 }
Index: code/branches/ppspickups1/src/orxonox/items/Engine.cc
===================================================================
--- code/branches/ppspickups1/src/orxonox/items/Engine.cc	(revision 6551)
+++ code/branches/ppspickups1/src/orxonox/items/Engine.cc	(revision 6607)
@@ -64,4 +64,7 @@
         this->boostBlur_ = 0;
 
+        this->speedAdd_ = 0.0;
+        this->speedMultiply_ = 1.0;
+
         this->setConfigValues();
         this->registerVariables();
@@ -119,4 +122,7 @@
         registerVariable(this->accelerationLeftRight_, VariableDirection::ToClient);
         registerVariable(this->accelerationUpDown_,    VariableDirection::ToClient);
+
+        registerVariable(this->speedAdd_, VariableDirection::ToClient);
+        registerVariable(this->speedMultiply_, VariableDirection::ToClient);
     }
 
@@ -192,5 +198,5 @@
         }
 
-        this->ship_->setAcceleration(this->ship_->getOrientation() * acceleration);
+        this->ship_->setAcceleration(this->ship_->getOrientation() * (acceleration*this->getSpeedMultiply()+Vector3(0,0,-this->getSpeedAdd())));
 
         if (!this->ship_->getPermanentBoost())
@@ -241,3 +247,13 @@
             return Vector3::ZERO;
     }
+
+    PickupCarrier* Engine::getCarrierParent(void)
+    {
+        return this->ship_;
+    }
+
+    const Vector3& Engine::getCarrierPosition(void)
+    {
+        return this->ship_->getWorldPosition();
+    }
 }
Index: code/branches/ppspickups1/src/orxonox/items/Engine.h
===================================================================
--- code/branches/ppspickups1/src/orxonox/items/Engine.h	(revision 6551)
+++ code/branches/ppspickups1/src/orxonox/items/Engine.h	(revision 6607)
@@ -35,7 +35,9 @@
 #include "Item.h"
 
+#include "interfaces/PickupCarrier.h"
+
 namespace orxonox
 {
-    class _OrxonoxExport Engine : public Item, public Tickable
+    class _OrxonoxExport Engine : public Item, public Tickable, public PickupCarrier
     {
         public:
@@ -104,5 +106,23 @@
                 { return this->accelerationUpDown_; }
 
+            inline float getSpeedAdd(void)
+                { return this->speedAdd_; }
+            inline float getSpeedMultiply(void)
+                { return this->speedMultiply_; }
+
             virtual const Vector3& getDirection() const;
+
+            virtual const Vector3& getCarrierPosition(void);
+
+            /* not in protected ?? */
+            inline void setSpeedAdd(float speedAdd)
+                { this->speedAdd_=speedAdd; }
+            inline void setSpeedMultiply(float speedMultiply)
+                { this->speedMultiply_=speedMultiply; }
+
+        protected:
+            virtual std::list<PickupCarrier*>* getCarrierChildren(void)
+                { return new std::list<PickupCarrier*>(); }
+            virtual PickupCarrier* getCarrierParent(void);
 
         private:
@@ -114,4 +134,7 @@
             float boostFactor_;
             float speedFactor_;
+
+            float speedAdd_;
+            float speedMultiply_;
 
             float maxSpeedFront_;
Index: code/branches/ppspickups1/src/orxonox/worldentities/pawns/SpaceShip.cc
===================================================================
--- code/branches/ppspickups1/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 6551)
+++ code/branches/ppspickups1/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 6607)
@@ -220,3 +220,10 @@
             engine->addToSpaceShip(this);
     }
+
+    std::list<PickupCarrier*>* SpaceShip::getCarrierChildren(void)
+    {
+        std::list<PickupCarrier*>* list = new std::list<PickupCarrier*>();
+        list->push_front(engine_);
+        return list;
+    }
 }
Index: code/branches/ppspickups1/src/orxonox/worldentities/pawns/SpaceShip.h
===================================================================
--- code/branches/ppspickups1/src/orxonox/worldentities/pawns/SpaceShip.h	(revision 6551)
+++ code/branches/ppspickups1/src/orxonox/worldentities/pawns/SpaceShip.h	(revision 6607)
@@ -86,4 +86,5 @@
 
         protected:
+            virtual std::list<PickupCarrier*>* getCarrierChildren(void);
             bool bInvertYAxis_;
 
