diff --git a/.gradle/8.10.2/executionHistory/executionHistory.bin b/.gradle/8.10.2/executionHistory/executionHistory.bin
index fdb4eeffcc87945fbb049d92ca05c3c10cf3c6b5..c2c1a8d7c31fc61d3bc769c5b59b9c1b73bf8111 100644
Binary files a/.gradle/8.10.2/executionHistory/executionHistory.bin and b/.gradle/8.10.2/executionHistory/executionHistory.bin differ
diff --git a/.gradle/8.10.2/executionHistory/executionHistory.lock b/.gradle/8.10.2/executionHistory/executionHistory.lock
index 41422f306b17568d7e6c1767886c73e5320db41b..747eec4f7100b3f5a1ba035749a032f07e14a96c 100644
Binary files a/.gradle/8.10.2/executionHistory/executionHistory.lock and b/.gradle/8.10.2/executionHistory/executionHistory.lock differ
diff --git a/.gradle/8.10.2/fileHashes/fileHashes.bin b/.gradle/8.10.2/fileHashes/fileHashes.bin
index 5cb4b01e4eccee19eba6934f31434286f145f7db..7a1ddb364a2d65bf861ef355db3a9b7dd8a041dd 100644
Binary files a/.gradle/8.10.2/fileHashes/fileHashes.bin and b/.gradle/8.10.2/fileHashes/fileHashes.bin differ
diff --git a/.gradle/8.10.2/fileHashes/fileHashes.lock b/.gradle/8.10.2/fileHashes/fileHashes.lock
index 3f1209eba2d344f756b5adde7102e707598993e4..7a739fb80125287ddcb20dca2b583a29cd2e4378 100644
Binary files a/.gradle/8.10.2/fileHashes/fileHashes.lock and b/.gradle/8.10.2/fileHashes/fileHashes.lock differ
diff --git a/.gradle/8.10.2/fileHashes/resourceHashesCache.bin b/.gradle/8.10.2/fileHashes/resourceHashesCache.bin
index 953dd5ee6e969ca039b09b633dfe0194aca17e2a..6a8f1f0b0d267adfae143b2e5a4dea5df9582a81 100644
Binary files a/.gradle/8.10.2/fileHashes/resourceHashesCache.bin and b/.gradle/8.10.2/fileHashes/resourceHashesCache.bin differ
diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock
index a1da752f5fdc61814a5539ca32ff72919cf99d6f..0a67f955cb299cb61c8a86cdfd23471d339f7746 100644
Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe
index d6ceb38bef8eeb41ce802c1b34c2aa5040e8e41a..792688fb82fda3818c7c298bd6b450d1187332ce 100644
Binary files a/.gradle/file-system.probe and b/.gradle/file-system.probe differ
diff --git a/build/classes/java/main/controller/Controller.class b/build/classes/java/main/controller/Controller.class
index b7d3429c3ee350a8620694ba61082c3e446107d4..e2208ff57eb1732291ab47e26e4e73038fd3ede1 100644
Binary files a/build/classes/java/main/controller/Controller.class and b/build/classes/java/main/controller/Controller.class differ
diff --git a/build/classes/java/main/model/FFBoard$1.class b/build/classes/java/main/model/FFBoard$1.class
deleted file mode 100644
index c370b5a0d5e656ef32aeb7f5b8f0f1eb4645e26d..0000000000000000000000000000000000000000
Binary files a/build/classes/java/main/model/FFBoard$1.class and /dev/null differ
diff --git a/build/classes/java/main/model/FFBoard.class b/build/classes/java/main/model/FFBoard.class
index ad0c95d59c5e8630cc51db54bf13ac68b169b64b..f57c1a9057f799b0def008417b2bd77d2256259d 100644
Binary files a/build/classes/java/main/model/FFBoard.class and b/build/classes/java/main/model/FFBoard.class differ
diff --git a/build/classes/java/main/model/FFBoardData.class b/build/classes/java/main/model/FFBoardData.class
index 0e467a4e9bbef0cbba7e215aac57aade8f493bb8..9f22a0e72eb02bd57d31319f61a8793d6e2ce0e7 100644
Binary files a/build/classes/java/main/model/FFBoardData.class and b/build/classes/java/main/model/FFBoardData.class differ
diff --git a/build/classes/java/main/model/Fire.class b/build/classes/java/main/model/Fire.class
index 013b6855f81a190fd85e71dcb3b9222701c790dc..c09a1b0fcfff85d7fbaaed635319ab41158e29ce 100644
Binary files a/build/classes/java/main/model/Fire.class and b/build/classes/java/main/model/Fire.class differ
diff --git a/build/classes/java/main/model/FireBehavior.class b/build/classes/java/main/model/FireBehavior.class
index bf58961506ebf58088dd2398e73002e4285e75a9..71db65cf608bac9073edb2e09e133d8c847f47f4 100644
Binary files a/build/classes/java/main/model/FireBehavior.class and b/build/classes/java/main/model/FireBehavior.class differ
diff --git a/build/classes/java/main/model/StandardFirefighter.class b/build/classes/java/main/model/StandardFirefighter.class
index acffa8ef60c78e01c7c9e845a463aa2e532d1539..addabbd7a7c7656d19c29e0ed6e8fec3bcecfeb9 100644
Binary files a/build/classes/java/main/model/StandardFirefighter.class and b/build/classes/java/main/model/StandardFirefighter.class differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Controller.class.uniqueId3 b/build/tmp/compileJava/compileTransaction/stash-dir/Controller.class.uniqueId3
deleted file mode 100644
index cf00614109212f6eb89b53189568778874c810a0..0000000000000000000000000000000000000000
Binary files a/build/tmp/compileJava/compileTransaction/stash-dir/Controller.class.uniqueId3 and /dev/null differ
diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin
index e8816291e0944805667e492410d9cc7959533c67..ae916a368146158e57dab4511ee930cbb133e667 100644
Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ
diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index 03c50c60d4e216bea0130ece38c151a484eff585..b6813ffe3f958a814654f7c931fb4a9953438e15 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -25,7 +25,25 @@ import java.util.List;
 import static java.util.Objects.requireNonNull;
 
 public class Controller {
+  public static String toString(ViewElement[][] matrice) {
+    StringBuilder sb = new StringBuilder();
+
+    for (int i = 0; i < matrice.length; i++) {
+      sb.append("[ ");
+      for (int j = 0; j < matrice[i].length; j++) {
+        sb.append(matrice[i][j].toString());
+        if (j < matrice[i].length - 1) {
+          sb.append(", "); // Ajouter une virgule entre les éléments
+        }
+      }
+      sb.append(" ]");
+      if (i < matrice.length - 1) {
+        sb.append("\n"); // Sauter une ligne entre les lignes de la matrice
+      }
+    }
 
+    return sb.toString();
+  }
   public static final int PERIOD_IN_MILLISECONDS = 50;
   @FXML
   public Button restartButton;
@@ -78,15 +96,19 @@ public class Controller {
       for(int row = 0; row < rowCount; row++)
         viewElements[row][column] = getViewElement(board.getState(new Position(row, column)));
     grid.repaint(viewElements);
+    System.out.println(toString(viewElements));
     updateGenerationLabel(board.stepNumber());
   }
 
   private ViewElement getViewElement(List<ModelElement> squareState) {
+    if (squareState.contains(ModelElement.FIRE)){
+    return ViewElement.FIRE;
+  }
     if(squareState.contains(ModelElement.FIREFIGHTER)){
       return ViewElement.FIREFIGHTER;
     }
-    if (squareState.contains(ModelElement.FIRE)){
-      return ViewElement.FIRE;
+    if(squareState.contains(ModelElement.CLOUD)){
+      return ViewElement.CLOUD;
     }
     if (squareState.contains(ModelElement.MOUNTAIN)){
       return ViewElement.MOUNTAIN;
diff --git a/src/main/java/model/Behavior.java b/src/main/java/model/Behavior.java
index 577e2690804681c61d8e20545a1b5d66604a52db..d6e2a1b6031e3603656d741cb1ae53336351ec34 100644
--- a/src/main/java/model/Behavior.java
+++ b/src/main/java/model/Behavior.java
@@ -5,7 +5,7 @@ import util.Position;
 import java.util.List;
 
 public interface Behavior {
-    public List<Position> getNext(BoardData boarddata,List<Position>positions);
+    public List<Position> getNext(BoardData boardData);
     public default Boolean isLegalMove(){
         return true;
     }
diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java
new file mode 100644
index 0000000000000000000000000000000000000000..4afaa3d824f4b8edfae955e4cafeb719655f2dee
--- /dev/null
+++ b/src/main/java/model/Cloud.java
@@ -0,0 +1,28 @@
+package model;
+
+import util.Position;
+import util.TargetStrategy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Cloud extends Element {
+
+    public Cloud() {
+            super(ModelElement.CLOUD,
+                    new CloudBehavior(ModelElement.CLOUD));
+    }
+
+    @Override
+    public List<Position> Update(BoardData boardData, List<Position> modifiedPositions) {
+        List<Position> cloudPositions=boardData.getPositions().get(type.ordinal());
+        List<Position> newCloudPositions=behavior.getNext(boardData);
+        modifiedPositions.removeAll(cloudPositions);
+        modifiedPositions.addAll(cloudPositions);
+        modifiedPositions.removeAll(newCloudPositions);
+        modifiedPositions.addAll(newCloudPositions);
+        cloudPositions.clear();
+        cloudPositions.addAll(newCloudPositions);
+        return modifiedPositions;
+    }
+}
diff --git a/src/main/java/model/CloudBehavior.java b/src/main/java/model/CloudBehavior.java
new file mode 100644
index 0000000000000000000000000000000000000000..5efbc14edcf77685b579eab99609ec17ff10fbd6
--- /dev/null
+++ b/src/main/java/model/CloudBehavior.java
@@ -0,0 +1,47 @@
+package model;
+
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class CloudBehavior implements RemoverBehavior<ModelElement> {
+    private ModelElement element;
+    private ModelElement removedElement=ModelElement.FIRE;
+    private Random random=new Random();
+    public CloudBehavior(ModelElement modelElement) {
+        this.element=modelElement;
+    }
+
+    @Override
+    public List<Position> getNext(BoardData boardData) {
+        List<Position> cloudPositions=boardData.getPositions().get(element.ordinal());
+        List<Position> newCloudPositions=new ArrayList<>();
+        for (Position cloudPosition:cloudPositions) {
+            List<Position> newPossibleCloudPosition=boardData.getNeighbors().get(cloudPosition);
+            Position newCloudPosition= newPossibleCloudPosition.get(random.nextInt(newPossibleCloudPosition.size()));
+            newCloudPositions.add(newCloudPosition);
+            remove(boardData,newCloudPosition);
+        }
+        return newCloudPositions;
+    }
+
+
+    @Override
+    public ModelElement getElementToRemove() {
+        return removedElement;
+    }
+
+    @Override
+    public void removePartial(BoardData boardData,Position p) {
+        List<Position> firePositions = boardData.getPositions().get(getElementToRemove().ordinal());
+        firePositions.remove(p);
+    }
+
+    @Override
+    public List<Position> remove(BoardData boardData, Position p) {
+        removePartial(boardData,p);
+        return List.of(p);
+    }
+}
diff --git a/src/main/java/model/FFBoard.java b/src/main/java/model/FFBoard.java
index a8fb054fc1311f07aebdc64bfca0550ee81f1f88..261e4b08f9f281536ef683701f8f54b23f8f8ddb 100644
--- a/src/main/java/model/FFBoard.java
+++ b/src/main/java/model/FFBoard.java
@@ -18,7 +18,7 @@ public class FFBoard implements Board<List<ModelElement>> {
   private final Random randomGenerator = new Random();
 
   public FFBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
-    boardData=new FFBoardData();
+    boardData=new FFBoardData(columnCount,rowCount);
     FFUpdater=new FFUpdater();
     this.columnCount = columnCount;
     this.rowCount = rowCount;
@@ -42,9 +42,11 @@ public class FFBoard implements Board<List<ModelElement>> {
 
   public void initializeElements() {
     boardData.initialize();
-
+    FFUpdater= new FFUpdater();
     for (int index = 0; index < initialFireCount; index++)
       boardData.getPositions().get(ModelElement.FIRE.ordinal()).add(randomPosition());
+    //for (int index = 0; index < initialFireCount; index++)
+      //boardData.getPositions().get(ModelElement.CLOUD.ordinal()).add(randomPosition());
     for (int index = 0; index < initialFirefighterCount; index++)
       boardData.getPositions().get(ModelElement.FIREFIGHTER.ordinal()).add(randomPosition());
   }
@@ -56,11 +58,15 @@ public class FFBoard implements Board<List<ModelElement>> {
   @Override
   public List<ModelElement> getState(Position position) {
     List<Position> firefighterPositions=boardData.getPositions().get(ModelElement.FIREFIGHTER.ordinal());
+    List<Position> cloudPositions=boardData.getPositions().get(ModelElement.CLOUD.ordinal());
     List<Position> firePositions =boardData.getPositions().get(ModelElement.FIRE.ordinal());
     List<ModelElement> result = new ArrayList<>();
     for (Position firefighterPosition : firefighterPositions)
       if (firefighterPosition.equals(position))
         result.add(ModelElement.FIREFIGHTER);
+    for (Position cloudPosition : cloudPositions)
+      if (cloudPosition.equals(position))
+        result.add(ModelElement.CLOUD);
     if (firePositions.contains(position))
       result.add(ModelElement.FIRE);
     return result;
@@ -81,6 +87,7 @@ public class FFBoard implements Board<List<ModelElement>> {
     modifiedPositions.addAll(updateFires());
     boardData.setStep(boardData.getStep()+1);
     return modifiedPositions;*/
+
     List<Position> modifiedPositions = FFUpdater.updateAll(boardData);
     boardData.setStep(boardData.getStep()+1);
     return modifiedPositions;
@@ -117,24 +124,17 @@ public class FFBoard implements Board<List<ModelElement>> {
 
   @Override
   public void reset() {
-    boardData.setStep(0);
     initializeElements();
   }
 
 
   @Override
   public void setState(List<ModelElement> state, Position position) {
-    List<Position> firefighterPositions = boardData.getPositions().get(ModelElement.FIREFIGHTER.ordinal());
-    List<Position> firePositions = boardData.getPositions().get(ModelElement.FIRE.ordinal());
-    firePositions.remove(position);
-    for (; ; ) {
-      if (!firefighterPositions.remove(position)) break;
+    for (ModelElement e:state) {
+        boardData.getPositions().get(e.ordinal()).remove(position);
     }
-    for (ModelElement element : state) {
-      switch (element) {
-        case FIRE -> firePositions.add(position);
-        case FIREFIGHTER -> firefighterPositions.add(position);
-      }
+    for (ModelElement e:state) {
+      boardData.getPositions().get(e.ordinal()).add(position);
     }
   }
 }
\ No newline at end of file
diff --git a/src/main/java/model/FFBoardData.java b/src/main/java/model/FFBoardData.java
index ae71a9320db857a03409070c421e36a8ace4b31b..65684d49cd95c08eadbe7037ac7f17d7916da1c0 100644
--- a/src/main/java/model/FFBoardData.java
+++ b/src/main/java/model/FFBoardData.java
@@ -6,14 +6,31 @@ import java.util.*;
 
 public class FFBoardData implements BoardData{
     private List<List<Position>> positions;
-    private final Map<Position, List<Position>> neighbors = new HashMap<Position, List<Position>>();
+    private Map<Position, List<Position>> neighbors = new HashMap<Position, List<Position>>();
     private int step;
+    private int columnCount,rowCount;
 
-    public FFBoardData() {
+    public FFBoardData(int columnCount, int rowCount) {
+        this.columnCount=columnCount;
+        this.rowCount=rowCount;
         initialize();
     }
     public void initialize(){
         step=0;
+        neighbors = new HashMap<Position, List<Position>>();
+        Position[][] ps = new Position[rowCount][columnCount];
+        for (int column = 0; column < columnCount; column++)
+            for (int row = 0; row < rowCount; row++)
+                ps[row][column] = new Position(row, column);
+        for (int column = 0; column < columnCount; column++)
+            for (int row = 0; row < rowCount; row++) {
+                List<Position> list = new ArrayList<>();
+                if (row > 0) list.add(ps[row - 1][column]);
+                if (column > 0) list.add(ps[row][column - 1]);
+                if (row < rowCount - 1) list.add(ps[row + 1][column]);
+                if (column < columnCount - 1) list.add(ps[row][column + 1]);
+                getNeighbors().put(ps[row][column], list);
+            }
         positions = new ArrayList<>();
         for (int i = 0; i < ModelElement.values().length; i++) {
             positions.add(new ArrayList<>());
diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java
index 065250b9fd2cefaec6e3bf038b5ee6d2aeac02b5..21a665d5bb23a7a9df308908c85aa0370e466a99 100644
--- a/src/main/java/model/Fire.java
+++ b/src/main/java/model/Fire.java
@@ -16,8 +16,10 @@ public class Fire extends Element{
     public List<Position> Update(BoardData boardData, List<Position> modifPositions) {
         List<Position> firePositions = boardData.getPositions().get(this.type.ordinal());
         List<Position> modifiedPositions = new ArrayList<Position>(modifPositions);
-        List<Position> newFirePositions = behavior.getNext(boardData,firePositions);
+        List<Position> newFirePositions = behavior.getNext(boardData);
+        firePositions.removeAll(newFirePositions);
         firePositions.addAll(newFirePositions);
+        modifiedPositions.removeAll(newFirePositions);
         modifiedPositions.addAll(newFirePositions);
         return modifiedPositions;
     }
diff --git a/src/main/java/model/FireBehavior.java b/src/main/java/model/FireBehavior.java
index c9a3c7240f0b3f0f5821d82a00f31fb8d4da4f0f..dce1e0e7072ab8ec097c6071130032c5ed2884c9 100644
--- a/src/main/java/model/FireBehavior.java
+++ b/src/main/java/model/FireBehavior.java
@@ -13,13 +13,15 @@ public class FireBehavior extends FFBehavior {
     }
 
     @Override
-    public List<Position> getNext(BoardData boardData, List<Position> positions) {
+    public List<Position> getNext(BoardData boardData) {
         List<Position> firePositions = boardData.getPositions().get(element.ordinal());
         List<Position> newFirePositions = new ArrayList<>();
         if (boardData.getStep() % 2 == 0) {
             for (Position fire : firePositions) {
-                boardData.getNeighbors().get(fire).removeAll(newFirePositions);
-                newFirePositions.addAll(boardData.getNeighbors().get(fire));
+                for (Position neighbor:boardData.getNeighbors().get(fire)) {
+                if (!newFirePositions.contains(neighbor))
+                    newFirePositions.add(neighbor);
+                }
             }
         }
         return newFirePositions;
diff --git a/src/main/java/model/FirefighterBehavior.java b/src/main/java/model/FirefighterBehavior.java
index 966a8049ce949ca98435a665b093f4fd85e13362..1c99215c0ef9717afc719af171426f2d8fe2e2c3 100644
--- a/src/main/java/model/FirefighterBehavior.java
+++ b/src/main/java/model/FirefighterBehavior.java
@@ -8,7 +8,6 @@ import java.util.List;
 import java.util.ListIterator;
 
 public class FirefighterBehavior extends FFBehavior implements TangibleBehavior<ModelElement>,RemoverBehavior<ModelElement> {
-    ModelElement element;
     List<ModelElement> obstacles=new ArrayList<>(List.of(ModelElement.MOUNTAIN));
     ModelElement removedElement=ModelElement.FIRE;
     TargetStrategy targetStrategy=new TargetStrategy();
@@ -19,27 +18,26 @@ public class FirefighterBehavior extends FFBehavior implements TangibleBehavior<
 
 
     @Override
-    public List<Position> getNext(BoardData boardData, List<Position> modifiedPositions) {
-        List<Position> modifiedPosition = new ArrayList<>();
+    public List<Position> getNext(BoardData boardData) {
         List<Position> firefighterPositions = boardData.getPositions().get(element.ordinal());
-        List<Position> firePositions = boardData.getPositions().get(getElementToRemove().ordinal());
+        List<Position> firePositions = new ArrayList<>(List.copyOf(boardData.getPositions().get(ModelElement.FIRE.ordinal())));
         List<Position> firefighterNewPositions = new ArrayList<>();
         for (Position firefighterPosition : firefighterPositions) {
-            Position newFirefighterPosition =
-                    targetStrategy.neighborClosestToFire(firefighterPosition,
-                            firePositions, boardData.getNeighbors());
+            Position newFirefighterPosition = targetStrategy.neighborClosestToFire(firefighterPosition,firePositions, boardData.getNeighbors());
             firefighterNewPositions.add(newFirefighterPosition);
-            remove(boardData,newFirefighterPosition);
-            modifiedPosition.add(firefighterPosition);
-            modifiedPosition.add(newFirefighterPosition);
-            List<Position> neighborFirePositions = boardData.getNeighbors().get(newFirefighterPosition).stream()
-                    .filter(firePositions::contains).toList();
-            for (Position firePosition : neighborFirePositions)
-                remove(boardData,firePosition);
-            modifiedPosition.addAll(neighborFirePositions);
+            firePositions.remove(newFirefighterPosition);
+            firePositions.remove(boardData.getNeighbors().get(newFirefighterPosition));
         }
-        firefighterPositions = firefighterNewPositions;
-        return modifiedPosition;
+        return firefighterNewPositions;
+    }
+    public List<Position> remove(BoardData boardData,Position p){
+        List<Position> firePositions = boardData.getPositions().get(getElementToRemove().ordinal());
+        List<Position> neighborFirePositions = boardData.getNeighbors().get(p).stream()
+                .filter(firePositions::contains).toList();
+        removePartial(boardData,p);
+        for (Position firePosition : neighborFirePositions)
+            removePartial(boardData,firePosition);
+        return neighborFirePositions;
     }
 
     @Override
@@ -53,7 +51,7 @@ public class FirefighterBehavior extends FFBehavior implements TangibleBehavior<
     }
 
     @Override
-    public void remove(BoardData boardData,Position p) {
+    public void removePartial(BoardData boardData,Position p) {
         List<Position> firePositions = boardData.getPositions().get(getElementToRemove().ordinal());
         firePositions.remove(p);
     }
diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java
index 6fa3031b0463f8c9f663ed8e8ac3d13eeac4cfdb..cb200e5f0412f99ef80ab8f5ef5ecc280966565c 100644
--- a/src/main/java/model/ModelElement.java
+++ b/src/main/java/model/ModelElement.java
@@ -5,6 +5,7 @@ import java.lang.reflect.InvocationTargetException;
 public enum ModelElement {
   FIREFIGHTER(StandardFirefighter.class),
   FIRE(Fire.class),
+  CLOUD(Cloud.class),
   MOUNTAIN(Mountain.class);
 
   public final Class<?> c;
diff --git a/src/main/java/model/NoBehavior.java b/src/main/java/model/NoBehavior.java
index 025014a74a8de024a1c01e9bead71fb264effed5..dcc3b7df06204aaea7439f0c9e8245013b64671e 100644
--- a/src/main/java/model/NoBehavior.java
+++ b/src/main/java/model/NoBehavior.java
@@ -12,8 +12,7 @@ public class NoBehavior extends FFBehavior {
     }
 
     @Override
-    public List<Position> getNext(BoardData boardData, List<Position> positions) {
-        return positions;
+    public List<Position> getNext(BoardData boardData) {
+        return null;
     }
-
 }
diff --git a/src/main/java/model/RemoverBehavior.java b/src/main/java/model/RemoverBehavior.java
index bb5b87fd3ba270a185a49ed9b0fdbab9b78c9415..d148013dc74ebaf511fdab021964d5ce5d6a32a0 100644
--- a/src/main/java/model/RemoverBehavior.java
+++ b/src/main/java/model/RemoverBehavior.java
@@ -5,6 +5,8 @@ import util.Position;
 import java.util.List;
 
 public interface RemoverBehavior<E> extends Behavior {
-    public void remove(BoardData boardData,Position p);
+    public void removePartial(BoardData boardData,Position p);
+    public  List<Position> remove(BoardData boardData,Position p);
+
     public E getElementToRemove();
 }
diff --git a/src/main/java/model/StandardFirefighter.java b/src/main/java/model/StandardFirefighter.java
index f60f5abe8265f82b97bcd75ac18d37b1abd6ea6b..82ef1e6430b91d818f264764e8bb3e074c99c36d 100644
--- a/src/main/java/model/StandardFirefighter.java
+++ b/src/main/java/model/StandardFirefighter.java
@@ -26,23 +26,19 @@ public class StandardFirefighter extends Element {
         firePositions.addAll(modifiedList);
         return modifiedList;*/
         List<Position> firefighterPositions = boardData.getPositions().get(type.ordinal());
-        List<Position> firePositions = boardData.getPositions().get(ModelElement.FIRE.ordinal());
-        List<Position> firefighterNewPositions = new ArrayList<>();
-        for (Position firefighterPosition : firefighterPositions) {
-            Position newFirefighterPosition =
-                    targetStrategy.neighborClosestToFire(firefighterPosition,
-                            firePositions, boardData.getNeighbors());
-            firefighterNewPositions.add(newFirefighterPosition);
-            remove(boardData,newFirefighterPosition);
-            modifiedPositions.add(firefighterPosition);
-            modifiedPositions.add(newFirefighterPosition);
-            List<Position> neighborFirePositions = boardData.getNeighbors().get(newFirefighterPosition).stream()
-                    .filter(firePositions::contains).toList();
-            for (Position firePosition : neighborFirePositions)
-                remove(boardData,firePosition);
-            modifiedPositions.addAll(neighborFirePositions);
+        List<Position> firefighterNewPositions = behavior.getNext(boardData);
+        List<Position> neighborFirePositions = new ArrayList<>();
+
+        modifiedPositions.removeAll(firefighterPositions);
+        modifiedPositions.removeAll(firefighterNewPositions);
+        modifiedPositions.addAll(firefighterPositions);
+        modifiedPositions.addAll(firefighterNewPositions);
+        for (Position p :firefighterNewPositions) {
+            neighborFirePositions.addAll(((RemoverBehavior)behavior).remove(boardData,p));
         }
-        firefighterPositions = firefighterNewPositions;
+        modifiedPositions.removeAll(neighborFirePositions);
+        modifiedPositions.addAll(neighborFirePositions);
+        boardData.getPositions().set(type.ordinal(),firefighterNewPositions);
         return modifiedPositions;
     }
 
diff --git a/src/main/java/view/ViewElement.java b/src/main/java/view/ViewElement.java
index d379d8029f87dc1c9a409f24f5f49092b9c146c7..4695ecd5fd6bcd79e72f68ebedcea869d944c5af 100644
--- a/src/main/java/view/ViewElement.java
+++ b/src/main/java/view/ViewElement.java
@@ -3,7 +3,7 @@ package view;
 import javafx.scene.paint.Color;
 
 public enum ViewElement {
-  FIREFIGHTER(Color.BLUE), FIRE(Color.RED),MOUNTAIN(Color.BROWN) , EMPTY(Color.WHITE);
+  FIREFIGHTER(Color.BLUE), FIRE(Color.RED),CLOUD(Color.GRAY) ,MOUNTAIN(Color.BROWN) , EMPTY(Color.WHITE);
   final Color color;
   ViewElement(Color color) {
     this.color = color;