diff --git a/src/main/java/engine/Engine.java b/src/main/java/engine/Engine.java
new file mode 100644
index 0000000000000000000000000000000000000000..049c92211cd7650036233a13921339b183442f73
--- /dev/null
+++ b/src/main/java/engine/Engine.java
@@ -0,0 +1,5 @@
+package engine;
+
+public interface Engine {
+    void update();
+}
diff --git a/src/main/java/engine/Grid.java b/src/main/java/engine/Grid.java
index 2f2b510360ebd0ca7172d3243e6c658824267987..3569a1c4a388fe5298d3aedbaeb6f2a2cc9465ee 100644
--- a/src/main/java/engine/Grid.java
+++ b/src/main/java/engine/Grid.java
@@ -1,21 +1,15 @@
 package engine;
 
 import pong.PongObject;
-import sprint2_demo.Hero;
 
 import javax.swing.*;
 import java.awt.*;
 import java.io.IOException;
-import java.util.ArrayList;
 
-public class Grid extends JFrame {
+public class Grid extends JFrame implements Engine  {
 
 
-    public Kernel kernel;
-
     public Grid() throws IOException {
-       this.kernel = new Kernel(this);
-       //components.add()
     }
 
     public void init(String title, int width, int height) throws IOException {
@@ -30,14 +24,24 @@ public class Grid extends JFrame {
         this.setResizable(false);
         this.setVisible(true);
         this.setLayout(this.getLayout());
-        kernel.start();
-        kernel.setKeysListeners((JPanel) getContentPane());
-
         this.revalidate();
     }
     public void draw(ImageComponent ic) throws IOException {
         getContentPane().add(ic);
     }
 
+    @Override
+    public void update(){
+        for (PongObject po : Kernel.gameObjects
+             ) {
+            try {
+                this.draw(new ImageComponent(po.getImage(), po.getPosition(), po.getWidth(), po.getHeight()));
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+
+        }
+    }
+
 
 }
diff --git a/src/main/java/engine/Kernel.java b/src/main/java/engine/Kernel.java
index daed469593340f20ca766e5c9b11a2bc5d655f06..e8754fe484242d7bbf18f1659fbab54dadc91add 100644
--- a/src/main/java/engine/Kernel.java
+++ b/src/main/java/engine/Kernel.java
@@ -5,20 +5,33 @@ import pong.PongObject;
 
 import javax.swing.*;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Random;
 
 public class Kernel {
 
+    ArrayList<Engine> engines = new ArrayList<Engine>();
     engine.Grid grid;
 
     //public HashMap<PongObject, ImageComponent> pongObjectImageComponentHashMap = new HashMap<>();
-    public HashMap<PongObject, Movable> pongObjectEntityHashMap = new HashMap<>();
+
+    protected static ArrayList<PongObject> gameObjects;
+    protected HashMap<PongObject, Entity> pongObjectEntityHashMap = new HashMap<>();
     Movable movable;
 
-    public Kernel(Grid grid) {
+    public Kernel(String gameName, int width, int height, ArrayList<PongObject> gameObjects) throws IOException {
+
+        this.setGameObject(gameObjects);
         System.out.println("Model created");
-        this.grid = grid;
+
+        this.grid = new Grid(); // Will create a new grid and a new kernel
+        grid.init(gameName, width, height); // Will start the kernel and set the keys listeners
+
+        engines.add(this.grid);
+
+        this.start();
+        this.setKeysListeners((JPanel) this.grid.getContentPane());
     }
 
     /**
@@ -30,11 +43,16 @@ public class Kernel {
         Random random = new Random(); // For random speed
 
         for (PongObject pongObject: PongApp.components) {
+            Coordinates2D speed = new Coordinates2D(0, 0);
+            if(pongObject.getName().equals("Ball")){
+                speed = new Coordinates2D(1, 1);
+            }
             //Coordinates2D speed = new Coordinates2D(random.nextInt(2) - 1, random.nextInt(2) - 1);
-            Coordinates2D speed = new Coordinates2D(0, 1);
             pongObjectEntityHashMap.put(pongObject, new Movable(1, pongObject.getPosition(), speed, new Coordinates2D(0, 0), pongObject.getWidth(), pongObject.getHeight()));
-            grid.draw(new ImageComponent(pongObject.getImage(), pongObject.getPosition(), pongObject.getWidth(), pongObject.getHeight()));
-        }
+
+
+            }
+        grid.update();
     }
 
 
@@ -48,13 +66,8 @@ public class Kernel {
             pongObjectEntityHashMap.get(pongObject).updatePosition(); // Updating of the associated movable position
 
             pongObject.setPosition(pongObjectEntityHashMap.get(pongObject).getPosition()); // Updating of the pong object position
-
-            try {
-                grid.draw(new ImageComponent(pongObject.getImage(), pongObject.getPosition(), pongObject.getWidth(), pongObject.getHeight()));
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
         }
+        grid.update();
         // Repainting the grid
         grid.repaint();
         grid.revalidate();
@@ -86,5 +99,7 @@ public class Kernel {
         mainPanel.setFocusable(true);
     }
 
-
+    public void setGameObject(ArrayList<PongObject> gameObject) {
+        this.gameObjects = gameObject;
+    }
 }
diff --git a/src/main/java/pong/PongApp.java b/src/main/java/pong/PongApp.java
index b1a9e40a8f6720cd075e2303fbd4cc13e4982c53..8d06861272ea14a82fba40f466f08f39f8470171 100644
--- a/src/main/java/pong/PongApp.java
+++ b/src/main/java/pong/PongApp.java
@@ -6,6 +6,7 @@ import engine.ImageComponent;
 import engine.Kernel;
 import sprint2_demo.Hero;
 
+import javax.swing.*;
 import java.io.IOException;
 import java.util.ArrayList;
 
@@ -30,11 +31,12 @@ public class PongApp {
         PongBall pongBall = new PongBall("Ball", "src/main/resources/sprint2_demo/asteroid.png", new Coordinates2D(100, 10), 64, 64);
         components.add(pongBall);
 
-        Grid grid = new Grid(); // Will create a new grid and a new kernel
-        grid.init("Pong", width, height); // Will start the kernel and set the keys listeners
+        Kernel kernel = new Kernel("Pong", width, height, components);
+        //kernel.setGameObject(components);
+
         while(true){
             try {
-                grid.kernel.update();
+                kernel.update();
                 Thread.sleep(10);
             } catch (InterruptedException e) {
                 e.printStackTrace();
diff --git a/src/main/java/pong/PongBall.java b/src/main/java/pong/PongBall.java
index c155c614989f8770cc83a35b3255cbdc5070c8c6..0bd40083d7dc900c61ecb231baf68f17c186a0f3 100644
--- a/src/main/java/pong/PongBall.java
+++ b/src/main/java/pong/PongBall.java
@@ -49,4 +49,9 @@ public class PongBall implements PongObject {
     public void setPosition(Coordinates2D position) {
         this.position = position;
     }
+
+    @Override
+    public String getName() {
+        return name;
+    }
 }
diff --git a/src/main/java/pong/PongObject.java b/src/main/java/pong/PongObject.java
index 98853c5b7ebe2909d718c30c29a5e1467aadec13..67be73717942483ed6421f3e305a74151d409eee 100644
--- a/src/main/java/pong/PongObject.java
+++ b/src/main/java/pong/PongObject.java
@@ -11,4 +11,6 @@ public interface PongObject {
     public int getHeight();
     public int getResistance();
     public void setPosition(Coordinates2D position);
+
+    public String getName();
 }
diff --git a/src/main/java/pong/PongRacket.java b/src/main/java/pong/PongRacket.java
index af33d904b262938e10c4ef7e57b5d6faa4dadd04..9198ef57a01b38cc199cfec0f658b020ed2fed67 100644
--- a/src/main/java/pong/PongRacket.java
+++ b/src/main/java/pong/PongRacket.java
@@ -48,4 +48,9 @@ public class PongRacket implements PongObject {
     public void setPosition(Coordinates2D position) {
         this.position = position;
     }
+
+    @Override
+    public String getName() {
+        return name;
+    }
 }