Index: code/branches/modularships/src/orxonox/controllers/NewHumanController.cc
===================================================================
--- code/branches/modularships/src/orxonox/controllers/NewHumanController.cc	(revision 10055)
+++ code/branches/modularships/src/orxonox/controllers/NewHumanController.cc	(revision 10058)
@@ -220,5 +220,5 @@
                 if (!controlPaused_ )
                 {
-                    if (this->getControllableEntity() && (this->getControllableEntity()->isExactlyA(ClassByString("SpaceShip")) || this->getControllableEntity()->isExactlyA(ClassByString("Rocket"))))
+                    if (this->getControllableEntity() && ((this->getControllableEntity()->isExactlyA(ClassByString("SpaceShip")) || (this->getControllableEntity()->isExactlyA(ClassByString("ModularSpaceShip")))) || this->getControllableEntity()->isExactlyA(ClassByString("Rocket"))))
                         this->showOverlays();
                     else if (this->getControllableEntity() &&  this->getControllableEntity()->isExactlyA(ClassByString("FpsPlayer")))
@@ -498,5 +498,5 @@
         this->controlMode_ = 0;
         this->centerCursor();
-        if (this->getControllableEntity() && (this->getControllableEntity()->isExactlyA(ClassByString("SpaceShip")) || this->getControllableEntity()->isExactlyA(ClassByString("Rocket"))))
+        if (this->getControllableEntity() && ((this->getControllableEntity()->isExactlyA(ClassByString("SpaceShip")) || (this->getControllableEntity()->isExactlyA(ClassByString("ModularSpaceShip")))) || this->getControllableEntity()->isExactlyA(ClassByString("Rocket"))))
         {
             this->showOverlays_ = true;
Index: code/branches/modularships/src/orxonox/items/PartDestructionEvent.cc
===================================================================
--- code/branches/modularships/src/orxonox/items/PartDestructionEvent.cc	(revision 10055)
+++ code/branches/modularships/src/orxonox/items/PartDestructionEvent.cc	(revision 10058)
@@ -83,6 +83,4 @@
     void PartDestructionEvent::execute()
     {
-        orxout() << "Executing PartDestructionEvent " << this->getName() << endl;
-
         // Do not execute if this event is invalid
         if(!isValid())
@@ -109,4 +107,7 @@
                 this->parent_->getParent()->setBoostPowerRate(operate(this->parent_->getParent()->getBoostPowerRate()));
                 break;
+            case rotationthrust:
+                this->parent_->getParent()->setRotationThrust(operate(this->parent_->getParent()->getRotationThrust()));
+                break;
             default:
                 break;
@@ -120,21 +121,28 @@
             switch (this->targetParam_) {
             case null:
-                for(unsigned int i = 0; i < this->parent_->getParent()->getEngineList().size(); i++) // FIXME: (noep) segfault on .size()
-                {
-                    if(this->parent_->getParent()->getEngine(i)->getName() == this->targetName_)
-                    {
-                        orxout() << "engine found" << endl;
-                        this->parent_->getParent()->removeEngine(this->parent_->getParent()->getEngine(i));
-                        break;
-                    }
-                }
+                this->parent_->getParent()->removeEngine(this->parent_->getParent()->getEngineByName(targetName_));
                 break;
             case boostfactor:
-                for(unsigned int i = 0; i < this->parent_->getParent()->getEngineList().size(); i++)
-                {
-                    if(this->parent_->getParent()->getEngine(i)->getName() == this->targetName_)
-                        this->parent_->getParent()->getEngine(i)->setBoostFactor(operate(this->parent_->getParent()->getEngine(i)->getBoostFactor()));
-                    break;
-                }
+                this->parent_->getParent()->getEngineByName(targetName_)->setBoostFactor(operate(this->parent_->getParent()->getEngineByName(targetName_)->getBoostFactor()));
+                break;
+            case speedfront:
+                this->parent_->getParent()->getEngineByName(targetName_)->setMaxSpeedFront(operate(this->parent_->getParent()->getEngineByName(targetName_)->getMaxSpeedFront()));
+                break;
+            case accelerationfront:
+                this->parent_->getParent()->getEngineByName(targetName_)->setAccelerationFront(operate(this->parent_->getParent()->getEngineByName(targetName_)->getAccelerationFront()));
+                break;
+            default:
+                break;
+            }
+            this->setValid(false);
+            return;
+        }
+
+        if (this->targetType_ == "part")
+        {
+            switch (this->targetParam_) {
+            case null:
+                this->parent_->getParent()->getShipPartByName(targetName_)->setEventExecution(false);
+                this->parent_->getParent()->killShipPart(targetName_);
                 break;
             default:
@@ -159,5 +167,5 @@
     void PartDestructionEvent::setTargetType(std::string type)
     {
-        if ((type == "ship") || (type == "engine") || (type == "weapon"))
+        if ((type == "ship") || (type == "engine") || (type == "weapon") || (type == "part"))
         {
             this->targetType_ = type;
@@ -166,5 +174,5 @@
 
         // Error, if invalid target-type was entered.
-        orxout(internal_warning) << "\"" << type << "\" is not a valid target-type for a PartDestructionEvent. Valid types are: ship engine weapon" << endl;
+        orxout(internal_warning) << "\"" << type << "\" is not a valid target-type for a PartDestructionEvent. Valid types are: ship engine weapon part" << endl;
         this->setValid(false);
         return;
@@ -229,5 +237,5 @@
         // weapon:
 
-        // ship: shieldhealth (maxshieldhealth shieldabsorption shieldrechargerate) boostpower boostpowerrate
+        // ship: shieldhealth (maxshieldhealth shieldabsorption shieldrechargerate) boostpower boostpowerrate rotationthrust
         if (this->targetType_ == "ship")
         {
@@ -247,6 +255,23 @@
                 return;
             }
-
-            orxout(internal_warning) << "\"" << param << "\" is not a valid target-param for a PartDestructionEvent with target-type \"ship\". Valid types are: shieldhealth maxshieldhealth shieldabsorption shieldrechargerate boostpower boostpowerrate" << endl;
+            if (param == "rotationthrust")
+            {
+                this->targetParam_ = rotationthrust;
+                return;
+            }
+
+            orxout(internal_warning) << "\"" << param << "\" is not a valid target-param for a PartDestructionEvent with target-type \"ship\". Valid types are: shieldhealth maxshieldhealth shieldabsorption shieldrechargerate boostpower boostpowerrate rotationthrust" << endl;
+            return;
+        }
+
+        if (this->targetType_ == "part")
+        {
+            if (param == "NULL")
+            {
+                this->targetParam_ = null;
+                return;
+            }
+
+            orxout(internal_warning) << "\"" << param << "\" is not a valid target-param for a PartDestructionEvent with target-type \"part\". Valid types are: NULL (set operation to \"destroy\")" << endl;
             return;
         }
@@ -265,5 +290,5 @@
     {
         // * + - destroy
-        if ((operation == "*") || (operation == "+") || (operation == "-") || (operation == "destroy"))
+        if ((operation == "*") || (operation == "+") || (operation == "-") || (operation == "set") || (operation == "destroy"))
         {
             this->operation_ = operation;
@@ -271,5 +296,5 @@
         }
         this->operation_ = "NULL";
-        orxout(internal_warning) << "\"" << operation << "\" is not a valid operation for a PartDestructionEvent. Valid operations are: * + - destroy" << endl;
+        orxout(internal_warning) << "\"" << operation << "\" is not a valid operation for a PartDestructionEvent. Valid operations are: * + - set destroy" << endl;
     }
 
@@ -292,5 +317,7 @@
         The value which should be modified
     @return
-        Returns the product / sum / difference of input and configured value, or 0 if the operation is "destroy"
+        Returns the product / sum / difference of input and configured value,
+        the configured value if the operation is "set",
+        or 0 if the operation is "destroy"
     */
     float PartDestructionEvent::operate(float input)
@@ -302,4 +329,6 @@
         if (this->operation_ == "-")
             return input - this->value_;
+        if (this->operation_ == "set")
+            return this->value_;
         if (this->operation_ == "destroy")
         {
Index: code/branches/modularships/src/orxonox/items/PartDestructionEvent.h
===================================================================
--- code/branches/modularships/src/orxonox/items/PartDestructionEvent.h	(revision 10055)
+++ code/branches/modularships/src/orxonox/items/PartDestructionEvent.h	(revision 10058)
@@ -90,4 +90,5 @@
                 boostpower,         // Amount of available boost
                 boostpowerrate,     // Recharge-rate of boost
+                rotationthrust,
                 boostfactor,
                 speedfront,
Index: code/branches/modularships/src/orxonox/items/ShipPart.cc
===================================================================
--- code/branches/modularships/src/orxonox/items/ShipPart.cc	(revision 10055)
+++ code/branches/modularships/src/orxonox/items/ShipPart.cc	(revision 10058)
@@ -52,4 +52,5 @@
         RegisterObject(ShipPart);
         this->setAlive(true);
+        this->setEventExecution(true);
     }
 
@@ -103,9 +104,11 @@
         this->setAlive(false);
 
-        // Execute all destruction events
-        for (unsigned int i = 0; i < this->eventList_.size(); i++)
-        {
-            orxout() << "executing" << endl;
-            this->getDestructionEvent(i)->execute();
+        if(eventExecution_)
+        {
+            // Execute all destruction events
+            for (unsigned int i = 0; i < this->eventList_.size(); i++)
+            {
+                this->getDestructionEvent(i)->execute();
+            }
         }
 
Index: code/branches/modularships/src/orxonox/items/ShipPart.h
===================================================================
--- code/branches/modularships/src/orxonox/items/ShipPart.h	(revision 10055)
+++ code/branches/modularships/src/orxonox/items/ShipPart.h	(revision 10058)
@@ -78,4 +78,9 @@
                 { return this->alive_; }
 
+            inline void setEventExecution(bool var)
+                { this->eventExecution_ = var; }
+            inline bool isEventExecution()
+                { return this->eventExecution_; }
+
             virtual void setHealth(float health);
             inline void addHealth(float health)
@@ -114,4 +119,5 @@
 
             bool alive_;
+            bool eventExecution_;
 
 
Index: code/branches/modularships/src/orxonox/worldentities/StaticEntity.cc
===================================================================
--- code/branches/modularships/src/orxonox/worldentities/StaticEntity.cc	(revision 10055)
+++ code/branches/modularships/src/orxonox/worldentities/StaticEntity.cc	(revision 10058)
@@ -34,4 +34,5 @@
 #include "util/OrxAssert.h"
 #include "core/CoreIncludes.h"
+#include "worldentities/BigExplosion.h"
 
 namespace orxonox
@@ -115,3 +116,4 @@
         worldTrans.setRotation(btQuaternion(node_->getOrientation().x, node_->getOrientation().y, node_->getOrientation().z, node_->getOrientation().w));
     }
+
 }
Index: code/branches/modularships/src/orxonox/worldentities/pawns/ModularSpaceShip.cc
===================================================================
--- code/branches/modularships/src/orxonox/worldentities/pawns/ModularSpaceShip.cc	(revision 10055)
+++ code/branches/modularships/src/orxonox/worldentities/pawns/ModularSpaceShip.cc	(revision 10058)
@@ -40,4 +40,5 @@
 
 #include "items/ShipPart.h"
+#include "items/Engine.h"
 #include "worldentities/StaticEntity.h"
 #include "collisionshapes/WorldEntityCollisionShape.h"
@@ -230,4 +231,25 @@
     /**
     @brief
+        Looks for an attached ShipPart with a certain name.
+    @param name
+        The name of the ShipPart to be returned.
+    @return
+        Pointer to the ShipPart with the given name, or NULL if not found.
+    */
+    ShipPart* ModularSpaceShip::getShipPartByName(std::string name)
+    {
+        for(std::vector<ShipPart*>::iterator it = this->partList_.begin(); it != this->partList_.end(); ++it)
+        {
+            if(orxonox_cast<ShipPart*>(*it)->getName() == name)
+            {
+                return orxonox_cast<ShipPart*>(*it);
+            }
+        }
+        orxout(internal_warning) << "Couldn't find ShipPart with name \"" << name << "\"." << endl;
+        return NULL;
+    }
+
+    /**
+    @brief
         Check whether the SpaceShip has a particular Engine.
     @param engine
@@ -285,4 +307,25 @@
     /**
     @brief
+        Looks for an attached Engine with a certain name.
+    @param name
+        The name of the engine to be returned.
+    @return
+        Pointer to the engine with the given name, or NULL if not found.
+    */
+    Engine* ModularSpaceShip::getEngineByName(std::string name)
+    {
+        for(std::vector<Engine*>::iterator it = this->engineList_.begin(); it != this->engineList_.end(); ++it)
+        {
+            if(orxonox_cast<Engine*>(*it)->getName() == name)
+            {
+                return orxonox_cast<Engine*>(*it);
+            }
+        }
+        orxout(internal_warning) << "Couldn't find Engine with name \"" << name << "\"." << endl;
+        return NULL;
+    }
+
+    /**
+    @brief
         Detaches a child WorldEntity from this instance.
     */
@@ -297,5 +340,4 @@
 
         // collision shapes
-        orxout() << "MSS: detach()" << endl;
 
         //this->printBtChildShapes((btCompoundShape*)(this->getWorldEntityCollisionShape()->getCollisionShape()), 2, 0);
@@ -314,5 +356,4 @@
 
         object->notifyDetached();
-        orxout() << "MSS: detach() completed." << endl;
     }
 }
Index: code/branches/modularships/src/orxonox/worldentities/pawns/ModularSpaceShip.h
===================================================================
--- code/branches/modularships/src/orxonox/worldentities/pawns/ModularSpaceShip.h	(revision 10055)
+++ code/branches/modularships/src/orxonox/worldentities/pawns/ModularSpaceShip.h	(revision 10058)
@@ -117,7 +117,14 @@
             void addShipPart(ShipPart* part);
             ShipPart* getShipPart(unsigned int index);
+            ShipPart* getShipPartByName(std::string name);
             bool hasShipPart(ShipPart* part) const;
             void removeShipPart(ShipPart* part);
 
+            inline void setRotationThrust(float val)
+                { this->rotationThrust_ = val; }
+            inline float getRotationThrust()
+                { return this->rotationThrust_; }
+
+            Engine* getEngineByName(std::string name);
             void detach(WorldEntity* object);
 
Index: code/branches/modularships/src/orxonox/worldentities/pawns/SpaceShip.h
===================================================================
--- code/branches/modularships/src/orxonox/worldentities/pawns/SpaceShip.h	(revision 10055)
+++ code/branches/modularships/src/orxonox/worldentities/pawns/SpaceShip.h	(revision 10058)
@@ -270,4 +270,6 @@
             float stallSpeed_; //!< The forward speed where no more lift is added.
 
+            std::vector<Engine*> engineList_; //!< The list of all Engines mounted on this SpaceShip.
+
         private:
             void registerVariables();
@@ -284,6 +286,4 @@
             void backupCamera(); // Save the original position and orientation of the camera.
             void resetCamera(); // Reset the camera to its original position.
-
-            std::vector<Engine*> engineList_; //!< The list of all Engines mounted on this SpaceShip.
 
             Timer timer_;                          //!< Timer for the cooldown duration.
