diff --git a/src/main/java/lab/AbleToHit.java b/src/main/java/lab/AbleToHit.java
new file mode 100644
index 0000000000000000000000000000000000000000..22f93adad91a0310a252851afd4e057b29d3ca7c
--- /dev/null
+++ b/src/main/java/lab/AbleToHit.java
@@ -0,0 +1,5 @@
+package lab;
+
+public interface AbleToHit extends Collisionable {
+
+}
diff --git a/src/main/java/lab/BulletAnimated.java b/src/main/java/lab/BulletAnimated.java
index 148b2385fba57c7bbec6f4b56285ca7461ece9ea..e19e67def708dcedbe8f4cc3aba351ddbaf930aa 100644
--- a/src/main/java/lab/BulletAnimated.java
+++ b/src/main/java/lab/BulletAnimated.java
@@ -5,7 +5,7 @@ import javafx.geometry.Rectangle2D;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.image.Image;
 
-public class BulletAnimated  {
+public class BulletAnimated extends WorldEntity implements AbleToHit  {
 
 	private Point2D position;
 	private Point2D start;
@@ -22,7 +22,6 @@ public class BulletAnimated  {
 	private double dragCoefficient = 0.47;
 	
 	private Image image;
-	private World world;
 	private Cannon cannon;
 
 	public BulletAnimated(World world, Cannon cannon) {
@@ -30,24 +29,24 @@ public class BulletAnimated  {
 	}
 
 	public BulletAnimated(World world, Cannon cannon, Point2D start, Point2D speed, double size) {
+		super(world);
 		this.start = start;
 		this.position = this.start;
 		this.initialSpeed = speed;
 		this.speed = speed;
 		this.size = size;
-		this.world = world;
 		this.cannon = cannon;
 		image = new Image(getClass().getResourceAsStream("fireball-transparent.gif"), size, size,
 				true, true);
 	}
 
-	public void draw(GraphicsContext gc) {
-		gc.save();
-		Point2D canvasPosition = world.getCanvasPoint(position);
+	@Override
+	protected void drawInternal(GraphicsContext gc) {
+		Point2D canvasPosition = getWorld().getCanvasPoint(position);
 		gc.drawImage(image, canvasPosition.getX(), canvasPosition.getY());
-		gc.restore();
 	}
 
+	@Override
 	public void simulate(double deltaT) {
 		if (accelerate && start.distance(position) < cannonLength) {
 			double cannonAngle = cannon.getAngle(); 
@@ -74,10 +73,18 @@ public class BulletAnimated  {
 		}		
 	}
 
+	@Override
 	public Rectangle2D getBoundingBox() {
 		return new Rectangle2D(position.getX(), position.getY(), size, size);
 	}
 	
+	@Override
+	public void hitBy(Collisionable that) {
+		if (that instanceof Dragon) {
+			reload();
+		}
+	}
+	
 	public boolean overlaps(Dragon dragon) {
 		return getBoundingBox().intersects(dragon.getBoundingBox());
 	}
diff --git a/src/main/java/lab/Cannon.java b/src/main/java/lab/Cannon.java
index b46745dc0779c5152639f0c4c9815c34f80d56fa..0c8b683cd2115ce95c4171c7739d597af0e5d6c8 100644
--- a/src/main/java/lab/Cannon.java
+++ b/src/main/java/lab/Cannon.java
@@ -5,7 +5,7 @@ import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.paint.Color;
 import javafx.scene.transform.Affine;
 
-public class Cannon {
+public class Cannon implements DrawableSimulable {
 
 	private int direction=-1;
 	private double angle = 0;
@@ -23,6 +23,7 @@ public class Cannon {
 		this.size = size;
 	}
 
+	@Override
 	public void simulate(double timeStep) {
 		angle = angle + direction*80*timeStep;
 		if(angle <=-90 || angle >= 0) {
@@ -30,6 +31,7 @@ public class Cannon {
 		}
 	}
 	
+	@Override
 	public void draw(GraphicsContext gc) {
 		gc.save();
 		Point2D worldPosition = world.getCanvasPoint(position);
diff --git a/src/main/java/lab/Collisionable.java b/src/main/java/lab/Collisionable.java
new file mode 100644
index 0000000000000000000000000000000000000000..52ce3b2bec1904458f54b6a4ef6d8a18b12005d2
--- /dev/null
+++ b/src/main/java/lab/Collisionable.java
@@ -0,0 +1,17 @@
+package lab;
+
+import javafx.geometry.Rectangle2D;
+
+public interface Collisionable {
+	Rectangle2D getBoundingBox(); 
+	
+	void hitBy(Collisionable that);
+	
+	default void checkCollision(Object entity) {
+		if (entity instanceof Collisionable ce2 
+				&& this.getBoundingBox().intersects(ce2.getBoundingBox())) {
+			ce2.hitBy(this);
+			this.hitBy(ce2);
+		}
+	}
+}
diff --git a/src/main/java/lab/Dragon.java b/src/main/java/lab/Dragon.java
index 216628afbd03d95d4896abc8b5175efcb25709c8..362063a49c771b04065c76b48408804252263ff5 100644
--- a/src/main/java/lab/Dragon.java
+++ b/src/main/java/lab/Dragon.java
@@ -4,7 +4,7 @@ import javafx.geometry.Point2D;
 import javafx.geometry.Rectangle2D;
 import javafx.scene.canvas.GraphicsContext;
 
-public class Dragon {
+public class Dragon implements DrawableSimulable, Collisionable{
 	
 	private Point2D position;
 	
@@ -21,13 +21,13 @@ public class Dragon {
 		this.speed = speed;
 	}
 
-	
+	@Override
 	public void draw(GraphicsContext gc) {
 		Point2D canvasPosition = world.getCanvasPoint(position);
 		gc.drawImage(Constants.DRAGON_IMAGE, canvasPosition.getX(), canvasPosition.getY(), size, size);
 	}
 
-
+	@Override
 	public void simulate(double timeDelta) {
 		double timeDeltaS = timeDelta;
 		double newX = (position.getX() + speed.getX() * timeDeltaS + world.getWidth()) % world.getWidth(); 
@@ -35,11 +35,17 @@ public class Dragon {
 		position = new Point2D(newX, newY);
 	}
 
-
+	@Override
 	public Rectangle2D getBoundingBox() {
 		return new Rectangle2D(position.getX(), position.getY(), size, size);
 	}
 
+	@Override
+	public void hitBy(Collisionable that) {
+		if (that instanceof BulletAnimated) {
+			hit();
+		}
+	}
 
 	public void hit() {
 		speed = speed.multiply(-1.);
diff --git a/src/main/java/lab/DrawableSimulable.java b/src/main/java/lab/DrawableSimulable.java
new file mode 100644
index 0000000000000000000000000000000000000000..0a2f949ead08f9f75fafea106b53c3a318bd40b5
--- /dev/null
+++ b/src/main/java/lab/DrawableSimulable.java
@@ -0,0 +1,11 @@
+package lab;
+
+import javafx.scene.canvas.GraphicsContext;
+
+public interface DrawableSimulable {
+	void draw(GraphicsContext gc);
+	
+	void simulate(double deltaT);
+
+	
+}
\ No newline at end of file
diff --git a/src/main/java/lab/World.java b/src/main/java/lab/World.java
index c531c516d183793f4bc8eb3c381b6856c967e25f..e6cd86394d93acc370ff6ee7577696c59e542fb3 100644
--- a/src/main/java/lab/World.java
+++ b/src/main/java/lab/World.java
@@ -1,24 +1,31 @@
 package lab;
 
+import java.util.Set;
+
 import javafx.geometry.Point2D;
 import javafx.scene.canvas.GraphicsContext;
 
 public class World {
 	private double width;
 	private double height;
-	private BulletAnimated bulletAnimatted;
-	private Cannon cannon;
-	private Dragon[] dragons;
-
+	private DrawableSimulable[] entities;
 	public World(double width, double height) {
 		super();
 		this.width = width;
 		this.height = height;
-		cannon = new Cannon(this, new Point2D(50, 50), new Point2D(100, 20));
+		/*cannon = new Cannon(this, new Point2D(50, 50), new Point2D(100, 20));
 		bulletAnimatted = new BulletAnimated(this, cannon, new Point2D(30, 60), new Point2D(0, 0), 40);
 		dragons = new Dragon[] { new Dragon(this, new Point2D(50, 200), new Point2D(100, 5)),
 				new Dragon(this, new Point2D(50, 230), new Point2D(60, 5)),
-				new Dragon(this, new Point2D(50, 270), new Point2D(-50, 20)) };
+				new Dragon(this, new Point2D(50, 270), new Point2D(-50, 20)) };*/
+		Cannon cannon;
+		entities = new DrawableSimulable[] {
+				cannon = new Cannon(this, new Point2D(50, 50), new Point2D(100, 20)),
+				new BulletAnimated(this, cannon, new Point2D(30, 60), new Point2D(0, 0), 40),
+				new Dragon(this, new Point2D(50, 200), new Point2D(100, 5)),
+				new Dragon(this, new Point2D(50, 230), new Point2D(60, 5)),
+				new Dragon(this, new Point2D(50, 270), new Point2D(-50, 20))
+		};
 	}
 
 	public Point2D getCanvasPoint(Point2D worldPoint) {
@@ -27,22 +34,22 @@ public class World {
 
 	public void draw(GraphicsContext gc) {
 		gc.clearRect(0, 0, width, height);
-		cannon.draw(gc);
-		bulletAnimatted.draw(gc);
-		for(Dragon dragon: dragons) {
-			dragon.draw(gc);
+		
+		for(DrawableSimulable entity: entities) {
+			entity.draw(gc);
 		}
 	}
 
 	public void simulate(double timeDelta) {
-		bulletAnimatted.simulate(timeDelta);
-		cannon.simulate(timeDelta);
-		for(Dragon dragon: dragons) {
-			if (bulletAnimatted.overlaps(dragon)) {
-				dragon.hit();
-				bulletAnimatted.reload();
+		for(DrawableSimulable entity: entities) {
+			entity.simulate(timeDelta);
+			if (entity instanceof AbleToHit ce) {
+				for (DrawableSimulable entity2: entities) {
+					if (entity != entity2) {
+						ce.checkCollision(entity2);
+					}
+				}
 			}
-			dragon.simulate(timeDelta);
 		}
 	}
 
diff --git a/src/main/java/lab/WorldEntity.java b/src/main/java/lab/WorldEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..6c4db9d1d20e395adadfbb5bfd960bfd3d5e6200
--- /dev/null
+++ b/src/main/java/lab/WorldEntity.java
@@ -0,0 +1,27 @@
+package lab;
+
+import javafx.scene.canvas.GraphicsContext;
+
+public abstract class WorldEntity implements DrawableSimulable {
+	
+	private final World world;
+
+	public WorldEntity(World world) {
+		this.world = world;
+	}
+	
+	@Override
+	public final void draw(GraphicsContext gc) {
+		gc.save();
+		drawInternal(gc);
+		gc.restore();
+		
+	}
+	
+	protected World getWorld() {
+		return world;
+	}
+
+	protected abstract void drawInternal(GraphicsContext gc);
+
+}