diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index c0bd67cc4f444a33c41551779b11f3d619412bef..c84740f34bbeb8be2450813efecb299d4337656f 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -1,8 +1,8 @@
 package model;
 
 import util.Position;
-
 import java.util.*;
+import model.TargetStrategy;
 
 
 public class FirefighterBoard implements Board<List<ModelElement>> {
@@ -10,21 +10,31 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   private final int rowCount;
   private final int initialFireCount;
   private final int initialFirefighterCount;
-  private final TargetStrategy targetStrategy = new TargetStrategy();
-  private List<Position> firefighterPositions;
-  private Set<Position> firePositions;
-  private Map<Position, List<Position>> neighbors = new HashMap();
   private final Position[][] positions;
+  private final Map<Position, List<Position>> neighbors = new HashMap<>();
+
+  private Fire fire;
+  private Firefighter firefighter;
   private int step = 0;
-  private final Random randomGenerator = new Random();
 
   public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
     this.columnCount = columnCount;
     this.rowCount = rowCount;
+    this.initialFireCount = initialFireCount;
+    this.initialFirefighterCount = initialFirefighterCount;
     this.positions = new Position[rowCount][columnCount];
+    initializePositions();
+    initializeNeighbors();
+    initializeElements();
+  }
+
+  private void initializePositions() {
     for (int column = 0; column < columnCount; column++)
       for (int row = 0; row < rowCount; row++)
         positions[row][column] = new Position(row, column);
+  }
+
+  private void initializeNeighbors() {
     for (int column = 0; column < columnCount; column++)
       for (int row = 0; row < rowCount; row++) {
         List<Position> list = new ArrayList<>();
@@ -34,64 +44,55 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
         if (column < columnCount - 1) list.add(positions[row][column + 1]);
         neighbors.put(positions[row][column], list);
       }
-    this.initialFireCount = initialFireCount;
-    this.initialFirefighterCount = initialFirefighterCount;
-    initializeElements();
   }
 
-  public void initializeElements() {
-    firefighterPositions = new ArrayList<>();
-    firePositions = new HashSet<>();
-    for (int index = 0; index < initialFireCount; index++)
-      firePositions.add(randomPosition());
-    for (int index = 0; index < initialFirefighterCount; index++)
-      firefighterPositions.add(randomPosition());
-  }
+  private void initializeElements() {
+    Set<Position> initialFirePositions = new HashSet<>();
+    List<Position> initialFirefighterPositions = new ArrayList<>();
+    Random random = new Random();
 
-  private Position randomPosition() {
-    return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
+    for (int i = 0; i < initialFireCount; i++) {
+      initialFirePositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
+    }
+    for (int i = 0; i < initialFirefighterCount; i++) {
+      initialFirefighterPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
+    }
+
+    fire = new Fire(initialFirePositions);
+    firefighter = new Firefighter(initialFirefighterPositions, new TargetStrategy());
   }
 
   @Override
   public List<ModelElement> getState(Position position) {
-    List<ModelElement> result = new ArrayList<>();
-    for (Position firefighterPosition : firefighterPositions)
-      if (firefighterPosition.equals(position))
-        result.add(ModelElement.FIREFIGHTER);
-    if (firePositions.contains(position))
-      result.add(ModelElement.FIRE);
-    return result;
+    List<ModelElement> elements = new ArrayList<>();
+    if (fire.getPositions().contains(position)) elements.add(ModelElement.FIRE);
+    if (firefighter.getPositions().contains(position)) elements.add(ModelElement.FIREFIGHTER);
+    return elements;
   }
 
   @Override
-  public int rowCount() {
-    return rowCount;
+  public List<Position> updateToNextGeneration() {
+    List<Position> modifiedPositions = firefighter.moveToClosestFire(fire.getPositions(), neighbors);
+    modifiedPositions.addAll(fire.spread(neighbors.keySet()));
+    step++;
+    return modifiedPositions;
   }
 
   @Override
-  public int columnCount() {
-    return columnCount;
+  public void setState(List<ModelElement> state, Position position) {
+    // Mise à jour des états (feu ou pompier) en fonction de la liste `state`
+    if (state.contains(ModelElement.FIRE)) fire.getPositions().add(position);
+    if (state.contains(ModelElement.FIREFIGHTER)) firefighter.getPositions().add(position);
   }
 
-  public List<Position> updateToNextGeneration() {
-    List<Position> modifiedPositions = updateFirefighters();
-    modifiedPositions.addAll(updateFires());
-    step++;
-    return modifiedPositions;
+  @Override
+  public int rowCount() {
+    return rowCount;
   }
 
-  private List<Position> updateFires() {
-    List<Position> modifiedPositions = new ArrayList<>();
-    if (step % 2 == 0) {
-      List<Position> newFirePositions = new ArrayList<>();
-      for (Position fire : firePositions) {
-        newFirePositions.addAll(neighbors.get(fire));
-      }
-      firePositions.addAll(newFirePositions);
-      modifiedPositions.addAll(newFirePositions);
-    }
-    return modifiedPositions;
-
+  @Override
+  public int columnCount() {
+    return columnCount;
   }
 
   @Override
@@ -99,49 +100,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     return step;
   }
 
-  private List<Position> updateFirefighters() {
-    List<Position> modifiedPosition = new ArrayList<>();
-    List<Position> firefighterNewPositions = new ArrayList<>();
-    for (Position firefighterPosition : firefighterPositions) {
-      Position newFirefighterPosition =
-              targetStrategy.neighborClosestToFire(firefighterPosition,
-                      firePositions, neighbors);
-      firefighterNewPositions.add(newFirefighterPosition);
-      extinguish(newFirefighterPosition);
-      modifiedPosition.add(firefighterPosition);
-      modifiedPosition.add(newFirefighterPosition);
-      List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream()
-              .filter(firePositions::contains).toList();
-      for (Position firePosition : neighborFirePositions)
-        extinguish(firePosition);
-      modifiedPosition.addAll(neighborFirePositions);
-    }
-    firefighterPositions = firefighterNewPositions;
-    return modifiedPosition;
-  }
-
   @Override
   public void reset() {
     step = 0;
     initializeElements();
   }
-
-  private void extinguish(Position position) {
-    firePositions.remove(position);
-  }
-
-
-  @Override
-  public void setState(List<ModelElement> state, Position position) {
-    firePositions.remove(position);
-    for (; ; ) {
-      if (!firefighterPositions.remove(position)) break;
-    }
-    for (ModelElement element : state) {
-      switch (element) {
-        case FIRE -> firePositions.add(position);
-        case FIREFIGHTER -> firefighterPositions.add(position);
-      }
-    }
-  }
-}
\ No newline at end of file
+}