Index: code/trunk/src/orxonox/objects/worldentities/ControllableEntity.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 3080)
+++ code/trunk/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 3084)
@@ -379,4 +379,5 @@
         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->playerID_,                variableDirection::toclient, new NetworkCallback<ControllableEntity>(this, &ControllableEntity::networkcallback_changedplayerID));
Index: code/trunk/src/orxonox/objects/worldentities/MobileEntity.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/MobileEntity.h	(revision 3080)
+++ code/trunk/src/orxonox/objects/worldentities/MobileEntity.h	(revision 3084)
@@ -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/trunk/src/orxonox/objects/worldentities/PongBall.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/PongBall.cc	(revision 3080)
+++ code/trunk/src/orxonox/objects/worldentities/PongBall.cc	(revision 3084)
@@ -32,5 +32,4 @@
 #include "core/CoreIncludes.h"
 #include "core/GameMode.h"
-#include "objects/worldentities/PongBat.h"
 #include "objects/gametypes/Gametype.h"
 
@@ -47,5 +46,21 @@
         this->speed_ = 0;
         this->bat_ = 0;
+        this->batID_ = new unsigned int[2];
+        this->batID_[0] = OBJECTID_UNKNOWN;
+        this->batID_[1] = OBJECTID_UNKNOWN;
         this->relMercyOffset_ = 0.05;
+        
+        this->registerVariables();
+    }
+    
+    void PongBall::registerVariables()
+    {
+        registerVariable( this->fieldWidth_ );
+        registerVariable( this->fieldHeight_ );
+        registerVariable( this->batlength_ );
+        registerVariable( this->speed_ );
+        registerVariable( this->relMercyOffset_ );
+        registerVariable( this->batID_[0] );
+        registerVariable( this->batID_[1], variableDirection::toclient, new NetworkCallback<PongBall>( this, &PongBall::applyBats) );
     }
 
@@ -119,4 +134,53 @@
                 this->setPosition(position);
         }
+        else
+        {
+          Vector3 position = this->getPosition();
+          Vector3 velocity = this->getVelocity();
+
+          if (position.z > this->fieldHeight_ / 2 || position.z < -this->fieldHeight_ / 2)
+          {
+            velocity.z = -velocity.z;
+
+            if (position.z > this->fieldHeight_ / 2)
+              position.z = this->fieldHeight_ / 2;
+            if (position.z < -this->fieldHeight_ / 2)
+              position.z = -this->fieldHeight_ / 2;
+          }
+
+          if (position.x > this->fieldWidth_ / 2 || position.x < -this->fieldWidth_ / 2)
+          {
+            float distance = 0;
+
+            if (this->bat_)
+            {
+              if (position.x > this->fieldWidth_ / 2 && this->bat_[1])
+              {
+                distance = (position.z - this->bat_[1]->getPosition().z) / (this->fieldHeight_ * (this->batlength_ * 1.10) / 2);
+                if (fabs(distance) <= 1)
+                {
+                  position.x = this->fieldWidth_ / 2;
+                  velocity.x = -velocity.x;
+                  velocity.z = distance * distance * sgn(distance) * PongBall::MAX_REL_Z_VELOCITY * this->speed_;
+                }
+              }
+              if (position.x < -this->fieldWidth_ / 2 && this->bat_[0])
+              {
+                distance = (position.z - this->bat_[0]->getPosition().z) / (this->fieldHeight_ * (this->batlength_ * 1.10) / 2);
+                if (fabs(distance) <= 1)
+                {
+                  position.x = -this->fieldWidth_ / 2;
+                  velocity.x = -velocity.x;
+                  velocity.z = distance * distance * sgn(distance) * PongBall::MAX_REL_Z_VELOCITY * this->speed_;
+                }
+              }
+            }
+          }
+
+          if (velocity != this->getVelocity())
+            this->setVelocity(velocity);
+          if (position != this->getPosition())
+            this->setPosition(position);
+        }
     }
 
Index: code/trunk/src/orxonox/objects/worldentities/PongBall.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/PongBall.h	(revision 3080)
+++ code/trunk/src/orxonox/objects/worldentities/PongBall.h	(revision 3084)
@@ -33,4 +33,5 @@
 
 #include "objects/worldentities/MovableEntity.h"
+#include "objects/worldentities/PongBat.h"
 
 namespace orxonox
@@ -43,4 +44,6 @@
 
             virtual void tick(float dt);
+            
+            void registerVariables();
 
             void setFieldDimension(float width, float height)
@@ -61,5 +64,8 @@
 
             void setBats(PongBat** bats)
-                { this->bat_ = bats; }
+            { this->bat_ = bats; this->batID_[0] = this->bat_[0]->getObjectID(); this->batID_[1] = this->bat_[1]->getObjectID(); }
+            
+            void applyBats()
+            { if(!this->bat_) this->bat_ = new PongBat*[2]; if(this->batID_[0] != OBJECTID_UNKNOWN) this->bat_[0] = dynamic_cast<PongBat*>(Synchronisable::getSynchronisable(this->batID_[0])); if(this->batID_[1] != OBJECTID_UNKNOWN) this->bat_[1] = dynamic_cast<PongBat*>(Synchronisable::getSynchronisable(this->batID_[1])); }
 
             static const float MAX_REL_Z_VELOCITY;
@@ -71,4 +77,5 @@
             float batlength_;
             PongBat** bat_;
+            unsigned int* batID_;
             float relMercyOffset_;
     };
Index: code/trunk/src/orxonox/objects/worldentities/PongBat.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/PongBat.cc	(revision 3080)
+++ code/trunk/src/orxonox/objects/worldentities/PongBat.cc	(revision 3084)
@@ -54,6 +54,6 @@
     {
         registerVariable(this->speed_);
-        registerVariable(this->speed_);
-        registerVariable(this->speed_);
+        registerVariable(this->fieldHeight_);
+        registerVariable(this->length_);
     }
 
@@ -91,5 +91,8 @@
             position.z = -this->fieldHeight_ / 2 + this->fieldHeight_ * this->length_ / 2;
         if (position != this->getPosition())
+        {
             this->setPosition(position);
+            this->setVelocity( Vector3::ZERO );
+        }
     }
 
@@ -97,5 +100,5 @@
     {
         this->bMoveLocal_ = false;
-        this->movement_ -= value.x;
+        this->movement_ = -value.x;
     }
 
Index: code/trunk/src/orxonox/objects/worldentities/pawns/Pawn.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/pawns/Pawn.cc	(revision 3080)
+++ code/trunk/src/orxonox/objects/worldentities/pawns/Pawn.cc	(revision 3084)
@@ -39,4 +39,5 @@
 #include "objects/worldentities/ParticleSpawner.h"
 #include "objects/worldentities/ExplosionChunk.h"
+
 #include "objects/weaponsystem/WeaponSystem.h"
 #include "objects/weaponsystem/WeaponSlot.h"
@@ -44,7 +45,11 @@
 #include "objects/weaponsystem/WeaponSet.h"
 
+#include "network/NetworkFunction.h"
+
 namespace orxonox
 {
     CreateFactory(Pawn);
+
+    registerMemberNetworkFunction( Pawn, doFire );
 
     Pawn::Pawn(BaseObject* creator) : ControllableEntity(creator)
@@ -123,19 +128,20 @@
         SUPER(Pawn, tick, dt);
 
-        if (this->weaponSystem_ && GameMode::isMaster())
-        {
-            for (unsigned int firemode = 0; firemode < WeaponSystem::MAX_FIRE_MODES; firemode++)
-                if (this->fire_ & WeaponSystem::getFiremodeMask(firemode))
-                    this->weaponSystem_->fire(firemode);
-
-            if (this->bReload_)
-                this->weaponSystem_->reload();
-        }
-
-        this->fire_ = this->firehack_;
-        this->firehack_ = 0x0;
+//        if (this->weaponSystem_ && GameMode::isMaster())
+//        {
+//            for (unsigned int firemode = 0; firemode < WeaponSystem::MAX_FIRE_MODES; firemode++)
+//                if (this->fire_ & WeaponSystem::getFiremodeMask(firemode))
+//                    this->weaponSystem_->fire(firemode);
+//
+//            if (this->bReload_)
+//                this->weaponSystem_->reload();
+//        }
+//
+//        this->fire_ = this->firehack_;
+//        this->firehack_ = 0x0;
         this->bReload_ = false;
 
-        if (this->health_ <= 0)
+        if (GameMode::isMaster())
+          if (this->health_ <= 0)
             this->death();
     }
@@ -263,5 +269,20 @@
     void Pawn::fire(unsigned int firemode)
     {
-        this->firehack_ |= WeaponSystem::getFiremodeMask(firemode);
+        this->doFire(firemode);
+    }
+
+    void Pawn::doFire(uint8_t firemode)
+    {
+        if(GameMode::isMaster())
+        {
+            if (this->weaponSystem_)
+                this->weaponSystem_->fire(firemode);
+        }
+        else
+        {
+            callMemberNetworkFunction(Pawn, doFire, this->getObjectID(), 0, ((uint8_t)firemode));
+            if (this->weaponSystem_)
+                this->weaponSystem_->fire(firemode);
+        }
     }
 
Index: code/trunk/src/orxonox/objects/worldentities/pawns/Pawn.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/pawns/Pawn.h	(revision 3080)
+++ code/trunk/src/orxonox/objects/worldentities/pawns/Pawn.h	(revision 3084)
@@ -79,4 +79,5 @@
             virtual void fire(unsigned int firemode);
             virtual void reload();
+            virtual void doFire(uint8_t firemode);
             virtual void postSpawn();
 
