Index: code/branches/weapon2/src/orxonox/objects/weaponSystem/Munition.cc
===================================================================
--- code/branches/weapon2/src/orxonox/objects/weaponSystem/Munition.cc	(revision 2186)
+++ code/branches/weapon2/src/orxonox/objects/weaponSystem/Munition.cc	(revision 2203)
@@ -46,4 +46,23 @@
     }
 
+
+    void Munition::decrementBullets()
+    {
+        this->bullets--;
+    }
+    void Munition::decrementMagazines()
+    {
+        this->magazines--;
+    }
+    void Munition::incrementBullets()
+    {
+        this->bullets++;
+    }
+    void Munition::incrementMagazines()
+    {
+        this->magazines++;
+    }
+
+
     void Munition::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
Index: code/branches/weapon2/src/orxonox/objects/weaponSystem/Munition.h
===================================================================
--- code/branches/weapon2/src/orxonox/objects/weaponSystem/Munition.h	(revision 2186)
+++ code/branches/weapon2/src/orxonox/objects/weaponSystem/Munition.h	(revision 2203)
@@ -45,8 +45,12 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
 
+            void decrementBullets();
+            void decrementMagazines();
+            void incrementBullets();
+            void incrementMagazines();
 
         private:
-
-
+            int bullets;
+            int magazines;
     };
 }
Index: code/branches/weapon2/src/orxonox/objects/weaponSystem/Weapon.cc
===================================================================
--- code/branches/weapon2/src/orxonox/objects/weaponSystem/Weapon.cc	(revision 2186)
+++ code/branches/weapon2/src/orxonox/objects/weaponSystem/Weapon.cc	(revision 2203)
@@ -35,5 +35,4 @@
 #include "Weapon.h"
 
-
 namespace orxonox
 {
@@ -43,7 +42,4 @@
         this->weaponReadyToShoot_ = true;
         this->setParentWeaponSystem();
-        this->pointerToMunition_ = this->parentWeaponSystem_->getAttachedMunitionPointer;
-        this->attachNeededMunition(this->pointerToMunition_);
-
     }
 
@@ -62,29 +58,51 @@
 
     }
+    void Weapon::timer()
+    {
+        this->reloadTimer_.setTimer( this->loadingTime_ , false , this , createExecutor(createFunctor(&Weapon::reloaded)));
+    }
 
     void Weapon::reloaded()
     {
+
         this->weaponReadyToShoot_ = true;
     }
 
-    void attachNeededMunition(Munition *pointerToMunition)
+    void Weapon::attachNeededMunition(std::string munitionName)
     {
         //if munition type already exist attach it, else create a new one of this type and attach it to the weapon and to the WeaponSystem
-        if ( this->parentWeaponSystem_->munitionSet_[laserGunMunition] )
-            this->pointerToMunition_ = pointerToMunition;
+        if ( this->parentWeaponSystem_->getMunitionType(munitionName) )
+            this->munition_ = this->parentWeaponSystem_->getMunitionType(munitionName);
         else
         {
-            this->pointerToMunition_ = new LaserGunMunition;
-            this->parentWeaponSystem_->munitionSet_[laserGunMunition] = this->pointerToMunition_;
-
+            //create new munition with identifier
+            this->munitionIdentifier_ = ClassByString(munitionName);
+            this->munition_ = this->munitionIdentifier_.fabricate(this);
+            this->parentWeaponSystem_->setNewMunition(munitionName, this->munition_);
         }
     }
 
-/*
+
+    /*get and set functions
+     *
+     */
     void Weapon::setParentWeaponSystem()
-    {
-        this->parentWeaponSystem_ = this->parentWeaponSlot_->parentWeaponSet_->parentWeaponSystem_;
-    }
-*/
+    {   this->parentWeaponSystem_ = this->parentWeaponSlot_->getParentWeaponSet()->getParentWeaponSystem(); }
 
+    Munition * Weapon::getAttachedMunition()
+    {   return this->munition_; }
+
+    void Weapon::setLoadingTime(float loadingTime)
+    {   this->loadingTime_ = loadingTime;   }
+
+    float Weapon::getLoadingTime()
+    {   return this->loadingTime_;  }
+
+    void Weapon::setWeaponReadyToShoot(bool b)
+    {   this->weaponReadyToShoot_ = b;   }
+
+    bool Weapon::getWeaponReadyToShoot()
+    {   return this->weaponReadyToShoot_;    }
+    Timer<Weapon> * Weapon::getTimer()
+    {   return &this->reloadTimer_;   }
 }
Index: code/branches/weapon2/src/orxonox/objects/weaponSystem/Weapon.h
===================================================================
--- code/branches/weapon2/src/orxonox/objects/weaponSystem/Weapon.h	(revision 2186)
+++ code/branches/weapon2/src/orxonox/objects/weaponSystem/Weapon.h	(revision 2203)
@@ -35,4 +35,8 @@
 #include "tools/BillboardSet.h"
 #include "tools/Timer.h"
+#include "core/Identifier.h"
+
+#include "WeaponSystem.h"
+#include "Munition.h"
 
 namespace orxonox
@@ -47,7 +51,16 @@
 
             virtual void fire();
+            void timer();
             void reloaded();
+            void attachNeededMunition(std::string munitionType);
+
+            //get and set functions
             virtual void setParentWeaponSystem();
-            void attachNeededMunition(Munition *munitionPointer);
+            Munition * getAttachedMunition();
+            void setLoadingTime(float loadingTime);
+            float getLoadingTime();
+            void setWeaponReadyToShoot(bool b);
+            bool getWeaponReadyToShoot();
+            Timer<Weapon> *getTimer();
 
             inline void setParentWeaponSlot(WeaponSlot *parentWeaponSlot)
@@ -56,16 +69,13 @@
                 { return parentWeaponSlot_; };
 
-
-
-
         private:
             bool weaponReadyToShoot_;
             float loadingTime_;
-            Munition *pointerToMunition_;
+            Munition *munition_;
+
             WeaponSlot *parentWeaponSlot_;
             WeaponSystem *parentWeaponSystem_;
+            SubclassIdentifier<Munition> munitionIdentifier_;
             Timer<Weapon> reloadTimer_;
-
-
     };
 }
Index: code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSlot.cc
===================================================================
--- code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSlot.cc	(revision 2186)
+++ code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSlot.cc	(revision 2203)
@@ -74,5 +74,6 @@
     void WeaponSlot::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
+        SUPER(WeaponSlot, XMLPort, xmlelement, mode);
+    }
 
-    }
 }
Index: code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSlot.h
===================================================================
--- code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSlot.h	(revision 2186)
+++ code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSlot.h	(revision 2203)
@@ -34,5 +34,4 @@
 #include "core/BaseObject.h"
 
-
 #include "Weapon.h"
 #include "../worldentities/PositionableEntity.h"
@@ -63,9 +62,4 @@
 
             WeaponSet *parentWeaponSet_;
-
-            //attached weapon orientation
-            int yaw_ = 0;
-            int pitch_ = 0;
-            int roll_ = 0;
     };
 }
Index: code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSystem.cc
===================================================================
--- code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSystem.cc	(revision 2186)
+++ code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSystem.cc	(revision 2203)
@@ -52,5 +52,4 @@
         this->activeWeaponSet_ = 0;
         this->parentSpaceShip_ = 0;
-        this->attachedMunition_ =0;
     }
 
@@ -64,4 +63,14 @@
         wSet->setParentWeaponSystem(this);
     }
+
+    void WeaponSystem::setNewMunition(std::string munitionType, Munition * munitionToAdd)
+    {
+        this->munitionSet_[munitionType] = munitionToAdd;
+    }
+    Munition * WeaponSystem::getMunitionType(std::string munitionType)
+    {
+        return this->munitionSet_[munitionType];
+    }
+
 
 /*
@@ -98,20 +107,3 @@
     }
 
-    Munition * WeaponSystem::getAttachedMunitionPointer()
-    {
-        return this->attachedMunition_;
-    }
-
-    void WeaponSystem::addMunitionType(Munition *munitionPointer)
-    {
-
-
-        if (munitionPointer != NULL)  //gewährleiste, dass munitionPointer auf etwas sinnvolles zeigt
-            this->attachedMunition_ = munitionPointer;
-        else
-            ;//was?
-
-    }
-
-
 }
Index: code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSystem.h
===================================================================
--- code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSystem.h	(revision 2186)
+++ code/branches/weapon2/src/orxonox/objects/weaponSystem/WeaponSystem.h	(revision 2203)
@@ -39,18 +39,4 @@
 namespace orxonox
 {
-    //put here all existing munitionTypes
-    namespace MunitionType
-    {
-        enum Enum
-        { laserGunMunition };
-    }
-
-    //put here all weapon fire modes.
-    //they have to be added to Pawn and HumanController, too.
-    namespace WeaponMode
-    {
-        enum Enum
-        { fire, altFire, altFire2 };
-    }
 
     class _OrxonoxExport WeaponSystem : public BaseObject
@@ -63,10 +49,11 @@
 
             void attachWeaponSet(WeaponSet *wSet);
-            void addMunitionType(Munition *munitionPointer);
             void fire();
             void fire(WeaponMode::Enum fireMode);
             //void setActiveWeaponSet(unsigned int n);
             WeaponSet * getWeaponSetPointer(unsigned int n);
-            Munition * getAttachedMunitionPointer();
+
+            void setNewMunition(std::string munitionType, Munition * munitionToAdd);
+            Munition * getMunitionType(std::string munitionType);
 
             inline void setParentSpaceShip(SpaceShip *parentSpaceShip)
@@ -78,8 +65,7 @@
         private:
             std::vector<WeaponSet *> weaponSets_;
-            std::map<MunitionType::Enum,Munition *> munitionSet_;
+            std::map<std::string, Munition *> munitionSet_;
             WeaponSet *activeWeaponSet_;
             SpaceShip *parentSpaceShip_;
-            Munition * attachedMunition_;
     };
 }
Index: code/branches/weapon2/src/orxonox/objects/weaponSystem/weapons/LaserGun.cc
===================================================================
--- code/branches/weapon2/src/orxonox/objects/weaponSystem/weapons/LaserGun.cc	(revision 2186)
+++ code/branches/weapon2/src/orxonox/objects/weaponSystem/weapons/LaserGun.cc	(revision 2203)
@@ -44,5 +44,8 @@
 
         //set weapon properties here
-        this->loadingTime_ = 0.5;
+        this->setLoadingTime(0.5);
+
+        //Hack --> will be loaded by XML
+        this->attachNeededMunition("LaserGunMunition");
     }
 
@@ -51,20 +54,22 @@
     }
 
-    LaserGun::fire()
+    void LaserGun::fire()
     {
-        if { this->weaponReadyToShoot_ }
+        if ( this->getWeaponReadyToShoot() )
         {
-            this->weaponReadyToShoot_ = false;
+            this->setWeaponReadyToShoot(false);
+
+            Weapon::timer();
+
             //take munition
-            //this->pointerToMunition_->
+            this->getAttachedMunition()->decrementBullets();
 
-            this->reloadTimer_.setTimer( loadingTime_ , false , this , &this->reloaded );
-
-            BillboardProjectile* projectile = new ParticleProjectile(this);
-            projectile->setColour(this->getProjectileColour());
+            //create projectile
+            //BillboardProjectile* projectile = new ParticleProjectile(this);
+            //projectile->setColour(this->getProjectileColour());
         }
         else
         {
-            //actions, when weapon is not reloaded
+            //actions, when weapon is not reloaded if there are some
         }
     }
@@ -75,3 +80,5 @@
     }
 
+
+
 }
Index: code/branches/weapon2/src/orxonox/objects/weaponSystem/weapons/LaserGun.h
===================================================================
--- code/branches/weapon2/src/orxonox/objects/weaponSystem/weapons/LaserGun.h	(revision 2186)
+++ code/branches/weapon2/src/orxonox/objects/weaponSystem/weapons/LaserGun.h	(revision 2203)
@@ -37,4 +37,6 @@
 #include "util/Math.h"
 #include "../Weapon.h"
+#include "../projectiles/BillboardProjectile.h"
+#include "../projectiles/ParticleProjectile.h"
 
 namespace orxonox
@@ -50,5 +52,4 @@
             void fire();
 
-
         private:
 
