diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java
index 6b009e4114f78b4f406f2a3954cb94be05354e80..179d224778e79e32f5b657dbdb29fab36f0dc3c3 100644
--- a/src/main/java/app/SimulatorApplication.java
+++ b/src/main/java/app/SimulatorApplication.java
@@ -53,7 +53,5 @@ public class SimulatorApplication extends javafx.application.Application {
     primaryStage.show();
   }
 
-  public static void main(String[] args) {
-    launch(args);
-  }
+  public static void main(String[] args) { launch(args); }
 }
diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index bcf7d3eb421b0d841a53dd420d61242967e90073..8f765e69cb3d5128f11c4d0e7ae99eebfca53886 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -13,6 +13,7 @@ import javafx.scene.control.ToggleGroup;
 import javafx.util.Duration;
 import javafx.util.Pair;
 import model.Board;
+import model.Item;
 import model.ModelElement;
 import model.FirefighterBoard;
 import util.Position;
@@ -70,6 +71,17 @@ public class Controller {
     updateGenerationLabel(board.stepNumber());
   }
 
+  private void updateBoard2(){
+    List<Position> updatedPositions = board.updateToNextGeneration2();
+    List<Item> updatedSquares = new ArrayList<>();
+    for(Position updatedPosition : updatedPositions){
+      Item squareState = board.getItemByPosition(updatedPosition);
+      updatedSquares.add(squareState);
+    }
+    grid.repaint(updatedSquares);
+    updateGenerationLabel(board.stepNumber());
+  }
+
   private void repaintGrid(){
     int columnCount = board.columnCount();
     int rowCount = board.rowCount();
@@ -77,6 +89,7 @@ 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/Board.java b/src/main/java/model/Board.java
index bb089a41406d57b0b2fe3d43b3c040cbd640b6b9..46b92b8bc1d1a35d831eca3ee8e83961fe823684 100644
--- a/src/main/java/model/Board.java
+++ b/src/main/java/model/Board.java
@@ -50,6 +50,15 @@ public interface Board<S> {
    */
   List<Position> updateToNextGeneration();
 
+  /**
+   * Update the board to its next generation or state. This method may modify the
+   * internal state of the board and return a list of positions that have changed
+   * during the update.
+   *
+   * @return A list of positions that have changed during the update.
+   */
+  List<Position> updateToNextGeneration2();
+
   /**
    * Reset the board to its initial state.
    */
@@ -61,5 +70,7 @@ public interface Board<S> {
    * @return The current step number or generation.
    */
   int stepNumber();
+
+  Item getItemByPosition(Position position);
 }
 
diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java
index b679ea00774038aa135f5311523662cd99f166de..bc42652baba0a7c93a234e04d86c9297aaa3649c 100644
--- a/src/main/java/model/Cloud.java
+++ b/src/main/java/model/Cloud.java
@@ -2,6 +2,7 @@ package model;
 
 import util.Position;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
@@ -11,9 +12,21 @@ public class Cloud extends Extinguisher implements Item {
     }
 
 
-    void move(FirefighterBoard board) {
-        List<Position> neighborslist = board.neighbors(position);
+    List<Position> move(FirefighterBoard board) {
+        List<Position> result = new ArrayList<>();
+        List<Position> neighborsList = board.neighbors(position);
+        for (Position neighborPosition: neighborsList) {
+            if (board.getItemByPosition(neighborPosition) != null){
+                neighborsList.remove(neighborPosition);
+            }
+        }
+        if (neighborsList.isEmpty()){
+            return null;
+        }
         Random ran = new Random();
-        position = neighborslist.get(ran.nextInt(neighborslist.size()));
+        result.add(position);
+        position = neighborsList.get(ran.nextInt(neighborsList.size()));
+        result.add(position);
+        return result;
     }
 }
diff --git a/src/main/java/model/Extinguisher.java b/src/main/java/model/Extinguisher.java
index d39efbd7bd72f48ccacff39dd1b968e8cea80972..87a996cb52bcef679d47cff8f69514c88d4d86d6 100644
--- a/src/main/java/model/Extinguisher.java
+++ b/src/main/java/model/Extinguisher.java
@@ -17,19 +17,28 @@ public abstract class Extinguisher {
     }
 
 
-    public void update(FirefighterBoard board){
-        move(board);
-        extinguish(board);
+    public List<Position> update(FirefighterBoard board){
+        ArrayList<Position> result = new ArrayList<Position>();
+        result.addAll(move(board));
+        result.addAll(extinguish(board));
+        return result;
     }
 
-    private void extinguish(FirefighterBoard board) {
+    private List<Position> extinguish(FirefighterBoard board) {
+        List<Position> result = new ArrayList<>();
         List<Item> itemList = board.itemList();
-        List<Position> neighborslist = board.neighbors(position);
-        for (Position neighborsposition: neighborslist) {
-            itemList.removeIf(item -> neighborsposition == item.position() && item instanceof Fire);
+        List<Position> neighborsList = board.neighbors(position);
+        Item neighborItem;
+        for (Position neighborPosition: neighborsList) {
+            neighborItem = board.getItemByPosition(neighborPosition);
+            if (neighborItem instanceof Fire){
+                itemList.remove(neighborItem);
+                result.add(neighborPosition);
+            }
 
         }
+        return result;
     }
 
-    abstract void move(FirefighterBoard board);
+    abstract List<Position> move(FirefighterBoard board);
 }
diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java
index 028b66990e5ac5f60417b296c3ef6bff14a3d1b6..f2e8db671a8c8f17d99e5e4aa59f31aeefb27b45 100644
--- a/src/main/java/model/Fire.java
+++ b/src/main/java/model/Fire.java
@@ -13,11 +13,16 @@ public class Fire implements Item{
         this.position = position;
     }
 
-    public void update(FirefighterBoard board) {
+    public List<Position> update(FirefighterBoard board) {
+        ArrayList<Position> result = new ArrayList<Position>();
         List<Position> neighborslist = board.neighbors(position);
         for (Position neighborposition : neighborslist) {
-            board.itemList().add(new Fire(neighborposition));
+            if (board.getItemByPosition(neighborposition) == null) {
+                board.itemList().add(new Fire(neighborposition));
+                result.add(neighborposition);
+            }
         }
+        return neighborslist;
     }
     public Position position() {
         return position;
diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java
index 5120ad272f0fdf5c6df0821cd94129ce41006b60..dc18e07fa8c8e12f13a682b1e2c56ea8541c8ae1 100644
--- a/src/main/java/model/Firefighter.java
+++ b/src/main/java/model/Firefighter.java
@@ -9,18 +9,25 @@ public class Firefighter extends Extinguisher implements Item{
         super(position);
     }
 
-    void move(FirefighterBoard board) {
+    public List<Position> move(FirefighterBoard board) {
+        List<Position> result = new ArrayList<>();
         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);
+        Queue<Position> toVisit = new LinkedList<>();
+        for (Position initialMove : board.neighbors(position)) {
+            if (board.getItemByPosition(initialMove) == null) {
+                firstMove.put(initialMove, initialMove);
+                toVisit.add(initialMove);
+            }
+            if (board.getItemByPosition(initialMove) instanceof Fire) return null;
         }
         while (!toVisit.isEmpty()) {
             Position current = toVisit.poll();
             if (board.getItemByPosition(current) instanceof Fire) {
+                result.add(position);
                 position = firstMove.get(current);
-                return;
+                result.add(position);
+                return result;
             }
             for (Position adjacent : board.neighbors(current)) {
                 if (seen.contains(adjacent)) continue;
@@ -29,5 +36,6 @@ public class Firefighter extends Extinguisher implements Item{
                 firstMove.put(adjacent, firstMove.get(current));
             }
         }
+        return null;
     }
 }
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index 336ef7eb9832084d4e1900737ddb112fca340d8c..7ff12de03d2aff326eb81ab13fa36835449a092e 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -67,6 +67,21 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     return result;
   }
 
+
+  public List<Position> updateToNextGeneration2() {
+    List<Position> result = new ArrayList<Position>();
+    for (Item item: itemList) {
+      if (!(item instanceof Fire)) result.addAll(item.update(this));
+    }
+    if (step%2 == 0){
+      for (Item item: itemList) {
+        if (item instanceof Fire) result.addAll(item.update(this));
+      }
+    }
+    step++;
+    return result;
+  }
+
   private List<Position> updateFires() {
     List<Position> result = new ArrayList<>();
     if (step % 2 == 0) {
diff --git a/src/main/java/model/Item.java b/src/main/java/model/Item.java
index b527bfd9b2c0d1c4ed1af52f17157e6dfd93ff73..c0dab144aa4335e57a48d8c69fbeb48363b9e3c7 100644
--- a/src/main/java/model/Item.java
+++ b/src/main/java/model/Item.java
@@ -6,7 +6,7 @@ import java.util.List;
 
 public interface Item {
 
-    void update(FirefighterBoard board);
+    List<Position> update(FirefighterBoard board);
 
     Position position();
 }