Index: code/branches/presentationFS16/src/orxonox/weaponsystem/Weapon.cc
===================================================================
--- code/branches/presentationFS16/src/orxonox/weaponsystem/Weapon.cc	(revision 11193)
+++ code/branches/presentationFS16/src/orxonox/weaponsystem/Weapon.cc	(revision 11208)
@@ -99,5 +99,5 @@
         Fire this Weapon with the the WeaponMode defined by @param mode
     */
-    void Weapon::fire(unsigned int mode)
+    void Weapon::push(unsigned int mode)
     {
         // To avoid firing with more than one mode at the same time, we lock the weapon (reloading) for
@@ -114,4 +114,6 @@
         // Note: The reloading of each WeaponMode is internally handled by each A, B and C.
         //       The reloading of the weapon is only performed to avoid firing with different modes at the same time.
+   
+   
         if (this->bReloading_ && this->reloadingWeaponmode_ != mode)
             return;
@@ -123,5 +125,27 @@
         {
             float reloading_time = 0;
-            if (it->second->fire(&reloading_time))
+            if (it->second->push(&reloading_time))
+            {
+                this->bReloading_ = true;
+                this->reloadingWeaponmode_ = mode;
+
+                this->reloadTimer_.setInterval(reloading_time);
+                this->reloadTimer_.startTimer();
+            }
+        }
+    }
+
+    void Weapon::release(unsigned int mode)
+    {
+        if (this->bReloading_ && this->reloadingWeaponmode_ != mode)
+            return;
+
+        std::multimap<unsigned int, WeaponMode*>::iterator start = this->weaponmodes_.lower_bound(mode);
+        std::multimap<unsigned int, WeaponMode*>::iterator end   = this->weaponmodes_.upper_bound(mode);
+
+        for (std::multimap<unsigned int, WeaponMode*>::iterator it = start; it != end; ++it)
+        {
+            float reloading_time = 0;
+            if (it->second->release(&reloading_time))
             {
                 this->bReloading_ = true;
Index: code/branches/presentationFS16/src/orxonox/weaponsystem/Weapon.h
===================================================================
--- code/branches/presentationFS16/src/orxonox/weaponsystem/Weapon.h	(revision 11193)
+++ code/branches/presentationFS16/src/orxonox/weaponsystem/Weapon.h	(revision 11208)
@@ -52,5 +52,6 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode) override;
 
-            void fire(unsigned int mode);
+            void push(unsigned int mode);
+            void release(unsigned int mode);
             void reload();
 
Index: code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponMode.cc
===================================================================
--- code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponMode.cc	(revision 11193)
+++ code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponMode.cc	(revision 11208)
@@ -24,5 +24,5 @@
  *      Fabian 'x3n' Landau
  *   Co-authors:
- *      ...
+ *      Johannes Sager
  *
  */
@@ -63,4 +63,7 @@
         this->bAutoReload_ = true;
         this->bParallelReload_ = true;
+        this->chargeable_ = false;              // most weapons are not chargeable
+        this->charges_ = 0;                     // always start with no charges
+        this->maxCharges_ = 100;                // default maximum charges one can have are 100
 
         this->reloadTimer_.setTimer(0.0f, false, createExecutor(createFunctor(&WeaponMode::reloaded, this)));
@@ -121,5 +124,4 @@
     {
         (*reloadTime) = this->reloadTime_;
-        
         // Fireing is only possible if this weapon mode is not reloading and there is enough munition
         if (!this->bReloading_ && this->munition_ && this->munition_->takeMunition(this->munitionPerShot_, this))
@@ -169,4 +171,34 @@
     }
 
+    bool WeaponMode::push(float* reloadTime)
+    {
+
+        if( this->chargeable_)                                                                                                          // chargeable weapons are supposed to charge on push
+        {
+            this->munition_ = this->weapon_->getWeaponPack()->getWeaponSystem()->getMunition(&this->munitiontype_);                     // updates the pointer to the munition(which we use in the next step)
+            if(this->charges_ < this->maxCharges_ && this->bReloading_ == false && this->munition_->canTakeMunition(1, this))           // charges up unless:
+            {                                                                                                                           // - we are fully charged
+                this->charges_ += 1;                                                                                                    // - we are reloading
+            }                                                                                                                           // - we have no munition
+            return false;
+        }
+        else                                                                                                                            // normal (not chargeable) weapons are supposed to fire on push
+        {
+            return fire(reloadTime);
+        }
+    }
+
+    bool WeaponMode::release(float* reloadTime)                 
+    {
+        if( this->chargeable_)                                                                                                          // chargeable weapons are supposed to fire on release
+        { 
+            return fire(reloadTime);
+        }
+        else                                                                                                                            // normal (not chargeable) weapons should do nothing on release
+        {
+            return false;
+        }
+    }
+
     bool WeaponMode::reload()
     {
Index: code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponMode.h
===================================================================
--- code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponMode.h	(revision 11193)
+++ code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponMode.h	(revision 11208)
@@ -24,5 +24,5 @@
  *      Fabian 'x3n' Landau
  *   Co-authors:
- *      ...
+ *      Johannes Sager
  *
  */
@@ -45,5 +45,7 @@
     /**
     @brief
-        A WeaponMode defines how a Weapon is used. It specifies what kind of @ref orxonox::Projectile is created when you fire it, how much time it takes to reload, what sound you hear while shooting, how much damage the projectile deals to a target, ...
+        A WeaponMode defines how a Weapon is used. It specifies what kind of
+        @ref orxonox::Projectile is created when you fire it, how much time it takes to reload,
+        what sound you hear while shooting, how much damage the projectile deals to a target, ...
     */
     class _OrxonoxExport WeaponMode : public BaseObject
@@ -55,4 +57,6 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode) override;
 
+            virtual bool push(float* reloadTime);
+            virtual bool release(float* reloadTime);
             virtual bool fire(float* reloadTime);
             bool reload();
@@ -106,4 +110,10 @@
 
             // Fire
+            inline unsigned int getMaxCharges()                 // get the maximum of charges one can have
+                { return this->maxCharges_;}
+            inline unsigned int getCharges()                    // get the current amount of charges
+                { return this->charges_;}
+            inline bool isChargeable()                          // returns if the weaponmode is chargeable
+                { return this->chargeable_;}
             inline void setDamage(float damage)
                 { this->damage_ = damage;}
@@ -166,8 +176,11 @@
             unsigned int initialMagazines_;
             unsigned int munitionPerShot_;
+            unsigned int charges_;                  // current amount of charges only matters for chargeable weapons(chargeable == true)
+            unsigned int maxCharges_;               // maximum amount of charges (is initialized with 100 in weaponmode.cc) only matters for chargeable weapons(chargeable == true)
 
             float reloadTime_;
-            bool bAutoReload_; // If true, the weapon reloads the magazine automatically.
-            bool bParallelReload_; // If true, the weapon reloads in parallel to the magazine reloading.
+            bool bAutoReload_;                      // If true, the weapon reloads the magazine automatically.
+            bool bParallelReload_;                  // If true, the weapon reloads in parallel to the magazine reloading.
+            bool chargeable_;                       // If true, the weapon charges up on push and fires on release
 
             float damage_;
@@ -189,14 +202,14 @@
 
             Timer reloadTimer_;
-            bool bReloading_; // If true, this weapon mode is marked as reloading.
+            bool bReloading_;                       // If true, this weapon mode is marked as reloading.
 
             Vector3 muzzlePosition_;
             Quaternion muzzleOrientation_;
 
-            std::string fireSoundPath_; // The path of the sound played when fireing
-            float fireSoundVolume_; // The volume of the sound played when fireing
-            std::vector<WorldSound*> fireSounds_; // List of sounds used by the weapon mode. Because multiple sounds may overlap, we need mor than one WorldSound instance.
-            std::string reloadSoundPath_; // The path of the sound played when reloading
-            float reloadSoundVolume_; // The volume of the sound played when reloading
+            std::string fireSoundPath_;             // The path of the sound played when fireing
+            float fireSoundVolume_;                 // The volume of the sound played when fireing
+            std::vector<WorldSound*> fireSounds_;   // List of sounds used by the weapon mode. Because multiple sounds may overlap, we need mor than one WorldSound instance.
+            std::string reloadSoundPath_;           // The path of the sound played when reloading
+            float reloadSoundVolume_;               // The volume of the sound played when reloading
             WorldSound* reloadSound_;
     };
Index: code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponPack.cc
===================================================================
--- code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponPack.cc	(revision 11193)
+++ code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponPack.cc	(revision 11208)
@@ -74,8 +74,14 @@
         Fire all weapons in this WeaponSet with the defined weaponmode.
     */
-    void WeaponPack::fire(unsigned int weaponmode)
+    void WeaponPack::push(unsigned int weaponmode)
     {
         for (Weapon* weapon : this->weapons_)
-            weapon->fire(weaponmode);
+            weapon->push(weaponmode);
+    }
+
+    void WeaponPack::release(unsigned int weaponmode)
+    {
+        for (Weapon* weapon : this->weapons_)
+            weapon->release(weaponmode);
     }
 
Index: code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponPack.h
===================================================================
--- code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponPack.h	(revision 11193)
+++ code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponPack.h	(revision 11208)
@@ -46,5 +46,6 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode) override;
 
-            void fire(unsigned int weaponmode);
+            void push(unsigned int weaponmode);
+            void release(unsigned int weaponmode);
             void reload();
 
Index: code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSet.cc
===================================================================
--- code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSet.cc	(revision 11193)
+++ code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSet.cc	(revision 11208)
@@ -60,10 +60,18 @@
     }
 
-    void WeaponSet::fire()
+    void WeaponSet::push()
     {
         // Fire all WeaponPacks with their defined weaponmode
         for (const auto& mapEntry : this->weaponpacks_)
             if (mapEntry.second != WeaponSystem::WEAPON_MODE_UNASSIGNED)
-                mapEntry.first->fire(mapEntry.second);
+                mapEntry.first->push(mapEntry.second);
+    }
+
+    void WeaponSet::release()
+    {
+        // Fire all WeaponPacks with their defined weaponmode
+        for (const auto& mapEntry : this->weaponpacks_)
+            if (mapEntry.second != WeaponSystem::WEAPON_MODE_UNASSIGNED)
+                mapEntry.first->release(mapEntry.second);
     }
 
Index: code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSet.h
===================================================================
--- code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSet.h	(revision 11193)
+++ code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSet.h	(revision 11208)
@@ -46,5 +46,6 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode) override;
 
-            void fire();
+            void push();
+            void release();
             void reload();
 
Index: code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSystem.cc
===================================================================
--- code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSystem.cc	(revision 11193)
+++ code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSystem.cc	(revision 11208)
@@ -287,9 +287,16 @@
         Fires the @ref orxonox::WeaponSet with the specified firemode.
     */
-    void WeaponSystem::fire(unsigned int firemode)
+    void WeaponSystem::push(unsigned int firemode)
     {
         std::map<unsigned int, WeaponSet *>::iterator it = this->weaponSets_.find(firemode);
         if (it != this->weaponSets_.end() && it->second)
-            it->second->fire();
+            it->second->push();
+    }
+
+    void WeaponSystem::release(unsigned int firemode)
+    {
+        std::map<unsigned int, WeaponSet *>::iterator it = this->weaponSets_.find(firemode);
+        if (it != this->weaponSets_.end() && it->second)
+            it->second->release();
     }
 
Index: code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSystem.h
===================================================================
--- code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSystem.h	(revision 11193)
+++ code/branches/presentationFS16/src/orxonox/weaponsystem/WeaponSystem.h	(revision 11208)
@@ -76,5 +76,6 @@
             void changeWeaponmode(WeaponPack * wPack, WeaponSet * wSet, unsigned int weaponmode);
 
-            void fire(unsigned int firemode);
+            void push(unsigned int firemode);
+            void release(unsigned int firemode);
             void reload();
 
