diff --git a/src/main/java/engine/Engine.java b/src/main/java/engine/Engine.java
index 049c92211cd7650036233a13921339b183442f73..b01463f4d833bddf6c9d68dd59785e99e551291d 100644
--- a/src/main/java/engine/Engine.java
+++ b/src/main/java/engine/Engine.java
@@ -2,4 +2,5 @@ package engine;
 
 public interface Engine {
     void update();
+    void restart();
 }
diff --git a/src/main/java/engine/Kernel.java b/src/main/java/engine/Kernel.java
index 04268859f7fe5c548e75ce21e38ed07c34608bcf..2c3bc966e9ee2f9c281dff0cac21ec7acb0174e0 100644
--- a/src/main/java/engine/Kernel.java
+++ b/src/main/java/engine/Kernel.java
@@ -24,8 +24,7 @@ public class Kernel {
     //public HashMap<PongObject, ImageComponent> pongObjectImageComponentHashMap = new HashMap<>();
 
     public static ArrayList<PongObject> gameObjects;
-    public HashMap<PongObject, Entity> pongObjectEntityHashMap = new HashMap<>();
-    Movable movable;
+    public HashMap<PongObject, Entity> pongObjectEntityHashMap;
 
     public Kernel(String gameName, int width, int height, ArrayList<PongObject> gameObjects) throws IOException {
 
@@ -51,11 +50,15 @@ public class Kernel {
      * @throws IOException
      */
     public void start() throws IOException {
-        Random random = new Random(); // For random speed
-
-
         graphicEngine.update();
+    }
 
+    public void restart() throws IOException {
+        for (Engine engine: engines
+             ) {
+            engine.restart();
+        }
+        //pongObjectEntityHashMap = physicEngine.pongObjectEntityHashMap;
     }
 
 
diff --git a/src/main/java/engine/graphic/GraphicEngine.java b/src/main/java/engine/graphic/GraphicEngine.java
index ae3fed1457d35a8984e902329feaab0a7b538c68..551b88ca9a3c62475b0db2787e1883023c6a4fab 100644
--- a/src/main/java/engine/graphic/GraphicEngine.java
+++ b/src/main/java/engine/graphic/GraphicEngine.java
@@ -52,6 +52,13 @@ public class GraphicEngine extends JFrame implements Engine {
         revalidate();
     }
 
+    @Override
+    public void restart() {
+        getContentPane().removeAll();
+        update();
+        drawRect(); //TODO: Trouver un moyen de ne pas avoir à redessiner le rectangle à chaque restart et rendre le restart plus générique
+    }
+
     public void drawRect(){
         this.getContentPane().add(new RectangleComponent(100, 100, PongApp.rectWidth, PongApp.rectHeight));
     }
diff --git a/src/main/java/engine/physic/Movable.java b/src/main/java/engine/physic/Movable.java
index 7e841ddd9b5b5095109b615d616eae2b1b2bdcd0..5aef2044a1181df9b7c5e64104e48a7efd36e9bd 100644
--- a/src/main/java/engine/physic/Movable.java
+++ b/src/main/java/engine/physic/Movable.java
@@ -62,8 +62,13 @@ public class Movable implements Entity {
         Coordinates2D newPosition = new Coordinates2D(this.position.getX(), this.position.getY());
         newPosition.add(this.speed); // Calculating the new position
 
-        if (newPosition.getX() <= 100 || newPosition.getX() >= PongApp.rectWidth - this.width + 100) {
-            this.speed = new Coordinates2D(-speed.getX(), speed.getY());
+        if(newPosition.getX() <= 100 && !PongApp.isGoal){
+            PongApp.score2 += 1;
+            PongApp.isGoal = true;
+        }
+        if(newPosition.getX() >= PongApp.rectWidth - this.width + 100 && !PongApp.isGoal){
+            PongApp.score1 += 1;
+            PongApp.isGoal = true;
         }
         if (newPosition.getY() <= 100 || newPosition.getY() >= PongApp.rectHeight - this.height + 100) { // -20 à cause de la barre verticale de la fenêtre
             this.speed = new Coordinates2D(speed.getX(), -speed.getY());
diff --git a/src/main/java/engine/physic/PhysicEngine.java b/src/main/java/engine/physic/PhysicEngine.java
index 4d4cec73f722194347e4bbdce8a95283e92c7126..cb371dc4888765ac395986d653acf96ac6fca36b 100644
--- a/src/main/java/engine/physic/PhysicEngine.java
+++ b/src/main/java/engine/physic/PhysicEngine.java
@@ -58,6 +58,20 @@ public class PhysicEngine implements Engine {
         }
     }
 
+    @Override
+    public void restart() {
+        for (PongObject pongObject: Kernel.gameObjects) {
+            Coordinates2D speed = new Coordinates2D(0, 0);
+            if(pongObject.getName().equals("Ball")){
+                speed = new Coordinates2D(2, 2);
+            }
+            //Coordinates2D speed = new Coordinates2D(random.nextInt(2) - 1, random.nextInt(2) - 1);
+            pongObjectEntityHashMap.put(pongObject, new Movable(1, pongObject.getPosition(), speed, new Coordinates2D(0, 0), pongObject.getWidth(), pongObject.getHeight()));
+            positions.put(pongObject.getPosition(), pongObject);
+
+        }
+    }
+
     public boolean checkCollision(Entity firstObject, Entity secondObject){
         Coordinates2D pos1 = firstObject.getPosition();
         Coordinates2D pos2 = secondObject.getPosition();
diff --git a/src/main/java/pong/PongApp.java b/src/main/java/pong/PongApp.java
index c87c3ab0bd30db64f18498befdad416ed974b065..45c22734dcab60cf04d9ac4ef4c658bfa9a35c38 100644
--- a/src/main/java/pong/PongApp.java
+++ b/src/main/java/pong/PongApp.java
@@ -10,9 +10,15 @@ import java.util.ArrayList;
 
 public class PongApp {
 
+    public static int numberOfMatchs = 5;
+    public static int score1 = 0;
+    public static int score2 = 0;
+
+    public static boolean isGoal = false;
+
     public static ArrayList<PongObject> components = new ArrayList<PongObject>();
-    public static int width = 1000;
-    public static int height = 800;
+    public static int width = 800;
+    public static int height = 600;
 
     public static int widthDiff = 100;
     public static int heightDiff = 100;
@@ -25,12 +31,12 @@ public class PongApp {
 
     public static void main(String[] args) throws IOException {
 
-        int racketWidth = 30;
+        int racketWidth = 20;
         int racketHeight = 120;
 
         int ballWidth = 32;
 
-        String son = "src/main/resources/Sound/son.wav";
+        String son = "src/main/resources/Sound/minecraft_butdrill.wav";
         Sound.playMusic(son);
         PongRacket leftRacket = new PongRacket("Left racket", "src/main/resources/pong/raquette.png", new Coordinates2D(widthDiff + 5, 100), racketWidth, racketHeight);
         components.add(leftRacket);
@@ -53,6 +59,12 @@ public class PongApp {
         long lastIterationTime = System.currentTimeMillis(); //Initialize the last iteration time
 
         while (true) {
+            if(isGoal){
+                System.out.println(score1 + " : " + score2);
+                restart();
+                kernel.setGameObject(components);
+                kernel.restart();
+            }
 
             kernel.update(); // Updating the kernel and the game state
 
@@ -69,5 +81,14 @@ public class PongApp {
             lastIterationTime = System.currentTimeMillis(); // Update the last iteration time with the current time
         }
 
+
+    }
+
+    /**
+     * Restart the game
+     */
+    public static void restart(){
+        isGoal = false;
+        components.get(2).setPosition(new Coordinates2D(width/2, height/2));
     }
 }
diff --git a/src/main/resources/Sound/minecraft_butdrill.wav b/src/main/resources/Sound/minecraft_butdrill.wav
new file mode 100644
index 0000000000000000000000000000000000000000..7758d4512a17ec7c8ab5c8efad212ee6628b091f
Binary files /dev/null and b/src/main/resources/Sound/minecraft_butdrill.wav differ
diff --git a/src/main/resources/Sound/minecraft_drill.mp3 b/src/main/resources/Sound/minecraft_drill.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..b44bcde314e3c075faeaee13858e0d0938987116
Binary files /dev/null and b/src/main/resources/Sound/minecraft_drill.mp3 differ