Index: code/trunk/src/orxonox/objects/worldentities/ControllableEntity.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2826)
+++ code/trunk/src/orxonox/objects/worldentities/ControllableEntity.cc	(revision 2839)
@@ -251,4 +251,6 @@
             }
         }
+
+        this->changedPlayer();
     }
 
@@ -263,4 +265,6 @@
         this->bHasHumanController_ = false;
         this->setObjectMode(objectDirection::toclient);
+
+        this->changedPlayer();
 
         if (this->bDestroyWhenPlayerLeft_)
Index: code/trunk/src/orxonox/objects/worldentities/ControllableEntity.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2826)
+++ code/trunk/src/orxonox/objects/worldentities/ControllableEntity.h	(revision 2839)
@@ -49,4 +49,5 @@
 
             virtual void changedGametype();
+            virtual void changedPlayer() {}
 
             virtual void setPlayer(PlayerInfo* player);
Index: code/trunk/src/orxonox/objects/worldentities/PongBall.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/PongBall.cc	(revision 2826)
+++ code/trunk/src/orxonox/objects/worldentities/PongBall.cc	(revision 2839)
@@ -44,4 +44,5 @@
         this->speed_ = 0;
         this->bat_ = 0;
+        this->relMercyOffset_ = 0.05;
     }
 
@@ -67,35 +68,45 @@
             if (position.x > this->fieldWidth_ / 2 || position.x < -this->fieldWidth_ / 2)
             {
-                velocity.x = -velocity.x;
                 float distance = 0;
 
-                if (position.x > this->fieldWidth_ / 2)
+                if (this->bat_)
                 {
-                    position.x = this->fieldWidth_ / 2;
-                    if (this->bat_ && this->bat_[1])
+                    if (position.x > this->fieldWidth_ / 2 && this->bat_[1])
                     {
-                        distance = (position.z - this->bat_[1]->getPosition().z) / (this->fieldHeight_ * this->batlength_ / 2);
-                        if (this->getGametype() && this->bat_[0] && fabs(distance) > 1)
+                        distance = (position.z - this->bat_[1]->getPosition().z) / (this->fieldHeight_ * (this->batlength_ * 1.10) / 2);
+                        if (fabs(distance) <= 1)
                         {
-                            this->getGametype()->playerScored(this->bat_[0]->getPlayer());
-                            return;
+                            position.x = this->fieldWidth_ / 2;
+                            velocity.x = -velocity.x;
+                            velocity.z = distance * distance * sgn(distance) * 1.5 * this->speed_;
+                        }
+                        else if (position.x > this->fieldWidth_ / 2 * (1 + this->relMercyOffset_))
+                        {
+                            if (this->getGametype() && this->bat_[0])
+                            {
+                                this->getGametype()->playerScored(this->bat_[0]->getPlayer());
+                                return;
+                            }
+                        }
+                    }
+                    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) * 1.5 * this->speed_;
+                        }
+                        else if (position.x < -this->fieldWidth_ / 2 * (1 + this->relMercyOffset_))
+                        {
+                            if (this->getGametype() && this->bat_[1])
+                            {
+                                this->getGametype()->playerScored(this->bat_[1]->getPlayer());
+                                return;
+                            }
                         }
                     }
                 }
-                if (position.x < -this->fieldWidth_ / 2)
-                {
-                    position.x = -this->fieldWidth_ / 2;
-                    if (this->bat_ && this->bat_[0])
-                    {
-                        distance = (position.z - this->bat_[0]->getPosition().z) / (this->fieldHeight_ * this->batlength_ / 2);
-                        if (this->getGametype() && this->bat_[1] && fabs(distance) > 1)
-                        {
-                            this->getGametype()->playerScored(this->bat_[1]->getPlayer());
-                            return;
-                        }
-                    }
-                }
-
-                velocity.z = distance * distance * sgn(distance) * 1.5 * this->speed_;
             }
 
Index: code/trunk/src/orxonox/objects/worldentities/PongBall.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/PongBall.h	(revision 2826)
+++ code/trunk/src/orxonox/objects/worldentities/PongBall.h	(revision 2839)
@@ -48,4 +48,6 @@
             void setFieldDimension(const Vector2& dimension)
                 { this->setFieldDimension(dimension.x, dimension.y); }
+            Vector2 getFieldDimension() const
+                { return Vector2(this->fieldWidth_, this->fieldHeight_); }
 
             void setSpeed(float speed);
@@ -67,4 +69,5 @@
             float batlength_;
             PongBat** bat_;
+            float relMercyOffset_;
     };
 }
Index: code/trunk/src/orxonox/objects/worldentities/PongBat.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/PongBat.cc	(revision 2826)
+++ code/trunk/src/orxonox/objects/worldentities/PongBat.cc	(revision 2839)
@@ -46,4 +46,5 @@
         this->length_ = 0.25;
         this->fieldHeight_ = 100;
+        this->bSteadiedPosition_ = false;
 
         this->registerVariables();
@@ -61,28 +62,34 @@
         if (this->hasLocalController())
         {
-            this->movement_ = clamp(this->movement_, -1.0f, 1.0f) * this->speed_;
+            if (this->movement_ != 0)
+            {
+                this->movement_ = clamp(this->movement_, -1.0f, 1.0f) * this->speed_;
 
-            if (this->bMoveLocal_)
-                this->setVelocity(this->getOrientation() * Vector3(this->movement_, 0, 0));
-            else
-                this->setVelocity(0, 0, this->movement_);
+                if (this->bMoveLocal_)
+                    this->setVelocity(this->getOrientation() * Vector3(this->movement_, 0, 0));
+                else
+                    this->setVelocity(0, 0, this->movement_);
 
-            this->movement_ = 0;
+                this->movement_ = 0;
+                this->bSteadiedPosition_ = false;
+            }
+            else if (!this->bSteadiedPosition_)
+            {
+                // To ensure network synchronicity
+                this->setVelocity(0, 0, 0);
+                this->setPosition(this->getPosition());
+                this->bSteadiedPosition_ = true;
+            }
         }
 
         SUPER(PongBat, tick, dt);
 
-        if (this->hasLocalController())
-        {
-            Vector3 position = this->getPosition();
-
-            if (position.z > this->fieldHeight_ / 2 - this->fieldHeight_ * this->length_ / 2)
-                position.z = this->fieldHeight_ / 2 - this->fieldHeight_ * this->length_ / 2;
-            if (position.z < -this->fieldHeight_ / 2 + this->fieldHeight_ * this->length_ / 2)
-                position.z = -this->fieldHeight_ / 2 + this->fieldHeight_ * this->length_ / 2;
-
-            if (position != this->getPosition())
-                this->setPosition(position);
-        }
+        Vector3 position = this->getPosition();
+        if (position.z > this->fieldHeight_ / 2 - this->fieldHeight_ * this->length_ / 2)
+            position.z = this->fieldHeight_ / 2 - this->fieldHeight_ * this->length_ / 2;
+        if (position.z < -this->fieldHeight_ / 2 + this->fieldHeight_ * this->length_ / 2)
+            position.z = -this->fieldHeight_ / 2 + this->fieldHeight_ * this->length_ / 2;
+        if (position != this->getPosition())
+            this->setPosition(position);
     }
 
@@ -98,3 +105,8 @@
         this->movement_ = value.x;
     }
+
+    void PongBat::changedPlayer()
+    {
+        this->setVelocity(0, 0, 0);
+    }
 }
Index: code/trunk/src/orxonox/objects/worldentities/PongBat.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/PongBat.h	(revision 2826)
+++ code/trunk/src/orxonox/objects/worldentities/PongBat.h	(revision 2839)
@@ -48,4 +48,6 @@
             virtual void moveRightLeft(const Vector2& value);
 
+            virtual void changedPlayer();
+
             void setSpeed(float speed)
                 { this->speed_ = speed; }
@@ -69,4 +71,5 @@
             float length_;
             float fieldHeight_;
+            bool bSteadiedPosition_;
     };
 }
