Index: code/trunk/src/orxonox/CMakeLists.txt
===================================================================
--- code/trunk/src/orxonox/CMakeLists.txt	(revision 9265)
+++ code/trunk/src/orxonox/CMakeLists.txt	(revision 9348)
@@ -50,5 +50,4 @@
 ADD_SUBDIRECTORY(items)
 ADD_SUBDIRECTORY(overlays)
-ADD_SUBDIRECTORY(pickup)
 ADD_SUBDIRECTORY(sound)
 ADD_SUBDIRECTORY(weaponsystem)
Index: code/trunk/src/orxonox/CameraManager.cc
===================================================================
--- code/trunk/src/orxonox/CameraManager.cc	(revision 9265)
+++ code/trunk/src/orxonox/CameraManager.cc	(revision 9348)
@@ -48,4 +48,6 @@
     CameraManager::CameraManager()
     {
+        RegisterRootObject(CameraManager);
+
         assert(GameMode::showsGraphics());
     }
Index: code/trunk/src/orxonox/LevelInfo.cc
===================================================================
--- code/trunk/src/orxonox/LevelInfo.cc	(revision 9265)
+++ code/trunk/src/orxonox/LevelInfo.cc	(revision 9348)
@@ -42,5 +42,5 @@
 
     // LevelInfoItem
-    
+
     //! The list of allowed tags.
     /*static*/ std::set<std::string> LevelInfoItem::possibleTags_s = std::set<std::string>();
@@ -93,4 +93,5 @@
             LevelInfoItem::possibleTags_s.insert("gametype");
             LevelInfoItem::possibleTags_s.insert("minigame");
+            LevelInfoItem::possibleTags_s.insert("shipselection");
         }
     }
@@ -106,8 +107,23 @@
         SubString substr = SubString(tags, ",", " "); // Split the string into tags.
         const std::vector<std::string>& strings = substr.getAllStrings();
+        for (std::vector<std::string>::const_iterator it = strings.begin(); it != strings.end(); it++)
+            this->addTag(*it, false);
+
+        this->tagsUpdated();
+    }
+    /**
+    @brief
+        Set the starting ship models of the level
+    @param tags
+        A comma-seperated string of all the allowed ship models for the shipselection.
+    */
+    void LevelInfoItem::setStartingShips(const std::string& ships)
+    {
+        SubString substr = SubString(ships, ",", " "); // Split the string into tags.
+        const std::vector<std::string>& strings = substr.getAllStrings();
         for(std::vector<std::string>::const_iterator it = strings.begin(); it != strings.end(); it++)
-            this->addTag(*it, false);
-
-        this->tagsUpdated();
+            this->addStartingShip(*it, false);
+
+        this->startingshipsUpdated();
     }
 
@@ -137,4 +153,24 @@
     /**
     @brief
+        Add a ship model to allowed models for the shipselection
+    @param ship
+        The ship model to be added.
+    @param update
+        Whether the comma-seperated string of all ship models should be updated. Default is true.
+    @return
+        Returns true if the ship was successfully added, if the ship was already present it returns false.
+    */
+    bool LevelInfoItem::addStartingShip(const std::string& ship, bool update)
+    {
+        bool success = this->startingShips_.insert(ship).second;
+        if(update && success)
+            this->startingshipsUpdated();
+
+        return success;
+    }
+
+
+    /**
+    @brief
         Updates the comma-seperated string of all tags, if the set of tags has changed.
     */
@@ -155,4 +191,53 @@
     }
 
+    /**
+    @brief
+        Updates the comma-seperated string of all ships, if the set of tags has changed.
+    */
+    void LevelInfoItem::startingshipsUpdated(void)
+    {
+        std::stringstream stream;
+        std::set<std::string>::iterator temp;
+        for(std::set<std::string>::iterator it = this->startingShips_.begin(); it != this->startingShips_.end(); )
+        {
+            temp = it;
+            if(++it == this->startingShips_.end()) // If this is the last ship we don't add a comma.
+                stream << *temp;
+            else
+                stream << *temp << ", ";
+        }
+
+        this->startingShipsString_ = std::string(stream.str());
+    }
+
+    void LevelInfoItem::changeStartingShip(const std::string& model)
+    {
+        static std::string shipSelectionTag = "shipselection";
+        //HACK: Read Level XML File, find "shipselection", replace with ship model
+        std::string levelPath = "../levels/";
+        levelPath.append(this->getXMLFilename());
+        std::string tempPath = "../levels/";
+        tempPath.append("_temp.oxw");
+        orxout(user_status) << levelPath << endl;
+        orxout(user_status) << tempPath << endl;
+        std::ifstream myLevel (levelPath.c_str());
+        std::ofstream tempLevel (tempPath.c_str());
+        while(!myLevel.eof())
+        {
+            std::string buff;
+            std::getline(myLevel, buff);
+            std::string pawndesignString = "pawndesign=";
+            size_t found = buff.find(pawndesignString.append(shipSelectionTag));
+            if (found!= std::string::npos)
+                buff = buff.substr(0, found + 11) + model + buff.substr(found+11+shipSelectionTag.length(), std::string::npos);
+            tempLevel.write(buff.c_str(), buff.length());
+            tempLevel << std::endl;
+        }
+        myLevel.close();
+        tempLevel.close();
+        orxout(user_status) << "done" << endl;
+    }
+
+
     // LevelInfo
 
@@ -192,4 +277,5 @@
         XMLPortParam(LevelInfo, "screenshot", setScreenshot, getScreenshot, xmlelement, mode);
         XMLPortParam(LevelInfo, "tags", setTags, getTags, xmlelement, mode);
+        XMLPortParam(LevelInfo, "startingships", setStartingShips, getStartingShips, xmlelement, mode);
     }
 
@@ -207,4 +293,5 @@
         info->setScreenshot(this->getScreenshot());
         info->setTags(this->getTags());
+        info->setStartingShips(this->getStartingShips());
         return info;
     }
Index: code/trunk/src/orxonox/LevelInfo.h
===================================================================
--- code/trunk/src/orxonox/LevelInfo.h	(revision 9265)
+++ code/trunk/src/orxonox/LevelInfo.h	(revision 9348)
@@ -43,4 +43,6 @@
 
 #include "core/BaseObject.h"
+#include <iostream>
+#include <fstream>
 #include "core/OrxonoxClass.h"
 
@@ -77,5 +79,5 @@
             */
             inline const std::string& getName(void) const { return this->name_; } // tolua_export
-        
+
             /**
             @brief Set the screenshot of the Level.
@@ -116,4 +118,19 @@
             inline bool hasTag(const std::string& tag) const { return this->tags_.find(tag) != this->tags_.end(); } // tolua_export
 
+            void setStartingShips(const std::string& ships); //!< Set the starting ship models of the level
+            bool addStartingShip(const std::string& ship, bool update = true); //!< Add a model to shipselection
+            /**
+            @brief Get the set of starting ship models the Level allows
+            @return Returns a comma-seperated string of all the allowed ship models for the shipselection.
+            */
+            inline const std::string& getStartingShips(void) const
+                { return this->startingShipsString_; }
+            /**
+            @brief Get whether the Level allows a specific starting ship model
+            @param ship The ship model for which is checked.
+            @return Returns true if the Level allows the input ship model
+            */
+            inline bool hasStartingShip(const std::string& ship) const { return this->startingShips_.find(ship) != this->startingShips_.end(); } // tolua_export
+            inline void selectStartingShip(const std::string& ship) { this->changeStartingShip(ship); } // tolua_export
             /**
             @brief Get the XML-filename of the Level.
@@ -122,4 +139,5 @@
             inline const std::string& getXMLFilename(void) const { return this->xmlfilename_; } // tolua_export
 
+
         protected:
             /**
@@ -133,6 +151,7 @@
 
         private:
+            void changeStartingShip (const std::string& model);
+            void startingshipsUpdated(void); //!< Updates the comma-seperated string of all possible starting ships.
             void tagsUpdated(void); //!< Updates the comma-seperated string of all tags, if the set of tags has changed.
-
             static void initializeTags(void); //!< Initialize the set of allowed tags.
             /**
@@ -152,4 +171,6 @@
             std::set<std::string> tags_; //!< The set of tags the Level is tagged with.
             std::string tagsString_; //!< The comma-seperated string of all the tags the Level is tagged with.
+            std::set<std::string> startingShips_; //!< The set of starting ship models the Level allows.
+            std::string startingShipsString_; //!< The comma-seperated string of all the allowed ship models for the shipselection.
     }; // tolua_export
 
@@ -161,6 +182,6 @@
         - @b description The description of the level.
         - @b screenshot The screenshot of the level.
-        - @b tags A comma-seperated string of tags. Allowed tags are: <em>test</em>, <em>singleplayer</em>, <em>multiplayer</em>, <em>showcase</em>, <em>tutorial</em>, <em>presentation</em>.
-
+        - @b tags A comma-seperated string of tags. Allowed tags are: <em>test</em>, <em>singleplayer</em>, <em>multiplayer</em>, <em>showcase</em>, <em>tutorial</em>, <em>presentation</em>, <em>shipselection</em>.
+        - @b (optional) startingships The comma-seperated string of starting ship models
         An example would be:
         @code
@@ -176,5 +197,6 @@
     @author
         Damian 'Mozork' Frick
-
+    @edit
+        Matthias Hutter
     @ingroup Orxonox
     */
@@ -186,5 +208,5 @@
 
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Creates a LevelInfo object through XML.
-        
+
             /**
             @brief Set the screenshot of the Level.
@@ -223,7 +245,18 @@
             inline const std::string& getTags(void) const
                 { return this->LevelInfoItem::getTags(); }
+            /**
+            @brief Set the starting ship models of the level
+            @param A comma-seperated string of all the allowed ship models for the shipselection.
+            */
+            inline void setStartingShips(const std::string& ships)
+                { this->LevelInfoItem::setStartingShips(ships); }
+            /**
+            @brief Get the starting ship models of the level
+            @return Returns a comma-seperated string of all the allowed ship models for the shipselection.
+            */
+            inline const std::string& getStartingShips(void) const
+                { return this->LevelInfoItem::getStartingShips(); }
 
             LevelInfoItem* copy(void); //!< Copies the contents of this LevelInfo object to a new LevelInfoItem object.
-
     };
 
@@ -243,5 +276,5 @@
             }
     };
-    
+
 } // tolua_export
 
Index: code/trunk/src/orxonox/OrxonoxPrereqs.h
===================================================================
--- code/trunk/src/orxonox/OrxonoxPrereqs.h	(revision 9265)
+++ code/trunk/src/orxonox/OrxonoxPrereqs.h	(revision 9348)
@@ -109,4 +109,5 @@
     class TeamDeathmatch;
     class UnderAttack;
+    class TeamGametype;
 
     // graphics
@@ -150,7 +151,4 @@
     class OrxonoxOverlay;
     class OverlayGroup;
-
-    // pickup
-    class PickupIdentifier;
 
     //sound
Index: code/trunk/src/orxonox/Scene.cc
===================================================================
--- code/trunk/src/orxonox/Scene.cc	(revision 9265)
+++ code/trunk/src/orxonox/Scene.cc	(revision 9348)
@@ -258,6 +258,14 @@
     void Scene::setSkybox(const std::string& skybox)
     {
-        if (GameMode::showsGraphics() && this->sceneManager_)
-            this->sceneManager_->setSkyBox(true, skybox);
+        try
+        {
+            if (GameMode::showsGraphics() && this->sceneManager_)
+                this->sceneManager_->setSkyBox(true, skybox);
+        }
+        catch (const Ogre::Exception&)
+        {
+            orxout(internal_error) << "Could not load skybox '" << skybox << "':" << endl;
+            orxout(internal_error) << Exception::handleMessage() << endl;
+        }
 
         this->skybox_ = skybox;
Index: code/trunk/src/orxonox/controllers/FormationController.cc
===================================================================
--- code/trunk/src/orxonox/controllers/FormationController.cc	(revision 9265)
+++ code/trunk/src/orxonox/controllers/FormationController.cc	(revision 9348)
@@ -50,25 +50,25 @@
 {
 
-  SetConsoleCommand("FormationController", "formationflight",  &FormationController::formationflight);
-  SetConsoleCommand("FormationController", "masteraction",     &FormationController::masteraction);
-  SetConsoleCommand("FormationController", "followme",         &FormationController::followme);
-  SetConsoleCommand("FormationController", "passivebehaviour", &FormationController::passivebehaviour);
-  SetConsoleCommand("FormationController", "formationsize",    &FormationController::formationsize);
-
-
-
-
-  static const unsigned int STANDARD_MAX_FORMATION_SIZE = 9;
-  static const int RADIUS_TO_SEARCH_FOR_MASTERS = 5000;
-  static const float FORMATION_LENGTH =  110;
-  static const float FORMATION_WIDTH =  110;
-  static const int FREEDOM_COUNT = 4; //seconds the slaves in a formation will be set free when master attacks an enemy
-  static const float SPEED_MASTER = 0.6f;
-  static const float ROTATEFACTOR_MASTER = 0.2f;
-  static const float SPEED_FREE = 0.8f;
-  static const float ROTATEFACTOR_FREE = 0.8f;
-
-  FormationController::FormationController(BaseObject* creator) : Controller(creator)
-  {
+    SetConsoleCommand("FormationController", "formationflight",  &FormationController::formationflight);
+    SetConsoleCommand("FormationController", "masteraction",     &FormationController::masteraction);
+    SetConsoleCommand("FormationController", "followme",         &FormationController::followme);
+    SetConsoleCommand("FormationController", "passivebehaviour", &FormationController::passivebehaviour);
+    SetConsoleCommand("FormationController", "formationsize",    &FormationController::formationsize);
+
+
+
+
+    static const unsigned int STANDARD_MAX_FORMATION_SIZE = 9;
+    static const int RADIUS_TO_SEARCH_FOR_MASTERS = 5000;
+    static const float FORMATION_LENGTH =  110;
+    static const float FORMATION_WIDTH =  110;
+    static const int FREEDOM_COUNT = 4; //seconds the slaves in a formation will be set free when master attacks an enemy
+    static const float SPEED_MASTER = 0.6f;
+    static const float ROTATEFACTOR_MASTER = 0.2f;
+    static const float SPEED_FREE = 0.8f;
+    static const float ROTATEFACTOR_FREE = 0.8f;
+
+    FormationController::FormationController(BaseObject* creator) : Controller(creator)
+    {
         RegisterObject(FormationController);
 
@@ -91,9 +91,9 @@
         this->team_=-1;
         this->target_.setCallback(createFunctor(&FormationController::targetDied, this));
-  }
-
-  FormationController::~FormationController()
-  {
-    if (this->isInitialized())
+    }
+
+    FormationController::~FormationController()
+    {
+        if (this->isInitialized())
         {
             this->removeFromFormation();
@@ -123,7 +123,7 @@
             }
         }
-  }
-
-  void FormationController::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    }
+
+    void FormationController::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
         SUPER(FormationController, XMLPort, xmlelement, mode);
@@ -137,9 +137,9 @@
 
 
-  /**
+    /**
         @brief Activates / deactivates formationflight behaviour
         @param form activate formflight if form is true
     */
-  void FormationController::formationflight(const bool form)
+    void FormationController::formationflight(const bool form)
     {
         for (ObjectList<Pawn>::iterator it = ObjectList<Pawn>::begin(); it; ++it)
@@ -168,5 +168,5 @@
     }
 
-  /**
+    /**
         @brief Get all masters to do a "specific master action"
         @param action which action to perform (integer, so it can be called with a console command (tmp solution))
@@ -198,5 +198,5 @@
     }
 
-  /**
+    /**
         @brief Sets shooting behaviour of pawns.
         @param passive if true, bots won't shoot.
@@ -225,5 +225,5 @@
     }
 
-  /**
+    /**
         @brief Sets maximal formation size
         @param size maximal formation size.
@@ -280,7 +280,8 @@
         }
 
-        Vector2 coord = get2DViewdirection(this->getControllableEntity()->getPosition(), this->getControllableEntity()->getOrientation() * WorldEntity::FRONT, this->getControllableEntity()->getOrientation() * WorldEntity::UP, target);
+        Vector2 coord = get2DViewcoordinates(this->getControllableEntity()->getPosition(), this->getControllableEntity()->getOrientation() * WorldEntity::FRONT, this->getControllableEntity()->getOrientation() * WorldEntity::UP, target);
         float distance = (target - this->getControllableEntity()->getPosition()).length();
-
+        float rotateX = clamp(coord.x * 10, -1.0f, 1.0f);
+        float rotateY = clamp(coord.y * 10, -1.0f, 1.0f);
 
         if(this->state_ == FREE)
@@ -289,9 +290,9 @@
             {
                 // Multiply with ROTATEFACTOR_FREE to make them a bit slower
-                this->getControllableEntity()->rotateYaw(-1.0f * ROTATEFACTOR_FREE * sgn(coord.x) * coord.x*coord.x);
-                this->getControllableEntity()->rotatePitch(ROTATEFACTOR_FREE * sgn(coord.y) * coord.y*coord.y);
-            }
-
-            if (this->target_ && distance < 200 && this->getControllableEntity()->getVelocity().squaredLength() > this->target_->getVelocity().squaredLength())
+                this->getControllableEntity()->rotateYaw(-1.0f * ROTATEFACTOR_FREE * rotateX);
+                this->getControllableEntity()->rotatePitch(ROTATEFACTOR_FREE * rotateY);
+            }
+
+            if (this->target_ && distance <  200 && this->getControllableEntity()->getVelocity().squaredLength() > this->target_->getVelocity().squaredLength())
             {
               this->getControllableEntity()->moveFrontBack(-0.05f); // They don't brake with full power to give the player a chance
@@ -305,6 +306,6 @@
             if (this->target_ || distance > 10)
             {
-                this->getControllableEntity()->rotateYaw(-1.0f * ROTATEFACTOR_MASTER * sgn(coord.x) * coord.x*coord.x);
-                this->getControllableEntity()->rotatePitch(ROTATEFACTOR_MASTER * sgn(coord.y) * coord.y*coord.y);
+                this->getControllableEntity()->rotateYaw(-1.0f * ROTATEFACTOR_MASTER * rotateX);
+                this->getControllableEntity()->rotatePitch(ROTATEFACTOR_MASTER * rotateY);
             }
 
@@ -320,22 +321,22 @@
         {
 
-           this->getControllableEntity()->rotateYaw(-2.0f * ROTATEFACTOR_MASTER * sgn(coord.x) * coord.x*coord.x);
-           this->getControllableEntity()->rotatePitch(2.0f * ROTATEFACTOR_MASTER * sgn(coord.y) * coord.y*coord.y);
+            this->getControllableEntity()->rotateYaw(-2.0f * ROTATEFACTOR_MASTER * rotateX);
+            this->getControllableEntity()->rotatePitch(2.0f * ROTATEFACTOR_MASTER * rotateY);
 
             if (distance < 300)
             {
-		 if (bHasTargetOrientation_)
-		    {
-			copyTargetOrientation();
-		    }
+                if (bHasTargetOrientation_)
+                {
+                    copyTargetOrientation();
+                }
                 if (distance < 100)
-                {   //linear speed reduction
+                { //linear speed reduction
                     this->getControllableEntity()->moveFrontBack(distance/100.0f*0.4f*SPEED_MASTER);
-
-                } else this->getControllableEntity()->moveFrontBack(1.2f*SPEED_MASTER);
-
-            } else {
+                }
+                else
+                    this->getControllableEntity()->moveFrontBack(1.2f*SPEED_MASTER);
+            }
+            else
                 this->getControllableEntity()->moveFrontBack(1.2f*SPEED_MASTER + distance/300.0f);
-            }
         }
 
@@ -343,17 +344,17 @@
         {
             this->positionReached();
-	    bHasTargetOrientation_=false;
-        }
-    }
-
-
-
-  void FormationController::moveToTargetPosition()
+            bHasTargetOrientation_=false;
+        }
+    }
+
+
+
+    void FormationController::moveToTargetPosition()
     {
         this->moveToPosition(this->targetPosition_);
     }
 
-  //copy the Roll orientation of given Quaternion.
-  void FormationController::copyOrientation(const Quaternion& orient)
+    //copy the Roll orientation of given Quaternion.
+    void FormationController::copyOrientation(const Quaternion& orient)
     {
         //roll angle difference in radian
@@ -373,5 +374,5 @@
 
 
-   /**
+    /**
         @brief Unregisters a slave from its master. Initiated by a slave.
     */
@@ -463,9 +464,9 @@
         }
     }
- /**
+
+    /**
         @brief Commands the slaves of a master into a formation. Sufficiently fast not to be called within tick. Initiated by a master.
     */
-
-void FormationController::commandSlaves()
+    void FormationController::commandSlaves()
     {
         if(this->state_ != MASTER) return;
@@ -481,9 +482,9 @@
         }
         else
-	// formation:
+        // formation:
         {
             dest += 1.0f*orient*WorldEntity::BACK;
             Vector3 pos = Vector3::ZERO;
-	         bool left=true;
+            bool left=true;
             int i = 1;
 
@@ -683,9 +684,10 @@
 
         if (specificMasterActionHoldCount_ == 0)
-         {
+        {
             this->specificMasterAction_ = NONE;
             this->searchNewTarget();
-         }
-        else specificMasterActionHoldCount_--;
+        }
+        else
+            specificMasterActionHoldCount_--;
     }
 
@@ -711,10 +713,10 @@
     void FormationController::turn180()
     {
-            Vector2 coord = get2DViewdirection(this->getControllableEntity()->getPosition(), this->getControllableEntity()->getOrientation() * WorldEntity::FRONT, this->getControllableEntity()->getOrientation() * WorldEntity::UP, this->targetPosition_);
-
-            this->getControllableEntity()->rotateYaw(-2.0f * sgn(coord.x) * coord.x*coord.x);
-            this->getControllableEntity()->rotatePitch(2.0f * sgn(coord.y) * coord.y*coord.y);
-
-            this->getControllableEntity()->moveFrontBack(SPEED_MASTER);
+        Vector2 coord = get2DViewdirection(this->getControllableEntity()->getPosition(), this->getControllableEntity()->getOrientation() * WorldEntity::FRONT, this->getControllableEntity()->getOrientation() * WorldEntity::UP, this->targetPosition_);
+
+        this->getControllableEntity()->rotateYaw(-2.0f * sgn(coord.x) * coord.x*coord.x);
+        this->getControllableEntity()->rotatePitch(2.0f * sgn(coord.y) * coord.y*coord.y);
+
+        this->getControllableEntity()->moveFrontBack(SPEED_MASTER);
     }
 
@@ -734,6 +736,6 @@
     void FormationController::spin()
     {
-            this->moveToTargetPosition();
-            this->getControllableEntity()->rotateRoll(0.8f);
+        this->moveToTargetPosition();
+        this->getControllableEntity()->rotateRoll(0.8f);
     }
 
@@ -773,24 +775,19 @@
         if((humanPawn != NULL) && (allMasters.size() != 0))
         {
-                float posHuman = humanPawn->getPosition().length();
-                float distance = 0.0f;
-                float minDistance = FLT_MAX;
-                int index = 0;
-                int i = 0;
-
-                for(std::vector<FormationController*>::iterator it = allMasters.begin(); it != allMasters.end(); it++, i++)
-                    {
-                        if (!FormationController::sameTeam((*it)->getControllableEntity(), humanPawn, (*it)->getGametype())) continue;
-                        distance = posHuman - (*it)->getControllableEntity()->getPosition().length();
-                        if(distance < minDistance) index = i;
-                    }
-                allMasters[index]->followInit(humanPawn);
-            }
-
-    }
-
-
-
-
+            float posHuman = humanPawn->getPosition().length();
+            float distance = 0.0f;
+            float minDistance = FLT_MAX;
+            int index = 0;
+            int i = 0;
+
+            for(std::vector<FormationController*>::iterator it = allMasters.begin(); it != allMasters.end(); it++, i++)
+            {
+                if (!FormationController::sameTeam((*it)->getControllableEntity(), humanPawn, (*it)->getGametype())) continue;
+                distance = posHuman - (*it)->getControllableEntity()->getPosition().length();
+                if(distance < minDistance) index = i;
+            }
+            allMasters[index]->followInit(humanPawn);
+        }
+    }
 
     /**
@@ -814,5 +811,5 @@
     }
 
-   /**
+    /**
         @brief Master begins to follow a randomly chosen human player of the same team. Is a "specific master action".
     */
@@ -842,5 +839,5 @@
 
 
-  /**
+    /**
         @brief Master follows target with adjusted speed. Called within tick.
     */
@@ -854,5 +851,5 @@
 
 
-  void FormationController::setTargetPosition(const Vector3& target)
+    void FormationController::setTargetPosition(const Vector3& target)
     {
         this->targetPosition_ = target;
@@ -918,5 +915,5 @@
     }
 
-  void FormationController::forgetTarget()
+    void FormationController::forgetTarget()
     {
         this->target_ = 0;
@@ -924,5 +921,5 @@
     }
 
-   void FormationController::targetDied()
+    void FormationController::targetDied()
     {
         this->forgetTarget();
@@ -930,5 +927,5 @@
     }
 
-  bool FormationController::sameTeam(ControllableEntity* entity1, ControllableEntity* entity2, Gametype* gametype)
+    bool FormationController::sameTeam(ControllableEntity* entity1, ControllableEntity* entity2, Gametype* gametype)
     {
         if (entity1 == entity2)
@@ -1054,5 +1051,5 @@
             return;
 
-        Vector2 coord = get2DViewdirection(this->getControllableEntity()->getPosition(), this->getControllableEntity()->getOrientation() * WorldEntity::FRONT, this->getControllableEntity()->getOrientation() * WorldEntity::UP, target);
+        Vector2 coord = get2DViewcoordinates(this->getControllableEntity()->getPosition(), this->getControllableEntity()->getOrientation() * WorldEntity::FRONT, this->getControllableEntity()->getOrientation() * WorldEntity::UP, target);
         float distance = (target - this->getControllableEntity()->getPosition()).length();
 
@@ -1060,6 +1057,6 @@
             {
                 // Multiply with ROTATEFACTOR_FREE to make them a bit slower
-                this->getControllableEntity()->rotateYaw(-1.0f * ROTATEFACTOR_FREE * sgn(coord.x) * coord.x*coord.x);
-                this->getControllableEntity()->rotatePitch(ROTATEFACTOR_FREE * sgn(coord.y) * coord.y*coord.y);
+                this->getControllableEntity()->rotateYaw(-1.0f * ROTATEFACTOR_FREE * clamp(coord.x * 10, -1.0f, 1.0f));
+                this->getControllableEntity()->rotatePitch(ROTATEFACTOR_FREE * clamp(coord.y * 10, -1.0f, 1.0f));
                 this->getControllableEntity()->moveFrontBack(SPEED_FREE);
             }
Index: code/trunk/src/orxonox/controllers/FormationController.h
===================================================================
--- code/trunk/src/orxonox/controllers/FormationController.h	(revision 9265)
+++ code/trunk/src/orxonox/controllers/FormationController.h	(revision 9348)
Index: code/trunk/src/orxonox/controllers/NewHumanController.cc
===================================================================
--- code/trunk/src/orxonox/controllers/NewHumanController.cc	(revision 9265)
+++ code/trunk/src/orxonox/controllers/NewHumanController.cc	(revision 9348)
@@ -298,5 +298,5 @@
         //Used in HumanController for formationFlight
         HumanController::hit(originator,contactpoint,damage);
-        
+
         if (this->showDamageOverlay_ && !this->controlPaused_ && this->controllableEntity_ && !this->controllableEntity_->isInMouseLook())
         {
@@ -397,5 +397,5 @@
                 try
                 {
-                    wePtr = dynamic_cast<WorldEntity*>(Ogre::any_cast<OrxonoxClass*>(itr->movable->getUserAny()));
+                    wePtr = orxonox_cast<WorldEntity*>(Ogre::any_cast<OrxonoxClass*>(itr->movable->getUserAny()));
                 }
                 catch (...)
Index: code/trunk/src/orxonox/gamestates/GSRoot.cc
===================================================================
--- code/trunk/src/orxonox/gamestates/GSRoot.cc	(revision 9265)
+++ code/trunk/src/orxonox/gamestates/GSRoot.cc	(revision 9348)
@@ -76,6 +76,7 @@
         for (ObjectList<BaseObject>::iterator it = ObjectList<BaseObject>::begin(); it; ++it)
         {
-            if (dynamic_cast<Synchronisable*>(*it))
-                orxout(debug_output) << "object: " << it->getIdentifier()->getName() << " id: " << dynamic_cast<Synchronisable*>(*it)->getObjectID() << endl;
+            Synchronisable* synchronisable = orxonox_cast<Synchronisable*>(*it);
+            if (synchronisable)
+                orxout(debug_output) << "object: " << it->getIdentifier()->getName() << " id: " << synchronisable->getObjectID() << endl;
             else
                 orxout(debug_output) << "object: " << it->getIdentifier()->getName() << endl;
Index: code/trunk/src/orxonox/gametypes/Deathmatch.cc
===================================================================
--- code/trunk/src/orxonox/gametypes/Deathmatch.cc	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/Deathmatch.cc	(revision 9348)
@@ -114,7 +114,7 @@
     }
 
-    void Deathmatch::playerScored(PlayerInfo* player)
+    void Deathmatch::playerScored(PlayerInfo* player, int score)
     {
-        Gametype::playerScored(player);
+        Gametype::playerScored(player, score);
 
         if (player)
Index: code/trunk/src/orxonox/gametypes/Deathmatch.h
===================================================================
--- code/trunk/src/orxonox/gametypes/Deathmatch.h	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/Deathmatch.h	(revision 9348)
@@ -48,5 +48,5 @@
 
             virtual void pawnKilled(Pawn* victim, Pawn* killer = 0);
-            virtual void playerScored(PlayerInfo* player);
+            virtual void playerScored(PlayerInfo* player, int score = 1);
     };
 }
Index: code/trunk/src/orxonox/gametypes/Dynamicmatch.cc
===================================================================
--- code/trunk/src/orxonox/gametypes/Dynamicmatch.cc	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/Dynamicmatch.cc	(revision 9348)
@@ -31,16 +31,17 @@
 //Low; Codeoptimierung und Dokumentation
 
-/*
-short gaming manual:
-There are three different parties a player can belong to: victim, chaser or killer
-Every player starts as chaser. As long as there are not enough victims and killers, you can change your and other player's parties by shooting them.
-In order to win you have to earn as much points as possible:
-- as victim by escaping the chasers
-- as chaser by shooting the victim
-- as killer by killing the chasers
-
-
-What you shouldn't do is shooting at players of your own party. By doing so your score will decrease.
-P.S: If you don't want to be a victim: Get rid of your part by shooting a chaser.
+/**
+@brief
+    Short Gaming Manual:
+    There are three different parties a player can belong to: victim, chaser or killer
+    Every player starts as chaser. As long as there are not enough victims and killers, you can change your and other player's parties by shooting them.
+    In order to win you have to earn as much points as possible:
+    - as victim by escaping the chasers
+    - as chaser by shooting the victim
+    - as killer by killing the chasers
+
+
+    What you shouldn't do is shooting at players of your own party. By doing so your score will decrease.
+    P.S: If you don't want to be a victim: Get rid of your part by shooting a chaser.
 */
 #include "Dynamicmatch.h"
@@ -81,5 +82,5 @@
         this->numberOf[killer]=0;
         this->tutorial=true;
-        this->pointsPerTime=0.0f;
+        this->pointsPerTime=1.0f;
         this->setHUDTemplate("DynamicmatchHUD");
     }
@@ -95,5 +96,4 @@
             ColourValue(0.3f, 0.3f, 1.0f),  //piggycolour
             ColourValue(0.3f, 1.0f, 0.3f)   //killercolour  what about black: 0.0f, 0.0f, 0.0f
-
         };
         static std::vector<ColourValue> defaultcolours(colours, colours + sizeof(colours) / sizeof(ColourValue));
@@ -111,6 +111,6 @@
         if (victim && victim->getPlayer()) //&& originator && originator->getPlayer() ??
         {
-        int target= playerParty_[victim->getPlayer()];
-        int source= playerParty_[originator->getPlayer()];
+            int target = playerParty_[victim->getPlayer()];
+            int source = playerParty_[originator->getPlayer()];
 
             //Case: Not Enough Pigs: party change (= party management)
@@ -151,5 +151,5 @@
 
                 //Give new pig boost
-                SpaceShip* spaceship = dynamic_cast<SpaceShip*>(victim);
+                SpaceShip* spaceship = orxonox_cast<SpaceShip*>(victim);
                 this->grantPigBoost(spaceship);
             }
@@ -245,5 +245,5 @@
                 }
                 //Give new pig boost
-                SpaceShip* spaceship = dynamic_cast<SpaceShip*>(victim);
+                SpaceShip* spaceship = orxonox_cast<SpaceShip*>(victim);
                 this->grantPigBoost(spaceship);
             }
@@ -276,11 +276,7 @@
             else if (friendlyfire && (source == target))
             {
-                std::map<PlayerInfo*, Player>::iterator it = this->players_.find(originator->getPlayer());
-                if (it != this->players_.end())
-                    {
-                        it->second.frags_--;
-                    }
-            }
-        }// from far far away not to be removed!
+           	    this->playerScored(originator->getPlayer(), -1);
+            }
+        }
         return false; //default: no damage
     }
@@ -296,11 +292,7 @@
             if (playerParty_[originator->getPlayer()] == killer) //reward the killer
             {
-                std::map<PlayerInfo*, Player>::iterator it = this->players_.find(originator->getPlayer());
-                if (it != this->players_.end())
-                {
-                    it->second.frags_+=20; //value must be tested
-                }
-            }
-        return true;
+           	    this->playerScored(originator->getPlayer(), 25);
+            }
+            return true;
         }
         else return false;
@@ -309,5 +301,5 @@
     /**
     @brief
-        Grant the piggy a boost.
+        Grant the victim a boost.
     @param spaceship
         The SpaceShip to give the boost.
@@ -315,9 +307,11 @@
     void Dynamicmatch::grantPigBoost(SpaceShip* spaceship)
     {
-        // Give pig boost
+        // Give victim boost
         if (spaceship)
         {
+            WeakPtr<SpaceShip>* ptr = new WeakPtr<SpaceShip>(spaceship);
+            if(ptr == NULL)
+                return;
             spaceship->addSpeedFactor(5);
-            WeakPtr<SpaceShip>* ptr = new WeakPtr<SpaceShip>(spaceship);
             ExecutorPtr executor = createExecutor(createFunctor(&Dynamicmatch::resetSpeedFactor, this));
             executor->setDefaultValue(0, ptr);
@@ -374,9 +368,10 @@
 
         if (this->hasStarted() && !gameEnded_)
-        {   pointsPerTime =pointsPerTime + dt;
-            gameTime_ = gameTime_ - dt;
-            if (pointsPerTime > 2.0f)//hard coded!! should be changed
-            {
-                pointsPerTime=0.0f;
+        {
+            pointsPerTime = pointsPerTime + dt; //increase points
+            gameTime_ = gameTime_ - dt; // decrease game time
+            if (pointsPerTime > 2.0f) //hard coded points for victim! should be changed
+            {
+                pointsPerTime = 0.0f;
                 rewardPig();
             }
@@ -408,16 +403,14 @@
     }
 
+/**
+    @brief The reward function is called every 2 seconds via the tick function and makes the victim score points.
+*/
     void Dynamicmatch::rewardPig()
     {
         for (std::map< PlayerInfo*, int >::iterator it = this->playerParty_.begin(); it != this->playerParty_.end(); ++it) //durch alle Spieler iterieren und alle piggys finden
         {
-            if (it->second==piggy)
-            {
-                 //Spieler mit der Pig-party frags++
-                 std::map<PlayerInfo*, Player>::iterator it2 = this->players_.find(it->first);// still not sure if right syntax
-                 if (it2 != this->players_.end())
-                 {
-                     it2->second.frags_++;
-                 }
+            if (it->second==piggy)//Spieler mit der Pig-party frags++
+            {
+            	 this->playerScored(it->first);
             }
         }
@@ -426,5 +419,5 @@
     {
         std::map<PlayerInfo*, int>::const_iterator it_player = this->playerParty_.find(player);
-        Pawn* pawn = dynamic_cast<Pawn*>(player->getControllableEntity());
+        Pawn* pawn = orxonox_cast<Pawn*>(player->getControllableEntity());
             if (pawn)
             {
@@ -446,5 +439,5 @@
     {
         //pigs: 1 + every 6th player is a pig
-        if ( (1+this->getNumberOfPlayers()/6) > numberOf[piggy])
+        if ( (1 + getPlayerCount()/6) > numberOf[piggy])
         {
             notEnoughPigs=true;
@@ -495,5 +488,5 @@
         }
         //killers: every 4th player is a killer
-        if (getNumberOfPlayers()/4 > numberOf[killer])
+        if ( static_cast<unsigned int>(getPlayerCount()/4) > numberOf[killer])
         {
             notEnoughKillers=true;
Index: code/trunk/src/orxonox/gametypes/Dynamicmatch.h
===================================================================
--- code/trunk/src/orxonox/gametypes/Dynamicmatch.h	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/Dynamicmatch.h	(revision 9348)
@@ -81,5 +81,8 @@
             SpawnPoint* getBestSpawnPoint(PlayerInfo* player) const;
 
+
         protected:
+            inline int getPlayerCount() const
+                 { return this->numberOf[chaser] + numberOf[piggy] + this->numberOf[killer]; }
 
             std::map< PlayerInfo*, int > playerParty_; //player's parties are recorded here
Index: code/trunk/src/orxonox/gametypes/Gametype.cc
===================================================================
--- code/trunk/src/orxonox/gametypes/Gametype.cc	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/Gametype.cc	(revision 9348)
@@ -301,9 +301,9 @@
     }
 
-    void Gametype::playerScored(PlayerInfo* player)
+    void Gametype::playerScored(PlayerInfo* player, int score)
     {
         std::map<PlayerInfo*, Player>::iterator it = this->players_.find(player);
         if (it != this->players_.end())
-            it->second.frags_++;
+            it->second.frags_ += score;
     }
 
Index: code/trunk/src/orxonox/gametypes/Gametype.h
===================================================================
--- code/trunk/src/orxonox/gametypes/Gametype.h	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/Gametype.h	(revision 9348)
@@ -90,5 +90,5 @@
             virtual bool playerChangedName(PlayerInfo* player);
 
-            virtual void playerScored(PlayerInfo* player);
+            virtual void playerScored(PlayerInfo* player, int score = 1);
 
             virtual bool allowPawnHit(Pawn* victim, Pawn* originator = 0);
@@ -153,6 +153,11 @@
             virtual void resetTimer(float t);
 
+            /**
+            @brief Get number of Players in game.
+            */
             inline unsigned int getNumberOfPlayers() const
-                { return this->gtinfo_->getNumberOfPlayers(); }
+                { return this->players_.size(); }
+
+
 
         protected:
Index: code/trunk/src/orxonox/gametypes/LastManStanding.cc
===================================================================
--- code/trunk/src/orxonox/gametypes/LastManStanding.cc	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/LastManStanding.cc	(revision 9348)
@@ -211,5 +211,5 @@
             if(!player->getControllableEntity())
                 return;
-            Pawn* pawn = dynamic_cast<Pawn*>(player->getControllableEntity());
+            Pawn* pawn = orxonox_cast<Pawn*>(player->getControllableEntity());
             if(!pawn)
                 return;
Index: code/trunk/src/orxonox/gametypes/LastTeamStanding.cc
===================================================================
--- code/trunk/src/orxonox/gametypes/LastTeamStanding.cc	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/LastTeamStanding.cc	(revision 9348)
@@ -283,5 +283,5 @@
             if(!player->getControllableEntity())
                 return;
-            Pawn* pawn = dynamic_cast<Pawn*>(player->getControllableEntity());
+            Pawn* pawn = orxonox_cast<Pawn*>(player->getControllableEntity());
             if(!pawn)
                 return;
Index: code/trunk/src/orxonox/gametypes/Mission.cc
===================================================================
--- code/trunk/src/orxonox/gametypes/Mission.cc	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/Mission.cc	(revision 9348)
@@ -63,5 +63,5 @@
         {
             this->missionAccomplished_ = false;
-	    this->end();
+            this->end();
         }
     }
@@ -78,9 +78,9 @@
     {
         Gametype::end();
-	/*if (this->missionAccomplished_) 
+        /*if (this->missionAccomplished_)
             this->gtinfo_->sendAnnounceMessage("Mission accomplished!");
-	else
+        else
             this->gtinfo_->sendAnnounceMessage("Mission failed!");
-	 * */
+        */
     }
 
Index: code/trunk/src/orxonox/gametypes/TeamBaseMatch.cc
===================================================================
--- code/trunk/src/orxonox/gametypes/TeamBaseMatch.cc	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/TeamBaseMatch.cc	(revision 9348)
@@ -128,5 +128,5 @@
 
     // collect Points for killing oppenents
-    void TeamBaseMatch::playerScored(PlayerInfo* player)
+    void TeamBaseMatch::playerScored(PlayerInfo* player, int score)
     {
         int teamnr = this->getTeam(player);
Index: code/trunk/src/orxonox/gametypes/TeamBaseMatch.h
===================================================================
--- code/trunk/src/orxonox/gametypes/TeamBaseMatch.h	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/TeamBaseMatch.h	(revision 9348)
@@ -47,5 +47,5 @@
             virtual bool allowPawnDamage(Pawn* victim, Pawn* originator);
 
-            virtual void playerScored(PlayerInfo* player);
+            virtual void playerScored(PlayerInfo* player, int score = 1);
             virtual void showPoints();
             virtual void endGame();
Index: code/trunk/src/orxonox/gametypes/TeamDeathmatch.cc
===================================================================
--- code/trunk/src/orxonox/gametypes/TeamDeathmatch.cc	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/TeamDeathmatch.cc	(revision 9348)
@@ -30,7 +30,6 @@
 
 #include "core/CoreIncludes.h"
-#include "core/ConfigValueIncludes.h"
-#include "interfaces/TeamColourable.h"
-#include "worldentities/TeamSpawnPoint.h"
+#include "chat/ChatManager.h"
+#include "infos/PlayerInfo.h"
 #include "worldentities/pawns/Pawn.h"
 
@@ -39,193 +38,89 @@
     CreateUnloadableFactory(TeamDeathmatch);
 
-    TeamDeathmatch::TeamDeathmatch(BaseObject* creator) : Deathmatch(creator)
+    TeamDeathmatch::TeamDeathmatch(BaseObject* creator) : TeamGametype(creator)
     {
         RegisterObject(TeamDeathmatch);
-
-        this->teams_ = 2;
-
-        this->setConfigValues();
     }
 
-    void TeamDeathmatch::setConfigValues()
+    void TeamDeathmatch::start()
     {
-        SetConfigValue(teams_, 2);
+        TeamGametype::start();
 
-        static ColourValue colours[] =
-        {
-            ColourValue(1.0f, 0.3f, 0.3f),
-            ColourValue(0.3f, 0.3f, 1.0f),
-            ColourValue(0.3f, 1.0f, 0.3f),
-            ColourValue(1.0f, 1.0f, 0.0f)
-        };
-        static std::vector<ColourValue> defaultcolours(colours, colours + sizeof(colours) / sizeof(ColourValue));
+        std::string message("The match has started!");
+        ChatManager::message(message);
+    }
 
-        SetConfigValue(teamcolours_, defaultcolours);
+    void TeamDeathmatch::end()
+    {
+        TeamGametype::end();
+
+        std::string message("The match has ended.");
+        ChatManager::message(message);
     }
 
     void TeamDeathmatch::playerEntered(PlayerInfo* player)
     {
-        Deathmatch::playerEntered(player);
+        TeamGametype::playerEntered(player);
 
-        std::vector<unsigned int> playersperteam(this->teams_, 0);
-
-        for (std::map<PlayerInfo*, int>::iterator it = this->teamnumbers_.begin(); it != this->teamnumbers_.end(); ++it)
-            if (it->second < static_cast<int>(this->teams_) && it->second >= 0)
-                playersperteam[it->second]++;
-
-        unsigned int minplayers = static_cast<unsigned int>(-1);
-        size_t minplayersteam = 0;
-        for (size_t i = 0; i < this->teams_; ++i)
-        {
-            if (playersperteam[i] < minplayers)
-            {
-                minplayers = playersperteam[i];
-                minplayersteam = i;
-            }
-        }
-
-        this->teamnumbers_[player] = minplayersteam;
+        const std::string& message = player->getName() + " entered the game";
+        ChatManager::message(message);
     }
 
     bool TeamDeathmatch::playerLeft(PlayerInfo* player)
     {
-        bool valid_player = Deathmatch::playerLeft(player);
+        bool valid_player = TeamGametype::playerLeft(player);
 
         if (valid_player)
-            this->teamnumbers_.erase(player);
+        {
+            const std::string& message = player->getName() + " left the game";
+            ChatManager::message(message);
+        }
+
+        return valid_player;
+    }
+    bool TeamDeathmatch::playerChangedName(PlayerInfo* player)
+    {
+        bool valid_player = TeamGametype::playerChangedName(player);
+
+        if (valid_player)
+        {
+            const std::string& message = player->getOldName() + " changed name to " + player->getName();
+            ChatManager::message(message);
+        }
 
         return valid_player;
     }
 
-    bool TeamDeathmatch::allowPawnHit(Pawn* victim, Pawn* originator)
+    void TeamDeathmatch::pawnKilled(Pawn* victim, Pawn* killer)
     {
-        return (!this->pawnsAreInTheSameTeam(victim, originator) || !originator);
+        if (victim && victim->getPlayer())
+        {
+            std::string message;
+            if (killer)
+            {
+                if (killer->getPlayer())
+                    message = victim->getPlayer()->getName() + " was killed by " + killer->getPlayer()->getName();
+                else
+                    message = victim->getPlayer()->getName() + " was killed";
+            }
+            else
+                message = victim->getPlayer()->getName() + " died";
+
+            ChatManager::message(message);
+        }
+
+        Gametype::pawnKilled(victim, killer);
     }
 
-    bool TeamDeathmatch::allowPawnDamage(Pawn* victim, Pawn* originator)
+    void TeamDeathmatch::playerScored(PlayerInfo* player, int score)
     {
-        return (!this->pawnsAreInTheSameTeam(victim, originator) || !originator);
-    }
+        TeamGametype::playerScored(player, score);
 
-    bool TeamDeathmatch::allowPawnDeath(Pawn* victim, Pawn* originator)
-    {
-        return (!this->pawnsAreInTheSameTeam(victim, originator) || !originator);
-    }
-
-    SpawnPoint* TeamDeathmatch::getBestSpawnPoint(PlayerInfo* player) const
-    {
-        int desiredTeamNr = -1;
-        std::map<PlayerInfo*, int>::const_iterator it_player = this->teamnumbers_.find(player);
-        if (it_player != this->teamnumbers_.end())
-            desiredTeamNr = it_player->second;
-
-        // Only use spawnpoints of the own team (or non-team-spawnpoints)
-        std::set<SpawnPoint*> teamSpawnPoints = this->spawnpoints_;
-        for (std::set<SpawnPoint*>::iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); )
+        if (player)
         {
-            if ((*it)->isA(Class(TeamSpawnPoint)))
-            {
-                TeamSpawnPoint* tsp = orxonox_cast<TeamSpawnPoint*>(*it);
-                if (tsp && static_cast<int>(tsp->getTeamNumber()) != desiredTeamNr)
-                {
-                    teamSpawnPoints.erase(it++);
-                    continue;
-                }
-            }
-
-            ++it;
-        }
-
-        SpawnPoint* fallbackSpawnPoint = NULL;
-        if (teamSpawnPoints.size() > 0)
-        {
-            unsigned int randomspawn = static_cast<unsigned int>(rnd(static_cast<float>(teamSpawnPoints.size())));
-            unsigned int index = 0;
-            // Get random fallback spawnpoint in case there is no active SpawnPoint.
-            for (std::set<SpawnPoint*>::const_iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); ++it)
-            {
-                if (index == randomspawn)
-                {
-                    fallbackSpawnPoint = (*it);
-                    break;
-                }
-
-                ++index;
-            }
-
-            // Remove all inactive SpawnPoints from the list.
-            for (std::set<SpawnPoint*>::iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); )
-            {
-                if(!(*it)->isActive())
-                {
-                    teamSpawnPoints.erase(it++);
-                    continue;
-                }
-
-                ++it;
-            }
-
-            randomspawn = static_cast<unsigned int>(rnd(static_cast<float>(teamSpawnPoints.size())));
-            index = 0;
-            for (std::set<SpawnPoint*>::const_iterator it = teamSpawnPoints.begin(); it != teamSpawnPoints.end(); ++it)
-            {
-                if (index == randomspawn)
-                    return (*it);
-
-                ++index;
-            }
-
-            return fallbackSpawnPoint;
-        }
-
-        return 0;
-    }
-
-    void TeamDeathmatch::playerStartsControllingPawn(PlayerInfo* player, Pawn* pawn)
-    {
-        if (!player)
-            return;
-
-        // Set the team colour
-        std::map<PlayerInfo*, int>::const_iterator it_player = this->teamnumbers_.find(player);
-        if (it_player != this->teamnumbers_.end() && it_player->second >= 0 && it_player->second < static_cast<int>(this->teamcolours_.size()))
-        {
-            if (pawn)
-            {
-                pawn->setRadarObjectColour(this->teamcolours_[it_player->second]);
-
-                std::set<WorldEntity*> pawnAttachments = pawn->getAttachedObjects();
-                for (std::set<WorldEntity*>::iterator it = pawnAttachments.begin(); it != pawnAttachments.end(); ++it)
-                {
-                    if ((*it)->isA(Class(TeamColourable)))
-                    {
-                        TeamColourable* tc = orxonox_cast<TeamColourable*>(*it);
-                        tc->setTeamColour(this->teamcolours_[it_player->second]);
-                    }
-                }
-            }
+            const std::string& message = player->getName() + " scores!";
+            ChatManager::message(message);
         }
     }
 
-    bool TeamDeathmatch::pawnsAreInTheSameTeam(Pawn* pawn1, Pawn* pawn2)
-    {
-        if (pawn1 && pawn2)
-        {
-            std::map<PlayerInfo*, int>::const_iterator it1 = this->teamnumbers_.find(pawn1->getPlayer());
-            std::map<PlayerInfo*, int>::const_iterator it2 = this->teamnumbers_.find(pawn2->getPlayer());
-
-            if (it1 != this->teamnumbers_.end() && it2 != this->teamnumbers_.end())
-                return (it1->second == it2->second);
-        }
-        return false;
-    }
-
-    int TeamDeathmatch::getTeam(PlayerInfo* player)
-    {
-        std::map<PlayerInfo*, int>::const_iterator it_player = this->teamnumbers_.find(player);
-        if (it_player != this->teamnumbers_.end())
-            return it_player->second;
-        else
-            return -1;
-    }
 }
Index: code/trunk/src/orxonox/gametypes/TeamDeathmatch.h
===================================================================
--- code/trunk/src/orxonox/gametypes/TeamDeathmatch.h	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/TeamDeathmatch.h	(revision 9348)
@@ -31,12 +31,9 @@
 
 #include "OrxonoxPrereqs.h"
-
-#include <map>
-#include <vector>
-#include "Deathmatch.h"
+#include "TeamGametype.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport TeamDeathmatch : public Deathmatch
+    class _OrxonoxExport TeamDeathmatch : public TeamGametype
     {
         public:
@@ -44,26 +41,12 @@
             virtual ~TeamDeathmatch() {}
 
-            void setConfigValues();
-
+            virtual void start();
+            virtual void end();
             virtual void playerEntered(PlayerInfo* player);
             virtual bool playerLeft(PlayerInfo* player);
+            virtual bool playerChangedName(PlayerInfo* player);
 
-            virtual bool allowPawnHit(Pawn* victim, Pawn* originator = 0);
-            virtual bool allowPawnDamage(Pawn* victim, Pawn* originator = 0);
-            virtual bool allowPawnDeath(Pawn* victim, Pawn* originator = 0);
-
-            virtual void playerStartsControllingPawn(PlayerInfo* player, Pawn* pawn);
-
-            int getTeam(PlayerInfo* player);
-            inline const ColourValue& getTeamColour(int teamnr) const
-                { return this->teamcolours_[teamnr]; }
-
-        protected:
-            virtual SpawnPoint* getBestSpawnPoint(PlayerInfo* player) const;
-            bool pawnsAreInTheSameTeam(Pawn* pawn1, Pawn* pawn2);
-
-            std::map<PlayerInfo*, int> teamnumbers_;
-            std::vector<ColourValue> teamcolours_;
-            unsigned int teams_;
+            virtual void pawnKilled(Pawn* victim, Pawn* killer = 0);
+            virtual void playerScored(PlayerInfo* player, int score = 1);
     };
 }
Index: code/trunk/src/orxonox/gametypes/TeamGametype.cc
===================================================================
--- code/trunk/src/orxonox/gametypes/TeamGametype.cc	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/TeamGametype.cc	(revision 9348)
@@ -89,4 +89,9 @@
     }
 
+    /**
+    @brief
+        Function that determines the player's team number when entering the game for the first time.
+        Override this function for other team structures.
+    */
     void TeamGametype::findAndSetTeam(PlayerInfo* player)
     {
@@ -130,5 +135,4 @@
             this->allowedInGame_.erase(player);
         }
-
 
         return valid_player;
Index: code/trunk/src/orxonox/gametypes/UnderAttack.cc
===================================================================
--- code/trunk/src/orxonox/gametypes/UnderAttack.cc	(revision 9265)
+++ code/trunk/src/orxonox/gametypes/UnderAttack.cc	(revision 9348)
@@ -49,6 +49,4 @@
         this->gameEnded_ = false;
 
-        //this->setHUDTemplate("UnderAttackHUD"); 
-        //This HUD is in conflict with the HUDEnemyHealthBar
         this->setConfigValues();
         this->timesequence_ = static_cast<int>(this->gameTime_);
Index: code/trunk/src/orxonox/infos/GametypeInfo.cc
===================================================================
--- code/trunk/src/orxonox/infos/GametypeInfo.cc	(revision 9265)
+++ code/trunk/src/orxonox/infos/GametypeInfo.cc	(revision 9348)
@@ -68,5 +68,5 @@
     {
         RegisterObject(GametypeInfo);
-        
+
         this->bStarted_ = false;
         this->bEnded_ = false;
@@ -165,9 +165,9 @@
         if(this->bStarted_)
            { return;}
-        
+
         this->bStarted_ = true;
         this->changedStarted();
-        
-       
+
+
     }
 
@@ -195,5 +195,5 @@
         if(this->startCountdown_ == countdown || countdown < 0.0f)
             return;
-        
+
         this->startCountdown_ = countdown;
         // Set the counter to the ceiling of the current countdown.
@@ -225,5 +225,5 @@
         if(this->counter_ == 0)
             return;
-        
+
         this->counter_--;
         this->changedCountdownCounter();
@@ -325,5 +325,5 @@
         if(this->spawned_ == spawned)
             return;
-        
+
         this->spawned_ = spawned;
         // Clear the notifications if the Player has spawned.
@@ -395,5 +395,5 @@
     // TODO: Replace with notifications.
 
-    void GametypeInfo::sendAnnounceMessage(const std::string& message)
+    void GametypeInfo::sendAnnounceMessage(const std::string& message) const
     {
         if (GameMode::isMaster())
@@ -404,5 +404,5 @@
     }
 
-    void GametypeInfo::sendAnnounceMessage(const std::string& message, unsigned int clientID)
+    void GametypeInfo::sendAnnounceMessage(const std::string& message, unsigned int clientID) const
     {
         if (GameMode::isMaster())
@@ -415,5 +415,5 @@
     }
 
-    void GametypeInfo::sendKillMessage(const std::string& message, unsigned int clientID)
+    void GametypeInfo::sendKillMessage(const std::string& message, unsigned int clientID) const
     {
         if (GameMode::isMaster())
@@ -426,5 +426,5 @@
     }
 
-    void GametypeInfo::sendDeathMessage(const std::string& message, unsigned int clientID)
+    void GametypeInfo::sendDeathMessage(const std::string& message, unsigned int clientID) const
     {
         if (GameMode::isMaster())
@@ -437,5 +437,5 @@
     }
 
-    void GametypeInfo::sendStaticMessage(const std::string& message, unsigned int clientID, const ColourValue& colour)
+    void GametypeInfo::sendStaticMessage(const std::string& message, unsigned int clientID, const ColourValue& colour) const
     {
         if (GameMode::isMaster())
@@ -448,5 +448,5 @@
     }
 
-    void GametypeInfo::sendFadingMessage(const std::string& message, unsigned int clientID)
+    void GametypeInfo::sendFadingMessage(const std::string& message, unsigned int clientID) const
     {
         if (GameMode::isMaster())
@@ -459,5 +459,5 @@
     }
 
-    void GametypeInfo::dispatchAnnounceMessage(const std::string& message)
+    void GametypeInfo::dispatchAnnounceMessage(const std::string& message) const
     {
         for (ObjectList<GametypeMessageListener>::iterator it = ObjectList<GametypeMessageListener>::begin(); it != ObjectList<GametypeMessageListener>::end(); ++it)
@@ -465,5 +465,5 @@
     }
 
-    void GametypeInfo::dispatchKillMessage(const std::string& message)
+    void GametypeInfo::dispatchKillMessage(const std::string& message) const
     {
         for (ObjectList<GametypeMessageListener>::iterator it = ObjectList<GametypeMessageListener>::begin(); it != ObjectList<GametypeMessageListener>::end(); ++it)
@@ -471,5 +471,5 @@
     }
 
-    void GametypeInfo::dispatchDeathMessage(const std::string& message)
+    void GametypeInfo::dispatchDeathMessage(const std::string& message) const
     {
         for (ObjectList<GametypeMessageListener>::iterator it = ObjectList<GametypeMessageListener>::begin(); it != ObjectList<GametypeMessageListener>::end(); ++it)
@@ -477,5 +477,5 @@
     }
 
-     void GametypeInfo::dispatchStaticMessage(const std::string& message, const ColourValue& colour)
+     void GametypeInfo::dispatchStaticMessage(const std::string& message, const ColourValue& colour) const
     {
         for (ObjectList<GametypeMessageListener>::iterator it = ObjectList<GametypeMessageListener>::begin(); it != ObjectList<GametypeMessageListener>::end(); ++it)
@@ -483,5 +483,5 @@
     }
 
-     void GametypeInfo::dispatchFadingMessage(const std::string& message)
+     void GametypeInfo::dispatchFadingMessage(const std::string& message) const
     {
         for (ObjectList<GametypeMessageListener>::iterator it = ObjectList<GametypeMessageListener>::begin(); it != ObjectList<GametypeMessageListener>::end(); ++it)
Index: code/trunk/src/orxonox/infos/GametypeInfo.h
===================================================================
--- code/trunk/src/orxonox/infos/GametypeInfo.h	(revision 9265)
+++ code/trunk/src/orxonox/infos/GametypeInfo.h	(revision 9348)
@@ -68,5 +68,5 @@
                 { return this->bStarted_; }
             void changedStarted(void); // Is called when the game has changed to started.
-            
+
             /**
             @brief Get whether the game has ended yet.
@@ -108,5 +108,5 @@
                 { return this->readyToSpawn_; }
             void changedReadyToSpawn(bool ready); // Inform the GametypeInfo that the local player has changed its spawned status.
-            
+
             /**
             @brief Get whether the local player is spawned.
@@ -119,21 +119,18 @@
             inline const std::string& getHUDTemplate() const
                 { return this->hudtemplate_; }
-            
-            inline unsigned int getNumberOfPlayers() const
-                {  return this->spawnedPlayers_.size(); }
 
-            void sendAnnounceMessage(const std::string& message);
-            void sendAnnounceMessage(const std::string& message, unsigned int clientID);
-            void sendKillMessage(const std::string& message, unsigned int clientID);
-            void sendDeathMessage(const std::string& message, unsigned int clientID);
-            void sendStaticMessage(const std::string& message, unsigned int clientID, const ColourValue& colour);
-            void sendFadingMessage(const std::string& message, unsigned int clientID);
+            void sendAnnounceMessage(const std::string& message) const;
+            void sendAnnounceMessage(const std::string& message, unsigned int clientID) const;
+            void sendKillMessage(const std::string& message, unsigned int clientID) const;
+            void sendDeathMessage(const std::string& message, unsigned int clientID) const;
+            void sendStaticMessage(const std::string& message, unsigned int clientID, const ColourValue& colour) const;
+            void sendFadingMessage(const std::string& message, unsigned int clientID) const;
 
-            void dispatchAnnounceMessage(const std::string& message);
-            void dispatchKillMessage(const std::string& message);
-            void dispatchDeathMessage(const std::string& message);
-            void dispatchStaticMessage(const std::string& message,const ColourValue& colour);
-            void dispatchFadingMessage(const std::string& message);
-            
+            void dispatchAnnounceMessage(const std::string& message) const;
+            void dispatchKillMessage(const std::string& message) const;
+            void dispatchDeathMessage(const std::string& message) const;
+            void dispatchStaticMessage(const std::string& message,const ColourValue& colour) const;
+            void dispatchFadingMessage(const std::string& message) const;
+
         protected:
             void start(void); // Inform the GametypeInfo that the game has started.
@@ -165,5 +162,5 @@
             unsigned int counter_; //!< The current integer value of the start countdown, the start countdown counter.
             std::string hudtemplate_;
-            
+
             std::set<PlayerInfo*> spawnedPlayers_; //!< A set of players that are currently spawned.
             bool spawned_; //!< Whether the local Player is currently spawned.
Index: code/trunk/src/orxonox/infos/PlayerInfo.cc
===================================================================
--- code/trunk/src/orxonox/infos/PlayerInfo.cc	(revision 9265)
+++ code/trunk/src/orxonox/infos/PlayerInfo.cc	(revision 9348)
@@ -173,5 +173,5 @@
         this->changedControllableEntity();
 
-		RadarViewable* radarviewable = orxonox_cast<RadarViewable*>(entity);
+        RadarViewable* radarviewable = orxonox_cast<RadarViewable*>(entity);
         if (radarviewable != NULL)
             radarviewable->setRadarName(this->getName());
Index: code/trunk/src/orxonox/interfaces/Pickupable.cc
===================================================================
--- code/trunk/src/orxonox/interfaces/Pickupable.cc	(revision 9265)
+++ code/trunk/src/orxonox/interfaces/Pickupable.cc	(revision 9348)
@@ -39,5 +39,4 @@
 
 #include "infos/PlayerInfo.h"
-#include "pickup/PickupIdentifier.h"
 #include "worldentities/pawns/Pawn.h"
 
@@ -52,5 +51,5 @@
         Constructor. Registers the objects and initializes its member variables.
     */
-    Pickupable::Pickupable() : pickupIdentifier_(NULL), used_(false), pickedUp_(false)
+    Pickupable::Pickupable() : used_(false), pickedUp_(false)
     {
         RegisterRootObject(Pickupable);
@@ -58,5 +57,4 @@
         this->carrier_ = NULL;
 
-        this->pickupIdentifier_ = new PickupIdentifier(this);
         this->beingDestroyed_ = false;
         this->enabled_ = true;
@@ -69,9 +67,4 @@
     Pickupable::~Pickupable()
     {
-        if(this->pickupIdentifier_ != NULL)
-        {
-            orxout(verbose, context::pickups) << "Pickupable (&" << this << ") destroyed." << endl;
-            this->pickupIdentifier_->destroy();
-        }
     }
 
@@ -104,5 +97,5 @@
     void Pickupable::destroyPickup(void)
     {
-        if(!this->beingDestroyed_)
+        if(!this->isBeingDestroyed())
             this->OrxonoxClass::destroy();
         else
@@ -329,21 +322,4 @@
     /**
     @brief
-        Creates a duplicate of the Pickupable.
-    @return
-        Returns the clone of this pickup as a pointer to a Pickupable.
-    */
-    Pickupable* Pickupable::clone(void)
-    {
-        OrxonoxClass* item = NULL;
-        this->clone(item);
-
-        Pickupable* pickup = dynamic_cast<Pickupable*>(item);
-
-        orxout(verbose, context::pickups) << "Pickupable (&" << this << ") cloned. Clone is new Pickupable (&" << pickup << ")." << endl;
-        return pickup;
-    }
-
-    /**
-    @brief
         Method to transcribe a Pickupable as a Rewardable to the player.
     @param player
Index: code/trunk/src/orxonox/interfaces/Pickupable.h
===================================================================
--- code/trunk/src/orxonox/interfaces/Pickupable.h	(revision 9265)
+++ code/trunk/src/orxonox/interfaces/Pickupable.h	(revision 9348)
@@ -53,6 +53,4 @@
         Pickups (@ref orxonox::Pickupable "Pickupables") are objects that (quite unsurprisingly) can be picked up. Additionally they can be used and unused (transition from used to not used), and also dropped.
 
-        A class of Pickups can incorporate many different types of pickups (see @ref orxonox::PickupIdentifier "PickupIdentifier"), each type is uniquely defined by a @ref orxonox::PickupIdentifier "PickupIdentifier". Each pickup has such an identifier identiying its type. This means that two pickups of the same type have identifiers which are equal.
-
     @author
         Damian 'Mozork' Frick
@@ -69,4 +67,7 @@
         public:
             virtual ~Pickupable(); //!< Default destructor.
+
+            //! @brief Returns the representation name which refers to the name of the PickupRepresentation that is used to represent this pickup.
+            virtual const std::string& getRepresentationName() const = 0;
 
             /**
@@ -136,19 +137,4 @@
             bool addTarget(Identifier* identifier); //!< Add a class, representetd by the input Identifier, as target of this Pickupable.
 
-            Pickupable* clone(void); //!< Creates a duplicate of the Pickupable.
-            /**
-            @brief Creates a duplicate of the input OrxonoxClass.
-                   This method needs to be implemented by any Class inheriting from Pickupable.
-            @param item A reference to a pointer to the OrxonoxClass that is to be duplicated.
-            */
-            virtual void clone(OrxonoxClass*& item) {}
-
-            /**
-            @brief Get the PickupIdentifier of this Pickupable.
-            @return Returns a pointer to the PickupIdentifier of this Pickupable.
-            */
-            virtual const PickupIdentifier* getPickupIdentifier(void) const
-                { return this->pickupIdentifier_; }
-
             bool setUsed(bool used); //!< Sets the Pickupable to used or unused, depending on the input.
             bool setPickedUp(bool pickedUp); //!< Helper method to set the Pickupable to either picked up or not picked up.
@@ -158,9 +144,4 @@
 
         protected:
-            /**
-            @brief Helper method to initialize the PickupIdentifier.
-            */
-            void initializeIdentifier(void) {}
-
             virtual void preDestroy(void); //!< A method that is called by OrxonoxClass::destroy() before the object is actually destroyed.
             virtual void destroyPickup(void); //!< Destroys a Pickupable.
@@ -174,12 +155,16 @@
 
             /**
+            @brief Check whether the Pickupable is in the process of being destroyed.
+            @return Returns true if so.
+            */
+            inline bool isBeingDestroyed(void)
+                { return this->beingDestroyed_; }
+
+            /**
             @brief Facilitates the creation of a PickupSpawner upon dropping of the Pickupable.
-                   This method must be implemented by any class directly inheriting from Pickupable. It is most easily done by just creating a new DroppedPickup, e.g.:
-                   DroppedPickup(BaseObject* creator, Pickupable* pickup, PickupCarrier* carrier, float triggerDistance);
+                   This method must be implemented by any class directly inheriting from Pickupable.
             @return Returns true if a spawner was created, false if not.
             */
             virtual bool createSpawner(void) = 0;
-
-            PickupIdentifier* pickupIdentifier_; //!< The PickupIdentifier of this Pickupable.
 
         private:
@@ -203,7 +188,6 @@
     //! SUPER functions.
     SUPER_FUNCTION(10, Pickupable, changedUsed, false);
-    SUPER_FUNCTION(12, Pickupable, changedCarrier, false);
-    SUPER_FUNCTION(13, Pickupable, changedPickedUp, false);
-    SUPER_FUNCTION(11, Pickupable, clone, false);
+    SUPER_FUNCTION(11, Pickupable, changedCarrier, false);
+    SUPER_FUNCTION(12, Pickupable, changedPickedUp, false);
 }
 
Index: code/trunk/src/orxonox/interfaces/RadarViewable.h
===================================================================
--- code/trunk/src/orxonox/interfaces/RadarViewable.h	(revision 9265)
+++ code/trunk/src/orxonox/interfaces/RadarViewable.h	(revision 9348)
@@ -61,14 +61,14 @@
         virtual ~RadarViewable();
 
-		virtual void setRadarName(const std::string& name)
-			{
-				if (this->radarName_ != name)
-				{
-					this->radarName_ = name;
-					this->settingsChanged();
-				}
-			}
-		const std::string& getRadarName() const
-			{ return this->radarName_; }
+        virtual void setRadarName(const std::string& name)
+            {
+                if (this->radarName_ != name)
+                {
+                    this->radarName_ = name;
+                    this->settingsChanged();
+                }
+            }
+        const std::string& getRadarName() const
+            { return this->radarName_; }
 
         inline void setRadarObjectCamouflage(float camouflage)
@@ -163,5 +163,5 @@
         ColourValue radarObjectColour_;
         float scale_;
-		std::string radarName_;
+        std::string radarName_;
     };
 }
Index: code/trunk/src/orxonox/worldentities/ControllableEntity.cc
===================================================================
--- code/trunk/src/orxonox/worldentities/ControllableEntity.cc	(revision 9265)
+++ code/trunk/src/orxonox/worldentities/ControllableEntity.cc	(revision 9348)
@@ -87,5 +87,5 @@
         this->setPriority( Priority::VeryHigh );
         this->registerVariables();
-	this->team_ = -1;
+        this->team_ = -1;
     }
 
@@ -266,5 +266,5 @@
                 this->cameraPositionRootNode_->_update(true, false); // update the camera node because otherwise the camera will drag back in position which looks strange
 
-                NewHumanController* controller = dynamic_cast<NewHumanController*>(this->getController());
+                NewHumanController* controller = orxonox_cast<NewHumanController*>(this->getController());
                 if (controller)
                     controller->centerCursor();
Index: code/trunk/src/orxonox/worldentities/ControllableEntity.h
===================================================================
--- code/trunk/src/orxonox/worldentities/ControllableEntity.h	(revision 9265)
+++ code/trunk/src/orxonox/worldentities/ControllableEntity.h	(revision 9348)
@@ -164,8 +164,8 @@
             void setTargetInternal( uint32_t targetID );
 
-	    inline void setTeam(int team)
-	        { this->team_ = team; }
-	    inline int getTeam() const
-	        { return this->team_; }
+            inline void setTeam(int team)
+                { this->team_ = team; }
+            inline int getTeam() const
+                { return this->team_; }
 
         protected:
@@ -243,5 +243,5 @@
             WeakPtr<WorldEntity> target_;
 
-	    int team_ ; //<! teamnumber
+            int team_ ; //<! teamnumber
     };
 }
Index: code/trunk/src/orxonox/worldentities/pawns/Pawn.cc
===================================================================
--- code/trunk/src/orxonox/worldentities/pawns/Pawn.cc	(revision 9265)
+++ code/trunk/src/orxonox/worldentities/pawns/Pawn.cc	(revision 9348)
@@ -75,4 +75,7 @@
         this->lastHitOriginator_ = 0;
 
+        // set damage multiplier to default value 1, meaning nominal damage
+        this->damageMultiplier_ = 1;
+
         this->spawnparticleduration_ = 3.0f;
 
@@ -228,4 +231,8 @@
     void Pawn::damage(float damage, float healthdamage, float shielddamage, Pawn* originator)
     {
+        // Applies multiplier given by the DamageBoost Pickup.
+        if (originator)
+            damage *= originator->getDamageMultiplier();
+
         if (this->getGametype() && this->getGametype()->allowPawnDamage(this, originator))
         {
Index: code/trunk/src/orxonox/worldentities/pawns/Pawn.h
===================================================================
--- code/trunk/src/orxonox/worldentities/pawns/Pawn.h	(revision 9265)
+++ code/trunk/src/orxonox/worldentities/pawns/Pawn.h	(revision 9348)
@@ -144,7 +144,4 @@
             virtual void addedWeaponPack(WeaponPack* wPack) {}
 
-            inline const WorldEntity* getWorldEntity() const
-                { return const_cast<Pawn*>(this); }
-
             inline void setSpawnParticleSource(const std::string& source)
                 { this->spawnparticlesource_ = source; }
@@ -162,4 +159,11 @@
                 { return this->numexplosionchunks_; }
 
+            // These are used with the Damage Boost Pickup to use the damage multiplier.
+            inline void setDamageMultiplier(float multiplier)
+                { this->damageMultiplier_ = multiplier; }
+            inline float getDamageMultiplier() const
+                { return this->damageMultiplier_; }
+
+
             virtual void startLocalHumanControl();
 
@@ -203,8 +207,10 @@
             float maxShieldHealth_;
             float initialShieldHealth_;
-            float shieldAbsorption_; // Has to be between 0 and 1
+            float shieldAbsorption_; ///< Has to be between 0 and 1
             float reloadRate_;
             float reloadWaitTime_;
             float reloadWaitCountdown_;
+
+            float damageMultiplier_; ///< Used by the Damage Boost Pickup.
 
             WeakPtr<Pawn> lastHitOriginator_;
Index: code/trunk/src/orxonox/worldentities/pawns/SpaceShip.cc
===================================================================
--- code/trunk/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 9265)
+++ code/trunk/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 9348)
@@ -133,5 +133,5 @@
     {
         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")
@@ -503,6 +503,6 @@
     void SpaceShip::resetCamera()
     {
-	if(this->hasLocalController() && this->hasHumanController())
-	{
+        if(this->hasLocalController() && this->hasHumanController())
+        {
             Camera *camera = this->getCamera();
             if (camera == 0)
@@ -514,5 +514,5 @@
             camera->setPosition(this->cameraOriginalPosition_);
             camera->setOrientation(this->cameraOriginalOrientation_);
-	}
+        }
     }
 
