diff --git a/src/main/java/engine/physic/PhysicEngine.java b/src/main/java/engine/physic/PhysicEngine.java
index 2341227beab1c1a8852017fa385672ae6e6dcc7b..72ccd4632b358bc44c412958b0858bd733cb2eb3 100644
--- a/src/main/java/engine/physic/PhysicEngine.java
+++ b/src/main/java/engine/physic/PhysicEngine.java
@@ -17,13 +17,11 @@ public class PhysicEngine implements Engine {
         restart();
     }
     @Override
-    public void update(){
+    public void update(){ //TODO: we cannot have the mention of "Ball" here so we need to find a way to do it without mentioning "Ball"
         for (PongObject pongObject: Kernel.gameObjects) {
             Coordinates2D previousPosition = pongObjectEntityHashMap.get(pongObject).getPosition();
             pongObjectEntityHashMap.get(pongObject).updatePosition();// Updating of the associated movable position
             if(pongObject.getName().equals("Ball")){
-                //System.out.println("Ball position: " + pongObjectEntityHashMap.get(pongObject).getPosition().getX() + " ; " + pongObjectEntityHashMap.get(pongObject).getPosition().getY());
-                //System.out.println("Ball init position: " + pongObjectEntityHashMap.get(pongObject).getInitPosition());
                 for (PongObject po2: pongObjectEntityHashMap.keySet()
                 ) {
                     if(!po2.getName().equals("Ball")){
@@ -34,12 +32,16 @@ public class PhysicEngine implements Engine {
                             Kernel.isCollision = true;
                             System.out.println("Collision " + i);
                             pongObjectEntityHashMap.get(pongObject).setPosition(previousPosition);
+                            //TODO: add a method to Entity to increment the speed
                             if(i % 10 == 0){
                                 pongObjectEntityHashMap.get(pongObject).getSpeed().mul(2);
                             }
-                            pongObject.setSpeed(pongObjectEntityHashMap.get(pongObject).getSpeed());
-                            //pongObjectEntityHashMap.get(pongObject).getSpeed().mul(-1);
-                            pongObject.updateSpeed(po2.doItHitHalf(pongObject.getPosition()), po2.isLeftRacket());
+                            pongObject.setSpeed(pongObjectEntityHashMap.get(pongObject).getSpeed()); // Updating of the pong object speed with the latest speed of the entity
+
+                            //po2 a racket will process the collision with the ball
+                            po2.processCollision(pongObject);
+
+                            //Updating the Entity speed with the new speed of the pong object Ball
                             pongObjectEntityHashMap.get(pongObject).setSpeed(pongObject.getSpeed());
 
                             pongObjectEntityHashMap.get(pongObject).updatePosition();
@@ -47,7 +49,6 @@ public class PhysicEngine implements Engine {
                     }
                 }
             }
-            //checkCollision();
             pongObject.setPosition(pongObjectEntityHashMap.get(pongObject).getPosition()); // Updating of the pong object position
         }
     }
diff --git a/src/main/java/pong/PongBall.java b/src/main/java/pong/PongBall.java
index fd7bcbe0369bfe345440ccaef2597cef4a00838e..e0a2639b404561eaf550dabd7c232c187be31071 100644
--- a/src/main/java/pong/PongBall.java
+++ b/src/main/java/pong/PongBall.java
@@ -65,44 +65,7 @@ public class PongBall implements PongObject {
         this.speed = speed;
     }
 
-    /**
-     * Update the speed of the ball when it hits a paddle.
-     * If the ball hits the upper half of the paddle, the ball will go up
-     * If the ball hits the lower half of the paddle, the ball will go down
-     * @param isUpperHalf
-     */
-    @Override
-    public void updateSpeed(boolean isUpperHalf, boolean isLeftRacket){
-        System.out.println("updateSpeed");
-        if(!isLeftRacket){
-            System.out.println("isLeftRacket");
-            if(isUpperHalf){
-                if(this.speed.getY() > 0){
-                    this.speed.setY(this.speed.getY() * -1);
-                }
-            }else{
-                if (this.speed.getY() < 0){
-                    this.speed.setY(this.speed.getY() * -1);
-                }
-            }
-            if (this.speed.getX() > 0){
-                this.speed.setX(this.speed.getX() * -1);
-            }
-        } else {
-            if(isUpperHalf){
-                if(this.speed.getY() > 0){
-                    this.speed.setY(this.speed.getY() * -1);
-                }
-            }else{
-                if (this.speed.getY() < 0){
-                    this.speed.setY(this.speed.getY() * -1);
-                }
-            }
-            if (this.speed.getX() < 0){
-                this.speed.setX(this.speed.getX() * -1);
-            }
-        }
-    }
+
 
     @Override
     public String getName() {
@@ -114,13 +77,15 @@ public class PongBall implements PongObject {
         return this.initPosition;
     }
 
+
+
     @Override
-    public boolean doItHitHalf(Coordinates2D ballPosition) {
+    public boolean isLeftRacket() {
         return false;
     }
 
     @Override
-    public boolean isLeftRacket() {
-        return false;
+    public void processCollision(PongObject po2) {
+
     }
 }
diff --git a/src/main/java/pong/PongObject.java b/src/main/java/pong/PongObject.java
index 77a7fac81c358b1fbe828abff552c320380508ca..a927fd9140be5cccd3729469692f68c3a74a5772 100644
--- a/src/main/java/pong/PongObject.java
+++ b/src/main/java/pong/PongObject.java
@@ -16,15 +16,12 @@ public interface PongObject {
 
     public void setSpeed(Coordinates2D speed);
 
-    void updateSpeed(boolean isUpperHalf, boolean isLeftRacket);
-
 
     public String getName();
 
     Coordinates2D getInitPosition();
 
 
-    boolean doItHitHalf(Coordinates2D ballPosition);
-
     boolean isLeftRacket();
+    void processCollision(PongObject po);
 }
diff --git a/src/main/java/pong/PongRacket.java b/src/main/java/pong/PongRacket.java
index 3d94fdb3607195d451dbdf1a1c746d335ff7bb40..d8d5329632b24b674104401202d22c2bf73b5a01 100644
--- a/src/main/java/pong/PongRacket.java
+++ b/src/main/java/pong/PongRacket.java
@@ -66,10 +66,6 @@ public class PongRacket implements PongObject {
         this.speed = speed;
     }
 
-    @Override
-    public void updateSpeed(boolean isUpperHalf, boolean isLeftRacket) {
-
-    }
 
     @Override
     public String getName() {
@@ -81,17 +77,48 @@ public class PongRacket implements PongObject {
         return initPosition;
     }
 
-    /**
-     * @param ballPosition
-     * @return true if the ball hit the upper half of the racket
-     */
     @Override
-    public boolean doItHitHalf(Coordinates2D ballPosition) {
-        return ballPosition.getY() < this.position.getY() + this.height / 2;
+    public boolean isLeftRacket() {
+        return isLeftRacket;
     }
 
+
+    /**
+     * Update the speed of the ball when it hits a paddle.
+     * If the ball hits the upper half of the paddle, the ball will go up
+     * If the ball hits the lower half of the paddle, the ball will go down
+     *
+     */
     @Override
-    public boolean isLeftRacket() {
-        return isLeftRacket;
+    public void processCollision(PongObject po2) {
+        boolean isUpperHalf = po2.getPosition().getY() < this.position.getY() + this.height / 2;
+        if(!isLeftRacket){
+            System.out.println("isLeftRacket");
+            if(isUpperHalf){
+                if(po2.getSpeed().getY() > 0){
+                    po2.getSpeed().setY(po2.getSpeed().getY() * -1);
+                }
+            }else{
+                if (po2.getSpeed().getY() < 0){
+                    po2.getSpeed().setY(po2.getSpeed().getY() * -1);
+                }
+            }
+            if (po2.getSpeed().getX() > 0){
+                po2.getSpeed().setX(po2.getSpeed().getX() * -1);
+            }
+        } else {
+            if(isUpperHalf){
+                if(po2.getSpeed().getY() > 0){
+                    po2.getSpeed().setY(po2.getSpeed().getY() * -1);
+                }
+            }else{
+                if (po2.getSpeed().getY() < 0){
+                    po2.getSpeed().setY(po2.getSpeed().getY() * -1);
+                }
+            }
+            if (po2.getSpeed().getX() < 0){
+                po2.getSpeed().setX(po2.getSpeed().getX() * -1);
+            }
+        }
     }
 }
diff --git a/src/test/java/pong/PongBallTest.java b/src/test/java/pong/PongBallTest.java
index 805ca0b9764807cf9a3c4f54a05d7740170d4152..bd204bcb074478dadd01b7c09404581753c5a27b 100644
--- a/src/test/java/pong/PongBallTest.java
+++ b/src/test/java/pong/PongBallTest.java
@@ -13,15 +13,6 @@ class PongBallTest {
      */
     @Test
     void testUpdateSpeedUpperHalfHit() {
-        PongBall pongBall = new PongBall("ball", "src/main/resources/ball.png", new Coordinates2D(0, 0), 10, 10);
-        pongBall.setSpeed(new Coordinates2D(1, 1));
-        pongBall.updateSpeed(true, true);
-        assertEquals(-1, pongBall.getSpeed().getY());
-        assertEquals(-1 , pongBall.getSpeed().getX());
 
-        pongBall.setSpeed(new Coordinates2D(1, -1));
-        pongBall.updateSpeed(false, true);
-        assertEquals(-1, pongBall.getSpeed().getX());
-        assertEquals(1 , pongBall.getSpeed().getY());
     }
 }
\ No newline at end of file