diff --git a/src/main/java/model/CloudStrategy.java b/src/main/java/model/CloudStrategy.java
new file mode 100644
index 0000000000000000000000000000000000000000..8399dc6da82bbc5767aa11297d110eda226b7ad8
--- /dev/null
+++ b/src/main/java/model/CloudStrategy.java
@@ -0,0 +1,68 @@
+package model;
+
+import util.Position;
+import util.TargetStrategy;
+
+import java.util.*;
+
+public class CloudStrategy implements Strategy {
+    private final TargetStrategy targetStrategy = new TargetStrategy();
+    private List<Position> cloudPositions;
+    private final Set<Position> firePositions;
+    private final Map<Position, List<Position>> neighbors;
+    private final Random random = new Random();
+    private final int maxRows;
+    private final int maxCols;
+
+    public CloudStrategy(List<Position> cloudPositions, Set<Position> firePositions, Map<Position, List<Position>> neighbors, int maxRows, int maxCols) {
+
+        this.cloudPositions = cloudPositions;
+        this.firePositions = firePositions;
+        this.neighbors = neighbors;
+        this.maxRows = maxRows;
+        this.maxCols = maxCols;
+    }
+
+    @Override
+    public List<Position> update() {
+        List<Position> modifiedCloudPositions = new ArrayList<>();
+        List<Position> newCloudPositions = new ArrayList<>();
+
+        for (Position cloudPosition : cloudPositions) {
+            Position newCloudPosition = randomPos(cloudPosition);
+            newCloudPositions.add(newCloudPosition);
+            modifiedCloudPositions.add(cloudPosition);
+            modifiedCloudPositions.add(newCloudPosition);
+            extinguishFiures(newCloudPosition, modifiedCloudPositions);
+        }
+        cloudPositions = newCloudPositions;
+        return modifiedCloudPositions;
+    }
+
+    @Override
+    public List<Position> getModelPositions() {
+        return cloudPositions;
+    }
+
+    @Override
+    public Set<Position> getFirePositions() {
+        return firePositions;
+    }
+    private void extinguishFiures(Position position, List<Position> modifiedCloudPositions) {
+        List<Position> positions = new ArrayList<>(neighbors.getOrDefault(position, Collections.emptyList()));
+        positions.add(position);
+        List<Position> firePos = positions.stream().filter(firePositions :: contains).toList();
+        firePositions.removeAll(firePos);
+        modifiedCloudPositions.addAll(firePos);
+    }
+    private Position randomPos(Position cloudPosition) {
+        int row = random.nextInt(3)-1;
+        int col = random.nextInt(3)-1;
+        int newRow = cloudPosition.getRow() + row;
+        int newCol = cloudPosition.getCol() + col;
+        if (newRow>=0 && newRow<maxRows && newCol>=0 && newCol<maxCols) {
+            return new Position(newRow, newCol);
+        }
+        return cloudPosition;
+    }
+}
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index 7737b1e58f904d285b172509ffa06161075bf0c5..ce6d9e41b393468ecf7cfe510f7a5890243a950c 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -4,34 +4,34 @@ import util.Position;
 import javafx.util.Pair;
 import java.util.*;
 
+import static model.ModelElement.CLOUD;
+
 public class FirefighterBoard implements Board<List<ModelElement>> {
     private final int columnCount;
     private final int rowCount;
     private final int initialFireCount;
     private final int initialFirefighterCount;
-    private final int initialRoadCount;
 
     private List<Position> firefighterPositions;
     private Set<Position> firePositions;
-    private List<Position> RoadPositions;
     private final Map<Position, List<Position>> neighbors;
     private final Position[][] positions;
+    private List<Position> cloudPositions;
 
     private int step = 0;
 
     // Constructor for FirefighterBoard
-    public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialRoadCount) {
+    public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
         this.columnCount = columnCount;
         this.rowCount = rowCount;
         this.initialFireCount = initialFireCount;
         this.initialFirefighterCount = initialFirefighterCount;
-        this.initialRoadCount = initialRoadCount;
 
         this.positions = new Position[rowCount][columnCount];
         this.firefighterPositions = new ArrayList<>();
         this.firePositions = new HashSet<>();
-        this.RoadPositions = new ArrayList<>();
         this.neighbors = new HashMap<>();
+        this.cloudPositions = new ArrayList<>();
 
         initializeBoard();
     }
@@ -48,11 +48,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
         for (int i = 0; i < initialFirefighterCount; i++) {
             firefighterPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
         }
-        // Initialize Road positions
-        for (int i = 0; i < initialRoadCount; i++) {
-            RoadPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
-        }
-
 
         // Initialize neighbors map
         for (int row = 0; row < rowCount; row++) {
@@ -87,12 +82,12 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
                         result.add(ModelElement.FIREFIGHTER);
                     }
                 }
-                case ROAD -> {
-                    if (RoadPositions.contains(position)) {
-                        result.add(ModelElement.ROAD);
+                case CLOUD -> {
+                    if (cloudPositions.contains(position)) {
+                        result.add(ModelElement.CLOUD);
                     }
                 }
-                default -> {
+                default ->{
                 }
             }
         }
@@ -117,11 +112,20 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     @Override
     public void reset() {
         step = 0;
-        firefighterPositions.clear();
-        firePositions.clear();
+        Initializer initializer = new Initializer(columnCount,rowCount,initialFireCount,initialFirefighterCount);
+        resetPos(firePositions,initializer.getFirePositions());
+        resetPos(firefighterPositions,initializer.getFirefighterPositions());
+        resetPos(cloudPositions,initializer.getCloudPositions());
+
+        neighbors.clear();
+        neighbors.putAll(initializer.getNeighbors());
 
         initializeBoard();
     }
+    private <S> void resetPos(Collection<S> currentPositions, Collection<S> newPositions) {
+        currentPositions.clear();
+        currentPositions.addAll(newPositions);
+  }
 
     @Override
     public void setState(List<ModelElement> state, Position position) {
@@ -132,7 +136,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
             switch (element) {
                 case FIRE -> firePositions.add(position);
                 case FIREFIGHTER -> firefighterPositions.add(position);
-                case ROAD -> RoadPositions.add(position);
+                case CLOUD -> cloudPositions.add(position);
             }
         }
     }
@@ -141,7 +145,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     public List<Position> updateToNextGeneration() {
         List<ModelElement> elements = List.of(
                 ModelElement.FIRE,
-                ModelElement.FIREFIGHTER
+                ModelElement.FIREFIGHTER,
+                ModelElement.CLOUD
         );
         List<Position> modifiedPositions = new ArrayList<>();
 
@@ -149,6 +154,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
             Strategy strategy = switch(element) {
                 case FIRE -> new SimpleFireSpreadStrategy(firePositions, neighbors,step);
                 case FIREFIGHTER -> new FirefighterMovementStrategy(firefighterPositions,firePositions,neighbors);
+                case CLOUD -> new CloudStrategy(cloudPositions,firePositions,neighbors,rowCount,columnCount);
                 default -> throw new IllegalStateException("Type de modèle inconnu : " + element);
             };
             modifiedPositions.addAll(strategy.update());
@@ -156,6 +162,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
             switch (element) {
                 case FIRE -> firePositions = strategy.getFirePositions();
                 case FIREFIGHTER -> firefighterPositions = strategy.getModelPositions();
+                case CLOUD -> cloudPositions = strategy.getModelPositions();
             }
         }
         step++;
@@ -165,11 +172,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     private Set<Position> spreadFire() {
         Set<Position> newFirePositions = new HashSet<>();
         for (Position firePosition : firePositions) {
-            for (Position neighbor : neighbors.get(firePosition)) {
-                if (!RoadPositions.contains(neighbor)) {
-                    newFirePositions.add(neighbor);
-                }
-            }
+            newFirePositions.addAll(neighbors.get(firePosition));  // Spread fire to neighbors
         }
         return newFirePositions;
     }
@@ -198,10 +201,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
         for (Position firefighterPosition : firefighterPositions) {
             updatedElements.add(new Pair<>(firefighterPosition, ModelElement.FIREFIGHTER));
         }
-        // Add Road positions
-        for (Position roadPosition : RoadPositions) {
-            updatedElements.add(new Pair<>(roadPosition, ModelElement.ROAD));
-        }
 
         return updatedElements;
     }
diff --git a/src/main/java/model/FirefighterMovementStrategy.java b/src/main/java/model/FirefighterMovementStrategy.java
index b8c4f3b5131548522bd513ba2c45e4dbad80524d..c6ca54c774f0671a9bf05cabdb410a34b5df518a 100644
--- a/src/main/java/model/FirefighterMovementStrategy.java
+++ b/src/main/java/model/FirefighterMovementStrategy.java
@@ -19,7 +19,7 @@ public class FirefighterMovementStrategy implements Strategy {
 
     @Override
     public List<Position> update() {
-List<Position> modifiedPositions = new ArrayList<>();
+        List<Position> modifiedPositions = new ArrayList<>();
         List<Position> newFirefighterPositions = new ArrayList<>();
 
         for (Position firefighterPosition : firefighterPositions) {
diff --git a/src/main/java/model/Initializer.java b/src/main/java/model/Initializer.java
index f4b634f0b060afe00d5c6aff7c4419ea6318a33d..df94f62c86ad9ee9d36d296f182c41eafe316d5b 100644
--- a/src/main/java/model/Initializer.java
+++ b/src/main/java/model/Initializer.java
@@ -16,11 +16,15 @@ public class Initializer {
     private List<Position> RoadPositions;
     private final List<Position> firefighterPositions;
     private final Set<Position> firePositions;
+    private final List<Position> cloudPositions;
     private int step = 0;
 
     private final Random randomGenerator = new Random();
 
-    public Initializer(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount,int initialRoadCount) {
+    private static final int cloudCount = 3;
+
+
+    public Initializer(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialRoadCount) {
         this.columnCount = columnCount;
         this.rowCount = rowCount;
         this.initialFireCount = initialFireCount;
@@ -32,10 +36,8 @@ public class Initializer {
         this.firePositions = new HashSet<>();
         this.firefighterPositions = new ArrayList<>();
         this.RoadPositions = new ArrayList<>();
+        this.cloudPositions = new ArrayList<>();
 
-        initializePositions();
-        initializeNeighbors();
-        initializeElements();
     }
     private void initializePositions() {
         for (int row = 0; row < rowCount; row++) {
@@ -60,6 +62,7 @@ public class Initializer {
         initializeFirePositions();
         initializeFirefighters();
         initializeRoadPositions();
+
     }
     private void initializeFirePositions() {
         addRandomPositions(firePositions, initialFireCount);
@@ -68,6 +71,9 @@ public class Initializer {
             addRandomPositions(firefighterPositions, initialFirefighterCount);
     }
     private void initializeRoadPositions() {addRandomPositions(RoadPositions, initialRoadCount);}
+    private void initializeCloudsPositions() {
+        addRandomPositions(cloudPositions, cloudCount);
+    }
 
     private void addRandomPositions(Collection<Position> targetCollection, int count) {
         while (targetCollection.size() < count) {
@@ -115,6 +121,7 @@ public class Initializer {
     public Set<Position> getFirePositions() {
         return firePositions;
     }
+    public List<Position> getCloudPositions() {return cloudPositions;}
     public int getStep() {return step;}
 
 }
diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java
index 45d9f1dd47907fc1797a449e0bf3bae2ee5c5e51..aa0ba36d2d22820408a534be5e919589025a3cde 100644
--- a/src/main/java/model/ModelElement.java
+++ b/src/main/java/model/ModelElement.java
@@ -2,7 +2,7 @@ package model;
 
 
 public enum ModelElement {
-  ROAD("Gris"), FIREFIGHTER("blue"), FIRE("red");
+  FIREFIGHTER("blue"), FIRE("red"), CLOUD("darkgrey");
 
   private final String color;