diff --git a/core/src/com/mygdx/game/GameScreens/GamePlay.java b/core/src/com/mygdx/game/GameScreens/GamePlay.java
index 0cab30e1b39843ea301845b3fe485a83530ba305..2b7a4543ecd7d6fd8640ee11d4b2273044378563 100644
--- a/core/src/com/mygdx/game/GameScreens/GamePlay.java
+++ b/core/src/com/mygdx/game/GameScreens/GamePlay.java
@@ -15,6 +15,9 @@ import com.badlogic.gdx.physics.box2d.Fixture;
 import com.badlogic.gdx.physics.box2d.FixtureDef;
 import com.badlogic.gdx.physics.box2d.Shape;
 import com.badlogic.gdx.physics.box2d.World;
+import com.mygdx.game.bodies.Ball;
+import com.mygdx.game.bodies.Field;
+import com.mygdx.game.bodies.Player;
 
 /**
  * Gameplay screen, allowing the user to play against an IA or another player on a shared screen
@@ -22,49 +25,34 @@ import com.badlogic.gdx.physics.box2d.World;
  */
 public class GamePlay extends GameScreen
 {
-    Texture game_field, pad_left, pad_right, goal_left, goal_right, player_left, player_right, ball;
+    Ball ball;
+    Player pleft, pright;
+    Field field;
     World world;
-    Body b_ball;
 
     Box2DDebugRenderer b2dd;
 
     @Override
     public void buildStage()
     {
-        game_field = new Texture(Gdx.files.internal("images/Terrain.png"));
-        pad_left = new Texture(Gdx.files.internal("images/Pad.png"));
-        pad_right = new Texture(Gdx.files.internal("images/Pad.png"));
-        goal_left = new Texture(Gdx.files.internal("images/But.bmp"));
-        goal_right = new Texture(Gdx.files.internal("images/But.bmp"));
-        player_left = new Texture(Gdx.files.internal("images/JoueurGauche.png"));
-        player_right = new Texture(Gdx.files.internal("images/JoueurDroite.png"));
-        ball = new Texture(Gdx.files.internal("images/Ballon.png"));
-
         world = new World(new Vector2(0, 0), true);
-
-        BodyDef bd_ball = new BodyDef();
-        bd_ball.type = BodyDef.BodyType.DynamicBody;
-        bd_ball.position.set(width()/2, height()/2);
-
-        b_ball = world.createBody(bd_ball);
-
-        FixtureDef fd_ball = new FixtureDef();
-        fd_ball.shape = new CircleShape();
-        fd_ball.shape.setRadius((1/85f) * width());
-
-        Fixture f = b_ball.createFixture(fd_ball);
-
-        b2dd = new Box2DDebugRenderer();
+        field = new Field(world);
+        ball = new Ball(world,  new Vector2(Gdx.graphics.getWidth()/2f, Gdx.graphics.getHeight()/2f));
+        pleft = new Player(world, Player.TYPE.LEFT);
+        pright = new Player(world, Player.TYPE.RIGHT);
     }
 
     @Override
     public void render(float delta) {
         beforeRender();
 
-        batch.draw(game_field, width()*0.1f, 0, width()*0.8f, height());
+        field.draw(batch);
+
+        pleft.draw(batch);
+
+        pright.draw(batch);
 
-        batch.draw(ball, b_ball.getPosition().x, b_ball.getPosition().y, (1/85f)*width(), (1/85f)*width());
-        //b2dd.render(world, getCamera().combined);
+        ball.draw(batch);
 
         world.step(delta, 1, 1);
 
diff --git a/core/src/com/mygdx/game/TableFootball.java b/core/src/com/mygdx/game/TableFootball.java
index 30a8f5ced6894887d65df39b06dabe706431d234..d070bfa148e77a064375a0457e18d951d3517c5f 100644
--- a/core/src/com/mygdx/game/TableFootball.java
+++ b/core/src/com/mygdx/game/TableFootball.java
@@ -26,7 +26,8 @@ public class TableFootball extends Game {
 	}
 	
 	@Override
-	public void dispose () {
-		int a = 10;
+	public void dispose ()
+	{
+
 	}
 }
diff --git a/core/src/com/mygdx/game/bodies/Ball.java b/core/src/com/mygdx/game/bodies/Ball.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6015a7f54a4c008139ddaf182938d27056c8217
--- /dev/null
+++ b/core/src/com/mygdx/game/bodies/Ball.java
@@ -0,0 +1,50 @@
+package com.mygdx.game.bodies;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.physics.box2d.Body;
+import com.badlogic.gdx.physics.box2d.BodyDef;
+import com.badlogic.gdx.physics.box2d.CircleShape;
+import com.badlogic.gdx.physics.box2d.FixtureDef;
+import com.badlogic.gdx.physics.box2d.World;
+
+public class Ball
+{
+    private TextureBody tb;
+
+    public Ball(World world, Vector2 pos)
+    {
+        BodyDef bdef = new BodyDef();
+        bdef.type = BodyDef.BodyType.DynamicBody;
+        bdef.position.set(pos);
+
+        FixtureDef fdef = new FixtureDef();
+
+        CircleShape cs = new CircleShape();
+        cs.setRadius(Gdx.graphics.getWidth() * (1f/85f));
+
+        fdef.shape = cs;
+        fdef.density = 1f;
+        fdef.restitution = 0.5f;
+        fdef.friction = 1.5f;
+
+        tb = new TextureBody(Gdx.files.internal("images/Ballon.png"), world, bdef, fdef, cs.getRadius(), cs.getRadius());
+    }
+
+    public Texture texture()
+    {
+        return tb;
+    }
+
+    public Body body()
+    {
+        return tb.body;
+    }
+
+    public void draw(SpriteBatch batch)
+    {
+        tb.draw(batch);
+    }
+}
diff --git a/core/src/com/mygdx/game/bodies/Field.java b/core/src/com/mygdx/game/bodies/Field.java
new file mode 100644
index 0000000000000000000000000000000000000000..8c51c24670de7dd9825da830faa815337cb5d46c
--- /dev/null
+++ b/core/src/com/mygdx/game/bodies/Field.java
@@ -0,0 +1,52 @@
+package com.mygdx.game.bodies;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.physics.box2d.Body;
+import com.badlogic.gdx.physics.box2d.BodyDef;
+import com.badlogic.gdx.physics.box2d.CircleShape;
+import com.badlogic.gdx.physics.box2d.FixtureDef;
+import com.badlogic.gdx.physics.box2d.PolygonShape;
+import com.badlogic.gdx.physics.box2d.World;
+
+public class Field
+{
+    private TextureBody tb;
+
+    public Field(World world)
+    {
+        BodyDef bdef = new BodyDef();
+        bdef.type = BodyDef.BodyType.StaticBody;
+        bdef.active = false;
+        bdef.position.set(Gdx.graphics.getWidth()*0.1f, 0);
+
+        FixtureDef fdef = new FixtureDef();
+
+        PolygonShape ps = new PolygonShape();
+        ps.setAsBox(Gdx.graphics.getWidth()*0.8f, Gdx.graphics.getHeight());
+
+        fdef.shape = ps;
+        fdef.density = 0f;
+        fdef.restitution = 0f;
+        fdef.friction = 0f;
+
+        tb = new TextureBody(Gdx.files.internal("images/Terrain.png"), world, bdef, fdef, Gdx.graphics.getWidth()*0.8f, Gdx.graphics.getHeight());
+    }
+
+    public Texture texture()
+    {
+        return tb;
+    }
+
+    public Body body()
+    {
+        return tb.body;
+    }
+
+    public void draw(SpriteBatch batch)
+    {
+        tb.draw(batch);
+    }
+}
diff --git a/core/src/com/mygdx/game/bodies/Player.java b/core/src/com/mygdx/game/bodies/Player.java
new file mode 100644
index 0000000000000000000000000000000000000000..413c5cb8eef7478f1f9efa845f978f963f3322a3
--- /dev/null
+++ b/core/src/com/mygdx/game/bodies/Player.java
@@ -0,0 +1,56 @@
+package com.mygdx.game.bodies;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.physics.box2d.Body;
+import com.badlogic.gdx.physics.box2d.BodyDef;
+import com.badlogic.gdx.physics.box2d.CircleShape;
+import com.badlogic.gdx.physics.box2d.FixtureDef;
+import com.badlogic.gdx.physics.box2d.World;
+
+public class Player
+{
+    private TextureBody tb;
+
+    public Player(World world, Player.TYPE playerType)
+    {
+        BodyDef bdef = new BodyDef();
+        bdef.type = BodyDef.BodyType.DynamicBody;
+        Vector2 pos = playerType == TYPE.RIGHT ? new Vector2(Gdx.graphics.getWidth()*0.75f, Gdx.graphics.getHeight()/2f) : new Vector2(Gdx.graphics.getWidth()*0.25f, Gdx.graphics.getHeight()/2f);
+        bdef.position.set(pos);
+
+        FixtureDef fdef = new FixtureDef();
+
+        CircleShape cs = new CircleShape();
+        cs.setRadius(Gdx.graphics.getWidth() * (1f/40f));
+
+        fdef.shape = cs;
+        fdef.density = 1f;
+        fdef.restitution = 0.25f;
+        fdef.friction = 1.5f;
+
+        tb = new TextureBody(Gdx.files.internal( "images/Joueur" + (playerType == TYPE.RIGHT ? "Droite" : "Gauche") + ".png"), world, bdef, fdef, cs.getRadius(), cs.getRadius());
+    }
+
+    public Texture texture()
+    {
+        return tb;
+    }
+
+    public Body body()
+    {
+        return tb.body;
+    }
+
+    public void draw(SpriteBatch batch)
+    {
+        tb.draw(batch);
+    }
+
+    public enum TYPE
+    {
+        LEFT, RIGHT, AI
+    }
+}
diff --git a/core/src/com/mygdx/game/bodies/TextureBody.java b/core/src/com/mygdx/game/bodies/TextureBody.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f088508574081d969372c016e4b7719e9afc4cc
--- /dev/null
+++ b/core/src/com/mygdx/game/bodies/TextureBody.java
@@ -0,0 +1,32 @@
+package com.mygdx.game.bodies;
+
+import com.badlogic.gdx.files.FileHandle;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.physics.box2d.Body;
+import com.badlogic.gdx.physics.box2d.BodyDef;
+import com.badlogic.gdx.physics.box2d.Fixture;
+import com.badlogic.gdx.physics.box2d.FixtureDef;
+import com.badlogic.gdx.physics.box2d.World;
+
+public class TextureBody extends Texture
+{
+    protected Body body;
+    protected Fixture fixture;
+    protected float width, height;
+
+    public TextureBody(FileHandle fh, World world, BodyDef bdef, FixtureDef fdef, float w, float h) {
+        super(fh);
+
+        width = w;
+        height = h;
+        body = world.createBody(bdef);
+        fixture = body.createFixture(fdef);
+    }
+
+    public void draw(SpriteBatch batch)
+    {
+        batch.draw(this, body.getPosition().x, body.getPosition().y, width, height);
+    }
+}