diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index bbd0ac35915d976a3cf79e3b8258858a91fe1220..260a1df48eae1a5eb6b71d1df5d95b561da5e66c 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -51,9 +51,9 @@ public class Controller {
     pauseToggleButton.setSelected(true);
   }
 
-  private void setModel(GameBoard gameBoard) {
+ /* private void setModel(GameBoard gameBoard) {
     this.board = requireNonNull(gameBoard, "GameBoard.model is null");
-  }
+  }*/
 
   private void updateBoard(){
     board.updateToNextGeneration();
@@ -109,9 +109,10 @@ public class Controller {
   }
 
   public void initialize(int squareWidth, int squareHeight, int columnCount,
-                                int rowCount, int initialFireCount, int initialFirefighterCount) {
+                         int rowCount, int initialFireCount, int initialFirefighterCount) {
     grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
-    this.setModel(new GameBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount));
+    board = new GameBoard(rowCount,columnCount,initialFireCount,initialFirefighterCount);
+    board.initializeElements();
     repaintGrid();
   }
 
diff --git a/src/main/java/model/Board.java b/src/main/java/model/Board.java
index 08848cccaecdaccabbe70db966a5534e8aac4964..469590ddfbca6597b878794b33c75ebfbae8b5c8 100644
--- a/src/main/java/model/Board.java
+++ b/src/main/java/model/Board.java
@@ -48,7 +48,7 @@ public interface Board<S> {
    *
    * @return A list of positions that have changed during the update.
    */
- void updateToNextGeneration();
+  void updateToNextGeneration();
 
   /**
    * Reset the board to its initial state.
diff --git a/src/main/java/model/Builder/ConcreteGameBuilder.java b/src/main/java/model/Builder/ConcreteGameBuilder.java
index 2a07975b0ef8747d4ada9e0d2524d2e375a65b5f..0c367e38c7129e93b09c75108aa6571cc8c95a2b 100644
--- a/src/main/java/model/Builder/ConcreteGameBuilder.java
+++ b/src/main/java/model/Builder/ConcreteGameBuilder.java
@@ -41,4 +41,4 @@ public class ConcreteGameBuilder implements GameBuilder{
     public GameManage build() {
         return new GameManage(fire,firefighter,clouds,motorizedFireFighters,roads,mountains);
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/model/Builder/FireFirefighterBuilder.java b/src/main/java/model/Builder/FireFirefighterBuilder.java
index 45e1167f6c97486125d90f6896ce65d735bb9397..5af512c580daf48dd3a43f94d3dd962127381e29 100644
--- a/src/main/java/model/Builder/FireFirefighterBuilder.java
+++ b/src/main/java/model/Builder/FireFirefighterBuilder.java
@@ -1,16 +1,11 @@
 package model.Builder;
 
-import model.GameBoard;
-
 public class FireFirefighterBuilder {
-
-
-
     public void Build(int fires, int firefighters) {
         ConcreteGameBuilder concreteGameBuilder;
         concreteGameBuilder =new ConcreteGameBuilder();
         concreteGameBuilder.setFire(fires)
-                            .setFireFighter(firefighters)
-                            .build();
+                .setFireFighter(firefighters)
+                .build();
     }
 }
diff --git a/src/main/java/model/Builder/GameBuilder.java b/src/main/java/model/Builder/GameBuilder.java
index 3898f3ccb6dbf5e018f063df2f48d413e5d652f8..603ed19ba8f6b57d6b97439f6f5fef42e56c9488 100644
--- a/src/main/java/model/Builder/GameBuilder.java
+++ b/src/main/java/model/Builder/GameBuilder.java
@@ -1,13 +1,14 @@
 package model.Builder;
 
- public interface GameBuilder {
-         GameBuilder setFire(int fire);
-         GameBuilder setFireFighter(int fireFighter);
-         GameBuilder setCloud(int cloud);
-         GameBuilder setMotorizedFireFighter(int motorizedFireFighter);
-         GameBuilder setMountain(int mountain);
-
-         // TODO: 15/11/2023 la suite
-         GameManage build();
+public interface GameBuilder {
+
+        model.Builder.GameBuilder setFire(int fire);
+        model.Builder.GameBuilder setFireFighter(int fireFighter);
+        model.Builder.GameBuilder setCloud(int cloud);
+        model.Builder.GameBuilder setMotorizedFireFighter(int motorizedFireFighter);
+        model.Builder.GameBuilder setMountain(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 12e699bf04e33fb756d0f880560a503842edd3d1..2a8c2d8759b48eb74e604c441d473ab4fe3e7b86 100644
--- a/src/main/java/model/Builder/GameManage.java
+++ b/src/main/java/model/Builder/GameManage.java
@@ -1,15 +1,8 @@
 package model.Builder;
 
 import javafx.scene.paint.Color;
-import model.BoardElement;
-import model.ExtinguishFire.Cloud;
 import model.ExtinguishFire.FireFighter;
 import model.Flammable.Fire;
-import model.GameBoard;
-import util.Position;
-
-import java.util.ArrayList;
-import java.util.HashMap;
 
 public class GameManage {
     private final int fires;
@@ -28,10 +21,10 @@ public class GameManage {
         this.motorizedFireFighters = motorizedFireFighters;
         this.roads = roads;
         this.mountains = mountains;
-         Initialise();
+        Initialize();
     }
 
-    public void Initialise(){
+    public void Initialize(){
         for(int i=0;i<fires;i++) {
             new Fire(Color.RED);
         }
@@ -45,3 +38,4 @@ public class GameManage {
     }
 
 }
+
diff --git a/src/main/java/model/ExtinguishFire/ExtinguishFire.java b/src/main/java/model/ExtinguishFire/ExtinguishFire.java
index d6f980821be13562578e43eefee5b210c7e78704..4e5e787dffbd8188a33ba9729a5aed8aa8aa4011 100644
--- a/src/main/java/model/ExtinguishFire/ExtinguishFire.java
+++ b/src/main/java/model/ExtinguishFire/ExtinguishFire.java
@@ -1,6 +1,7 @@
 package model.ExtinguishFire;
 
 import model.BoardElement;
+import model.GameBoard;
 import util.Position;
 
 import java.util.ArrayList;
@@ -9,7 +10,6 @@ import java.util.List;
 
 public interface ExtinguishFire extends BoardElement {
 
-
-    void update();
+    void update(GameBoard gameBoard , Position position);
 
 }
diff --git a/src/main/java/model/ExtinguishFire/FireFighter.java b/src/main/java/model/ExtinguishFire/FireFighter.java
index 5fa47da19c17b3e6237df5535c59c0551cda12b5..0d7aa63706ebff471c18b73527a9f708c2d18126 100644
--- a/src/main/java/model/ExtinguishFire/FireFighter.java
+++ b/src/main/java/model/ExtinguishFire/FireFighter.java
@@ -2,7 +2,6 @@ package model.ExtinguishFire;
 
 import javafx.scene.paint.Color;
 import model.BoardElement;
-import model.Flammable.Fire;
 import model.GameBoard;
 import model.Visitor.CrossMountain;
 import model.Visitor.FireFinder;
@@ -12,10 +11,11 @@ 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 FireFighter implements ExtinguishFire{
+public class FireFighter implements ExtinguishFire {
     Color color;
     public FireFighter(Color color){
         this.color=color;
@@ -35,38 +35,78 @@ public class FireFighter implements ExtinguishFire{
     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) {
+        Position position = GameBoard.randomPosition();
+        if(elementPosition.containsKey(position)) {
+            for (; ; ) {
+                canInitialise = true;
+                for (BoardElement element : elementPosition.get(position)) {
+                    if (element.accept(crossMountain)) {
+                        canInitialise = false;
                         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);
+                if (canInitialise) {
+                    break;
                 }
-
+                position = GameBoard.randomPosition();
+                if (!elementPosition.containsKey(position)) break;
             }
-            ArrayList<BoardElement> boardElements = new ArrayList<>();
-            boardElements.add(this);
-            elementPosition.put(position,boardElements);
+            if (elementPosition.containsKey(position))
+                elementPosition.get(position).add(this);
+            else {
+                ArrayList<BoardElement> boardElements = new ArrayList<>();
+                boardElements.add(this);
+                elementPosition.put(position, boardElements);
+            }
+
+        }
+        ArrayList<BoardElement> boardElements = new ArrayList<>();
+        boardElements.add(this);
+        elementPosition.put(position,boardElements);
     }
 
     @Override
-    public void update() {
+    public void update(GameBoard gameBoard, Position position) {
 
-    }
+            HashMap<Position, ArrayList<BoardElement>> elementPositionCopie = new HashMap<>();
+            for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()){
+                elementPositionCopie.put(entry.getKey(),entry.getValue());
+            }
+            List<Position> firePositions = new ArrayList<>();
+            for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPositionCopie.entrySet()) {
+                for (BoardElement element : entry.getValue()) {
+                    if (element.accept(new FireFinder())) {
+                     firePositions.add(entry.getKey());
+                    }
+                }
+            }
+            Position newFirefighterPosition = gameBoard.neighborClosestToFire(position);
+            if(elementPositionCopie.containsKey(newFirefighterPosition)){
+                elementPositionCopie.get(newFirefighterPosition).add(new FireFighter(Color.BLUE));
+            }
+            else{
+                ArrayList<BoardElement> boardElements = new ArrayList<>();
+                boardElements.add(new FireFighter(Color.BLUE));
+                elementPosition.put(newFirefighterPosition,boardElements);
+            }
+            gameBoard.extinguish(newFirefighterPosition);
+            List<Position> neighborFirePositions = gameBoard.neighbors(newFirefighterPosition).stream()
+                    .filter(firePositions::contains).toList();
+            for(Position newposition : neighborFirePositions){
+                if(elementPositionCopie.containsKey(newposition)){
+                    elementPosition.get(newposition).add(new FireFighter(Color.BLUE));
+                }
+                else{
+                    ArrayList<BoardElement> boardElements = new ArrayList<>();
+                    boardElements.add(new FireFighter(Color.BLUE));
+                    elementPosition.put(newposition,boardElements);
+                }
+            }
+
+            for(Position firePosition : neighborFirePositions) {
+                gameBoard.extinguish(firePosition);
+            }
+
+        }
 }
+
diff --git a/src/main/java/model/Flammable/Fire.java b/src/main/java/model/Flammable/Fire.java
index aa9641ce07b735da8c7895da9bf1590395e9c242..e3bee196be794157e60e9a463f70cda724448502 100644
--- a/src/main/java/model/Flammable/Fire.java
+++ b/src/main/java/model/Flammable/Fire.java
@@ -35,32 +35,32 @@ public class Fire implements Flammable{
         FireFinder fireFinder=new FireFinder();
         Position position = GameBoard.randomPosition();
         boolean canInitialise;
-            if(GameBoard.elementPosition.containsKey(position)) {
-                 for (;;) {
-                    canInitialise=true;
-                    for (BoardElement element : GameBoard.elementPosition.get(position)) {
-                        if (element.accept(fireFinder)) {
-                            canInitialise=false;
-                            break;
-                        }
-                    }
-                    if(canInitialise){
+        if(GameBoard.elementPosition.containsKey(position)) {
+            for (;;) {
+                canInitialise=true;
+                for (BoardElement element : GameBoard.elementPosition.get(position)) {
+                    if (element.accept(fireFinder)) {
+                        canInitialise=false;
                         break;
                     }
-                 position = GameBoard.randomPosition();
-                    if(!GameBoard.elementPosition.containsKey(position))break;
-                 }
-                 if(GameBoard.elementPosition.containsKey(position))
-                      GameBoard.elementPosition.get(position).add(this);
-                 else{
-                     ArrayList<BoardElement> boardElements = new ArrayList<>();
-                     boardElements.add(this);
-                     GameBoard.elementPosition.put(position,boardElements);
-                 }
+                }
+                if(canInitialise){
+                    break;
+                }
+                position = GameBoard.randomPosition();
+                if(!GameBoard.elementPosition.containsKey(position))break;
             }
-            ArrayList<BoardElement> boardElements = new ArrayList<>();
-            boardElements.add(this);
-            GameBoard.elementPosition.put(position,boardElements);
+            if(GameBoard.elementPosition.containsKey(position))
+                GameBoard.elementPosition.get(position).add(this);
+            else{
+                ArrayList<BoardElement> boardElements = new ArrayList<>();
+                boardElements.add(this);
+                GameBoard.elementPosition.put(position,boardElements);
+            }
+        }
+        ArrayList<BoardElement> boardElements = new ArrayList<>();
+        boardElements.add(this);
+        GameBoard.elementPosition.put(position,boardElements);
     }
 
     @Override   // TODO: 15/11/2023
@@ -69,27 +69,30 @@ public class Fire implements Flammable{
         if (gameBoard.stepNumber() % 2 == 0) {
             List<Position> newFirePositions = new ArrayList<>();
             newFirePositions.addAll(gameBoard.neighbors(position));
-        for(Position newPosition : newFirePositions){
-            if(GameBoard.elementPosition.containsKey(newPosition)) {
-                for(BoardElement boardElement : GameBoard.elementPosition.get(newPosition)){
-                    if(boardElement.accept(new FireFinder()) && boardElement.accept(new CrossRoad()) && boardElement.accept(new CrossMountain())){
-                        break;
-                    }
-                    else if(!boardElement.accept( new FireFinder())&& !boardElement.accept(new CrossRoad()) && !boardElement.accept(new CrossMountain())){
-                        GameBoard.elementPosition.get(newPosition).add(this);
+            for(Position newPosition : newFirePositions){
+                if(GameBoard.elementPosition.containsKey(newPosition)) {
+                    for(BoardElement boardElement : GameBoard.elementPosition.get(newPosition)){
+                        if(boardElement.accept(new FireFinder()) && boardElement.accept(new CrossRoad()) && boardElement.accept(new CrossMountain())){
+                            break;
+                        }
+                        else if(!boardElement.accept( new FireFinder())&& !boardElement.accept(new CrossRoad()) && !boardElement.accept(new CrossMountain())){
+                            GameBoard.elementPosition.get(newPosition).add(this);
+                        }
                     }
+
+                }
+                else{
+                    ArrayList<BoardElement> boardElements = new ArrayList<>();
+                    boardElements.add(this);
+                    GameBoard.elementPosition.put(newPosition,boardElements);
+                    System.out.println(GameBoard.elementPosition.get(position).get(0).getColor());
                 }
 
             }
-            else{
-                ArrayList<BoardElement> boardElements = new ArrayList<>();
-                boardElements.add(this);
-                GameBoard.elementPosition.put(newPosition,boardElements);
-                System.out.println(GameBoard.elementPosition.get(position).get(0).getColor());
-            }
-
-        }
         }
 
     }
 }
+
+
+
diff --git a/src/main/java/model/Flammable/Flammable.java b/src/main/java/model/Flammable/Flammable.java
index 744b2dc702817ac5390573eaaa5bd5e45f63e3ae..b21f82b9a9ddc487a95a82902a89d4631ae608ce 100644
--- a/src/main/java/model/Flammable/Flammable.java
+++ b/src/main/java/model/Flammable/Flammable.java
@@ -10,7 +10,5 @@ import java.util.List;
 
 public interface Flammable extends BoardElement{
 
-    void initialize();
-
     void update(GameBoard gameBoard, Position position);
 }
diff --git a/src/main/java/model/GameBoard.java b/src/main/java/model/GameBoard.java
index ad5f6672f177344d6be6cb43fdd7eccd5fcc8dc2..216b267c9659dee78e790d0bb092e3ea284f2546 100644
--- a/src/main/java/model/GameBoard.java
+++ b/src/main/java/model/GameBoard.java
@@ -1,10 +1,8 @@
 package model;
 
-import javafx.scene.paint.Color;
 import model.Builder.FireFirefighterBuilder;
 import model.Builder.GameManage;
-import model.ExtinguishFire.FireFighter;
-import model.Flammable.Fire;
+import model.ExtinguishFire.ExtinguishFire;
 import model.Flammable.Flammable;
 import model.Visitor.FireFinder;
 import util.Position;
@@ -14,11 +12,12 @@ import java.util.*;
 public class GameBoard implements Board{
     static  int columnCount;
     static  int rowCount;
-
+    private int initialFireCount;
+    private int initialFirefighterCount;
     private int step = 0;
     static Random randomGenerator = new Random();
 
-     public HashMap<Position, ArrayList<BoardElement>> getElementPosition() {
+    public HashMap<Position, ArrayList<BoardElement>> getElementPosition() {
         return elementPosition;
     }
 
@@ -27,8 +26,13 @@ public class GameBoard implements Board{
     public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount) {
         this.columnCount = columnCount;
         this.rowCount = rowCount;
+        this.initialFireCount = initialFireCount;
+        this.initialFirefighterCount = initialFirefighterCount;
+    }
+
+    public void initializeElements(){
         FireFirefighterBuilder fireFirefighterBuilder=new FireFirefighterBuilder();
-        fireFirefighterBuilder.Build(initialFireCount,initialFirefighterCount);
+        fireFirefighterBuilder.Build(this.initialFireCount,this.initialFirefighterCount);
     }
 
     public static Position randomPosition() {
@@ -37,18 +41,27 @@ public class GameBoard implements Board{
     @Override
     public void updateToNextGeneration() {
         HashMap<Position, ArrayList<BoardElement>> elementPositionCopie = new HashMap<>();
-        for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()){
+        for (Map.Entry<Position, ArrayList<BoardElement>> entry : this.elementPosition.entrySet()){
             elementPositionCopie.put(entry.getKey(),entry.getValue());
         }
         for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPositionCopie.entrySet()){
             for(BoardElement element : entry.getValue()){
 
-                if (element.accept(new FireFinder())){
-                    Flammable element1 = (Flammable) element;
+                if (!element.accept(new FireFinder())){
+                    ExtinguishFire element1 = (ExtinguishFire) element;
                     element1.update(this,entry.getKey());
                 }
             }
         }
+        /*for (Map.Entry<Position, ArrayList<BoardElement>> entryCopie : elementPositionCopie.entrySet()){
+            for(BoardElement element : entryCopie.getValue()){
+
+                if (element.accept(new FireFinder())){
+                    Flammable element1 = (Flammable) element;
+                    element1.update(this,entryCopie.getKey());
+                }
+            }
+        }*/
 
         step++;
 
@@ -79,7 +92,9 @@ public class GameBoard implements Board{
 
     @Override
     public void reset() {
-
+        step = 0;
+        elementPosition.clear();
+        initializeElements();
     }
 
     @Override
@@ -96,5 +111,43 @@ public class GameBoard implements Board{
         return list;
     }
 
+    public  Position neighborClosestToFire(Position position) {
+        FireFinder fireFinder = new FireFinder();
+        Set<Position> firePositions = new HashSet<>();
+        Set<Position> seen = new HashSet<>();
+        HashMap<Position, Position> firstMove = new HashMap<>();
+        Queue<Position> toVisit = new LinkedList<>(neighbors(position));
+        for (Map.Entry<Position, ArrayList<BoardElement>> entry : this.elementPosition.entrySet()){
+            for(BoardElement element : entry.getValue()){
+                if (element.accept(fireFinder)){
+                    firePositions.add(entry.getKey());
+                }
+            }
+        }
+        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 void extinguish(Position position) {
+        FireFinder fireFinder = new FireFinder();
+        for (BoardElement boardElement : elementPosition.get(position)){
+                if (boardElement.accept(fireFinder)){
+                    this.elementPosition.get(position).remove(boardElement);
+                    break;
+                }
+            }
+        }
+    }
 
-}
diff --git a/src/main/java/model/Visitor/FireFighterFinder.java b/src/main/java/model/Visitor/FireFighterFinder.java
deleted file mode 100644
index ebef4b2b5ff00091c1ad5d615cf9adad36308131..0000000000000000000000000000000000000000
--- a/src/main/java/model/Visitor/FireFighterFinder.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package model.Visitor;
-
-import model.ExtinguishFire.FireFighter;
-import model.ExtinguishFire.MotorizedFireFighter;
-import model.Flammable.Fire;
-import model.Obstacle.Mountain;
-import model.Obstacle.Road;
-
-public class FireFighterFinder implements Visitor{
-
-    public boolean visit(Fire fire) {
-        return false;
-    }
-
-    @Override
-    public boolean visit(FireFighter fireFighter) {
-        return true;
-    }
-
-    @Override
-    public boolean visit(MotorizedFireFighter motorizedFireFighter) {
-        return false;
-    }
-
-    @Override
-    public boolean visit(Mountain mountain) {
-        return false;
-    }
-
-    @Override
-    public boolean visit(Road road) {
-        return false;
-    }
-}