diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java
index 3c796977333c8a1c7c907f059e4e0161c3f6901e..8be93fae98fd8c3c21df08d6339858c661a20902 100644
--- a/src/main/java/app/SimulatorApplication.java
+++ b/src/main/java/app/SimulatorApplication.java
@@ -21,6 +21,8 @@ public class SimulatorApplication extends javafx.application.Application {
   public static final int INITIAL_FIREFIGHTER_COUNT = 6;
   public static final int INITIAL_CLOUD_COUNT = 6;
   public static final int INITIAL_MONTAIN_COUNT = 4;
+  public static final int INITIAL_MOTORIZED_FIREFIGHTER_COUNT = 4;
+
 
   private Stage primaryStage;
   private Parent view;
@@ -46,7 +48,7 @@ public class SimulatorApplication extends javafx.application.Application {
     view = loader.load();
     Controller controller = loader.getController();
     controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT,
-            INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MONTAIN_COUNT);
+            INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MONTAIN_COUNT,INITIAL_MOTORIZED_FIREFIGHTER_COUNT);
   }
 
   private void showScene() {
diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index 4d0ca769ec200c76646912b22028fc4bca05bf60..37c6a8aeac22526aed03e11e7f498cc44e25cc69 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -94,6 +94,9 @@ public class Controller {
       if(model instanceof Montains){
         return new MONTAINS();
       }
+      if(model instanceof Motorized_Firefighter){
+        return new MOTORIZED_FIREFIGHTER();
+      }
 
     }
 
@@ -133,9 +136,9 @@ public class Controller {
   }
 
   public void initialize(int squareWidth, int squareHeight, int columnCount,
-                                int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainsCount) {
+                                int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainsCount,int initialMorized_firefighterCount) {
     grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
-    this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount,initialCloudsCount, initialMontainsCount));
+    this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount,initialCloudsCount, initialMontainsCount,initialMorized_firefighterCount));
     repaintGrid();
   }
 
diff --git a/src/main/java/model/BoardMethods.java b/src/main/java/model/BoardMethods.java
index 9ddf81196593f40de66fbb5b22336aff40e70962..10a0ca2b0f3f9f2fe4f2643540e25371323ba088 100644
--- a/src/main/java/model/BoardMethods.java
+++ b/src/main/java/model/BoardMethods.java
@@ -2,10 +2,7 @@ package model;
 
 import util.Position;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
+import java.util.*;
 
 public class BoardMethods {
     int columnCount;
@@ -17,7 +14,7 @@ public class BoardMethods {
          firPositions.remove(position);
     }
 
-     public  List<Position> neighbors(Position position, int rowCount, int columnCount) {
+     public  List<Position> neighbors(Position position) {
         List<Position> list = new ArrayList<>();
         if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
         if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
@@ -26,6 +23,26 @@ public class BoardMethods {
         return list;
     }
 
+    public Position neighborClosestToFire(Position position, Set<Position> firePositions) {
+        Set<Position> seen = new HashSet<>();
+        HashMap<Position, Position> firstMove = new HashMap<>();
+        Queue<Position> toVisit = new LinkedList<>(neighbors(position));
+        for (Position initialMove : toVisit)
+            firstMove.put(initialMove, initialMove);
+        while (!toVisit.isEmpty()) {
+            Position current = toVisit.poll();
+            if (firePositions.contains(current))
+                return firstMove.get(current);
+            for (Position adjacent : neighbors(current)) {
+                if (seen.contains(adjacent)) continue;
+                toVisit.add(adjacent);
+                seen.add(adjacent);
+                firstMove.put(adjacent, firstMove.get(current));
+            }
+        }
+        return position;
+    }
+
     public Position randomPosition() {
         if (rowCount <= 0 || columnCount <= 0) {
             throw new IllegalArgumentException("Les limites doivent ĂȘtre positives");
diff --git a/src/main/java/model/FireFighters.java b/src/main/java/model/FireFighters.java
index 68127388fceecd8d42e1f9afa1e908c72b80db72..ae6f52ac49d53f37474a29beb8c1ffdf81ece152 100644
--- a/src/main/java/model/FireFighters.java
+++ b/src/main/java/model/FireFighters.java
@@ -4,13 +4,12 @@ import util.Position;
 
 import java.util.*;
 
-public class FireFighters implements ModelElement {
+public class FireFighters extends BoardMethods implements ModelElement {
 
     private List<Position> fireFightersPositions;
-    private int rowCount;
-    private int columnCount;
 
-    private final Random randomGenerator = new Random();
+
+
 
     public FireFighters() {
     }
@@ -25,11 +24,7 @@ public class FireFighters implements ModelElement {
     }
 
 
-   /* public void initializeElements(int initialCount, int rowCount, int columnCount) {
-        this.rowCount=rowCount;
-        this.columnCount=columnCount;
-        initializeElements(initialCount);
-    }*/
+
 
     public void initializeElements(int initialFirefighterCount, int rowCount, int columnCount) {
         this.rowCount=rowCount;
@@ -39,29 +34,22 @@ public class FireFighters implements ModelElement {
             fireFightersPositions.add(randomPosition());
     }
 
-    @Override
-    public Position randomPosition() {
-        if (rowCount <= 0 || columnCount <= 0) {
-            throw new IllegalArgumentException("Les limites doivent ĂȘtre positives");
-        }
-        return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
 
-    }
-    private List<Position> neighbors(Position position) {
-        List<Position> list = new ArrayList<>();
-        if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
-        if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
-        if (position.row() < rowCount - 1) list.add(new Position(position.row() + 1, position.column()));
-        if (position.column() < columnCount - 1) list.add(new Position(position.row(), position.column() + 1));
-        return list;
-    }
-    public List<Position> updateFirefighters(Set<Position> firePositions) {
+
+    public List<Position> updateFirefighters(Set<Position> firePositions, Montains mountains) {
         List<Position> result = new ArrayList<>();
         List<Position> firefighterNewPositions = new ArrayList<>();
         for (Position firefighterPosition : fireFightersPositions) {
             Position newFirefighterPosition = neighborClosestToFire(firefighterPosition,firePositions);
-            firefighterNewPositions.add(newFirefighterPosition);
-            extinguish(newFirefighterPosition, firePositions);
+
+            if (firefighterNewPositions.contains(newFirefighterPosition) ||  mountains.getMontainsPositions().contains(newFirefighterPosition)){
+                firefighterNewPositions.add(firefighterPosition);
+                extinguish(firefighterPosition, firePositions);
+            }
+            else {
+                firefighterNewPositions.add(newFirefighterPosition);
+                extinguish(newFirefighterPosition, firePositions);
+            }
             result.add(firefighterPosition);
             result.add(newFirefighterPosition);
             List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream()
@@ -74,29 +62,8 @@ public class FireFighters implements ModelElement {
         return result;
     }
 
-    private void extinguish(Position position,Set<Position> firePositions ) {
-        firePositions.remove(position);
-    }
 
-    private Position neighborClosestToFire(Position position, Set<Position> firePositions) {
-        Set<Position> seen = new HashSet<>();
-        HashMap<Position, Position> firstMove = new HashMap<>();
-        Queue<Position> toVisit = new LinkedList<>(neighbors(position));
-        for (Position initialMove : toVisit)
-            firstMove.put(initialMove, initialMove);
-        while (!toVisit.isEmpty()) {
-            Position current = toVisit.poll();
-            if (firePositions.contains(current))
-                return firstMove.get(current);
-            for (Position adjacent : neighbors(current)) {
-                if (seen.contains(adjacent)) continue;
-                toVisit.add(adjacent);
-                seen.add(adjacent);
-                firstMove.put(adjacent, firstMove.get(current));
-            }
-        }
-        return position;
-    }
+
 
 
 }
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index 7022bd7f68b1570ced0f3fbe5e9a8cf67f50edca..90c1e6f3113f23662cb1fd81b6847d99451fb574 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -11,22 +11,25 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   private final int initialFireCount;
   private final int initialFirefighterCount;
   private final int initialCloudsCount;
+  private final int initialMorized_firefighterCount;
 
   private final int initialMontainCount;
   private Fires fires;
   private FireFighters fireFighters;
   private Cloud clouds;
   private Montains Montains;
+  private Motorized_Firefighter motorized_firefighter;
 
   private int step = 0;
 
-  public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainCount) {
+  public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainCount,int initialMorized_firefighterCount) {
     this.columnCount = columnCount;
     this.rowCount = rowCount;
     this.initialFireCount = initialFireCount;
     this.initialFirefighterCount = initialFirefighterCount;
     this.initialCloudsCount = initialCloudsCount;
     this.initialMontainCount = initialMontainCount;
+    this.initialMorized_firefighterCount = initialMorized_firefighterCount;
     initializeElements();
   }
 
@@ -35,10 +38,12 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     this.fireFighters = new FireFighters();
     this.clouds = new Cloud();
     this.Montains = new Montains();
+    this.motorized_firefighter = new Motorized_Firefighter();
     fires.initializeElements(initialFireCount,rowCount,columnCount);
     fireFighters.initializeElements(initialFirefighterCount,rowCount,columnCount);
     clouds.initializeElements(initialCloudsCount,rowCount, columnCount);
     Montains.initializeElements(initialMontainCount, rowCount,columnCount);
+    motorized_firefighter.initializeElements(initialMorized_firefighterCount,rowCount,columnCount);
   }
 
   @Override
@@ -56,6 +61,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
       if (cloudsPositions.equals(position))
         result.add(new Cloud());
 
+    for(Position motorized_firefighter : motorized_firefighter.getMotorized_fireFightersPositions())
+      if (motorized_firefighter.equals(position))
+        result.add(new Motorized_Firefighter());
+
     if(fires.getFirePositions().contains(position))
       result.add(new Fires());
     return result;
@@ -72,10 +81,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   }
 
   public List<Position> updateToNextGeneration() {
-    List<Position> result = fireFighters.updateFirefighters(fires.getFirePositions());
-    result.addAll(fires.updateFires());
+    List<Position> result = fireFighters.updateFirefighters(fires.getFirePositions(),Montains);
+    result.addAll(fires.updateFires(Montains));
     if (!fires.getFirePositions().isEmpty()) {
       result.addAll(clouds.updateCouds(fires.getFirePositions()));
+      result.addAll(motorized_firefighter.updateMotorized_firefighter(fires.getFirePositions(),Montains));
       step++;
       fires.incrementStep();
     }
@@ -119,6 +129,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
       if(element instanceof Montains){
         Montains.add(position);
       }
+      if (element instanceof Motorized_Firefighter){
+        motorized_firefighter.add(position);
+      }
     }
 
   }
diff --git a/src/main/java/model/Fires.java b/src/main/java/model/Fires.java
index 5ee1f2286b619f66debce4b4ee772183ae6c59ed..1b157b97efe0d216321a511a0c26c2cec5fca18f 100644
--- a/src/main/java/model/Fires.java
+++ b/src/main/java/model/Fires.java
@@ -22,12 +22,17 @@ public class Fires extends BoardMethods implements ModelElement {
         return firePositions;
     }
 
-    public List<Position> updateFires() {
+    public List<Position> updateFires(Montains montains) {
         List<Position> result = new ArrayList<>();
         if (step % 2 == 0) {
             List<Position> newFirePositions = new ArrayList<>();
             for (Position fire : firePositions) {
-                newFirePositions.addAll(neighbors(fire, fire.row(), fire.column()));
+                List<Position> neighborsOfFires = neighbors(fire);
+                for(Position neighbor : neighborsOfFires) {
+                    if (!montains.getMontainsPositions().contains(neighbor)){
+                        newFirePositions.add(neighbor);
+                    }
+                }
             }
             firePositions.addAll(newFirePositions);
             result.addAll(newFirePositions);
diff --git a/src/main/java/model/Motorized_Firefighter.java b/src/main/java/model/Motorized_Firefighter.java
new file mode 100644
index 0000000000000000000000000000000000000000..874881bba9c319ff64d5b631f6e17c925aacf479
--- /dev/null
+++ b/src/main/java/model/Motorized_Firefighter.java
@@ -0,0 +1,67 @@
+package model;
+
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+public class Motorized_Firefighter extends BoardMethods implements ModelElement {
+
+    private List<Position> Motorized_fireFightersPositions;
+
+    public Motorized_Firefighter() {
+    }
+
+    public void add(Position position){
+        Motorized_fireFightersPositions.add(position);
+    }
+
+    public List<Position> getMotorized_fireFightersPositions() {
+        return Motorized_fireFightersPositions;
+    }
+
+
+
+
+    public void initializeElements(int initialFirefighterCount, int rowCount, int columnCount) {
+        this.rowCount=rowCount;
+        this.columnCount=columnCount;
+        Motorized_fireFightersPositions = new ArrayList<>();
+        for (int index = 0; index < initialFirefighterCount; index++)
+            Motorized_fireFightersPositions.add(randomPosition());
+    }
+
+
+    public List<Position> updateMotorized_firefighter(Set<Position> firePositions, Montains mountains) {
+        List<Position> result = new ArrayList<>();
+
+        for (int i = 0; i < 2; i++) {
+            List<Position> firefighterNewPositions = new ArrayList<>();
+
+            for (Position firefighterPosition : Motorized_fireFightersPositions) {
+                Position newFirefighterPosition = neighborClosestToFire(firefighterPosition, firePositions);
+
+                if (firefighterNewPositions.contains(newFirefighterPosition) || mountains.getMontainsPositions().contains(newFirefighterPosition)) {
+                    firefighterNewPositions.add(firefighterPosition);
+                    extinguish(firefighterPosition, firePositions);
+                } else {
+                    firefighterNewPositions.add(newFirefighterPosition);
+                    extinguish(newFirefighterPosition, firePositions);
+                }
+                result.add(firefighterPosition);
+                result.add(newFirefighterPosition);
+                List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream()
+                        .filter(firePositions::contains).toList();
+                for (Position firePosition : neighborFirePositions)
+                    extinguish(firePosition, firePositions);
+                result.addAll(neighborFirePositions);
+            }
+            Motorized_fireFightersPositions = firefighterNewPositions;
+
+        }
+        return result;
+    }
+
+
+}
diff --git a/src/main/java/view/MOTORIZED_FIREFIGHTER.java b/src/main/java/view/MOTORIZED_FIREFIGHTER.java
new file mode 100644
index 0000000000000000000000000000000000000000..efd19f59e56d0e7eb260decf7aff96d2090794fa
--- /dev/null
+++ b/src/main/java/view/MOTORIZED_FIREFIGHTER.java
@@ -0,0 +1,10 @@
+package view;
+
+import javafx.scene.paint.Color;
+
+public class MOTORIZED_FIREFIGHTER implements ViewElement{
+    @Override
+    public Color getColor() {
+        return Color.BROWN;
+    }
+}