Index: code/branches/presentation/src/modules/weapons/projectiles/BasicProjectile.cc
===================================================================
--- code/branches/presentation/src/modules/weapons/projectiles/BasicProjectile.cc	(revision 8580)
+++ code/branches/presentation/src/modules/weapons/projectiles/BasicProjectile.cc	(revision 8580)
@@ -0,0 +1,131 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      simonmie
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#include "BasicProjectile.h"
+
+#include "core/CoreIncludes.h"
+#include "core/ConfigValueIncludes.h"
+#include "core/GameMode.h"
+#include "core/command/Executor.h"
+#include "objects/collisionshapes/SphereCollisionShape.h"
+#include "worldentities/pawns/Pawn.h"
+#include "graphics/ParticleSpawner.h"
+#include "core/OrxonoxClass.h"
+
+namespace orxonox
+{
+    /**
+    @brief
+        Constructor. Registers the object and initializes some default values.
+    */
+    BasicProjectile::BasicProjectile() : OrxonoxClass()
+    {
+        RegisterRootObject(BasicProjectile);// - register the BasicProjectile class to the core
+
+        this->bDestroy_ = false;
+
+        // Default damage must be zero, otherwise it would be above zero if no settings are made in the weaponsettings xml file.
+        // same thing for all weaponmodes files
+        this->damage_ = 0;
+        this->healthdamage_ = 0;
+        this->shielddamage_ = 0;
+    }
+
+    BasicProjectile::~BasicProjectile()
+    {
+    }
+
+    /* The function called when a projectile hits another thing.
+     * calls the hit-function, starts the reload countdown, displays visual effects
+     * hit is defined in src/orxonox/worldentities/pawns/pawn.cc
+     */
+    bool BasicProjectile::basicCollidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint, Pawn* owner, BasicProjectile* this_)
+    {
+        if (!this_->getBDestroy() && GameMode::isMaster())
+        {
+            if (otherObject == owner) //prevents you from shooting yourself
+                return false;
+
+            this_->setBDestroy(true); // If something is hit, the object is destroyed and can't hit something else.
+                                      // The projectile is destroyed by its tick()-function (in the following tick).
+
+            Pawn* victim = orxonox_cast<Pawn*>(otherObject); //if otherObject isn't a Pawn, then victim is NULL
+
+            WorldEntity* entity = orxonox_cast<WorldEntity*>(this_);
+            assert(entity); //entity must not be null
+
+
+            // if visual effects after destruction cause problems, put this block below the effects code block
+            if (victim)
+            {
+                victim->hit(owner, contactPoint, this_->getDamage(), this_->getHealthDamage(), this_->getShieldDamage());
+                victim->startReloadCountdown();
+            }
+
+            // visual effects for being hit, depending on whether the shield is hit or not
+            if (owner) //if the owner does not exist (anymore?), no effects are displayed.
+            {
+                // damping and explosion effect is only played if the victim is no pawn (see cast above)
+                // or if the victim is a pawn, has no shield left, is still alive and any damage goes to the health
+                if (!victim || (victim && !victim->hasShield() && victim->getHealth() > 0 && (this_->getDamage() > 0 || this_->getHealthDamage() > 0)))
+                {
+                    {
+                        ParticleSpawner* effect = new ParticleSpawner(owner->getCreator());
+                        effect->setPosition(entity->getPosition());
+                        effect->setOrientation(entity->getOrientation());
+                        effect->setDestroyAfterLife(true);
+                        effect->setSource("Orxonox/explosion3");
+                        effect->setLifetime(2.0f);
+                    }
+                        // second effect with same condition
+                    {
+                        ParticleSpawner* effect = new ParticleSpawner(owner->getCreator());
+                        effect->setPosition(entity->getPosition());
+                        effect->setOrientation(entity->getOrientation());
+                        effect->setDestroyAfterLife(true);
+                        effect->setSource("Orxonox/smoke4");
+                        effect->setLifetime(3.0f);
+                    }
+                }
+
+                // victim->isAlive() is not false until the next tick, so getHealth() > 0 is used instead
+                if (victim && victim->hasShield() && (this_->getDamage() > 0 || this_->getShieldDamage() > 0) && victim->getHealth() > 0)
+                {
+                    ParticleSpawner* effect = new ParticleSpawner(owner->getCreator());
+                    effect->setPosition(entity->getPosition());
+                    effect->setOrientation(entity->getOrientation());
+                    effect->setDestroyAfterLife(true);
+                    effect->setSource("Orxonox/Shield");
+                    effect->setLifetime(0.5f);
+                }
+            }
+
+        }
+        return false;
+    }
+}
Index: code/branches/presentation/src/modules/weapons/projectiles/BasicProjectile.h
===================================================================
--- code/branches/presentation/src/modules/weapons/projectiles/BasicProjectile.h	(revision 8580)
+++ code/branches/presentation/src/modules/weapons/projectiles/BasicProjectile.h	(revision 8580)
@@ -0,0 +1,83 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      simonmie
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+#ifndef _BasicProjectile_H__
+#define _BasicProjectile_H__
+
+#include "weapons/WeaponsPrereqs.h"
+
+#include "tools/Timer.h"
+#include "core/OrxonoxClass.h"
+
+namespace orxonox
+{
+    class _WeaponsExport BasicProjectile : public virtual OrxonoxClass
+    {
+        public:
+            BasicProjectile();
+
+            virtual ~BasicProjectile();
+
+            static bool basicCollidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint, Pawn* owner, BasicProjectile* this_);
+
+            void basicDestroyObject();
+
+            inline void setDamage(float damage)
+                { this->damage_ = damage;  }
+            inline float getDamage() const
+                { return this->damage_; }
+
+            inline void setHealthDamage(float healthdamage)
+                { this->healthdamage_ = healthdamage; }
+            inline float getHealthDamage() const
+                { return this->healthdamage_; }
+
+            inline void setShieldDamage(float shielddamage)
+                { this->shielddamage_ = shielddamage;  } //ShieldDamage wird korrekt gesettet vom XML-File
+            inline float getShieldDamage() const
+                { return this->shielddamage_; }
+
+
+            inline void setBDestroy(bool bDestroy)
+                { this->bDestroy_ = bDestroy;  }
+            inline float getBDestroy() const
+                { return this->bDestroy_; }
+
+
+        private:
+//            WeakPtr<Pawn> owner_; //owner cannot be set in BasicProjectile, because it's already defined in MobileEntity and Movable Entity
+
+            float damage_;
+            float healthdamage_;
+            float shielddamage_;
+
+            bool bDestroy_;
+    };
+}
+
+#endif /* _BasicProjectile_H__ */
Index: code/branches/presentation/src/modules/weapons/projectiles/CMakeLists.txt
===================================================================
--- code/branches/presentation/src/modules/weapons/projectiles/CMakeLists.txt	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/projectiles/CMakeLists.txt	(revision 8580)
@@ -6,3 +6,4 @@
   Rocket.cc
   SimpleRocket.cc
+  BasicProjectile.cc
 )
Index: code/branches/presentation/src/modules/weapons/projectiles/Projectile.cc
===================================================================
--- code/branches/presentation/src/modules/weapons/projectiles/Projectile.cc	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/projectiles/Projectile.cc	(revision 8580)
@@ -23,5 +23,5 @@
  *      Fabian 'x3n' Landau
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -41,15 +41,12 @@
     CreateFactory(Projectile);
 
-    Projectile::Projectile(BaseObject* creator) : MovableEntity(creator)
+    Projectile::Projectile(BaseObject* creator) : MovableEntity(creator), BasicProjectile()
     {
         RegisterObject(Projectile);
 
         this->setConfigValues();
-        this->bDestroy_ = false;
         this->owner_ = 0;
-        this->damage_ = 15;
 
         // Get notification about collisions
-
         if (GameMode::isMaster())
         {
@@ -84,5 +81,5 @@
             return;
 
-        if (this->bDestroy_)
+        if (this->getBDestroy())
             this->destroy(); // TODO: use a scheduler instead of deleting the object right here in tick()
     }
@@ -94,38 +91,9 @@
     }
 
+    /* Calls the collidesAgainst function of BasicProjectile
+     */
     bool Projectile::collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint)
     {
-        if (!this->bDestroy_ && GameMode::isMaster())
-        {
-            if (otherObject == this->owner_)
-                return false;
-
-            this->bDestroy_ = true;
-
-            if (this->owner_)
-            {
-                {
-                    ParticleSpawner* effect = new ParticleSpawner(this->owner_->getCreator());
-                    effect->setPosition(this->getPosition());
-                    effect->setOrientation(this->getOrientation());
-                    effect->setDestroyAfterLife(true);
-                    effect->setSource("Orxonox/explosion3");
-                    effect->setLifetime(2.0f);
-                }
-                {
-                    ParticleSpawner* effect = new ParticleSpawner(this->owner_->getCreator());
-                    effect->setPosition(this->getPosition());
-                    effect->setOrientation(this->getOrientation());
-                    effect->setDestroyAfterLife(true);
-                    effect->setSource("Orxonox/smoke4");
-                    effect->setLifetime(3.0f);
-                }
-            }
-
-            Pawn* victim = orxonox_cast<Pawn*>(otherObject);
-            if (victim)
-                victim->hit(this->owner_, contactPoint, this->damage_);
-        }
-        return false;
+        return BasicProjectile::basicCollidesAgainst(otherObject,contactPoint,this->getOwner(),this);
     }
 
Index: code/branches/presentation/src/modules/weapons/projectiles/Projectile.h
===================================================================
--- code/branches/presentation/src/modules/weapons/projectiles/Projectile.h	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/projectiles/Projectile.h	(revision 8580)
@@ -23,5 +23,5 @@
  *      Fabian 'x3n' Landau
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -35,7 +35,9 @@
 #include "worldentities/MovableEntity.h"
 
+#include "BasicProjectile.h"
+
 namespace orxonox
 {
-    class _WeaponsExport Projectile : public MovableEntity
+    class _WeaponsExport Projectile : public MovableEntity, public BasicProjectile
     {
         public:
@@ -49,18 +51,12 @@
             virtual bool collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint);
 
-            inline void setDamage(float damage)
-                { this->damage_ = damage; }
-            inline float getDamage() const
-                { return this->damage_; }
-
             void setOwner(Pawn* owner);
             inline Pawn* getOwner() const
                 { return this->owner_; }
 
+
         private:
             WeakPtr<Pawn> owner_;
             float lifetime_;
-            float damage_;
-            bool bDestroy_;
             Timer destroyTimer_;
     };
Index: code/branches/presentation/src/modules/weapons/projectiles/Rocket.cc
===================================================================
--- code/branches/presentation/src/modules/weapons/projectiles/Rocket.cc	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/projectiles/Rocket.cc	(revision 8580)
@@ -23,5 +23,5 @@
  *      Oliver Scheuss
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -52,10 +52,9 @@
         Constructor. Registers the object and initializes some default values.
     */
-    Rocket::Rocket(BaseObject* creator) : ControllableEntity(creator)
+    Rocket::Rocket(BaseObject* creator) : ControllableEntity(creator), BasicProjectile()
     {
         RegisterObject(Rocket);// - register the Rocket class to the core
 
         this->localAngularVelocity_ = 0;
-        this->bDestroy_ = false;
         this->lifetime_ = 100;
 
@@ -146,6 +145,6 @@
     {
         this->owner_ = owner;
-        this->player_ = this->owner_->getPlayer();
-        this->owner_->getPlayer()->startTemporaryControl(this);
+        this->player_ = this->getOwner()->getPlayer();
+        this->getOwner()->getPlayer()->startTemporaryControl(this);
 
         if( GameMode::isMaster() )
@@ -175,5 +174,5 @@
         if( GameMode::isMaster() )
         {
-            if( this->bDestroy_ )
+            if( this->getBDestroy() )
                 this->destroy();
 
@@ -181,40 +180,9 @@
     }
 
+    /* Calls the collidesAgainst function of BasicProjectile
+     */
     bool Rocket::collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint)
     {
-        if (!this->bDestroy_ && GameMode::isMaster())
-        {
-            if (otherObject == this->owner_)
-                return false;
-
-            this->bDestroy_ = true;
-
-            if (this->owner_)
-            {
-                {
-                    ParticleSpawner* effect = new ParticleSpawner(this->owner_->getCreator());
-                    effect->setPosition(this->getPosition());
-                    effect->setOrientation(this->getOrientation());
-                    effect->setDestroyAfterLife(true);
-                    effect->setSource("Orxonox/explosion4");
-                    effect->setLifetime(2.0f);
-                }
-
-                {
-                    ParticleSpawner* effect = new ParticleSpawner(this->owner_->getCreator());
-                    effect->setPosition(this->getPosition());
-                    effect->setOrientation(this->getOrientation());
-                    effect->setDestroyAfterLife(true);
-                    effect->setSource("Orxonox/smoke4");
-                    effect->setLifetime(3.0f);
-                }
-            }
-
-            Pawn* victim = orxonox_cast<Pawn*>(otherObject);
-            if (victim)
-                victim->hit(this->owner_, contactPoint, this->damage_);
-//             this->destroy();
-        }
-        return false;
+        return BasicProjectile::basicCollidesAgainst(otherObject,contactPoint,this->getOwner(),this);
     }
 
@@ -233,8 +201,5 @@
     void Rocket::fired(unsigned int firemode)
     {
-//         if (this->owner_)
-//         {
-            this->destroy();
-//         }
+        this->destroy();
     }
 
@@ -242,8 +207,8 @@
     {
         ParticleSpawner *effect1, *effect2;
-        if( this->owner_ )
-        {
-            effect1 = new ParticleSpawner(this->owner_->getCreator());
-            effect2 = new ParticleSpawner(this->owner_->getCreator());
+        if( this->getOwner() )
+        {
+            effect1 = new ParticleSpawner(this->getOwner()->getCreator());
+            effect2 = new ParticleSpawner(this->getOwner()->getCreator());
         }
         else
Index: code/branches/presentation/src/modules/weapons/projectiles/Rocket.h
===================================================================
--- code/branches/presentation/src/modules/weapons/projectiles/Rocket.h	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/projectiles/Rocket.h	(revision 8580)
@@ -23,5 +23,5 @@
  *      Oliver Scheuss
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -34,4 +34,6 @@
 #include "tools/Timer.h"
 #include "worldentities/ControllableEntity.h"
+
+#include "BasicProjectile.h"
 
 namespace orxonox
@@ -46,5 +48,5 @@
         Oli Scheuss
     */
-    class _WeaponsExport Rocket : public ControllableEntity
+    class _WeaponsExport Rocket : public ControllableEntity, public BasicProjectile
     {
         public:
@@ -109,8 +111,4 @@
                 { return this->owner_; }
 
-            inline void setDamage(float damage)
-                { this->damage_ = damage; }
-            inline float getDamage() const
-                { return this->damage_; }
             virtual void fired(unsigned int firemode);
 
@@ -118,6 +116,4 @@
             WeakPtr<Pawn> owner_;
             Vector3 localAngularVelocity_;
-            float damage_;
-            bool bDestroy_;
 
             WeakPtr<PlayerInfo> player_;
Index: code/branches/presentation/src/modules/weapons/projectiles/SimpleRocket.cc
===================================================================
--- code/branches/presentation/src/modules/weapons/projectiles/SimpleRocket.cc	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/projectiles/SimpleRocket.cc	(revision 8580)
@@ -23,5 +23,5 @@
  *      Oliver Scheuss
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -48,14 +48,13 @@
     CreateFactory(SimpleRocket);
 
-    SimpleRocket::SimpleRocket(BaseObject* creator) : ControllableEntity(creator)
+    SimpleRocket::SimpleRocket(BaseObject* creator) : ControllableEntity(creator), BasicProjectile()
     {
         RegisterObject(SimpleRocket);// - register the SimpleRocket class to the core
 
         this->localAngularVelocity_ = 0;
-        this->bDestroy_ = false;
         this->lifetime_ = 120;
 
         this->setMass(15);
-        COUT(4) << "simplerocket constructed\n";
+//        COUT(4) << "simplerocket constructed\n";
 
         if (GameMode::isMaster())
@@ -115,5 +114,5 @@
                 this->disableFire();
 
-            if( this->bDestroy_ )
+            if( this->getBDestroy() )
                 this->destroy();
         }
@@ -159,49 +158,13 @@
     {
         this->owner_ = owner;
-        this->player_ = this->owner_->getPlayer();
-    }
-
-
-
-
+        this->player_ = this->getOwner()->getPlayer();
+    }
+
+
+    /* Calls the collidesAgainst function of BasicProjectile
+     */
     bool SimpleRocket::collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint)
     {
-        if (!this->bDestroy_ && GameMode::isMaster())
-        {
-            if (otherObject == this->owner_)
-                return false;
-
-            this->bDestroy_ = true;
-
-            if (this->owner_)
-            {
-                {
-                    ParticleSpawner* effect = new ParticleSpawner(this->owner_->getCreator());
-                    effect->setPosition(this->getPosition());
-                    effect->setOrientation(this->getOrientation());
-                    effect->setDestroyAfterLife(true);
-                    effect->setSource("Orxonox/explosion4");
-                    effect->setLifetime(2.0f);
-                }
-
-                {
-                    ParticleSpawner* effect = new ParticleSpawner(this->owner_->getCreator());
-                    effect->setPosition(this->getPosition());
-                    effect->setOrientation(this->getOrientation());
-                    effect->setDestroyAfterLife(true);
-                    effect->setSource("Orxonox/smoke4");
-                    effect->setLifetime(3.0f);
-                }
-            }
-
-            float dmg = this->damage_;
-//             if (this->owner_)
-//                 dmg = this->owner_->getPickups().processModifiers(ModifierType::Damage, dmg, false);
-
-            Pawn* victim = orxonox_cast<Pawn*>(otherObject);
-            if (victim)
-                victim->hit(this->owner_, contactPoint, dmg);
-        }
-        return false;
+        return BasicProjectile::basicCollidesAgainst(otherObject,contactPoint,this->getOwner(),this);
     }
 
Index: code/branches/presentation/src/modules/weapons/projectiles/SimpleRocket.h
===================================================================
--- code/branches/presentation/src/modules/weapons/projectiles/SimpleRocket.h	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/projectiles/SimpleRocket.h	(revision 8580)
@@ -23,5 +23,5 @@
  *      Oliver Scheuss
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -36,4 +36,6 @@
 #include "graphics/ParticleSpawner.h"
 
+#include "BasicProjectile.h"
+
 namespace orxonox
 {
@@ -46,5 +48,5 @@
        Gabriel Nadler (Original file: Oli Scheuss)
     */
-    class _WeaponsExport SimpleRocket : public ControllableEntity
+    class _WeaponsExport SimpleRocket : public ControllableEntity, public BasicProjectile
     {
         public:
@@ -111,11 +113,7 @@
             inline Pawn* getOwner() const
                 { return this->owner_; }
+
             inline bool hasFuel() const
             { return this->fuel_; }
-
-            inline void setDamage(float damage)
-                { this->damage_ = damage; }
-            inline float getDamage() const
-                { return this->damage_; }
 
 
@@ -123,6 +121,4 @@
             WeakPtr<Pawn> owner_;
             Vector3 localAngularVelocity_;
-            float damage_;
-            bool bDestroy_;
             bool fuel_; //!< Bool is true while the rocket "has fuel"
 
Index: code/branches/presentation/src/modules/weapons/weaponmodes/EnergyDrink.cc
===================================================================
--- code/branches/presentation/src/modules/weapons/weaponmodes/EnergyDrink.cc	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/weaponmodes/EnergyDrink.cc	(revision 8580)
@@ -23,5 +23,5 @@
  *      Hagen Seifert
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -50,5 +50,5 @@
 
         this->reloadTime_ = 0.25;
-        this->damage_ = 15;
+        this->damage_ = 0; //default 15
         this->speed_ = 2500;
         this->delay_ = 0;
@@ -97,4 +97,6 @@
     }
 
+    /* Creates the projectile object, sets its properties to the EnergyDrink properties, calls muendungsfeuer()
+     */
     void EnergyDrink::shot()
     {
@@ -112,4 +114,6 @@
         projectile->setOwner(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn());
         projectile->setDamage(this->getDamage());
+        projectile->setShieldDamage(this->getShieldDamage());
+        projectile->setHealthDamage(this->getHealthDamage());
 
         EnergyDrink::muendungsfeuer();
Index: code/branches/presentation/src/modules/weapons/weaponmodes/FusionFire.cc
===================================================================
--- code/branches/presentation/src/modules/weapons/weaponmodes/FusionFire.cc	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/weaponmodes/FusionFire.cc	(revision 8580)
@@ -23,5 +23,5 @@
  *      Martin Polak
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -48,5 +48,5 @@
         this->reloadTime_ = 1.0;
         this->bParallelReload_ = false;
-        this->damage_ = 40;
+        this->damage_ = 0; //default 40
         this->speed_ = 1250;
 
@@ -54,4 +54,6 @@
     }
 
+    /* Creates the projectile (BillboardProjectile) object, sets its properties to the FusionFire properties
+     */
     void FusionFire::fire()
     {
@@ -65,4 +67,7 @@
         projectile->setOwner(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn());
         projectile->setDamage(this->getDamage());
+        projectile->setShieldDamage(this->getShieldDamage());
+        projectile->setHealthDamage(this->getHealthDamage());
+
         projectile->setColour(ColourValue(1.0f, 0.7f, 0.3f, 1.0f));
     }
Index: code/branches/presentation/src/modules/weapons/weaponmodes/HsW01.cc
===================================================================
--- code/branches/presentation/src/modules/weapons/weaponmodes/HsW01.cc	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/weaponmodes/HsW01.cc	(revision 8580)
@@ -23,5 +23,5 @@
  *      Hagen Seifert
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -51,5 +51,5 @@
 
         this->reloadTime_ = 0.25;
-        this->damage_ = 15;
+        this->damage_ = 0; //default 15
         this->speed_ = 2500;
         this->delay_ = 0;
@@ -109,4 +109,6 @@
     }
 
+    /* Creates the projectile object, sets its properties to the HsW01 properties, calls muendungsfeuer()
+     */
     void HsW01::shot()
     {
@@ -126,4 +128,6 @@
         projectile->setOwner(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn());
         projectile->setDamage(this->getDamage());
+        projectile->setShieldDamage(this->getShieldDamage());
+        projectile->setHealthDamage(this->getHealthDamage());
 
         HsW01::muendungsfeuer();
Index: code/branches/presentation/src/modules/weapons/weaponmodes/LaserFire.cc
===================================================================
--- code/branches/presentation/src/modules/weapons/weaponmodes/LaserFire.cc	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/weaponmodes/LaserFire.cc	(revision 8580)
@@ -23,5 +23,5 @@
  *      Martin Polak
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -45,5 +45,5 @@
 
         this->reloadTime_ = 0.25;
-        this->damage_ = 15;
+        this->damage_ = 0; //default 15
         this->speed_ = 1250;
 
@@ -51,4 +51,6 @@
     }
 
+    /* Creates the projectile object, sets its properties to the LaserFire properties
+     */
     void LaserFire::fire()
     {
@@ -61,4 +63,6 @@
         projectile->setOwner(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn());
         projectile->setDamage(this->getDamage());
+        projectile->setShieldDamage(this->getShieldDamage());
+        projectile->setHealthDamage(this->getHealthDamage());
     }
 }
Index: code/branches/presentation/src/modules/weapons/weaponmodes/LightningGun.cc
===================================================================
--- code/branches/presentation/src/modules/weapons/weaponmodes/LightningGun.cc	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/weaponmodes/LightningGun.cc	(revision 8580)
@@ -23,5 +23,5 @@
  *      Joel Smely
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -45,5 +45,5 @@
 
         this->reloadTime_ = 1;
-        this->damage_ = 100;
+        this->damage_ = 0; //default 100
         this->speed_ = 150;
 
@@ -56,4 +56,6 @@
     }
 
+    /* Creates the projectile (LightningGunProjectile) object, sets its properties to the LightningGun properties
+     */
     void LightningGun::fire()
     {
@@ -69,4 +71,6 @@
         projectile->setOwner(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn());
         projectile->setDamage(this->getDamage());
+        projectile->setShieldDamage(this->getShieldDamage());
+        projectile->setHealthDamage(this->getHealthDamage());
     }
 }
Index: code/branches/presentation/src/modules/weapons/weaponmodes/RocketFire.cc
===================================================================
--- code/branches/presentation/src/modules/weapons/weaponmodes/RocketFire.cc	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/weaponmodes/RocketFire.cc	(revision 8580)
@@ -23,5 +23,5 @@
  *      Oliver Scheuss
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -48,5 +48,5 @@
         this->reloadTime_ = 0.20f;
         this->bParallelReload_ = false;
-        this->damage_ = 100;
+        this->damage_ = 0;
         this->speed_ = 500;
 
@@ -59,4 +59,6 @@
     }
 
+    /* Creates the Rocket object, sets its properties to the RocketFire properties
+     */
     void RocketFire::fire()
     {
@@ -71,4 +73,6 @@
         rocket->setOwner(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn());
         rocket->setDamage(this->getDamage());
+        rocket->setShieldDamage(this->getShieldDamage());
+        rocket->setHealthDamage(this->getHealthDamage());
     }
 }
Index: code/branches/presentation/src/modules/weapons/weaponmodes/SimpleRocketFire.cc
===================================================================
--- code/branches/presentation/src/modules/weapons/weaponmodes/SimpleRocketFire.cc	(revision 8579)
+++ code/branches/presentation/src/modules/weapons/weaponmodes/SimpleRocketFire.cc	(revision 8580)
@@ -23,5 +23,5 @@
  *      Oliver Scheuss
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -50,5 +50,5 @@
         this->reloadTime_ = 1;
         this->bParallelReload_ = false;
-        this->damage_ = 100;
+        this->damage_ = 0;
         this->speed_ = 500;
 
@@ -62,4 +62,6 @@
     }
 
+    /* Creates the Rocket (RocketController) object, sets its properties to the SimpleRocketFire properties, sets target
+     */
     void SimpleRocketFire::fire()
     {
@@ -71,5 +73,9 @@
         rocket->setVelocity(this->getMuzzleDirection()*this->speed_);
         rocket->setOwner(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn());
+
         rocket->setDamage(this->damage_);
+        rocket->setShieldDamage(this->getShieldDamage());
+        rocket->setHealthDamage(this->getHealthDamage());
+
         WorldEntity* pawnn=static_cast<ControllableEntity*>(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn())->getTarget();
         if (pawnn) con->setTarget(pawnn);
Index: code/branches/presentation/src/orxonox/controllers/Controller.h
===================================================================
--- code/branches/presentation/src/orxonox/controllers/Controller.h	(revision 8579)
+++ code/branches/presentation/src/orxonox/controllers/Controller.h	(revision 8580)
@@ -52,4 +52,10 @@
             virtual inline void hit(Pawn* originator, btManifoldPoint& contactpoint, float damage) {};
 
+/* Override needed for different visual effects (e.g. in "NewHumanController.cc") depending on
+   the DIFFERENT AMOUNT OF DAMAGE done to the shield and to the health of "victim" (see Projectile.cc, Pawn.cc)
+
+//            virtual inline void hit(Pawn* originator, btManifoldPoint& contactpoint, float damage, float healthdamage, float shielddamage) {};
+*/
+
             void setGodMode( bool mode ){ this->bGodMode_ = mode; }
             bool getGodMode(){ return this->bGodMode_; }
Index: code/branches/presentation/src/orxonox/controllers/HumanController.cc
===================================================================
--- code/branches/presentation/src/orxonox/controllers/HumanController.cc	(revision 8579)
+++ code/branches/presentation/src/orxonox/controllers/HumanController.cc	(revision 8580)
@@ -42,4 +42,5 @@
     extern const std::string __CC_fire_name = "fire";
     extern const std::string __CC_suicide_name = "suicide";
+    const std::string __CC_boost_name = "boost";
 
     SetConsoleCommand("HumanController", "moveFrontBack",          &HumanController::moveFrontBack ).addShortcut().setAsInputCommand();
@@ -51,5 +52,5 @@
     SetConsoleCommand("HumanController", __CC_fire_name,           &HumanController::fire          ).addShortcut().keybindMode(KeybindMode::OnHold);
     SetConsoleCommand("HumanController", "reload",                 &HumanController::reload        ).addShortcut();
-    SetConsoleCommand("HumanController", "boost",                  &HumanController::boost         ).addShortcut().keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand("HumanController", __CC_boost_name,          &HumanController::keepBoost     ).addShortcut().keybindMode(KeybindMode::OnHold);
     SetConsoleCommand("HumanController", "greet",                  &HumanController::greet         ).addShortcut();
     SetConsoleCommand("HumanController", "switchCamera",           &HumanController::switchCamera  ).addShortcut();
@@ -66,4 +67,5 @@
 
     HumanController* HumanController::localController_s = 0;
+    /*static*/ const float HumanController::BOOSTING_TIME = 0.1f;
 
     HumanController::HumanController(BaseObject* creator) : Controller(creator)
@@ -71,7 +73,10 @@
         RegisterObject(HumanController);
 
-        controlPaused_ = false;
+        this->controlPaused_ = false;
+        this->boosting_ = false;
 
         HumanController::localController_s = this;
+        this->boostingTimeout_.setTimer(HumanController::BOOSTING_TIME, false, createExecutor(createFunctor(&HumanController::terminateBoosting, this)));
+        this->boostingTimeout_.stopTimer();
     }
 
@@ -163,8 +168,47 @@
     }
 
-    void HumanController::boost()
-    {
-        if (HumanController::localController_s && HumanController::localController_s->controllableEntity_)
-            HumanController::localController_s->controllableEntity_->boost();
+    /**
+    @brief
+        Static method,keeps boosting.
+    */
+    /*static*/ void HumanController::keepBoost()
+    {
+        if (HumanController::localController_s && HumanController::localController_s->controllableEntity_)
+            HumanController::localController_s->keepBoosting();
+    }
+    
+    /**
+    @brief
+        Starts, or keeps the boosting mode.
+        Resets the boosting timeout and ells the ControllableEntity to boost (or not boost anymore).
+    */
+    void HumanController::keepBoosting(void)
+    {
+        if(this->boostingTimeout_.isActive())
+        {
+            this->boostingTimeout_.stopTimer();
+            this->boostingTimeout_.startTimer();
+        }
+        else
+        {
+            this->boosting_ = true;
+            this->boostingTimeout_.startTimer();
+            
+            this->controllableEntity_->boost(this->boosting_);
+            COUT(4) << "Start boosting" << endl;
+        }
+    }
+
+    /**
+    @brief
+        Terminates the boosting mode.
+    */
+    void HumanController::terminateBoosting(void)
+    {
+        this->boosting_ = false;
+        this->boostingTimeout_.stopTimer();
+
+        this->controllableEntity_->boost(this->boosting_);
+        COUT(4) << "Stop boosting" << endl;
     }
 
Index: code/branches/presentation/src/orxonox/controllers/HumanController.h
===================================================================
--- code/branches/presentation/src/orxonox/controllers/HumanController.h	(revision 8579)
+++ code/branches/presentation/src/orxonox/controllers/HumanController.h	(revision 8580)
@@ -32,4 +32,5 @@
 #include "OrxonoxPrereqs.h"
 
+#include "tools/Timer.h"
 #include "tools/interfaces/Tickable.h"
 #include "Controller.h"
@@ -64,5 +65,14 @@
             static void reload();
 
-            static void boost();
+            static void keepBoost(); // Static method, keeps boosting.
+            /**
+            @brief Check whether the HumanController is in boosting mode.
+            @return Returns true if it is, false if not.
+            */
+            inline bool isBoosting(void)
+                { return this->boosting_; }
+            void keepBoosting(void);
+            void terminateBoosting(void);
+            
             static void greet();
             static void switchCamera();
@@ -92,4 +102,10 @@
             static HumanController* localController_s;
             bool controlPaused_;
+        
+        private:
+            bool boosting_; // Whether the HumanController is in boosting mode or not.
+            Timer boostingTimeout_; // A timer to check whether the player is no longer boosting.
+            static const float BOOSTING_TIME; // The time after it is checked, whether the player is no longer boosting.
+
     }; // tolua_export
 } // tolua_export
Index: code/branches/presentation/src/orxonox/graphics/Camera.cc
===================================================================
--- code/branches/presentation/src/orxonox/graphics/Camera.cc	(revision 8579)
+++ code/branches/presentation/src/orxonox/graphics/Camera.cc	(revision 8580)
@@ -48,5 +48,5 @@
     CreateFactory(Camera);
 
-    Camera::Camera(BaseObject* creator) : StaticEntity(creator)
+    Camera::Camera(BaseObject* creator) : MovableEntity(creator)
     {
         RegisterObject(Camera);
Index: code/branches/presentation/src/orxonox/graphics/Camera.h
===================================================================
--- code/branches/presentation/src/orxonox/graphics/Camera.h	(revision 8579)
+++ code/branches/presentation/src/orxonox/graphics/Camera.h	(revision 8580)
@@ -36,9 +36,10 @@
 #include "tools/interfaces/Tickable.h"
 #include "tools/interfaces/TimeFactorListener.h"
-#include "worldentities/StaticEntity.h"
+#include "worldentities/MovableEntity.h"
 
 namespace orxonox
 {
-    class _OrxonoxExport Camera : public StaticEntity, public Tickable, public TimeFactorListener, public WindowEventListener
+
+    class _OrxonoxExport Camera : public MovableEntity, public TimeFactorListener, public WindowEventListener
     {
         friend class CameraManager;
Index: code/branches/presentation/src/orxonox/items/Engine.cc
===================================================================
--- code/branches/presentation/src/orxonox/items/Engine.cc	(revision 8579)
+++ code/branches/presentation/src/orxonox/items/Engine.cc	(revision 8580)
@@ -204,6 +204,4 @@
         this->ship_->setAcceleration(this->ship_->getOrientation() * (acceleration*this->getSpeedMultiply()+Vector3(0,0,-this->getSpeedAdd())));
 
-        if (!this->ship_->getPermanentBoost())
-            this->ship_->setBoost(false);
         this->ship_->setSteeringDirection(Vector3::ZERO);
 
Index: code/branches/presentation/src/orxonox/weaponsystem/WeaponMode.cc
===================================================================
--- code/branches/presentation/src/orxonox/weaponsystem/WeaponMode.cc	(revision 8579)
+++ code/branches/presentation/src/orxonox/weaponsystem/WeaponMode.cc	(revision 8580)
@@ -66,4 +66,6 @@
 
         this->damage_ = 0;
+        this->healthdamage_ = 0;
+        this->shielddamage_ = 0;
 
         this->muzzleOffset_ = Vector3::ZERO;
@@ -106,4 +108,6 @@
 
         XMLPortParam(WeaponMode, "damage",           setDamage,           getDamage,           xmlelement, mode);
+        XMLPortParam(WeaponMode, "healthdamage",     setHealthDamage,     getHealthDamage,     xmlelement, mode);
+        XMLPortParam(WeaponMode, "shielddamage",     setShieldDamage,     getShieldDamage,     xmlelement, mode);
         XMLPortParam(WeaponMode, "muzzleoffset",     setMuzzleOffset,     getMuzzleOffset,     xmlelement, mode);
     }
Index: code/branches/presentation/src/orxonox/weaponsystem/WeaponMode.h
===================================================================
--- code/branches/presentation/src/orxonox/weaponsystem/WeaponMode.h	(revision 8579)
+++ code/branches/presentation/src/orxonox/weaponsystem/WeaponMode.h	(revision 8580)
@@ -104,7 +104,16 @@
             // Fire
             inline void setDamage(float damage)
-                { this->damage_ = damage; }
+                { this->damage_ = damage;}
             inline float getDamage() const
                 { return this->damage_; }
+            inline void setHealthDamage(float healthdamage)
+                { this->healthdamage_ = healthdamage; }
+            inline float getHealthDamage() const
+                { return this->healthdamage_; }
+
+            inline void setShieldDamage(float shielddamage)
+                { this->shielddamage_ = shielddamage;}
+            inline float getShieldDamage() const
+                { return this->shielddamage_; }
 
             inline void setMuzzleOffset(const Vector3& offset)
@@ -146,4 +155,6 @@
 
             float damage_;
+            float healthdamage_;
+            float shielddamage_;
             Vector3 muzzleOffset_;
 
Index: code/branches/presentation/src/orxonox/worldentities/ControllableEntity.cc
===================================================================
--- code/branches/presentation/src/orxonox/worldentities/ControllableEntity.cc	(revision 8579)
+++ code/branches/presentation/src/orxonox/worldentities/ControllableEntity.cc	(revision 8580)
@@ -84,5 +84,4 @@
         this->client_angular_velocity_ = Vector3::ZERO;
 
-
         this->setConfigValues();
         this->setPriority( Priority::VeryHigh );
Index: code/branches/presentation/src/orxonox/worldentities/ControllableEntity.h
===================================================================
--- code/branches/presentation/src/orxonox/worldentities/ControllableEntity.h	(revision 8579)
+++ code/branches/presentation/src/orxonox/worldentities/ControllableEntity.h	(revision 8580)
@@ -93,5 +93,11 @@
             virtual void reload() {}
 
-            virtual void boost() {}
+            /**
+            @brief Tells the ControllableEntity to either start or stop boosting.
+                   This doesn't mean, that the ControllableEntity will do so, there might be additional restrictions on boosting, but if it can, then it will.
+            @param bBoost If true the ControllableEntity is told to start boosting, if false it is told to stop.
+            */
+            virtual void boost(bool bBoost) {}
+            
             virtual void greet() {}
             virtual void switchCamera();
Index: code/branches/presentation/src/orxonox/worldentities/pawns/Pawn.cc
===================================================================
--- code/branches/presentation/src/orxonox/worldentities/pawns/Pawn.cc	(revision 8579)
+++ code/branches/presentation/src/orxonox/worldentities/pawns/Pawn.cc	(revision 8580)
@@ -23,5 +23,5 @@
  *      Fabian 'x3n' Landau
  *   Co-authors:
- *      ...
+ *      simonmie
  *
  */
@@ -64,6 +64,13 @@
         this->maxHealth_ = 0;
         this->initialHealth_ = 0;
+
         this->shieldHealth_ = 0;
+        this->initialShieldHealth_ = 0;
+        this->maxShieldHealth_ = 100; //otherwise shield might increase to float_max
         this->shieldAbsorption_ = 0.5;
+
+        this->reloadRate_ = 0;
+        this->reloadWaitTime_ = 1.0f;
+        this->reloadWaitCountdown_ = 0;
 
         this->lastHitOriginator_ = 0;
@@ -109,4 +116,6 @@
 
         XMLPortParam(Pawn, "shieldhealth", setShieldHealth, getShieldHealth, xmlelement, mode).defaultValues(0);
+        XMLPortParam(Pawn, "initialshieldhealth", setInitialShieldHealth, getInitialShieldHealth, xmlelement, mode).defaultValues(0);
+        XMLPortParam(Pawn, "maxshieldhealth", setMaxShieldHealth, getMaxShieldHealth, xmlelement, mode).defaultValues(100);
         XMLPortParam(Pawn, "shieldabsorption", setShieldAbsorption, getShieldAbsorption, xmlelement, mode).defaultValues(0);
 
@@ -118,4 +127,7 @@
         XMLPortObject(Pawn, WeaponSet, "weaponsets", addWeaponSet, getWeaponSet, xmlelement, mode);
         XMLPortObject(Pawn, WeaponPack, "weapons", addWeaponPackXML, getWeaponPack, xmlelement, mode);
+
+        XMLPortParam(Pawn, "reloadrate", setReloadRate, getReloadRate, xmlelement, mode).defaultValues(0);
+        XMLPortParam(Pawn, "reloadwaittime", setReloadWaitTime, getReloadWaitTime, xmlelement, mode).defaultValues(1.0f);
     }
 
@@ -124,6 +136,7 @@
         registerVariable(this->bAlive_,           VariableDirection::ToClient);
         registerVariable(this->health_,           VariableDirection::ToClient);
-        registerVariable(this->initialHealth_,    VariableDirection::ToClient);
+        registerVariable(this->maxHealth_,        VariableDirection::ToClient);
         registerVariable(this->shieldHealth_,     VariableDirection::ToClient);
+        registerVariable(this->maxShieldHealth_,  VariableDirection::ToClient);
         registerVariable(this->shieldAbsorption_, VariableDirection::ToClient);
         registerVariable(this->bReload_,          VariableDirection::ToServer);
@@ -137,10 +150,23 @@
         this->bReload_ = false;
 
+        // TODO: use the existing timer functions instead
+        if(this->reloadWaitCountdown_ > 0)
+        {
+            this->decreaseReloadCountdownTime(dt);
+        }
+        else
+        {
+            this->addShieldHealth(this->getReloadRate() * dt);
+            this->resetReloadCountdown();
+        }
+
         if (GameMode::isMaster())
+        {
             if (this->health_ <= 0 && bAlive_)
             {
-                this->fireEvent(); // Event to notify anyone who want's to know about the death.
+                this->fireEvent(); // Event to notify anyone who wants to know about the death.
                 this->death();
             }
+        }
     }
 
@@ -168,60 +194,88 @@
     }
 
+
     void Pawn::setHealth(float health)
     {
-        this->health_ = std::min(health, this->maxHealth_);
-    }
-
-    void Pawn::damage(float damage, Pawn* originator)
+        this->health_ = std::min(health, this->maxHealth_); //Health can't be set to a value bigger than maxHealth, otherwise it will be reduced at first hit
+    }
+
+    void Pawn::setShieldHealth(float shieldHealth)
+    {
+        this->shieldHealth_ = std::min(shieldHealth, this->maxShieldHealth_);
+    }
+
+    void Pawn::setMaxShieldHealth(float maxshieldhealth)
+    {
+        this->maxShieldHealth_ = maxshieldhealth;
+    }
+
+    void Pawn::setReloadRate(float reloadrate)
+    {
+        this->reloadRate_ = reloadrate;
+    }
+
+    void Pawn::setReloadWaitTime(float reloadwaittime)
+    {
+        this->reloadWaitTime_ = reloadwaittime;
+    }
+
+    void Pawn::decreaseReloadCountdownTime(float dt)
+    {
+        this->reloadWaitCountdown_ -= dt;
+    }
+
+    void Pawn::damage(float damage, float healthdamage, float shielddamage, Pawn* originator)
     {
         if (this->getGametype() && this->getGametype()->allowPawnDamage(this, originator))
         {
-            //share the dealt damage to the shield and the Pawn.
-            float shielddamage = damage*this->shieldAbsorption_;
-            float healthdamage = damage*(1-this->shieldAbsorption_);
-
-            // In case the shield can not take all the shield damage.
-            if (shielddamage > this->getShieldHealth())
+            if (shielddamage >= this->getShieldHealth())
             {
-                healthdamage += shielddamage-this->getShieldHealth();
                 this->setShieldHealth(0);
+                this->setHealth(this->health_ - (healthdamage + damage));
             }
-
-            this->setHealth(this->health_ - healthdamage);
-
-            if (this->getShieldHealth() > 0)
+            else
             {
                 this->setShieldHealth(this->shieldHealth_ - shielddamage);
+
+                // remove remaining shieldAbsorpton-Part of damage from shield
+                shielddamage = damage * this->shieldAbsorption_;
+                shielddamage = std::min(this->getShieldHealth(),shielddamage);
+                this->setShieldHealth(this->shieldHealth_ - shielddamage);
+
+                // set remaining damage to health
+                this->setHealth(this->health_ - (damage - shielddamage) - healthdamage);
             }
 
             this->lastHitOriginator_ = originator;
-
-            // play damage effect
-        }
-    }
-
-    void Pawn::hit(Pawn* originator, const Vector3& force, float damage)
+        }
+    }
+
+// TODO: Still valid?
+/* HIT-Funktionen
+    Die hit-Funktionen muessen auch in src/orxonox/controllers/Controller.h angepasst werden! (Visuelle Effekte)
+
+*/
+
+    void Pawn::hit(Pawn* originator, const Vector3& force, float damage, float healthdamage, float shielddamage)
     {
         if (this->getGametype() && this->getGametype()->allowPawnHit(this, originator) && (!this->getController() || !this->getController()->getGodMode()) )
         {
-            this->damage(damage, originator);
+            this->damage(damage, healthdamage, shielddamage, originator);
             this->setVelocity(this->getVelocity() + force);
-
-            // play hit effect
-        }
-    }
-
-    void Pawn::hit(Pawn* originator, btManifoldPoint& contactpoint, float damage)
+        }
+    }
+
+
+    void Pawn::hit(Pawn* originator, btManifoldPoint& contactpoint, float damage, float healthdamage, float shielddamage)
     {
         if (this->getGametype() && this->getGametype()->allowPawnHit(this, originator) && (!this->getController() || !this->getController()->getGodMode()) )
         {
-            this->damage(damage, originator);
+            this->damage(damage, healthdamage, shielddamage, originator);
 
             if ( this->getController() )
-                this->getController()->hit(originator, contactpoint, damage);
-
-            // play hit effect
-        }
-    }
+                this->getController()->hit(originator, contactpoint, damage); // changed to damage, why shielddamage?
+        }
+    }
+
 
     void Pawn::kill()
Index: code/branches/presentation/src/orxonox/worldentities/pawns/Pawn.h
===================================================================
--- code/branches/presentation/src/orxonox/worldentities/pawns/Pawn.h	(revision 8579)
+++ code/branches/presentation/src/orxonox/worldentities/pawns/Pawn.h	(revision 8580)
@@ -72,8 +72,28 @@
                 { return this->initialHealth_; }
 
-            inline void setShieldHealth(float shieldHealth)
-            { this->shieldHealth_ = shieldHealth; }
+            virtual void setShieldHealth(float shieldHealth);
+
             inline float getShieldHealth()
             { return this->shieldHealth_; }
+
+            inline void addShieldHealth(float amount)
+            { this->setShieldHealth(this->shieldHealth_ + amount); }
+
+            inline bool hasShield()
+            { return (this->getShieldHealth() > 0); }
+
+            virtual void setMaxShieldHealth(float maxshieldhealth);
+            inline float getMaxShieldHealth() const
+                { return this->maxShieldHealth_; }
+
+            inline void setInitialShieldHealth(float initialshieldhealth)
+                { this->initialShieldHealth_ = initialshieldhealth; this->setShieldHealth(initialshieldhealth); }
+            inline float getInitialShieldHealth() const
+                { return this->initialShieldHealth_; }
+
+            inline void restoreInitialShieldHealth()
+                { this->setShieldHealth(this->initialShieldHealth_); }
+            inline void restoreMaxShieldHealth()
+                { this->setShieldHealth(this->maxShieldHealth_); }
 
             inline void setShieldAbsorption(float shieldAbsorption)
@@ -82,9 +102,29 @@
             { return this->shieldAbsorption_; }
 
+            // TODO: Rename to shieldRechargeRate
+            virtual void setReloadRate(float reloadrate);
+            inline float getReloadRate() const
+                { return this->reloadRate_; }
+
+            virtual void setReloadWaitTime(float reloadwaittime);
+            inline float getReloadWaitTime() const
+                { return this->reloadWaitTime_; }
+
+            inline void resetReloadCountdown()
+            { this->reloadWaitCountdown_ = 0; }
+
+            inline void startReloadCountdown()
+            { this->reloadWaitCountdown_ = this->getReloadWaitTime(); } // TODO: Implement in Projectile.cc
+
+            virtual void decreaseReloadCountdownTime(float dt);
+
             inline ControllableEntity* getLastHitOriginator() const
                 { return this->lastHitOriginator_; }
 
-            virtual void hit(Pawn* originator, const Vector3& force, float damage);
-            virtual void hit(Pawn* originator, btManifoldPoint& contactpoint, float damage);
+            //virtual void hit(Pawn* originator, const Vector3& force, float damage);
+            //virtual void hit(Pawn* originator, btManifoldPoint& contactpoint, float damage);
+            virtual void hit(Pawn* originator, const Vector3& force, float damage, float healthdamage = 0.0f, float shielddamage = 0.0f);
+            virtual void hit(Pawn* originator, btManifoldPoint& contactpoint, float damage, float healthdamage = 0.0f, float shielddamage = 0.0f);
+
             virtual void kill();
 
@@ -142,5 +182,6 @@
             virtual void spawneffect();
 
-            virtual void damage(float damage, Pawn* originator = 0);
+            //virtual void damage(float damage, Pawn* originator = 0);
+            virtual void damage(float damage, float healthdamage = 0.0f, float shielddamage = 0.0f, Pawn* originator = NULL);
 
             bool bAlive_;
@@ -154,6 +195,12 @@
             float maxHealth_;
             float initialHealth_;
+            
             float shieldHealth_;
+            float maxShieldHealth_;
+            float initialShieldHealth_;
             float shieldAbsorption_; // Has to be between 0 and 1
+            float reloadRate_;
+            float reloadWaitTime_;
+            float reloadWaitCountdown_;
 
             WeakPtr<Pawn> lastHitOriginator_;
Index: code/branches/presentation/src/orxonox/worldentities/pawns/SpaceShip.cc
===================================================================
--- code/branches/presentation/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 8579)
+++ code/branches/presentation/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 8580)
@@ -36,4 +36,7 @@
 #include "core/XMLPort.h"
 #include "items/Engine.h"
+#include "graphics/Camera.h"
+#include "CameraManager.h"
+#include "util/Math.h"
 
 namespace orxonox
@@ -53,5 +56,4 @@
         this->localAngularAcceleration_.setValue(0, 0, 0);
         this->bBoost_ = false;
-        this->bPermanentBoost_ = false;
         this->steering_ = Vector3::ZERO;
         this->engine_ = 0;
@@ -76,4 +78,12 @@
         this->setConfigValues();
         this->registerVariables();
+        
+        Camera* camera = CameraManager::getInstance().getActiveCamera();
+        this->cameraOriginalPosition_ = camera->getPosition();
+        this->cameraOriginalOrientation_ = camera->getOrientation();
+
+        this->shakeFrequency_ = 15;
+        this->shakeAmplitude_ = 5;
+        this->shakeDt_ = 0;
     }
 
@@ -96,4 +106,6 @@
         XMLPortParamVariable(SpaceShip, "boostRate", boostRate_, xmlelement, mode);
         XMLPortParamVariable(SpaceShip, "boostCooldownDuration", boostCooldownDuration_, xmlelement, mode);
+        XMLPortParamVariable(SpaceShip, "shakeFrequency", shakeFrequency_, xmlelement, mode);
+        XMLPortParamVariable(SpaceShip, "shakeAmplitude", shakeAmplitude_, xmlelement, mode);
     }
 
@@ -103,4 +115,11 @@
         registerVariable(this->auxilaryThrust_, VariableDirection::ToClient);
         registerVariable(this->rotationThrust_, VariableDirection::ToClient);
+        // TODO: Synchronization of boost needed?
+        registerVariable(this->boostPower_, VariableDirection::ToClient);
+        registerVariable(this->boostPowerRate_, VariableDirection::ToClient);
+        registerVariable(this->boostRate_, VariableDirection::ToClient);
+        registerVariable(this->boostCooldownDuration_, VariableDirection::ToClient);
+        registerVariable(this->shakeFrequency_, VariableDirection::ToClient);
+        registerVariable(this->shakeAmplitude_, VariableDirection::ToClient);
     }
 
@@ -128,4 +147,5 @@
         if (this->hasLocalController())
         {
+
 /*
             this->localLinearAcceleration_.setX(this->localLinearAcceleration_.x() * getMass() * this->auxilaryThrust_);
@@ -150,4 +170,5 @@
                 this->boostPower_ += this->boostPowerRate_*dt;
             }
+
             if(this->bBoost_)
             {
@@ -155,15 +176,13 @@
                 if(this->boostPower_ <= 0.0f)
                 {
-                    this->bBoost_ = false;
+                    this->boost(false);
                     this->bBoostCooldown_ = true;
                     this->timer_.setTimer(this->boostCooldownDuration_, false, createExecutor(createFunctor(&SpaceShip::boostCooledDown, this)));
+
                 }
-            }
-        }
-    }
-
-    void SpaceShip::boostCooledDown(void)
-    {
-        this->bBoostCooldown_ = false;
+
+                shakeCamera(dt);
+            }
+        }
     }
 
@@ -207,26 +226,77 @@
     }
 
-    // TODO: something seems to call this function every tick, could probably handled a little more efficiently!
-    void SpaceShip::setBoost(bool bBoost)
-    {
-        if(bBoost == this->bBoost_)
+    void SpaceShip::fire()
+    {
+    }
+
+    /**
+    @brief
+        Starts or stops boosting.
+    @param bBoost
+        Whether to start or stop boosting.
+    */
+    void SpaceShip::boost(bool bBoost)
+    {
+        if(bBoost && !this->bBoostCooldown_)
+        {
+            //COUT(0) << "Boost startet!\n";
+            this->bBoost_ = true;
+        }
+        if(!bBoost)
+        {
+            //COUT(0) << "Boost stoppt\n";
+            this->resetCamera();
+            this->bBoost_ = false;
+        }
+    }
+    
+    void SpaceShip::boostCooledDown(void)
+    {
+        this->bBoostCooldown_ = false;
+    }
+    
+    void SpaceShip::shakeCamera(float dt)
+    {
+        //make sure the ship is only shaking if it's moving
+        if (this->getVelocity().squaredLength() > 80)
+        {
+            this->shakeDt_ += dt;
+    
+            int frequency = this->shakeFrequency_ * (this->getVelocity().squaredLength());
+    
+            if (this->shakeDt_ >= 1 /(frequency))
+            {
+                this->shakeDt_ -= 1/(frequency);
+            }
+    
+            Degree angle = Degree(sin(this->shakeDt_ * 2* math::pi * frequency) * this->shakeAmplitude_);
+    
+            //COUT(0) << "Angle: " << angle << std::endl;
+            Camera* c = this->getCamera();
+
+            //Shaking Camera effect
+            if (c != 0)
+            {
+                c->setOrientation(Vector3::UNIT_X, angle);
+            }
+        }
+    }
+    
+    void SpaceShip::resetCamera()
+    {
+    
+        //COUT(0) << "Resetting camera\n";
+        Camera *c = this->getCamera();
+    
+        if (c == 0)
+        {
+            COUT(2) << "Failed to reset camera!";
             return;
-
-        if(bBoost)
-            this->boost();
-        else
-        {
-            this->bBoost_ = false;
-        }
-    }
-
-    void SpaceShip::fire()
-    {
-    }
-
-    void SpaceShip::boost()
-    {
-        if(!this->bBoostCooldown_)
-            this->bBoost_ = true;
+        }
+    
+        shakeDt_ = 0;
+        //
+        c->setPosition(this->cameraOriginalPosition_);
+        c->setOrientation(this->cameraOriginalOrientation_);
     }
 
@@ -273,3 +343,5 @@
         return list;
     }
+    
+
 }
Index: code/branches/presentation/src/orxonox/worldentities/pawns/SpaceShip.h
===================================================================
--- code/branches/presentation/src/orxonox/worldentities/pawns/SpaceShip.h	(revision 8579)
+++ code/branches/presentation/src/orxonox/worldentities/pawns/SpaceShip.h	(revision 8580)
@@ -59,5 +59,5 @@
 
             virtual void fire();
-            virtual void boost();
+            virtual void boost(bool bBoost); // Starts or stops boosting.
 
             void setEngine(Engine* engine);
@@ -70,5 +70,4 @@
                 { return this->steering_; }
 
-            void setBoost(bool bBoost);
             inline bool getBoost() const
                 { return this->bBoost_; }
@@ -79,9 +78,4 @@
                 { return this->enginetemplate_; }
 
-            inline void setPermanentBoost(bool bPermanent)
-                { this->bPermanentBoost_ = bPermanent; }
-            inline bool getPermanentBoost() const
-                { return this->bPermanentBoost_; }
-
         protected:
             virtual std::vector<PickupCarrier*>* getCarrierChildren(void) const;
@@ -90,5 +84,4 @@
             bool bBoost_;
             bool bBoostCooldown_;
-            bool bPermanentBoost_;
             float boostPower_;
             float initialBoostPower_;
@@ -103,4 +96,7 @@
             btVector3 localAngularAcceleration_;
 
+            float shakeFrequency_;
+            float shakeAmplitude_;
+
         private:
             void registerVariables();
@@ -110,8 +106,15 @@
             
             void boostCooledDown(void);
+        
+            void resetCamera();
+            void shakeCamera(float dt);
 
             std::string enginetemplate_;
             Engine* engine_;
             Timer timer_;
+            Vector3 cameraOriginalPosition_;
+            Quaternion cameraOriginalOrientation_;
+        
+            float shakeDt_;
     };
 }
