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 5181cb6ec19926bff50a1d45432c038965e97f72..ce6d9e41b393468ecf7cfe510f7a5890243a950c 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -4,6 +4,8 @@ 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;
@@ -14,6 +16,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     private Set<Position> firePositions;
     private final Map<Position, List<Position>> neighbors;
     private final Position[][] positions;
+    private List<Position> cloudPositions;
 
     private int step = 0;
 
@@ -28,6 +31,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
         this.firefighterPositions = new ArrayList<>();
         this.firePositions = new HashSet<>();
         this.neighbors = new HashMap<>();
+        this.cloudPositions = new ArrayList<>();
 
         initializeBoard();
     }
@@ -78,7 +82,12 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
                         result.add(ModelElement.FIREFIGHTER);
                     }
                 }
-                default -> {
+                case CLOUD -> {
+                    if (cloudPositions.contains(position)) {
+                        result.add(ModelElement.CLOUD);
+                    }
+                }
+                default ->{
                 }
             }
         }
@@ -103,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) {
@@ -118,6 +136,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
             switch (element) {
                 case FIRE -> firePositions.add(position);
                 case FIREFIGHTER -> firefighterPositions.add(position);
+                case CLOUD -> cloudPositions.add(position);
             }
         }
     }
@@ -125,8 +144,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     @Override
     public List<Position> updateToNextGeneration() {
         List<ModelElement> elements = List.of(
-            ModelElement.FIRE,
-            ModelElement.FIREFIGHTER
+                ModelElement.FIRE,
+                ModelElement.FIREFIGHTER,
+                ModelElement.CLOUD
         );
         List<Position> modifiedPositions = new ArrayList<>();
 
@@ -134,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());
@@ -141,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++;
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 373eb05ba57e27989095c591c562e7129b132491..f2cf448dd9a7cb82b65f3d421d40011e2f61bae2 100644
--- a/src/main/java/model/Initializer.java
+++ b/src/main/java/model/Initializer.java
@@ -14,10 +14,14 @@ public class Initializer {
     private final Map<Position, List<Position>> neighbors;
     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();
 
+    private static final int cloudCount = 3;
+
+
     public Initializer(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
         this.columnCount = columnCount;
         this.rowCount = rowCount;
@@ -28,6 +32,7 @@ public class Initializer {
         this.neighbors = new HashMap<>();
         this.firePositions = new HashSet<>();
         this.firefighterPositions = new ArrayList<>();
+        this.cloudPositions = new ArrayList<>();
 
         initializePositions();
         initializeNeighbors();
@@ -53,6 +58,9 @@ public class Initializer {
         }
     }
     private void initializeElements() {
+        initializeFirePositions();
+        initializeFirefighters();
+        initializeCloudsPositions();
 
     }
     private void initializeFirePositions() {
@@ -61,6 +69,9 @@ public class Initializer {
     private void initializeFirefighters() {
             addRandomPositions(firefighterPositions, initialFirefighterCount);
     }
+    private void initializeCloudsPositions() {
+        addRandomPositions(cloudPositions, cloudCount);
+    }
 
     private void addRandomPositions(Collection<Position> targetCollection, int count) {
         while (targetCollection.size() < count) {
@@ -108,6 +119,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 5212cc5dc358e893318e4c01fb2926782f07b496..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 {
-  FIREFIGHTER("blue"), FIRE("red");
+  FIREFIGHTER("blue"), FIRE("red"), CLOUD("darkgrey");
 
   private final String color;