diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index 2a60897c6eb8ba847cb8589840c16a0f175ce0a3..bcf7d3eb421b0d841a53dd420d61242967e90073 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -77,7 +77,6 @@ public class Controller {
     for(int column = 0; column < columnCount; column++)
       for(int row = 0; row < rowCount; row++)
         viewElements[row][column] = getViewElement(board.getState(new Position(row, column)));
-    grid.repaint(viewElements);
     updateGenerationLabel(board.stepNumber());
   }
 
diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java
new file mode 100644
index 0000000000000000000000000000000000000000..b679ea00774038aa135f5311523662cd99f166de
--- /dev/null
+++ b/src/main/java/model/Cloud.java
@@ -0,0 +1,19 @@
+package model;
+
+import util.Position;
+
+import java.util.List;
+import java.util.Random;
+
+public class Cloud extends Extinguisher implements Item {
+    public Cloud(Position position) {
+        super(position);
+    }
+
+
+    void move(FirefighterBoard board) {
+        List<Position> neighborslist = board.neighbors(position);
+        Random ran = new Random();
+        position = neighborslist.get(ran.nextInt(neighborslist.size()));
+    }
+}
diff --git a/src/main/java/model/Extinguisher.java b/src/main/java/model/Extinguisher.java
index 4e1592820d21b738ce84a9df80f95f5b30e1f51e..d39efbd7bd72f48ccacff39dd1b968e8cea80972 100644
--- a/src/main/java/model/Extinguisher.java
+++ b/src/main/java/model/Extinguisher.java
@@ -6,33 +6,25 @@ import java.util.ArrayList;
 import java.util.List;
 
 public abstract class Extinguisher {
-    private Position position;
+    protected Position position;
 
     public Extinguisher(Position position){
         this.position = position;
     }
-    public List<Position> neighbors(Position position, FirefighterBoard board){
-        List<Position> list = new ArrayList<>();
-        if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
-        if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
-        if (position.row() < board.rowCount() - 1) list.add(new Position(position.row() + 1, position.column()));
-        if (position.column() < board.columnCount() - 1) list.add(new Position(position.row(), position.column() + 1));
-        return list;
-    }
 
     public Position position() {
         return position;
     }
 
 
-    void update(FirefighterBoard board){
+    public void update(FirefighterBoard board){
         move(board);
         extinguish(board);
     }
 
     private void extinguish(FirefighterBoard board) {
         List<Item> itemList = board.itemList();
-        List<Position> neighborslist = neighbors(position, board);
+        List<Position> neighborslist = board.neighbors(position);
         for (Position neighborsposition: neighborslist) {
             itemList.removeIf(item -> neighborsposition == item.position() && item instanceof Fire);
 
diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java
index 98512a2010975bb5049100c5d91fb06ee8e52d95..028b66990e5ac5f60417b296c3ef6bff14a3d1b6 100644
--- a/src/main/java/model/Fire.java
+++ b/src/main/java/model/Fire.java
@@ -7,31 +7,19 @@ import java.util.List;
 
 public class Fire implements Item{
 
-    private Position position;
+    private final Position position;
 
     public Fire(Position position) {
         this.position = position;
     }
 
-    @Override
     public void update(FirefighterBoard board) {
-        List<Position> neighborslist = neighbors(position, board);
+        List<Position> neighborslist = board.neighbors(position);
         for (Position neighborposition : neighborslist) {
             board.itemList().add(new Fire(neighborposition));
         }
     }
-
-    public List<Position> neighbors(Position position, FirefighterBoard board){
-        List<Position> list = new ArrayList<>();
-        if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
-        if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
-        if (position.row() < board.rowCount() - 1) list.add(new Position(position.row() + 1, position.column()));
-        if (position.column() < board.columnCount() - 1) list.add(new Position(position.row(), position.column() + 1));
-        return list;
-    }
-
-    @Override
     public Position position() {
-        return null;
+        return position;
     }
 }
diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java
index 3fa26bf07c679297159f973e032f013624e9d218..5120ad272f0fdf5c6df0821cd94129ce41006b60 100644
--- a/src/main/java/model/Firefighter.java
+++ b/src/main/java/model/Firefighter.java
@@ -2,18 +2,32 @@ package model;
 
 import util.Position;
 
+import java.util.*;
+
 public class Firefighter extends Extinguisher implements Item{
     public Firefighter(Position position) {
         super(position);
     }
 
-    @Override
     void move(FirefighterBoard board) {
-
-    }
-
-    @Override
-    public void update(FirefighterBoard board) {
-
+        Set<Position> seen = new HashSet<>();
+        HashMap<Position, Position> firstMove = new HashMap<>();
+        Queue<Position> toVisit = new LinkedList<>(board.neighbors(position));
+        for (Position initialMove : toVisit) {
+            firstMove.put(initialMove, initialMove);
+        }
+        while (!toVisit.isEmpty()) {
+            Position current = toVisit.poll();
+            if (board.getItemByPosition(current) instanceof Fire) {
+                position = firstMove.get(current);
+                return;
+            }
+            for (Position adjacent : board.neighbors(current)) {
+                if (seen.contains(adjacent)) continue;
+                toVisit.add(adjacent);
+                seen.add(adjacent);
+                firstMove.put(adjacent, firstMove.get(current));
+            }
+        }
     }
 }
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index b37bb43f82709ea572d88ff13f2d98de32b8e866..336ef7eb9832084d4e1900737ddb112fca340d8c 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -86,6 +86,15 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
 
   public List<Item> itemList() { return itemList; }
 
+  public Item getItemByPosition(Position position) {
+    for (Item item: itemList) {
+      if (item.position() == position){
+        return item;
+      }
+    }
+    return null;
+  }
+
   public List<Box> boxList() { return boxList; }
 
   private List<Position> updateFirefighters() {
@@ -117,7 +126,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     firePositions.remove(position);
   }
 
-  private List<Position> neighbors(Position position) {
+  public List<Position> neighbors(Position position) {
     List<Position> list = new ArrayList<>();
     if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
     if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
@@ -130,8 +139,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     Set<Position> seen = new HashSet<>();
     HashMap<Position, Position> firstMove = new HashMap<>();
     Queue<Position> toVisit = new LinkedList<>(neighbors(position));
-    for (Position initialMove : toVisit)
+    for (Position initialMove : toVisit) {
       firstMove.put(initialMove, initialMove);
+    }
     while (!toVisit.isEmpty()) {
       Position current = toVisit.poll();
       if (firePositions.contains(current))
diff --git a/src/main/java/model/Item.java b/src/main/java/model/Item.java
index 1593d5616586e6a5a0f232c722ddbdf3006f70bf..b527bfd9b2c0d1c4ed1af52f17157e6dfd93ff73 100644
--- a/src/main/java/model/Item.java
+++ b/src/main/java/model/Item.java
@@ -8,7 +8,5 @@ public interface Item {
 
     void update(FirefighterBoard board);
 
-    List<Position> neighbors(Position position, FirefighterBoard board);
-
     Position position();
 }
diff --git a/src/main/java/model/Road.java b/src/main/java/model/Road.java
index 3aec54fdffb58cc9b427c4dec5dd57e12f4c5a08..eceb1c3a65192452ed933628b0da4709cabd3408 100644
--- a/src/main/java/model/Road.java
+++ b/src/main/java/model/Road.java
@@ -1,4 +1,5 @@
 package model;
 
 public class Road implements Box{
+
 }