Index: code/branches/netp3/src/orxonox/OrxonoxPrereqs.h
===================================================================
--- code/branches/netp3/src/orxonox/OrxonoxPrereqs.h	(revision 2989)
+++ code/branches/netp3/src/orxonox/OrxonoxPrereqs.h	(revision 2990)
@@ -158,4 +158,5 @@
     class SpawnPoint;
     class TeamSpawnPoint;
+    class Test;
 
     class Spectator;
Index: code/branches/netp3/src/orxonox/objects/Test.cc
===================================================================
--- code/branches/netp3/src/orxonox/objects/Test.cc	(revision 2989)
+++ code/branches/netp3/src/orxonox/objects/Test.cc	(revision 2990)
@@ -31,5 +31,7 @@
 #include "core/ConfigValueIncludes.h"
 #include "core/ConsoleCommand.h"
+#include "network/NetworkFunction.h"
 #include "Test.h"
+#include "util/MultiType.h"
 
 namespace orxonox
@@ -41,4 +43,15 @@
   SetConsoleCommand(Test, printV3, true).accessLevel(AccessLevel::User);
   SetConsoleCommand(Test, printV4, true).accessLevel(AccessLevel::User);
+  SetConsoleCommand(Test, call, true).accessLevel(AccessLevel::User);
+  SetConsoleCommand(Test, call2, true).accessLevel(AccessLevel::User);
+  
+  
+  //void=* aaaaa = copyPtr<sizeof(&Test::printV1)>( &NETWORK_FUNCTION_POINTER, &Test::printV1 );
+  //void* NETWORK_FUNCTION_TEST_B = memcpy(&NETWORK_FUNCTION_POINTER, &a, sizeof(a));
+//   NetworkFunctionBase* NETWORK_FUNCTION_TEST_C = new NetworkFunctionStatic( createFunctor(&Test::printV1), "bla", NETWORK_FUNCTION_POINTER );
+  
+  registerStaticNetworkFunction( &Test::printV1 );
+  registerMemberNetworkFunction( Test, checkU1 );
+  registerMemberNetworkFunction( Test, printBlaBla );
   
   Test* Test::instance_ = 0;
@@ -73,9 +86,9 @@
 
 
-	void Test::registerVariables()
-	{
-		registerVariable ( u1, variableDirection::toclient, new NetworkCallback<Test> ( this, &Test::checkU1 ));
+  void Test::registerVariables()
+  {
+    registerVariable ( u1, variableDirection::toclient, new NetworkCallback<Test> ( this, &Test::checkU1 ));
     registerVariable ( u2, variableDirection::toserver, new NetworkCallback<Test> ( this, &Test::checkU2 ));
-		registerVariable ( u3, variableDirection::serverMaster, new NetworkCallback<Test> ( this, &Test::checkU3 ), true );
+    registerVariable ( u3, variableDirection::serverMaster, new NetworkCallback<Test> ( this, &Test::checkU3 ), true );
     registerVariable ( u4, variableDirection::clientMaster, new NetworkCallback<Test> ( this, &Test::checkU4 ), true );
     
@@ -84,6 +97,41 @@
     registerVariable ( s3, variableDirection::serverMaster, new NetworkCallback<Test> ( this, &Test::checkS3 ), true );
     registerVariable ( s4, variableDirection::clientMaster, new NetworkCallback<Test> ( this, &Test::checkS4 ), true );
-	}
-
+  }
+  
+  void Test::call(unsigned int clientID)
+  {
+    callStaticNetworkFunction( &Test::printV1, clientID );
+    callStaticNetworkFunction( &Test::printV1, clientID );
+  }
+  
+  void Test::call2(unsigned int clientID, std::string s1, std::string s2, std::string s3, std::string s4)
+  {
+    callMemberNetworkFunction( Test, printBlaBla, this->getObjectID(), clientID, s1, s2, s3, s4, s4 );
+  }
+  
+  void Test::tick(float dt)
+  {
+//     std::string str1 = "blub";
+//     //MultiType mt1(std::string("blub"));
+//     MultiType mt1(str1);
+//     uint8_t* mem = new uint8_t[mt1.getNetworkSize()];
+//     uint8_t* temp = mem;
+//     mt1.exportData( temp );
+//     assert( temp-mem == mt1.getNetworkSize() );
+//     MultiType mt2;
+//     temp = mem;
+//     mt2.importData( temp );
+//     assert( temp-mem == mt1.getNetworkSize() );
+//     COUT(0) << mt2 << endl;
+    if(!Core::isMaster())
+      call2(0, "bal", "a", "n", "ce");
+//       callMemberNetworkFunction( Test, checkU1, this->getObjectID(), 0 );
+  }
+  
+  void Test::printBlaBla(std::string s1, std::string s2, std::string s3, std::string s4, std::string s5)
+  {
+    COUT(0) << s1 << s2 << s3 << s4 << s5 << endl;
+  }
+  
   void Test::checkU1(){ COUT(1) << "U1 changed: " << u1 << std::endl; }
   void Test::checkU2(){ COUT(1) << "U2 changed: " << u2 << std::endl; }
Index: code/branches/netp3/src/orxonox/objects/Test.h
===================================================================
--- code/branches/netp3/src/orxonox/objects/Test.h	(revision 2989)
+++ code/branches/netp3/src/orxonox/objects/Test.h	(revision 2990)
@@ -33,4 +33,5 @@
 #include "core/BaseObject.h"
 #include "network/synchronisable/Synchronisable.h"
+#include "Tickable.h"
 
 
@@ -41,5 +42,5 @@
 namespace orxonox
 {
-  class _OrxonoxExport Test: public BaseObject, public Synchronisable
+  class _OrxonoxExport Test: public BaseObject, public Synchronisable, public Tickable
   {
     public:
@@ -49,4 +50,8 @@
       void setConfigValues();
       void registerVariables();
+      
+      static void call(unsigned int clientID);
+      void call2(unsigned int clientID, std::string s1, std::string s2, std::string s3, std::string s4);
+      virtual void tick(float dt);
 
 
@@ -75,4 +80,6 @@
       static void printV3(){ instance_->checkU3(); }
       static void printV4(){ instance_->checkU4(); }
+      
+      void printBlaBla(std::string s1, std::string s2, std::string s3, std::string s4, std::string s5);
 
     private:
Index: code/branches/netp3/src/orxonox/objects/controllers/AIController.cc
===================================================================
--- code/branches/netp3/src/orxonox/objects/controllers/AIController.cc	(revision 2989)
+++ code/branches/netp3/src/orxonox/objects/controllers/AIController.cc	(revision 2990)
@@ -101,15 +101,18 @@
     void AIController::tick(float dt)
     {
-        if (!this->isActive())
-            return;
-
-        if (this->target_)
-            this->aimAtTarget();
-
-        if (this->bHasTargetPosition_)
-            this->moveToTargetPosition(dt);
-
-        if (this->getControllableEntity() && this->bShooting_ && this->isCloseAtTarget(500) && this->isLookingAtTarget(Ogre::Math::PI / 20.0))
-            this->getControllableEntity()->fire(WeaponMode::fire);
+        if(Core::isMaster())
+        {
+            if (!this->isActive())
+                return;
+    
+            if (this->target_)
+                this->aimAtTarget();
+    
+            if (this->bHasTargetPosition_)
+                this->moveToTargetPosition(dt);
+    
+            if (this->getControllableEntity() && this->bShooting_ && this->isCloseAtTarget(500) && this->isLookingAtTarget(Ogre::Math::PI / 20.0))
+                this->getControllableEntity()->fire(WeaponMode::fire);
+        }
 
         SUPER(AIController, tick, dt);
Index: code/branches/netp3/src/orxonox/objects/worldentities/ControllableEntity.cc
===================================================================
--- code/branches/netp3/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2989)
+++ code/branches/netp3/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2990)
@@ -66,12 +66,12 @@
         this->mouseLookSpeed_ = 200;
 
-        this->server_position_         = Vector3::ZERO;
-        this->client_position_         = Vector3::ZERO;
-        this->server_linear_velocity_  = Vector3::ZERO;
-        this->client_linear_velocity_  = Vector3::ZERO;
-        this->server_orientation_      = Quaternion::IDENTITY;
-        this->client_orientation_      = Quaternion::IDENTITY;
-        this->server_angular_velocity_ = Vector3::ZERO;
-        this->client_angular_velocity_ = Vector3::ZERO;
+        this->common_position_         = Vector3::ZERO;
+//         this->client_position_         = Vector3::ZERO;
+        this->common_linear_velocity_  = Vector3::ZERO;
+//         this->client_linear_velocity_  = Vector3::ZERO;
+        this->common_orientation_      = Quaternion::IDENTITY;
+//         this->client_orientation_      = Quaternion::IDENTITY;
+        this->common_angular_velocity_ = Vector3::ZERO;
+//         this->client_angular_velocity_ = Vector3::ZERO;
 
 
@@ -326,18 +326,18 @@
             if (!this->isDynamic())
             {
-                if (GameMode::isMaster())
-                {
-                    this->server_position_ = this->getPosition();
-                    this->server_orientation_ = this->getOrientation();
-                    this->server_linear_velocity_ = this->getVelocity();
-                    this->server_angular_velocity_ = this->getAngularVelocity();
-                }
-                else if (this->bHasLocalController_)
-                {
-                    this->client_position_ = this->getPosition();
-                    this->client_orientation_ = this->getOrientation();
-                    this->client_linear_velocity_ = this->getVelocity();
-                    this->client_angular_velocity_ = this->getAngularVelocity();
-                }
+//                 if (GameMode::isMaster())
+//                 {
+                    this->common_position_ = this->getPosition();
+                    this->common_orientation_ = this->getOrientation();
+                    this->common_linear_velocity_ = this->getVelocity();
+                    this->common_angular_velocity_ = this->getAngularVelocity();
+//                 }
+//                 else if (this->bHasLocalController_)
+//                 {
+//                     this->client_position_ = this->getPosition();
+//                     this->client_orientation_ = this->getOrientation();
+//                     this->client_linear_velocity_ = this->getVelocity();
+//                     this->client_angular_velocity_ = this->getAngularVelocity();
+//                 }
             }
         }
@@ -349,16 +349,21 @@
         registerVariable(this->hudtemplate_,             variableDirection::toclient);
 
-        registerVariable(this->server_position_,         variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerPosition));
-        registerVariable(this->server_linear_velocity_,  variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerLinearVelocity));
-        registerVariable(this->server_orientation_,      variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerOrientation));
-        registerVariable(this->server_angular_velocity_, variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerAngularVelocity));
-
-        registerVariable(this->server_overwrite_,        variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processOverwrite));
-        registerVariable(this->client_overwrite_,        variableDirection::toserver);
-
-        registerVariable(this->client_position_,         variableDirection::toserver, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processClientPosition));
-        registerVariable(this->client_linear_velocity_,  variableDirection::toserver, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processClientLinearVelocity));
-        registerVariable(this->client_orientation_,      variableDirection::toserver, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processClientOrientation));
-        registerVariable(this->client_angular_velocity_, variableDirection::toserver, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processClientAngularVelocity));
+//         registerVariable(this->server_position_,         variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerPosition));
+//         registerVariable(this->server_linear_velocity_,  variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerLinearVelocity));
+//         registerVariable(this->server_orientation_,      variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerOrientation));
+//         registerVariable(this->server_angular_velocity_, variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerAngularVelocity));
+// 
+//         registerVariable(this->server_overwrite_,        variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processOverwrite));
+//         registerVariable(this->client_overwrite_,        variableDirection::toserver);
+// 
+//         registerVariable(this->client_position_,         variableDirection::toserver, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processClientPosition));
+//         registerVariable(this->client_linear_velocity_,  variableDirection::toserver, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processClientLinearVelocity));
+//         registerVariable(this->client_orientation_,      variableDirection::toserver, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processClientOrientation));
+//         registerVariable(this->client_angular_velocity_, variableDirection::toserver, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processClientAngularVelocity));
+        
+        registerVariable(this->common_position_,         variableDirection::serverMaster, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerPosition), true);
+        registerVariable(this->common_linear_velocity_,  variableDirection::serverMaster, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerLinearVelocity), true);
+        registerVariable(this->common_orientation_,      variableDirection::serverMaster, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerOrientation), true);
+        registerVariable(this->common_angular_velocity_, variableDirection::serverMaster, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::processServerAngularVelocity), true);
 
         registerVariable(this->playerID_,                variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::networkcallback_changedplayerID));
@@ -368,5 +373,5 @@
     {
         if (!this->bHasLocalController_)
-            MobileEntity::setPosition(this->server_position_);
+            MobileEntity::setPosition(this->common_position_);
     }
 
@@ -374,5 +379,5 @@
     {
         if (!this->bHasLocalController_)
-            MobileEntity::setVelocity(this->server_linear_velocity_);
+            MobileEntity::setVelocity(this->common_linear_velocity_);
     }
 
@@ -380,5 +385,5 @@
     {
         if (!this->bHasLocalController_)
-            MobileEntity::setOrientation(this->server_orientation_);
+            MobileEntity::setOrientation(this->common_orientation_);
     }
 
@@ -386,5 +391,5 @@
     {
         if (!this->bHasLocalController_)
-            MobileEntity::setAngularVelocity(this->server_angular_velocity_);
+            MobileEntity::setAngularVelocity(this->common_angular_velocity_);
     }
 
@@ -393,10 +398,10 @@
         if (this->bHasLocalController_)
         {
-            this->setPosition(this->server_position_);
-            this->setOrientation(this->server_orientation_);
-            this->setVelocity(this->server_linear_velocity_);
-            this->setAngularVelocity(this->server_angular_velocity_);
-
-            this->client_overwrite_ = this->server_overwrite_;
+//             this->setPosition(this->server_position_);
+//             this->setOrientation(this->server_orientation_);
+//             this->setVelocity(this->server_linear_velocity_);
+//             this->setAngularVelocity(this->server_angular_velocity_);
+
+//             this->client_overwrite_ = this->server_overwrite_;
         }
     }
@@ -406,6 +411,6 @@
         if (this->server_overwrite_ == this->client_overwrite_)
         {
-            MobileEntity::setPosition(this->client_position_);
-            this->server_position_ = this->getPosition();
+//             MobileEntity::setPosition(this->client_position_);
+//             this->server_position_ = this->getPosition();
         }
     }
@@ -415,6 +420,6 @@
         if (this->server_overwrite_ == this->client_overwrite_)
         {
-            MobileEntity::setVelocity(this->client_linear_velocity_);
-            this->server_linear_velocity_ = this->getVelocity();
+//             MobileEntity::setVelocity(this->client_linear_velocity_);
+//             this->server_linear_velocity_ = this->getVelocity();
         }
     }
@@ -424,6 +429,6 @@
         if (this->server_overwrite_ == this->client_overwrite_)
         {
-            MobileEntity::setOrientation(this->client_orientation_);
-            this->server_orientation_ = this->getOrientation();
+//             MobileEntity::setOrientation(this->client_orientation_);
+//             this->server_orientation_ = this->getOrientation();
         }
     }
@@ -433,6 +438,6 @@
         if (this->server_overwrite_ == this->client_overwrite_)
         {
-            MobileEntity::setAngularVelocity(this->client_angular_velocity_);
-            this->server_angular_velocity_ = this->getAngularVelocity();
+//             MobileEntity::setAngularVelocity(this->client_angular_velocity_);
+//             this->server_angular_velocity_ = this->getAngularVelocity();
         }
     }
@@ -440,60 +445,60 @@
     void ControllableEntity::setPosition(const Vector3& position)
     {
-        if (GameMode::isMaster())
-        {
+//         if (GameMode::isMaster())
+//         {
             MobileEntity::setPosition(position);
-            this->server_position_ = this->getPosition();
-            ++this->server_overwrite_;
-        }
-        else if (this->bHasLocalController_)
-        {
-            MobileEntity::setPosition(position);
-            this->client_position_ = this->getPosition();
-        }
+            this->common_position_ = this->getPosition();
+//             ++this->server_overwrite_;
+//         }
+//         else if (this->bHasLocalController_)
+//         {
+//             MobileEntity::setPosition(position);
+//             this->client_position_ = this->getPosition();
+//         }
     }
 
     void ControllableEntity::setOrientation(const Quaternion& orientation)
     {
-        if (GameMode::isMaster())
-        {
+//         if (GameMode::isMaster())
+//         {
             MobileEntity::setOrientation(orientation);
-            this->server_orientation_ = this->getOrientation();
-            ++this->server_overwrite_;
-        }
-        else if (this->bHasLocalController_)
-        {
-            MobileEntity::setOrientation(orientation);
-            this->client_orientation_ = this->getOrientation();
-        }
+            this->common_orientation_ = this->getOrientation();
+//             ++this->server_overwrite_;
+//         }
+//         else if (this->bHasLocalController_)
+//         {
+//             MobileEntity::setOrientation(orientation);
+//             this->client_orientation_ = this->getOrientation();
+//         }
     }
 
     void ControllableEntity::setVelocity(const Vector3& velocity)
     {
-        if (GameMode::isMaster())
-        {
+//         if (GameMode::isMaster())
+//         {
             MobileEntity::setVelocity(velocity);
-            this->server_linear_velocity_ = this->getVelocity();
-            ++this->server_overwrite_;
-        }
-        else if (this->bHasLocalController_)
-        {
-            MobileEntity::setVelocity(velocity);
-            this->client_linear_velocity_ = this->getVelocity();
-        }
+            this->common_linear_velocity_ = this->getVelocity();
+//             ++this->server_overwrite_;
+//         }
+//         else if (this->bHasLocalController_)
+//         {
+//             MobileEntity::setVelocity(velocity);
+//             this->client_linear_velocity_ = this->getVelocity();
+//         }
     }
 
     void ControllableEntity::setAngularVelocity(const Vector3& velocity)
     {
-        if (GameMode::isMaster())
-        {
+//         if (GameMode::isMaster())
+//         {
             MobileEntity::setAngularVelocity(velocity);
-            this->server_angular_velocity_ = this->getAngularVelocity();
-            ++this->server_overwrite_;
-        }
-        else if (this->bHasLocalController_)
-        {
-            MobileEntity::setAngularVelocity(velocity);
-            this->client_angular_velocity_ = this->getAngularVelocity();
-        }
+            this->common_angular_velocity_ = this->getAngularVelocity();
+//             ++this->server_overwrite_;
+//         }
+//         else if (this->bHasLocalController_)
+//         {
+//             MobileEntity::setAngularVelocity(velocity);
+//             this->client_angular_velocity_ = this->getAngularVelocity();
+//         }
     }
 
@@ -501,18 +506,18 @@
     {
         MobileEntity::setWorldTransform(worldTrans);
-        if (GameMode::isMaster())
-        {
-            this->server_position_ = this->getPosition();
-            this->server_orientation_ = this->getOrientation();
-            this->server_linear_velocity_ = this->getVelocity();
-            this->server_angular_velocity_ = this->getAngularVelocity();
-        }
-        else if (this->bHasLocalController_)
-        {
-            this->client_position_ = this->getPosition();
-            this->client_orientation_ = this->getOrientation();
-            this->client_linear_velocity_ = this->getVelocity();
-            this->client_angular_velocity_ = this->getAngularVelocity();
-        }
+//         if (GameMode::isMaster())
+//         {
+            this->common_position_ = this->getPosition();
+            this->common_orientation_ = this->getOrientation();
+            this->common_linear_velocity_ = this->getVelocity();
+            this->common_angular_velocity_ = this->getAngularVelocity();
+//         }
+//         else if (this->bHasLocalController_)
+//         {
+//             this->client_position_ = this->getPosition();
+//             this->client_orientation_ = this->getOrientation();
+//             this->client_linear_velocity_ = this->getVelocity();
+//             this->client_angular_velocity_ = this->getAngularVelocity();
+//         }
     }
 }
Index: code/branches/netp3/src/orxonox/objects/worldentities/ControllableEntity.h
===================================================================
--- code/branches/netp3/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2989)
+++ code/branches/netp3/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2990)
@@ -164,12 +164,16 @@
             bool bDestroyWhenPlayerLeft_;
 
-            Vector3 server_position_;
-            Vector3 client_position_;
-            Vector3 server_linear_velocity_;
-            Vector3 client_linear_velocity_;
-            Quaternion server_orientation_;
-            Quaternion client_orientation_;
-            Vector3 server_angular_velocity_;
-            Vector3 client_angular_velocity_;
+//             Vector3 server_position_;
+            Vector3 common_position_;
+//             Vector3 client_position_;
+//             Vector3 server_linear_velocity_;
+//             Vector3 client_linear_velocity_;
+            Vector3 common_linear_velocity_;
+//             Quaternion server_orientation_;
+//             Quaternion client_orientation_;
+            Quaternion common_orientation_;
+//             Vector3 server_angular_velocity_;
+//             Vector3 client_angular_velocity_;
+            Vector3 common_angular_velocity_;
 
             PlayerInfo* player_;
Index: code/branches/netp3/src/orxonox/objects/worldentities/MobileEntity.h
===================================================================
--- code/branches/netp3/src/orxonox/objects/worldentities/MobileEntity.h	(revision 2989)
+++ code/branches/netp3/src/orxonox/objects/worldentities/MobileEntity.h	(revision 2990)
@@ -61,5 +61,5 @@
                 { this->setAngularVelocity(Vector3(x, y, z)); }
             inline const Vector3& getAngularVelocity() const
-                { return this->linearAcceleration_; }
+                { return this->angularVelocity_; }
 
             void setAcceleration(const Vector3& acceleration);
Index: code/branches/netp3/src/orxonox/objects/worldentities/pawns/Pawn.cc
===================================================================
--- code/branches/netp3/src/orxonox/objects/worldentities/pawns/Pawn.cc	(revision 2989)
+++ code/branches/netp3/src/orxonox/objects/worldentities/pawns/Pawn.cc	(revision 2990)
@@ -39,8 +39,11 @@
 #include "objects/worldentities/ParticleSpawner.h"
 #include "objects/worldentities/ExplosionChunk.h"
+#include "network/NetworkFunction.h"
 
 namespace orxonox
 {
     CreateFactory(Pawn);
+    
+    registerMemberNetworkFunction( Pawn, doFire );
 
     Pawn::Pawn(BaseObject* creator) : ControllableEntity(creator)
@@ -117,17 +120,18 @@
         SUPER(Pawn, tick, dt);
 
-        if (this->weaponSystem_)
-        {
-            if (this->fire_ & WeaponMode::fire)
-                this->weaponSystem_->fire(WeaponMode::fire);
-            if (this->fire_ & WeaponMode::altFire)
-                this->weaponSystem_->fire(WeaponMode::altFire);
-            if (this->fire_ & WeaponMode::altFire2)
-                this->weaponSystem_->fire(WeaponMode::altFire2);
-        }
-        this->fire_ = this->firehack_;
-        this->firehack_ = 0x0;
-
-        if (this->health_ <= 0)
+//         if (this->weaponSystem_)
+//         {
+//             if (this->fire_ & WeaponMode::fire)
+//                 this->weaponSystem_->fire(WeaponMode::fire);
+//             if (this->fire_ & WeaponMode::altFire)
+//                 this->weaponSystem_->fire(WeaponMode::altFire);
+//             if (this->fire_ & WeaponMode::altFire2)
+//                 this->weaponSystem_->fire(WeaponMode::altFire2);
+//         }
+//         this->fire_ = this->firehack_;
+//         this->firehack_ = 0x0;
+
+        if (Core::isMaster())
+          if (this->health_ <= 0)
             this->death();
     }
@@ -254,5 +258,20 @@
     void Pawn::fire(WeaponMode::Enum fireMode)
     {
-        this->firehack_ |= fireMode;
+        doFire(fireMode);
+    }
+    
+    void Pawn::doFire(uint8_t fireMode)
+    {
+        if(Core::isMaster())
+        {
+            if (this->weaponSystem_)
+                this->weaponSystem_->fire((WeaponMode::Enum)fireMode);
+        }
+        else
+        {
+            callMemberNetworkFunction( Pawn, doFire, this->getObjectID(), 0, ((uint8_t)fireMode));
+            if (this->weaponSystem_)
+                this->weaponSystem_->fire((WeaponMode::Enum)fireMode);
+        }
     }
 
Index: code/branches/netp3/src/orxonox/objects/worldentities/pawns/Pawn.h
===================================================================
--- code/branches/netp3/src/orxonox/objects/worldentities/pawns/Pawn.h	(revision 2989)
+++ code/branches/netp3/src/orxonox/objects/worldentities/pawns/Pawn.h	(revision 2990)
@@ -80,4 +80,5 @@
 
             virtual void fire(WeaponMode::Enum fireMode);
+            virtual void doFire(uint8_t fireMode);
             virtual void postSpawn();
 
