diff --git a/.gradle/8.4/executionHistory/executionHistory.bin b/.gradle/8.4/executionHistory/executionHistory.bin
index ef3814db707d3311a601ee242faa1484aadf300d..8f1b2dd7e12c428126c841e15e393e8aa0750036 100644
Binary files a/.gradle/8.4/executionHistory/executionHistory.bin and b/.gradle/8.4/executionHistory/executionHistory.bin differ
diff --git a/.gradle/8.4/executionHistory/executionHistory.lock b/.gradle/8.4/executionHistory/executionHistory.lock
index 90be8bbe46872fb2c2dfaa16c2b1debc3585b0e8..2f5ab811be3d96d24e78d9dc4139628ed8bc8a71 100644
Binary files a/.gradle/8.4/executionHistory/executionHistory.lock and b/.gradle/8.4/executionHistory/executionHistory.lock differ
diff --git a/.gradle/8.4/fileHashes/fileHashes.bin b/.gradle/8.4/fileHashes/fileHashes.bin
index 3777e2fb75188a80f5ef02b487efb22b1d596b5c..f961414987ea05a2ba4cff7e6f0e15177557d141 100644
Binary files a/.gradle/8.4/fileHashes/fileHashes.bin and b/.gradle/8.4/fileHashes/fileHashes.bin differ
diff --git a/.gradle/8.4/fileHashes/fileHashes.lock b/.gradle/8.4/fileHashes/fileHashes.lock
index 7b333d1b1b3ec72096d6acd1269ec9a0c55f1011..753dbf9dbddde9e52f56efab94835c5ce535b059 100644
Binary files a/.gradle/8.4/fileHashes/fileHashes.lock and b/.gradle/8.4/fileHashes/fileHashes.lock differ
diff --git a/.gradle/8.4/fileHashes/resourceHashesCache.bin b/.gradle/8.4/fileHashes/resourceHashesCache.bin
index aa0feb0429a70db3fd0c1501c8b605824d233c01..838b0069cd156cd1359aad27da737a8fd0628a0a 100644
Binary files a/.gradle/8.4/fileHashes/resourceHashesCache.bin and b/.gradle/8.4/fileHashes/resourceHashesCache.bin differ
diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock
index c77e84520038f8c47d14db5cb911ea630ec7b10d..0bfc94ece4020f6aa0d98d4a9986882cfc8fda8b 100644
Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe
index 349a7660edc0174109e0bb6d9f10eadb1c99c724..26a07b303a3272556a607b454cab45b805954402 100644
Binary files a/.gradle/file-system.probe and b/.gradle/file-system.probe differ
diff --git a/build/classes/java/main/app/SimulatorApplication.class b/build/classes/java/main/app/SimulatorApplication.class
index 1003f5961c795950b88df71148fdc944e51f63e9..7e6f31bb2e3cb5962c4cc1ee6bc336501ac01730 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/controller/Controller.class b/build/classes/java/main/controller/Controller.class
index 23933b95f3862a8016fa14fae947490553944e61..a8d8a50db6b3654e296244fac71b6fb8b811475b 100644
Binary files a/build/classes/java/main/controller/Controller.class and b/build/classes/java/main/controller/Controller.class differ
diff --git a/build/classes/java/main/model/Builder/GameManage.class b/build/classes/java/main/model/Builder/GameManage.class
index fd32c7f35a06865312c88379a1bd57794de41293..a0261b9904b2581661e7948aadf106998b3671b1 100644
Binary files a/build/classes/java/main/model/Builder/GameManage.class and b/build/classes/java/main/model/Builder/GameManage.class differ
diff --git a/build/classes/java/main/model/ExtinguishFire/Cloud.class b/build/classes/java/main/model/ExtinguishFire/Cloud.class
index 61044ec9271ec1cec418aa6f50ce31b14ed7bf66..9a2ca81b62515b6aaff3d2f4ad91acf8b4fd3921 100644
Binary files a/build/classes/java/main/model/ExtinguishFire/Cloud.class and b/build/classes/java/main/model/ExtinguishFire/Cloud.class differ
diff --git a/build/classes/java/main/model/ExtinguishFire/FireFighter.class b/build/classes/java/main/model/ExtinguishFire/FireFighter.class
index c0e51cda8547a4be38648418a2a9a1e46ff831f1..cec32da5f69030726d4773a781d4f3ce3c5d5131 100644
Binary files a/build/classes/java/main/model/ExtinguishFire/FireFighter.class and b/build/classes/java/main/model/ExtinguishFire/FireFighter.class differ
diff --git a/build/classes/java/main/model/ExtinguishFire/MotorizedFireFighter.class b/build/classes/java/main/model/ExtinguishFire/MotorizedFireFighter.class
index 2584644314d21ef8df7dc763702d6084d8844c81..73dcd4f4c73d5965ca13a94c1c33641c645b64c9 100644
Binary files a/build/classes/java/main/model/ExtinguishFire/MotorizedFireFighter.class and b/build/classes/java/main/model/ExtinguishFire/MotorizedFireFighter.class differ
diff --git a/build/classes/java/main/model/GameBoard.class b/build/classes/java/main/model/GameBoard.class
index 6c8872b744c5e2a38f940a8d23806e30f1ac6e64..162baba038c7ed764297e1e083126849fc0c94a4 100644
Binary files a/build/classes/java/main/model/GameBoard.class and b/build/classes/java/main/model/GameBoard.class differ
diff --git a/build/classes/java/main/model/Obstacle/Mountain.class b/build/classes/java/main/model/Obstacle/Mountain.class
index 187c3cf23bc43eab3f4542f932b95e1291f70154..9d89533a3b088c27c70ebae6f63f2c2116accfe5 100644
Binary files a/build/classes/java/main/model/Obstacle/Mountain.class and b/build/classes/java/main/model/Obstacle/Mountain.class differ
diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin
index 37b3b8ba1f9900d28aabf3f9453e8536c2a212b8..c492006b2d0970468eb0f6acd127bd43204d83e7 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 241535ad21caa88d9dc9f06805b63b0593d3a18b..0ff42af2cb55da64fb072e87a0f0dce4aaab89be 100644
--- a/src/main/java/app/SimulatorApplication.java
+++ b/src/main/java/app/SimulatorApplication.java
@@ -17,11 +17,12 @@ public class SimulatorApplication extends javafx.application.Application {
   private static final int COLUMN_COUNT = 20;
   private static final int SQUARE_WIDTH = 30;
   private static final int SQUARE_HEIGHT = 30;
-  public static final int INITIAL_FIRE_COUNT = 5;
+  public static final int INITIAL_FIRE_COUNT = 8;
   public static final int INITIAL_FIREFIGHTER_COUNT = 3;
   public static final int INITIAL_CLOUD_COUNT = 15;
   public static final int INITIAL_MOTORIZEDFIREFIGHTER_COUNT = 2;
   public static final int INITIAL_MOUNTAIN_COUNT = 15;
+  public static final int INITIAL_ROAD_COUNT = 10;
 
   private Stage primaryStage;
   private Parent view;
@@ -47,7 +48,7 @@ public class SimulatorApplication extends javafx.application.Application {
     view = loader.load();
     Controller controller = loader.getController();
     controller.initialize(SQUARE_WIDTH, SQUARE_HEIGHT, COLUMN_COUNT, ROW_COUNT,
-            INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MOTORIZEDFIREFIGHTER_COUNT,INITIAL_MOUNTAIN_COUNT);
+            INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MOTORIZEDFIREFIGHTER_COUNT,INITIAL_MOUNTAIN_COUNT,INITIAL_ROAD_COUNT);
   }
 
   private void showScene() {
diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index b5f3cde65a57cbee5305ac5b521a9d103828d9a3..a5f13dee0791ec74705a2683e00fe5aac8573dad 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -24,7 +24,7 @@ import static java.util.Objects.requireNonNull;
 
 public class Controller {
 
-  public static final int PERIOD_IN_MILLISECONDS = 50;
+  public static final int PERIOD_IN_MILLISECONDS = 300;
   @FXML
   public Button restartButton;
   @FXML
@@ -111,10 +111,11 @@ public class Controller {
     repaintGrid();
   }
 
-  public void initialize(int squareWidth, int squareHeight, int columnCount,
-                         int rowCount, int initialFireCount, int initialFirefighterCount,int initialCloudCount,int initialMotorizedFireFighterCount,int initialMountainCount) {
+  public void initialize(int squareWidth, int squareHeight, int columnCount, int rowCount, int initialFireCount,
+                         int initialFirefighterCount,int initialCloudCount,
+                         int initialMotorizedFireFighterCount,int initialMountainCount,int initialRoadCount ) {
     grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
-    board = new GameBoard(rowCount,columnCount,initialFireCount,initialFirefighterCount,initialCloudCount,initialMotorizedFireFighterCount,initialMountainCount);
+    board = new GameBoard(rowCount,columnCount,initialFireCount,initialFirefighterCount,initialCloudCount,initialMotorizedFireFighterCount,initialMountainCount,initialRoadCount);
     board.initializeElements();
     repaintGrid();
   }
diff --git a/src/main/java/model/Builder/ConcreteGameBuilder.java b/src/main/java/model/Builder/ConcreteGameBuilder.java
index 0c367e38c7129e93b09c75108aa6571cc8c95a2b..627f03ffffc8a716a93e6e89e3f15e13226b31ca 100644
--- a/src/main/java/model/Builder/ConcreteGameBuilder.java
+++ b/src/main/java/model/Builder/ConcreteGameBuilder.java
@@ -36,9 +36,13 @@ public class ConcreteGameBuilder implements GameBuilder{
         this.mountains=mountains;
         return this;
     }
+    public GameBuilder setRoad(int roads) {
+        this.roads=roads;
+        return this;
+    }
 
     @Override
     public GameManage build() {
-        return new GameManage(fire,firefighter,clouds,motorizedFireFighters,roads,mountains);
+        return new GameManage(fire,firefighter,clouds,motorizedFireFighters,mountains,roads);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/model/Builder/FireFirefightersBuilder.java b/src/main/java/model/Builder/FireFirefightersBuilder.java
index 53d18f891302d3885f5d5f803128802596cc1d87..85b8f5e671de385a1bdcb7d3a8e1e7d8bc8c575a 100644
--- a/src/main/java/model/Builder/FireFirefightersBuilder.java
+++ b/src/main/java/model/Builder/FireFirefightersBuilder.java
@@ -1,7 +1,7 @@
 package model.Builder;
 
 public class FireFirefightersBuilder {
-    public void Build(int fires, int firefighters , int clouds , int motorizedFireFighters ,int mountains) {
+    public void Build(int fires, int firefighters , int clouds , int motorizedFireFighters ,int mountains,int roads) {
         ConcreteGameBuilder concreteGameBuilder;
         concreteGameBuilder =new ConcreteGameBuilder();
         concreteGameBuilder.setFire(fires)
@@ -9,6 +9,7 @@ public class FireFirefightersBuilder {
                 .setCloud(clouds)
                 .setMotorizedFireFighter(motorizedFireFighters)
                 .setMountain(mountains)
+                .setRoad(roads)
                 .build();
     }
 }
diff --git a/src/main/java/model/Builder/GameBuilder.java b/src/main/java/model/Builder/GameBuilder.java
index 603ed19ba8f6b57d6b97439f6f5fef42e56c9488..64cb6b6466a21f0d6642d69f81e3f2d226d669d0 100644
--- a/src/main/java/model/Builder/GameBuilder.java
+++ b/src/main/java/model/Builder/GameBuilder.java
@@ -7,6 +7,7 @@ public interface GameBuilder {
         model.Builder.GameBuilder setCloud(int cloud);
         model.Builder.GameBuilder setMotorizedFireFighter(int motorizedFireFighter);
         model.Builder.GameBuilder setMountain(int mountain);
+        model.Builder.GameBuilder setRoad(int mountain);
 
         // TODO: 15/11/2023 la suite
         GameManage build();
diff --git a/src/main/java/model/Builder/GameManage.java b/src/main/java/model/Builder/GameManage.java
index c544874832343d997be56627840b93ce4f6092b8..479b57403cb159964ebfde27f6f1396d0ea36add 100644
--- a/src/main/java/model/Builder/GameManage.java
+++ b/src/main/java/model/Builder/GameManage.java
@@ -6,6 +6,7 @@ import model.ExtinguishFire.FireFighter;
 import model.ExtinguishFire.MotorizedFireFighter;
 import model.Flammable.Fire;
 import model.Obstacle.Mountain;
+import model.Obstacle.Road;
 
 public class GameManage {
     private final int fires;
@@ -32,7 +33,7 @@ public class GameManage {
             new Fire(Color.RED);
         }
         for(int i=0;i<clouds;i++) {
-            new Cloud(Color.GRAY);
+            new Cloud(Color.DARKCYAN);
         }
         for(int i=0;i<motorizedFireFighters;i++) {
             new MotorizedFireFighter(Color.ORANGE);
@@ -43,6 +44,9 @@ public class GameManage {
         for(int i=0;i<firefighters;i++) {
             new FireFighter(Color.BLUE);
         }
+        for(int i=0;i<roads;i++) {
+            new Road(Color.GRAY);
+        }
     }
 
 }
diff --git a/src/main/java/model/ExtinguishFire/FireFighter.java b/src/main/java/model/ExtinguishFire/FireFighter.java
index ba929484c77375da5c2d33304c088ffaff7e0104..5d0a8b594ce63f4fa09b8d1b1620587f8184f541 100644
--- a/src/main/java/model/ExtinguishFire/FireFighter.java
+++ b/src/main/java/model/ExtinguishFire/FireFighter.java
@@ -14,7 +14,7 @@ import java.util.*;
 import static model.GameBoard.elementPosition;
 
 
-public class FireFighter implements ExtinguishFire {
+public class FireFighter extends FireFighters {
     private final Color color;
 
     public FireFighter(Color color) {
@@ -31,83 +31,35 @@ public class FireFighter implements ExtinguishFire {
         return visitor.visit(this);
     }
 
-    @Override
     public void initialize() {
-        Position position = GameBoard.randomPosition();
-        while(!canInitialise(position)){
-            position = GameBoard.randomPosition();
-        }
-        addElementToElementPosition(elementPosition,position);
+        super.initialize();
     }
-
-    private void addElementToElementPosition(HashMap<Position, ArrayList<BoardElement>> elementPosition, Position position) {
-        if (elementPosition.containsKey(position) ) {
-            elementPosition.get(position).add(this);
-
-        } else {
-            ArrayList<BoardElement> boardElements = new ArrayList<>();
-            boardElements.add(this);
-            elementPosition.put(position, boardElements);
-        }
-    }
-
-    private boolean canInitialise(Position position) {
-        if(elementPosition.containsKey(position)){
-            for (BoardElement element : GameBoard.elementPosition.get(position)) {
-                if (element.accept(new FireFinder()) || element.accept(new CrossMountain())) {
-                    return false;
-                }
-            }
-        }
-        return true;
+    public void moveAndExtinguish(HashMap<Position, ArrayList<BoardElement>> newElementPosition, Position newFirefighterPosition, ArrayList<Position> extinguishPosition, List<Position> firePositions, GameBoard gameBoard) {
+        addElementToElementPosition(newElementPosition, newFirefighterPosition);
+        extinguishPosition.add(newFirefighterPosition);
+        List<Position> neighborFirePositions = gameBoard.neighbors(newFirefighterPosition).stream()
+                .filter(firePositions()::contains).toList();
+        extinguishPosition.addAll(neighborFirePositions);
     }
 
     @Override
     public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
-        List<Position> firePositions = firePosition();
+        List<Position> firePositions = firePositions();
         Position newFirefighterPosition = gameBoard.neighborClosestToFire(position);
         extinguishPosition.add(position);
         if(canMove(newFirefighterPosition)){
             moveAndExtinguish(newElementPosition,newFirefighterPosition,extinguishPosition,firePositions,gameBoard);
         }else {
             List<Position> neighbors = gameBoard.neighbors(position);
-            for (Position positionNeighbour : neighbors) {
-                if(canMove(positionNeighbour)){
-                    moveAndExtinguish(newElementPosition,positionNeighbour,extinguishPosition,firePositions,gameBoard);
+            for (Position neighbourPosition : neighbors) {
+                if(canMove(neighbourPosition)){
+                    moveAndExtinguish(newElementPosition,neighbourPosition,extinguishPosition,firePositions,gameBoard);
                     return;
                 }
             }
-            moveAndExtinguish(newElementPosition,position,extinguishPosition,firePositions,gameBoard);
+          //  moveAndExtinguish(newElementPosition,position,extinguishPosition,firePositions,gameBoard);
         }
     }
-    private void moveAndExtinguish(HashMap<Position, ArrayList<BoardElement>> newElementPosition, Position newFirefighterPosition, ArrayList<Position> extinguishPosition, List<Position> firePositions, GameBoard gameBoard) {
-        addElementToElementPosition(newElementPosition,newFirefighterPosition);
-        extinguishPosition.add(newFirefighterPosition);
-        List<Position> neighborFirePositions = gameBoard.neighbors(newFirefighterPosition).stream()
-                .filter(firePositions::contains).toList();
-        extinguishPosition.addAll(neighborFirePositions);
-    }
-    private boolean canMove(Position newFirefighterPosition) {
-        if(elementPosition.containsKey(newFirefighterPosition)){
-            for (BoardElement boardElement : elementPosition.get(newFirefighterPosition)) {
-                if (boardElement.accept(new CrossMountain())) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
 
-    private List<Position> firePosition(){
-        List<Position> firePositions = new ArrayList<>();
-        for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
-            for (BoardElement element : entry.getValue()) {
-                if (element.accept(new FireFinder())) {
-                    firePositions.add(entry.getKey());
-                }
-            }
-        }
-        return firePositions;
-    }
 }
 
diff --git a/src/main/java/model/ExtinguishFire/FireFighters.java b/src/main/java/model/ExtinguishFire/FireFighters.java
new file mode 100644
index 0000000000000000000000000000000000000000..519a76c9284e542b945c3c12f2755c026d87af12
--- /dev/null
+++ b/src/main/java/model/ExtinguishFire/FireFighters.java
@@ -0,0 +1,80 @@
+package model.ExtinguishFire;
+
+import javafx.scene.paint.Color;
+import model.BoardElement;
+import model.GameBoard;
+import model.Visitor.CrossMountain;
+import model.Visitor.FireFinder;
+import model.Visitor.Visitor;
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static model.GameBoard.elementPosition;
+
+public abstract class FireFighters implements BoardElement {
+
+    public abstract Color getColor();
+
+    @Override
+    public abstract Boolean accept(Visitor visitor);
+
+    @Override
+    public void initialize() {
+        Position position = GameBoard.randomPosition();
+        while (!canInitialise(position)) {
+            position = GameBoard.randomPosition();
+        }
+        addElementToElementPosition(elementPosition, position);
+    }
+
+    public void addElementToElementPosition(HashMap<Position, ArrayList<BoardElement>> elementPosition, Position position) {
+        if (elementPosition.containsKey(position)) {
+            elementPosition.get(position).add(this);
+
+        } else {
+            ArrayList<BoardElement> boardElements = new ArrayList<>();
+            boardElements.add(this);
+            elementPosition.put(position, boardElements);
+        }
+    }
+
+    public boolean canInitialise(Position position) {
+        if (elementPosition.containsKey(position)) {
+            for (BoardElement element : GameBoard.elementPosition.get(position)) {
+                if (element.accept(new FireFinder()) || element.accept(new CrossMountain())) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    public boolean canMove(Position newFirefighterPosition) {
+        if (elementPosition.containsKey(newFirefighterPosition)) {
+            for (BoardElement boardElement : elementPosition.get(newFirefighterPosition)) {
+                if (boardElement.accept(new CrossMountain())) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    public List<Position> firePositions() {
+        List<Position> firePositions = new ArrayList<>();
+        for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
+            for (BoardElement element : entry.getValue()) {
+                if (element.accept(new FireFinder())) {
+                    firePositions.add(entry.getKey());
+                }
+            }
+        }
+        return firePositions;
+    }
+
+    public abstract void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition);
+}
\ No newline at end of file
diff --git a/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java b/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java
index 60b855dcfc447652a1083cf3156be0f3dc489017..a371a8ef090798e0f728e2aaf98678da0c08574a 100644
--- a/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java
+++ b/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java
@@ -3,26 +3,23 @@ package model.ExtinguishFire;
 import javafx.scene.paint.Color;
 import model.BoardElement;
 import model.GameBoard;
-import model.Visitor.CrossMountain;
-import model.Visitor.FireFinder;
 import model.Visitor.Visitor;
 import util.Position;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
-import static model.GameBoard.elementPosition;
 
-public class MotorizedFireFighter implements ExtinguishFire {
+public class MotorizedFireFighter extends FireFighters {
 
     private final Color color;
 
-    public MotorizedFireFighter(Color color){
-        this.color=color;
+    public MotorizedFireFighter(Color color) {
+        this.color = color;
         initialize();
     }
+
     @Override
     public Color getColor() {
         return color;
@@ -33,75 +30,45 @@ public class MotorizedFireFighter implements ExtinguishFire {
         return visitor.visit(this);
     }
 
-    @Override
     public void initialize() {
-        CrossMountain crossMountain=new CrossMountain();
-        boolean canInitialise;
-        Position position = GameBoard.randomPosition();
-        if(elementPosition.containsKey(position)) {
-            for (;;) {
-                canInitialise = true;
-                for (BoardElement element : elementPosition.get(position)) {
-                    if (element.accept(crossMountain)) {
-                        canInitialise = false;
-                        break;
-                    }
-                }
-                if (canInitialise) {
-                    break;
-                }
-                position = GameBoard.randomPosition();
-                if (!elementPosition.containsKey(position)) break;
-            }
-            if (elementPosition.containsKey(position))
-                elementPosition.get(position).add(this);
-            else {
-                ArrayList<BoardElement> boardElements = new ArrayList<>();
-                boardElements.add(this);
-                elementPosition.put(position, boardElements);
-            }
+        super.initialize();
+    }
 
+    public void moveAndExtinguish(HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> newMotorizedFireFighterPositions,
+                                  ArrayList<Position> extinguishPosition, List<Position> firePositions, GameBoard gameBoard) {
+        addElementToElementPosition(newElementPosition, newMotorizedFireFighterPositions.get(1));
+
+        for (Position newPosition : newMotorizedFireFighterPositions) {
+            extinguishPosition.add(newPosition);
+        }
+        List<Position> neighborFirePositions = new ArrayList<>();
+        neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPositions.get(0)).stream()
+                .filter(firePositions::contains).toList());
+        neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPositions.get(1)).stream()
+                .filter(firePositions::contains).toList());
+        for (Position firePosition : neighborFirePositions) {
+            extinguishPosition.add(firePosition);
         }
-        ArrayList<BoardElement> boardElements = new ArrayList<>();
-        boardElements.add(this);
-        elementPosition.put(position,boardElements);
     }
 
     @Override
     public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
 
-        List<Position> firePositions = new ArrayList<>();
-        for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
-            for (BoardElement element : entry.getValue()) {
-                if (element.accept(new FireFinder())) {
-                    firePositions.add(entry.getKey());
-                }
-            }
-        }
+        List<Position> firePositions = firePositions();
         ArrayList<Position> newMotorizedFireFighterPositions = new ArrayList<>();
         Position newMotorizedFireFighterPosition1 = gameBoard.neighborClosestToFire(position);
         newMotorizedFireFighterPositions.add(newMotorizedFireFighterPosition1);
         Position newMotorizedFireFighterPosition2 = gameBoard.neighborClosestToFire(newMotorizedFireFighterPosition1);
         newMotorizedFireFighterPositions.add(newMotorizedFireFighterPosition2);
-
-        if(newElementPosition.containsKey(newMotorizedFireFighterPosition2)){
-            newElementPosition.get(newMotorizedFireFighterPosition2).add(this);
-        }
-        else{
-            ArrayList<BoardElement> boardElements = new ArrayList<>();
-            boardElements.add(this);
-            newElementPosition.put(newMotorizedFireFighterPosition2,boardElements);
-        }
-        for(Position newPosition : newMotorizedFireFighterPositions) {
-            extinguishPosition.add(newPosition);
-        }
-        List<Position> neighborFirePositions = new ArrayList<>();
-        neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPosition1).stream()
-                .filter(firePositions::contains).toList());
-        neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPosition2).stream()
-                .filter(firePositions::contains).toList());
-        for(Position firePosition : neighborFirePositions) {
-            extinguishPosition.add(firePosition);
+        if (canMove(newMotorizedFireFighterPosition2)) {
+            moveAndExtinguish(newElementPosition, newMotorizedFireFighterPositions, extinguishPosition,firePositions, gameBoard);
+        } else {
+            List<Position> neighbors = gameBoard.neighbors(position);
+            for (Position neighbourPosition : neighbors) {
+                if (canMove(neighbourPosition)) {
+                    moveAndExtinguish(newElementPosition, newMotorizedFireFighterPositions, extinguishPosition, firePositions, gameBoard);
+                }
+            }
         }
     }
 }
diff --git a/src/main/java/model/GameBoard.java b/src/main/java/model/GameBoard.java
index 01565fa13b9758f0a38afa5602bc2600ea122c97..4cfd2b62e5d919e57d9f262d8b1897a5fa20a801 100644
--- a/src/main/java/model/GameBoard.java
+++ b/src/main/java/model/GameBoard.java
@@ -17,6 +17,7 @@ public class GameBoard implements Board{
     private int initialCloudCount;
     private int initialMotorizedFireFighterCount;
     private int initialMountainCount;
+    private int initialRoadCount;
 
     private int step = 0;
     static Random randomGenerator = new Random();
@@ -27,7 +28,8 @@ public class GameBoard implements Board{
     }
 
 
-    public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount,int initialCloudCount,int initialMotorizedFireFighterCount,int initialMountainCount) {
+    public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount,int initialCloudCount,
+                     int initialMotorizedFireFighterCount,int initialMountainCount,int initialRoadCount) {
         this.columnCount = columnCount;
         this.rowCount = rowCount;
         this.initialFireCount = initialFireCount;
@@ -35,11 +37,13 @@ public class GameBoard implements Board{
         this.initialCloudCount = initialCloudCount;
         this.initialMotorizedFireFighterCount=initialMotorizedFireFighterCount;
         this.initialMountainCount = initialMountainCount;
+        this.initialRoadCount = initialRoadCount;
     }
 
     public void initializeElements(){
         FireFirefightersBuilder fireFirefighterBuilder=new FireFirefightersBuilder();
-        fireFirefighterBuilder.Build(this.initialFireCount,this.initialFirefighterCount,this.initialCloudCount,this.initialMotorizedFireFighterCount,this.initialMountainCount);
+        fireFirefighterBuilder.Build(this.initialFireCount,this.initialFirefighterCount,
+                this.initialCloudCount,this.initialMotorizedFireFighterCount,this.initialMountainCount,this.initialRoadCount);
     }
 
     public static Position randomPosition() {
diff --git a/src/main/java/model/Obstacle/Mountain.java b/src/main/java/model/Obstacle/Mountain.java
index d53d4cef0837361c4797699622fdbe9ab5fe1fbc..643242cc2833def55bdbfa85f6d3e4d6de5b29c6 100644
--- a/src/main/java/model/Obstacle/Mountain.java
+++ b/src/main/java/model/Obstacle/Mountain.java
@@ -3,17 +3,15 @@ package model.Obstacle;
 import javafx.scene.paint.Color;
 import model.BoardElement;
 import model.GameBoard;
-import model.Visitor.FireFinder;
 import model.Visitor.Visitor;
 import util.Position;
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Map;
 
 import static model.GameBoard.elementPosition;
 
-public class Mountain implements Obstacles{
+public class Mountain extends Obstacles {
 
     private final Color color;
 
@@ -33,24 +31,11 @@ public class Mountain implements Obstacles{
 
     @Override
     public void initialize() {
-        Position position = GameBoard.randomPosition();
-        if (elementPosition.containsKey(position))
-            elementPosition.get(position).add(this);
-        else {
-            ArrayList<BoardElement> boardElements = new ArrayList<>();
-            boardElements.add(this);
-            elementPosition.put(position, boardElements);
-        }
+        super.initialize();
     }
 
     @Override
     public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
-        if(newElementPosition.containsKey(position))
-            newElementPosition.get(position).add(this);
-        else{
-            ArrayList<BoardElement> boardElements = new ArrayList<>();
-            boardElements.add(this);
-            newElementPosition.put(position,boardElements);
-        }
+        super.update(gameBoard,position,newElementPosition,extinguishPosition);
     }
 }
diff --git a/src/main/java/model/Obstacle/Obstacles.java b/src/main/java/model/Obstacle/Obstacles.java
index c913b4a72f4c407f06db71a4f1c70f5b9aa0bdf9..52c830f525c622b9994781e998a9f9945d0a95ca 100644
--- a/src/main/java/model/Obstacle/Obstacles.java
+++ b/src/main/java/model/Obstacle/Obstacles.java
@@ -1,15 +1,38 @@
 package model.Obstacle;
 
+import javafx.scene.paint.Color;
 import model.BoardElement;
 import model.GameBoard;
+import model.Visitor.Visitor;
 import util.Position;
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 
-public interface Obstacles extends BoardElement {
+import static model.GameBoard.elementPosition;
 
-    //void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition);
+public abstract class Obstacles implements BoardElement {
+    public abstract Color getColor();
+    public abstract  Boolean accept(Visitor visitor);
+    public void initialize(){
+        Position position = GameBoard.randomPosition();
+        if (elementPosition.containsKey(position))
+            elementPosition.get(position).add(this);
+        else {
+            ArrayList<BoardElement> boardElements = new ArrayList<>();
+            boardElements.add(this);
+            elementPosition.put(position, boardElements);
+        }
+    }
+    public void update(GameBoard gameBoard , Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition,
+                       ArrayList<Position> extinguishPosition){
+        if(newElementPosition.containsKey(position))
+            newElementPosition.get(position).add(this);
+        else{
+            ArrayList<BoardElement> boardElements = new ArrayList<>();
+            boardElements.add(this);
+            newElementPosition.put(position,boardElements);
+        }
+    }
 
 }
diff --git a/src/main/java/model/Obstacle/Road.java b/src/main/java/model/Obstacle/Road.java
index 70a0adb708ca4b522d16564840512561ccc1c34a..f4a15d5a94eeea524a5db428e0fa196fce3f06f8 100644
--- a/src/main/java/model/Obstacle/Road.java
+++ b/src/main/java/model/Obstacle/Road.java
@@ -1,4 +1,38 @@
 package model.Obstacle;
 
-public class Road {
+import javafx.scene.paint.Color;
+import model.BoardElement;
+import model.GameBoard;
+import model.Visitor.Visitor;
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class Road extends Obstacles {
+    private final Color color;
+
+    public Road(Color color){
+        this.color=color;
+        initialize();
+    }
+    @Override
+    public Color getColor() {
+        return color;
+    }
+
+    @Override
+    public Boolean accept(Visitor visitor) {
+        return visitor.visit(this);
+    }
+
+    @Override
+    public void initialize() {
+        super.initialize();
+    }
+
+    @Override
+    public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
+        super.update(gameBoard,position,newElementPosition,extinguishPosition);
+    }
 }