diff --git a/.gradle/8.10.2/executionHistory/executionHistory.bin b/.gradle/8.10.2/executionHistory/executionHistory.bin
index 53225b6e1d3c27517a8449101ba24dd9d51f363a..1b04c929a7e6e8270dc77696abc06ecd9c56b77b 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 06f79ed17ebae12f4323b4883a00019d0c1c7d87..e20f18574181d8ff09e42dcf6caccef815f53ed2 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 8989656673bcca3b5670dd85268d4144e6b999ea..2b94c4ed959cc5773e8663685b0edf2ea4a98210 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 483570e1978f2c9f262de08186ad212fda1d7fc0..3f9302b190923d39bb00d07a94bc8a04cebe5f6b 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 7c7289b756a6949b1f985b0257f895dcb4ea896f..ca9f79172a257f13e1e007f6b1634f3278e887f2 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 f43397ebdd29301389a089397cd1646b4fe2561d..287af6e1ca757eb1c80330e74e2596b23a3cb115 100644
Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/build/classes/java/main/app/SimulatorApplication.class b/build/classes/java/main/app/SimulatorApplication.class
index fca1aceeefd58a020e52c53c7a879dadb8f147ed..74b875251a0cde725bd7e353d53f8ef10d36b6c1 100644
Binary files a/build/classes/java/main/app/SimulatorApplication.class and b/build/classes/java/main/app/SimulatorApplication.class differ
diff --git a/build/classes/java/main/model/BoardFireFighterBehavior.class b/build/classes/java/main/model/BoardFireFighterBehavior.class
index 07204c3c3f123f9b13f3a54f72d36e3148c48a95..23937ecfb9fbe992d4ceb5471b0891d8bb9947ec 100644
Binary files a/build/classes/java/main/model/BoardFireFighterBehavior.class and b/build/classes/java/main/model/BoardFireFighterBehavior.class differ
diff --git a/build/classes/java/main/model/FireFactory.class b/build/classes/java/main/model/FireFactory.class
index 63ec280e55d1c3b09f0328944b6695f7f41db67e..cd2de694304566ad83e53b02f3ca95060dfe94dc 100644
Binary files a/build/classes/java/main/model/FireFactory.class and b/build/classes/java/main/model/FireFactory.class differ
diff --git a/build/classes/java/main/model/FirefighterBoard.class b/build/classes/java/main/model/FirefighterBoard.class
index dfcfecbdaae1ba217fa185d9de40690d2b2a8d44..e5546abb657938877a328311e38a6f60e909c7e5 100644
Binary files a/build/classes/java/main/model/FirefighterBoard.class and b/build/classes/java/main/model/FirefighterBoard.class differ
diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin
index 33f51b6742b84ed99e02b091fc48257a19ed2a82..02f840310ffeae8d39057f746b3f0d133500205b 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/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java
index 280ec62c05c645c8291c85f8ec2d7c08b8bc4da4..47b7017f062e4894a47716d4e45aabb8bd5387ad 100644
--- a/src/main/java/app/SimulatorApplication.java
+++ b/src/main/java/app/SimulatorApplication.java
@@ -17,7 +17,7 @@ public class SimulatorApplication extends javafx.application.Application {
   private static final int COLUMN_COUNT = 20;
   private static final int BOX_WIDTH = 50;
   private static final int BOX_HEIGHT = 50;
-  public static final int INITIAL_FIRE_COUNT = 4;
+  public static final int INITIAL_FIRE_COUNT = 10;
   public static final int INITIAL_FIREFIGHTER_COUNT = 3;
   public static final int INITIAL_CLOUD_COUNT = 3;
   public static final int INITIAL_MOTORIZED_COUNT = 3;
diff --git a/src/main/java/model/BoardFireFighterBehavior.java b/src/main/java/model/BoardFireFighterBehavior.java
index ccd6b9a2d245c0b596ba670e20b16a72557f4b39..53c01c6bcfe53673b99649da36049922bb7404c7 100644
--- a/src/main/java/model/BoardFireFighterBehavior.java
+++ b/src/main/java/model/BoardFireFighterBehavior.java
@@ -6,60 +6,36 @@ import util.TargetStrategy;
 import java.util.*;
 
 public class BoardFireFighterBehavior implements BoardBehavior{
-    private final TargetStrategy targetStrategy = new TargetStrategy();
-    private final Map<Position, List<Position>> neighbors;
-    private List<Position> firefighterPositions;
-    private List<Position> motorizedFighters;
-    private List<Position> rocky;
-    private Set<Position> firePositions;
-    private final ElementFactory<FireFighter> firefighterFactory;
-    private final ElementFactory<Fire> fireFactory;
-    private final ElementFactory<Cloud> cloudFactory;
-    private final ElementFactory<MotorizedFireFighter> motorizedFactory;
+    private static TargetStrategy targetStrategy = new TargetStrategy();
+    private static Map<Position, List<Position>> neighbors;
+
+    private static List<Position> rocky;
+
     private ElementFactory<Rocky> rockyFactory;
-    private List<Position> cloudPositions;
-    private final Map<Position, Terrain> terrainMap = new HashMap<>();
-    private int step;
+    private static  Map<Position, Terrain> terrainMap = new HashMap<>();
+    private static int step;
+    static Movements fireMovements ;
+    static Movements fireFighterMovements;
+    static Movements cloudMovements;
+    static Movements motorizedMovements;
 
     public BoardFireFighterBehavior(Map<Position, List<Position>> neighbors, ElementFactory<Fire> fireFactory ,ElementFactory<FireFighter> firefighterFactory,
                                     ElementFactory<Cloud> cloudFactory,ElementFactory<MotorizedFireFighter> motorizedFactory,ElementFactory<Rocky> rockyFactory) {
         this.step=0;
         this.neighbors = neighbors;
-        this.firefighterFactory = firefighterFactory;
-        this.fireFactory = fireFactory;
-        this.cloudFactory=cloudFactory;
-        this.motorizedFactory=motorizedFactory;
         this.rockyFactory=rockyFactory;
+        fireMovements=new FireMovements(fireFactory);
+        fireFighterMovements=new FireFighterMovements(firefighterFactory);
+        cloudMovements=new CloudMovements(cloudFactory);
+        motorizedMovements=new MotorizedMovements(motorizedFactory);
     }
 
     public void initializeElements(int rowCount, int columnCount) {
-        // Feux
-        firePositions = new HashSet<>();
-        List<Fire> fires = fireFactory.createElements(rowCount, columnCount);
-        for (Fire fire : fires) {
-            firePositions.add(fire.getPosition());
-        }
-
-        // Pompiers
-        firefighterPositions = new ArrayList<>();
-        List<FireFighter> firefighters = firefighterFactory.createElements(rowCount, columnCount);
-        for (FireFighter firefighter : firefighters) {
-            firefighterPositions.add(firefighter.getPosition());
-        }
-
-
-        // Nuages
-        cloudPositions = new ArrayList<>();
-        List<Cloud> clouds = cloudFactory.createElements(rowCount, columnCount);
-        for (Cloud cloud : clouds) {
-            cloudPositions.add(cloud.getPosition());
-        }
+         fireMovements.initializeElement(rowCount,columnCount);
+         fireFighterMovements.initializeElement(rowCount,columnCount);
+         cloudMovements.initializeElement(rowCount,columnCount);
         // Pompiers motorisés
-        motorizedFighters = new ArrayList<>();
-        List<MotorizedFireFighter> motorizedFirefighters = motorizedFactory.createElements(rowCount, columnCount);
-        for (MotorizedFireFighter motorizedFirefighter : motorizedFirefighters) {
-            motorizedFighters.add(motorizedFirefighter.getPosition());
-        }
+        motorizedMovements.initializeElement(rowCount,columnCount);
         // Rocky
         rocky = new ArrayList<>();
         List<Rocky> rockies = rockyFactory.createElements(rowCount, columnCount);
@@ -73,146 +49,20 @@ public class BoardFireFighterBehavior implements BoardBehavior{
     }
 
 
-    public List<Position> updateFires() {
-        List<Position> modifiedPositions = new ArrayList<>();
-        if (step % 2 == 0) {
-            List<Position> newFirePositions = new ArrayList<>();
-
-            // Pour chaque feu existant, vérifier ses voisins
-            for (Position fire : firePositions) {
-                // Si la position voisine est libre (non occupée par un feu ou un pompier), le feu peut se propager
-                for (Position neighbor : neighbors.get(fire)) {
-                    // Vérifier si le feu peut se propager à cette position (pas de feu déjà là et pas un terrain bloqué)
-                    if (canMoveTo(neighbor, firePositions, firefighterPositions) && !firePositions.contains(neighbor)) {
-                        newFirePositions.add(neighbor);
-                    }
-                }
-            }
-
-            // Ajouter les nouvelles positions de feu à la liste des feux existants
-            firePositions.addAll(newFirePositions);
-            modifiedPositions.addAll(newFirePositions);
-        }
-        return modifiedPositions;
-    }
-
-
-    public List<Position> updateFirefighters() {
-        List<Position> modifiedPositions = new ArrayList<>();
-        List<Position> newFirefighterPositions = new ArrayList<>();
 
-        for (Position firefighterPosition : firefighterPositions) {
-            // Calcul de la position vers laquelle le pompier devrait se déplacer
-            Position newFirefighterPosition = targetStrategy.neighborClosestToTarget(firefighterPosition, firePositions, neighbors);
-
-            // Vérification si la position cible est valide pour le mouvement
-            if (canMoveTo(newFirefighterPosition, firePositions, firefighterPositions)) {
-                // Si le déplacement est valide, on met à jour la position du pompier
-                newFirefighterPositions.add(newFirefighterPosition);
-
-                // Éteindre le feu à la nouvelle position
-                extinguish(newFirefighterPosition);
-                modifiedPositions.add(firefighterPosition);
-                modifiedPositions.add(newFirefighterPosition);
-
-                // Vérification des voisins et extinction des feux voisins
-                List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream()
-                        .filter(firePositions::contains).toList();
-
-                // Log pour débogage
-                System.out.println("Pompiers se déplacent de " + firefighterPosition + " vers " + newFirefighterPosition);
-
-                // Éteindre les feux voisins
-                for (Position firePosition : neighborFirePositions) {
-                    extinguish(firePosition);
-                    modifiedPositions.add(firePosition);  // Ajout des feux éteints dans la liste des positions modifiées
-                }
-            } else {
-                // Si la position n'est pas valide, le pompier reste sur place
-                newFirefighterPositions.add(firefighterPosition);
-                System.out.println("Pompier ne peut pas se déplacer à " + newFirefighterPosition + ", il reste à " + firefighterPosition);
-            }
-        }
-
-        // Mettre à jour la liste des positions des pompiers
-        firefighterPositions = newFirefighterPositions;
-        return modifiedPositions;
-    }
-
-    public List<Position> updateMotorized() {
-        List<Position> modifiedPositions = new ArrayList<>();
-        List<Position> newPositions = new ArrayList<>();
-
-        for (Position currentPosition : motorizedFighters) {
-            // Vérification de validité de la position actuelle
-            if (!neighbors.containsKey(currentPosition)) {
-                System.err.println("Position actuelle invalide : " + currentPosition);
-                newPositions.add(currentPosition);
-                continue;
-            }
-
-            // Étape 1 : Calcul du premier déplacement
-            Position firstStep = targetStrategy.neighborClosestToTarget(currentPosition, firePositions, neighbors);
-            if (firstStep == null || !neighbors.containsKey(firstStep)) {
-                // Aucun déplacement possible, rester sur place
-                System.out.println("Pas de première étape possible pour : " + currentPosition);
-                newPositions.add(currentPosition);
-                continue;
-            }
-
-            // Étape 2 : Calcul du deuxième déplacement
-            Position secondStep = targetStrategy.neighborClosestToTarget(firstStep, firePositions, neighbors);
-            Position finalPosition = (secondStep != null && neighbors.containsKey(secondStep)) ? secondStep : firstStep;
-
-            // Ajout de la position finale aux nouvelles positions
-            newPositions.add(finalPosition);
-
-            // Mise à jour des positions modifiées
-            modifiedPositions.add(currentPosition);  // Ancienne position
-            modifiedPositions.add(finalPosition);    // Nouvelle position
-
-            // Étape 3 : Éteindre les feux à la position finale
-            extinguish(finalPosition);
-            extinguishNearbyFires(finalPosition, modifiedPositions);
-        }
-
-        // Mettre à jour les positions globales
-        motorizedFighters = newPositions;
-        return modifiedPositions;
-    }
-
-    /**
-     * Éteint les feux à proximité d'une position donnée.
-     *
-     * @param firefighterPosition La position actuelle du pompier.
-     * @param modifiedPositions   Les positions modifiées pendant ce tour.
-     */
-    private void extinguishNearbyFires(Position firefighterPosition, List<Position> modifiedPositions) {
-        List<Position> nearbyFires = neighbors.getOrDefault(firefighterPosition, Collections.emptyList())
-                .stream()
-                .filter(firePositions::contains)
-                .toList();
-        for (Position fire : nearbyFires) {
-            firePositions.remove(fire);
-            modifiedPositions.add(fire);
-            System.out.println("Feu éteint à : " + fire);
-        }
-    }
 
 
-    private void extinguish(Position position) {
-        firePositions.remove(position);
+    public static void extinguish(Position position) {
+        fireMovements.getPositions().remove(position);
     }
 
 
 
     public Set<Position> getFirePositions() {
-        return firePositions;
+        return (Set<Position>) fireMovements.getPositions();
     }
 
-    public List<Position> getFirefighterPositions() {
-        return firefighterPositions;
-    }
+
 
     public void incrementStep() {
         step++;
@@ -226,10 +76,10 @@ public class BoardFireFighterBehavior implements BoardBehavior{
 
     @Override
     public List<Position> updateToNextGeneration() {
-        List<Position> modifiedPositions = updateFirefighters();
-        modifiedPositions.addAll(updateFires());
-        modifiedPositions.addAll(updateClouds());
-        modifiedPositions.addAll(updateMotorized());
+        List<Position> modifiedPositions = fireFighterMovements.updateElements();
+        modifiedPositions.addAll(fireMovements.updateElements());
+        modifiedPositions.addAll(cloudMovements.updateElements());
+        modifiedPositions.addAll(motorizedMovements.updateElements());
         incrementStep();
         return modifiedPositions;
     }
@@ -237,45 +87,16 @@ public class BoardFireFighterBehavior implements BoardBehavior{
     @Override
     public void reset() {
         this.step=0;
-    }
-    public List<Position> updateClouds() {
-        List<Position> modifiedPositions = new ArrayList<>();
-        List<Position> newCloudPositions = new ArrayList<>();
-
-        for (Position cloudPosition : cloudPositions) {
-            // Déplacement aléatoire
-            List<Position> possibleMoves = neighbors.get(cloudPosition);
-            Position newCloudPosition = possibleMoves.get(new Random().nextInt(possibleMoves.size()));
-
-            // Vérification que le nuage ne se déplace pas vers une montagne
-            if (!canMoveTo(newCloudPosition, firePositions, firefighterPositions)) {
-                continue;  // Si la position est invalide ou une montagne, le nuage reste sur place
-            }
-
-            newCloudPositions.add(newCloudPosition);
-
-            // Éteindre le feu à la position du nuage (le nuage mange le feu)
-            if (firePositions.contains(newCloudPosition)) {
-                extinguish(newCloudPosition);  // Supprimer le feu
-                modifiedPositions.add(newCloudPosition);  // Ajouter la position du feu éteint aux positions modifiées
-                System.out.println("Feu éteint par nuage à : " + newCloudPosition);
-            }
-
-            modifiedPositions.add(cloudPosition);  // Ajouter l'ancienne position du nuage
-            modifiedPositions.add(newCloudPosition);  // Ajouter la nouvelle position du nuage
-        }
 
-        cloudPositions = newCloudPositions;
-        return modifiedPositions;
     }
 
 
-    public List<Position> getCloudPositions() {
-        return cloudPositions;
+    public Collection<Position> getCloudPositions() {
+        return cloudMovements.getPositions();
     }
 
     public List<Position> getMotorizedFighters() {
-        return motorizedFighters;
+        return (List<Position>) motorizedMovements.getPositions();
     }
     private void generateMountainBlocks(int rowCount, int columnCount) {
         Random random = new Random();
@@ -317,11 +138,28 @@ public class BoardFireFighterBehavior implements BoardBehavior{
             }
         }
     }
+    /**
+     * Éteint les feux à proximité d'une position donnée.
+     *
+     * @param firefighterPosition La position actuelle du pompier.
+     * @param modifiedPositions   Les positions modifiées pendant ce tour.
+     */
+    public static void extinguishNearbyFires(Position firefighterPosition, List<Position> modifiedPositions) {
+        List<Position> nearbyFires = getNeighbors().getOrDefault(firefighterPosition, Collections.emptyList())
+                .stream()
+                .filter(fireMovements.getPositions()::contains)
+                .toList();
+        for (Position fire : nearbyFires) {
+            fireMovements.getPositions().remove(fire);
+            modifiedPositions.add(fire);
+            System.out.println("Feu éteint à : " + fire);
+        }
+    }
 
     public Map<Position, Terrain> getTerrainMap() {
         return terrainMap;
     }
-    public boolean canMoveTo(Position position, Set<Position> firePositions, List<Position> firefighterPositions) {
+    public static boolean canMoveTo(Position position, Set<Position> firePositions, List<Position> firefighterPositions) {
         // Vérifie si la position est hors des limites (par exemple, en dehors de la grille ou inaccessible)
         if (!neighbors.containsKey(position)) {
             return false;
@@ -338,7 +176,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{
         }
 
         // Si la position est une montagne, aucun élément ne peut la franchir sauf les nuages
-        if (terrainMap.get(position) != null && !cloudPositions.contains(position)) {
+        if (terrainMap.get(position) != null && !cloudMovements.getPositions().contains(position)) {
             return false;  // Impossible de franchir une montagne, sauf pour un nuage
         }
         if(rocky.contains(position))
@@ -389,7 +227,33 @@ public class BoardFireFighterBehavior implements BoardBehavior{
         }
     }
 
+
     public List<Position> getRocky() {
         return rocky;
     }
+
+    public static int getStep() {
+        return step;
+    }
+
+    public static Map<Position, List<Position>> getNeighbors() {
+        return neighbors;
+    }
+
+    public static Movements getFireMovements() {
+        return fireMovements;
+    }
+
+    public static TargetStrategy getTargetStrategy() {
+        return targetStrategy;
+    }
+
+    public static Movements getFireFighterMovements() {
+        return fireFighterMovements;
+    }
+
+
+    public Collection<Position> getFirefighterPositions() {
+        return fireFighterMovements.getPositions();
+    }
 }
diff --git a/src/main/java/model/CloudMovements.java b/src/main/java/model/CloudMovements.java
new file mode 100644
index 0000000000000000000000000000000000000000..5e186aaebc89973da5229f2fa539cea959e6fa38
--- /dev/null
+++ b/src/main/java/model/CloudMovements.java
@@ -0,0 +1,67 @@
+package model;
+
+import util.Position;
+
+import java.util.*;
+
+import static model.BoardFireFighterBehavior.*;
+
+public class CloudMovements implements Movements{
+    private  List<Position> cloudPositions;
+    private final ElementFactory<Cloud> cloudFactory;
+     public CloudMovements(ElementFactory<Cloud> cloudFactory) {
+        this.cloudPositions = new ArrayList<>();
+        this.cloudFactory = cloudFactory;
+    }
+    @Override
+    public void initializeElement(int rowCount, int columnCount) {
+        // Nuages
+        cloudPositions = new ArrayList<>();
+        List<Cloud> clouds = cloudFactory.createElements(rowCount, columnCount);
+        for (Cloud cloud : clouds) {
+            cloudPositions.add(cloud.getPosition());
+        }
+    }
+
+
+    @Override
+    public List<Position> updateElements() {
+        List<Position> modifiedPositions = new ArrayList<>();
+        List<Position> newCloudPositions = new ArrayList<>();
+
+        for (Position cloudPosition : cloudPositions) {
+            // Déplacement aléatoire
+            List<Position> possibleMoves = getNeighbors().get(cloudPosition);
+            Position newCloudPosition = possibleMoves.get(new Random().nextInt(possibleMoves.size()));
+
+            // Vérification que le nuage ne se déplace pas vers une montagne
+            if (!canMoveTo(newCloudPosition, (Set<Position>) fireMovements.getPositions(), (List<Position>) fireFighterMovements.getPositions())) {
+                continue;  // Si la position est invalide ou une montagne, le nuage reste sur place
+            }
+
+            newCloudPositions.add(newCloudPosition);
+
+            // Éteindre le feu à la position du nuage (le nuage mange le feu)
+            if (fireMovements.getPositions().contains(newCloudPosition)) {
+                extinguish(newCloudPosition);  // Supprimer le feu
+                modifiedPositions.add(newCloudPosition);  // Ajouter la position du feu éteint aux positions modifiées
+                System.out.println("Feu éteint par nuage à : " + newCloudPosition);
+            }
+
+            modifiedPositions.add(cloudPosition);  // Ajouter l'ancienne position du nuage
+            modifiedPositions.add(newCloudPosition);  // Ajouter la nouvelle position du nuage
+        }
+
+        cloudPositions = newCloudPositions;
+        return modifiedPositions;
+    }
+
+
+
+
+
+    @Override
+    public Collection<Position> getPositions() {
+        return cloudPositions;
+    }
+}
diff --git a/src/main/java/model/ElementsUpdate.java b/src/main/java/model/ElementsUpdate.java
deleted file mode 100644
index d0e05e3e5cab80c00133c12fbf1a31885648c10d..0000000000000000000000000000000000000000
--- a/src/main/java/model/ElementsUpdate.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package model;
-
-import util.Position;
-
-import java.util.List;
-
-public interface ElementsUpdate {
-    public List<Position> updateElements();
-}
diff --git a/src/main/java/model/FireFactory.java b/src/main/java/model/FireFactory.java
index 5b066af06cefbd9a6c91c5215bed2679f79ea43e..7bcd71402e0f3a98f416a1b558b394e102ceba91 100644
--- a/src/main/java/model/FireFactory.java
+++ b/src/main/java/model/FireFactory.java
@@ -29,6 +29,7 @@ public class FireFactory implements ElementFactory<Fire>,PositionGenerator{
             Position randomPosition = generateRandomPosition(rowCount, columnCount);
             boolean add = fires.add(new Fire(randomPosition));
         }
+        System.out.println(fires.size());
         return fires;
     }
 
diff --git a/src/main/java/model/FireFighterMovements.java b/src/main/java/model/FireFighterMovements.java
new file mode 100644
index 0000000000000000000000000000000000000000..6e1ded828c1572cde2a440e92f50659bd8e0412f
--- /dev/null
+++ b/src/main/java/model/FireFighterMovements.java
@@ -0,0 +1,79 @@
+package model;
+
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import static model.BoardFireFighterBehavior.*;
+
+public class FireFighterMovements implements Movements{
+    private final ElementFactory<FireFighter> firefighterFactory;
+    private  List<Position> firefighterPositions;
+    public FireFighterMovements(ElementFactory<FireFighter> firefighterFactory) {
+        this.firefighterFactory = firefighterFactory;
+        this.firefighterPositions = new ArrayList<>();
+    }
+
+
+
+    @Override
+    public List<Position> updateElements() {
+        List<Position> modifiedPositions = new ArrayList<>();
+        List<Position> newFirefighterPositions = new ArrayList<>();
+
+        for (Position firefighterPosition : firefighterPositions) {
+            // Calcul de la position vers laquelle le pompier devrait se déplacer
+            Position newFirefighterPosition =getTargetStrategy().neighborClosestToTarget(firefighterPosition, fireMovements.getPositions(), getNeighbors());
+
+            // Vérification si la position cible est valide pour le mouvement
+            if (canMoveTo(newFirefighterPosition, (Set<Position>) fireMovements.getPositions(), firefighterPositions)) {
+                // Si le déplacement est valide, on met à jour la position du pompier
+                newFirefighterPositions.add(newFirefighterPosition);
+
+                // Éteindre le feu à la nouvelle position
+                extinguish(newFirefighterPosition);
+                modifiedPositions.add(firefighterPosition);
+                modifiedPositions.add(newFirefighterPosition);
+
+                // Vérification des voisins et extinction des feux voisins
+                List<Position> neighborFirePositions = getNeighbors().get(newFirefighterPosition).stream()
+                        .filter(fireMovements.getPositions()::contains).toList();
+
+                // Log pour débogage
+                System.out.println("Pompiers se déplacent de " + firefighterPosition + " vers " + newFirefighterPosition);
+
+                // Éteindre les feux voisins
+                for (Position firePosition : neighborFirePositions) {
+                    extinguish(firePosition);
+                    modifiedPositions.add(firePosition);  // Ajout des feux éteints dans la liste des positions modifiées
+                }
+            } else {
+                // Si la position n'est pas valide, le pompier reste sur place
+                newFirefighterPositions.add(firefighterPosition);
+                System.out.println("Pompier ne peut pas se déplacer à " + newFirefighterPosition + ", il reste à " + firefighterPosition);
+            }
+        }
+
+        // Mettre à jour la liste des positions des pompiers
+        firefighterPositions = newFirefighterPositions;
+        return modifiedPositions;
+    }
+
+    @Override
+    public void initializeElement(int rowCount, int columnCount) {
+        // Pompiers
+        firefighterPositions = new ArrayList<>();
+        List<FireFighter> firefighters = firefighterFactory.createElements(rowCount, columnCount);
+        for (FireFighter firefighter : firefighters) {
+            firefighterPositions.add(firefighter.getPosition());
+        }
+    }
+
+    @Override
+    public Collection<Position> getPositions() {
+        return firefighterPositions;
+    }
+}
diff --git a/src/main/java/model/FireMovements.java b/src/main/java/model/FireMovements.java
new file mode 100644
index 0000000000000000000000000000000000000000..da96795989f2ed8e45366c8f8249bd3dc36c7211
--- /dev/null
+++ b/src/main/java/model/FireMovements.java
@@ -0,0 +1,64 @@
+package model;
+
+import util.Position;
+
+import java.util.*;
+
+import static model.BoardFireFighterBehavior.*;
+
+public class FireMovements implements Movements{
+    private final ElementFactory<Fire> fireFactory;
+    private Set<Position> firePositions;
+
+
+    public FireMovements(ElementFactory<Fire> fireFactory) {
+        this.fireFactory = fireFactory;
+        this.firePositions = new HashSet<>();
+    }
+
+
+
+    @Override
+    public void initializeElement(int rowCount, int columnCount) {
+        // Feux
+
+            List<Fire> fires = fireFactory.createElements(rowCount, columnCount);
+            for (Fire fire : fires) {
+               firePositions.add(fire.getPosition());
+            }
+
+
+
+    }
+
+    @Override
+    public Collection<Position> getPositions() {
+        return firePositions;
+    }
+
+    @Override
+    public List<Position> updateElements() {
+        List<Position> modifiedPositions = new ArrayList<>();
+        if (getStep() % 2 == 0) {
+            List<Position> newFirePositions = new ArrayList<>();
+
+            // Pour chaque feu existant, vérifier ses voisins
+            for (Position fire : firePositions) {
+                // Si la position voisine est libre (non occupée par un feu ou un pompier), le feu peut se propager
+                for (Position neighbor : getNeighbors().get(fire)) {
+                    // Vérifier si le feu peut se propager à cette position (pas de feu déjà là et pas un terrain bloqué)
+                    if (canMoveTo(neighbor, firePositions, (List<Position>) getFireFighterMovements().getPositions()) && !firePositions.contains(neighbor)) {
+                        newFirePositions.add(neighbor);
+                    }
+                }
+            }
+
+            // Ajouter les nouvelles positions de feu à la liste des feux existants
+            firePositions.addAll(newFirePositions);
+            modifiedPositions.addAll(newFirePositions);
+        }
+        return modifiedPositions;
+    }
+
+
+}
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index cf8e4e0631f8cf29a6c92ba9d77fa11de177166b..88e8b7dc5520c8caafa5126c4408860186c032f9 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -53,7 +53,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
             .forEach(pos -> result.add(new Fire(pos))); // Créer un objet Fire à partir de Position
 
     // Filtrage des éléments Firefighter (en transformant les positions en objets FireFighter)
-    behavior.getFirefighterPositions().stream()
+    behavior.getFireFighterMovements().getPositions().stream()
             .filter(pos -> pos.isAtPosition(position)) // Vérifier si la position correspond
             .forEach(pos -> result.add(new FireFighter(pos))); // Créer un objet Firefighter à partir de Position
     // Filtrage des éléments Cloud
diff --git a/src/main/java/model/InitializeElements.java b/src/main/java/model/InitializeElements.java
deleted file mode 100644
index 9da24f0dbbabf7fe38a71d396bf54394c9fe93ee..0000000000000000000000000000000000000000
--- a/src/main/java/model/InitializeElements.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package model;
-
-public interface InitializeElements {
-    public void initializeElement(int rowCount, int columnCount);
-}
diff --git a/src/main/java/model/MotorizedMovements.java b/src/main/java/model/MotorizedMovements.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5be9dec1000206410ab16de6106412fd1132b54
--- /dev/null
+++ b/src/main/java/model/MotorizedMovements.java
@@ -0,0 +1,79 @@
+package model;
+
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import static model.BoardFireFighterBehavior.*;
+
+public class MotorizedMovements implements Movements{
+    private final ElementFactory<MotorizedFireFighter> motorizedFactory;
+    private List<Position> motorizedFighters;
+
+    public MotorizedMovements(ElementFactory<MotorizedFireFighter> motorizedFactory) {
+        this.motorizedFactory = motorizedFactory;
+        this.motorizedFighters = new ArrayList<>();
+    }
+
+    @Override
+    public List<Position> updateElements() {
+        List<Position> modifiedPositions = new ArrayList<>();
+        List<Position> newPositions = new ArrayList<>();
+
+        for (Position currentPosition : motorizedFighters) {
+            // Vérification de validité de la position actuelle
+            if (!getNeighbors().containsKey(currentPosition)) {
+                System.err.println("Position actuelle invalide : " + currentPosition);
+                newPositions.add(currentPosition);
+                continue;
+            }
+
+            // Étape 1 : Calcul du premier déplacement
+            Position firstStep = getTargetStrategy().neighborClosestToTarget(currentPosition, fireMovements.getPositions(), getNeighbors());
+            if (firstStep == null || !getNeighbors().containsKey(firstStep)) {
+                // Aucun déplacement possible, rester sur place
+                System.out.println("Pas de première étape possible pour : " + currentPosition);
+                newPositions.add(currentPosition);
+                continue;
+            }
+
+            // Étape 2 : Calcul du deuxième déplacement
+            Position secondStep = getTargetStrategy().neighborClosestToTarget(firstStep, fireMovements.getPositions(), getNeighbors());
+            Position finalPosition = (secondStep != null && getNeighbors().containsKey(secondStep)) ? secondStep : firstStep;
+
+            // Ajout de la position finale aux nouvelles positions
+            newPositions.add(finalPosition);
+
+            // Mise à jour des positions modifiées
+            modifiedPositions.add(currentPosition);  // Ancienne position
+            modifiedPositions.add(finalPosition);    // Nouvelle position
+
+            // Étape 3 : Éteindre les feux à la position finale
+            extinguish(finalPosition);
+            extinguishNearbyFires(finalPosition, modifiedPositions);
+        }
+
+        // Mettre à jour les positions globales
+        motorizedFighters = newPositions;
+        return modifiedPositions;
+    }
+
+    @Override
+    public void initializeElement(int rowCount, int columnCount) {
+        motorizedFighters = new ArrayList<>();
+        List<MotorizedFireFighter> motorizedFirefighters = motorizedFactory.createElements(rowCount, columnCount);
+        for (MotorizedFireFighter motorizedFirefighter : motorizedFirefighters) {
+            motorizedFighters.add(motorizedFirefighter.getPosition());
+        }
+
+    }
+
+    @Override
+    public Collection<Position> getPositions() {
+       return this.motorizedFighters;
+    }
+
+}
diff --git a/src/main/java/model/Movements.java b/src/main/java/model/Movements.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f1638a687e05f834df6965c0bdfe0fff75fb6fb
--- /dev/null
+++ b/src/main/java/model/Movements.java
@@ -0,0 +1,13 @@
+package model;
+
+import util.Position;
+
+import java.util.Collection;
+import java.util.List;
+
+public interface Movements {
+    public List<Position> updateElements();
+    public void initializeElement(int rowCount, int columnCount);
+
+    Collection<Position> getPositions();
+}