diff --git a/src/main/java/lab/Bullet.java b/src/main/java/lab/Bullet.java
new file mode 100644
index 0000000000000000000000000000000000000000..d218cd69dc36fd7ccbd270a7fab09dc348b9f428
--- /dev/null
+++ b/src/main/java/lab/Bullet.java
@@ -0,0 +1,35 @@
+package lab;
+
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
+
+public class Bullet {
+	private static final double SIZE = 20;
+	
+	private final Point2D acceleration;
+	
+	private  Point2D position;
+	private  Point2D velocity;
+	
+	
+	public Bullet(Point2D position, Point2D velocity, Point2D acceleration) {
+		this.position = position;
+		this.velocity = velocity;
+		this.acceleration = acceleration;
+	}
+	
+	public void draw(GraphicsContext gc) {
+		gc.setFill(Color.SILVER);
+		gc.fillOval(position.getX(), position.getY(), SIZE, SIZE);
+	}
+	
+	public void simulate(double deltaT) {
+		position = position.add(velocity.multiply(deltaT));
+		velocity = velocity.add(acceleration.multiply(deltaT));
+	}
+
+	protected Point2D getPosition() {
+		return position;
+	}
+}
diff --git a/src/main/java/lab/BulletAnimated.java b/src/main/java/lab/BulletAnimated.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f64f18affcac58badb6fad724b6bb8b45bd6252
--- /dev/null
+++ b/src/main/java/lab/BulletAnimated.java
@@ -0,0 +1,22 @@
+package lab;
+
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.image.Image;
+
+public class BulletAnimated extends Bullet{
+
+	private static final double SIZE = 40;
+	private Image image = new Image(this.getClass().getResourceAsStream("fireball-transparent.gif"));
+	
+	public BulletAnimated(Point2D position, Point2D velocity, Point2D acceleration) {
+		super(position, velocity, acceleration);
+	}
+	
+	@Override
+	public void draw(GraphicsContext gc) {
+		gc.drawImage(image, getPosition().getX(), getPosition().getY(), SIZE, SIZE);
+	}
+	
+
+}
diff --git a/src/main/java/lab/Cannon.java b/src/main/java/lab/Cannon.java
new file mode 100644
index 0000000000000000000000000000000000000000..c665ecc8e6a342eaa2f54c310d8ce7fe9ce5cf7f
--- /dev/null
+++ b/src/main/java/lab/Cannon.java
@@ -0,0 +1,33 @@
+package lab;
+
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
+import javafx.scene.transform.Affine;
+import javafx.scene.transform.Transform;
+
+public class Cannon {
+
+	private static final double LENGTH = 60;
+	private static final double WIDTH = 15;
+	private Point2D position;
+	private double angle;
+	
+	public Cannon(Point2D position, double angle) {
+		this.position = position;
+		this.angle = angle;
+	}
+
+	public void draw(GraphicsContext gc) {
+		gc.save();
+		gc.transform(new Affine(Transform.rotate(angle, position.getX(), position.getY())));
+		gc.setFill(Color.LIGHTSTEELBLUE);
+		gc.fillRect(position.getX(), position.getY(), LENGTH, WIDTH);
+		gc.restore();
+	}
+	
+	public void simulate(double deltaT) {
+		//do nothing yet
+		angle += 25 * deltaT;
+	}
+}
diff --git a/src/main/java/lab/DrawingThread.java b/src/main/java/lab/DrawingThread.java
index f2436cda938c0cee27acd4e925cd42dedd975197..0b696c4efdf40aa237147d845368f470927803ec 100644
--- a/src/main/java/lab/DrawingThread.java
+++ b/src/main/java/lab/DrawingThread.java
@@ -7,10 +7,13 @@ import javafx.scene.canvas.GraphicsContext;
 public class DrawingThread extends AnimationTimer {
 
 	private final GraphicsContext gc;
+	private final World world;
+	
 	private long lastTime;
 
 	public DrawingThread(Canvas canvas) {
 		this.gc = canvas.getGraphicsContext2D();
+		this.world = new World(canvas.getWidth(), canvas.getHeight());
 	}
 
 	/**
@@ -21,8 +24,10 @@ public class DrawingThread extends AnimationTimer {
 		if (lastTime > 0) {
 			double deltaT = (now - lastTime) / 1e9;
 			// call simulate on world
+			this.world.simulate(deltaT);
 		}
 		//call draw on world
+		this.world.draw(gc);
 		lastTime= now;
 
 	}
diff --git a/src/main/java/lab/World.java b/src/main/java/lab/World.java
new file mode 100644
index 0000000000000000000000000000000000000000..68d90cfc69352d5f88a2762c96ec7dd898f2b9cf
--- /dev/null
+++ b/src/main/java/lab/World.java
@@ -0,0 +1,45 @@
+package lab;
+
+import javafx.geometry.Point2D;
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.image.Image;
+
+public class World {
+	
+	private final double width;
+	
+	private final double hight;
+	
+	private final Image image = new Image(this.getClass().getResourceAsStream("scenery.gif"));
+	
+	private final Bullet bullet;
+	private final Bullet bullet2;
+	private final Cannon cannon;
+	
+
+	public World(double width, double hight) {
+		this.width = width;
+		this.hight = hight;
+		this.bullet = new Bullet(new Point2D(0, 0), new Point2D(30, 30), new Point2D(0, -9.81));
+		this.bullet2 = new BulletAnimated(new Point2D(0, 0), new Point2D(30, 70), new Point2D(0, -9.81));
+		this.cannon = new Cannon(new Point2D(0, 0), 45);
+	}
+	
+	public void draw(GraphicsContext gc) {
+		gc.drawImage(image, 0, 0, width, hight);
+		
+		gc.save();
+		gc.scale(1, -1);
+		gc.translate(0, -hight);
+		this.bullet.draw(gc);
+		this.bullet2.draw(gc);
+		this.cannon.draw(gc);
+		gc.restore();
+	}
+	
+	public void simulate(double deltaT) {
+		this.bullet.simulate(deltaT);
+		this.bullet2.simulate(deltaT);
+		this.cannon.simulate(deltaT);
+	}
+}
\ No newline at end of file
diff --git a/src/main/resources/lab/scenery.gif b/src/main/resources/lab/scenery.gif
new file mode 100644
index 0000000000000000000000000000000000000000..d65c8d3d921f20d9b41709b90e4c79e3a6bd6232
Binary files /dev/null and b/src/main/resources/lab/scenery.gif differ