diff --git a/.gradle/8.10.2/executionHistory/executionHistory.bin b/.gradle/8.10.2/executionHistory/executionHistory.bin
index 79538d319d9238bcf52c8976097423428788122c..98ecd17592fd3aea79dac8e7c51ce70587ca4063 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 8aca32139fab07c3188cba31af7facedf5b5849d..52c071fa673591c7f2f70311c123de4770de3fe3 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 b21a4f094a5d0c34b3ee39874fe98d06d77360e4..4f24b129676b1fd085520e112d41d12ace6d74a1 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 e49212765c741797bec045b9467eb5e66ac21562..d5daea42486733d983bfb0d4c13ff94e293d5b04 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 2785b9fa215e02182ebda8c085cf521cbb97a02c..a04a18530400cb9aff321ea672c2050665862ff2 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 267adf260927eb5a89b797caca8536fd39ec8438..0652d045544b5231cee8310fa15244604bef24ff 100644
Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin
index be48dec68ce6a0b4624ff38030c3bf9b96631353..5255978d1ddb4dd589fea8326d1aeb547bbb620c 100644
Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and b/.gradle/buildOutputCleanup/outputFiles.bin differ
diff --git a/Project Repports/Rapport2.md b/Project Repports/Rapport2.md
index 3c21066162111c2b72214f9e6bbd028f2612be15..c38b2351e4d6e320f412112c45d7519806ff9331 100644
--- a/Project Repports/Rapport2.md	
+++ b/Project Repports/Rapport2.md	
@@ -1,6 +1,6 @@
 Dans ce TP nous avons ajouter deux classes SimpleFireFighterStrategy
 et SimpleFireSpreadStrategy qui implementent leurs Strategy respectivent
-De plus on a essayer de faire le FirefighterBoard qui soit compatible avec Controller 
-on a ajouter de plus des getters dans util.Position
+De plus nous avons essayé de faire le FirefighterBoard qui soit compatible avec Controller 
+nous avons ajouté de plus des getters dans util.Position
 
-on va finir le FirefighterBoard plus tard ainsi que implementer util.TargetStrategy dans notre code 
\ No newline at end of file
+on va finir le FirefighterBoard la semaine prochaine ainsi que implementer util.TargetStrategy dans notre code 
\ No newline at end of file
diff --git a/Project Repports/Rapport3.md b/Project Repports/Rapport3.md
index 82d410533f742a16b276ce5a38d2d202f046bfcc..b46572a04ab0fad5df0b4710f24bf32c9f80ae78 100644
--- a/Project Repports/Rapport3.md	
+++ b/Project Repports/Rapport3.md	
@@ -5,4 +5,9 @@ Nous avons Modifier les classes Manager afin de fixer les erreurs qui parvenait
 cependant il faudrait ajuster encore le code comme les firefighters sont entrain de mourir ce qui ne dervrais
 pas ce passer.
 
-Avant la prochaine seance nous allons corriger le code en sorte que ça fonctionne correctement
\ No newline at end of file
+Avant la prochaine seance nous allons corriger le code en sorte que ça fonctionne correctement
+
+refactorisation totale du code
+j'ai enlever les classes Manager et je les ai implementer dans les startegy de plus 
+j'ai ajouter une interface globale nomme Strategy et une classe Initializer 
+afin de reduire le code dans les autre classe et faciliter l'implementation de codes additionelle
\ No newline at end of file
diff --git a/build/classes/java/main/app/SimulatorApplication.class b/build/classes/java/main/app/SimulatorApplication.class
index 2a7034e60e98733448c64912ad888c8535e59f92..3e04e3ad61ce4bc7716996607d7ef0c8de245fe9 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/app/SimulatorMain.class b/build/classes/java/main/app/SimulatorMain.class
index b426382855daa4f8e3ff421f7108c0b298a18d65..1d13229f73ef27c233a432bc89aa3dffc086246a 100644
Binary files a/build/classes/java/main/app/SimulatorMain.class and b/build/classes/java/main/app/SimulatorMain.class differ
diff --git a/build/classes/java/main/controller/Controller.class b/build/classes/java/main/controller/Controller.class
index cd5dac2be62f3cc20cf25951d0f3b58492fe8d4d..1de3f5cc54f95ac002b8a057f15747eec7898cae 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/controller/PersistentToggleGroup.class b/build/classes/java/main/controller/PersistentToggleGroup.class
index c0ccdd01abe3a42a581528ab9898584f819a2f12..314954a9fd4ab6d48da5fec7067063879e670d62 100644
Binary files a/build/classes/java/main/controller/PersistentToggleGroup.class and b/build/classes/java/main/controller/PersistentToggleGroup.class differ
diff --git a/build/classes/java/main/model/Board.class b/build/classes/java/main/model/Board.class
index 9384d2b533b1eef09f28e2e08c82c467056e8b53..a1f8169e45fef3872ae559ad22bdf5a3d6f63dfd 100644
Binary files a/build/classes/java/main/model/Board.class and b/build/classes/java/main/model/Board.class differ
diff --git a/build/classes/java/main/model/BoardManager.class b/build/classes/java/main/model/BoardManager.class
index c6cd4e9969ad9dfdef36e743246b8d2b432ddb40..401577047c6f4921c89315d5025414dabc2b9114 100644
Binary files a/build/classes/java/main/model/BoardManager.class and b/build/classes/java/main/model/BoardManager.class differ
diff --git a/build/classes/java/main/model/FirefighterBoard$1.class b/build/classes/java/main/model/FirefighterBoard$1.class
index 9556c3c89b29049c6c15d9e1316c32eaa5ab53e9..36139e86884c256a348af7e1b2a13b5fa944c975 100644
Binary files a/build/classes/java/main/model/FirefighterBoard$1.class and b/build/classes/java/main/model/FirefighterBoard$1.class differ
diff --git a/build/classes/java/main/model/FirefighterBoard.class b/build/classes/java/main/model/FirefighterBoard.class
index 55b8549995d4bb14aea6c1262105c7c369d6d6f7..8cf7ed6fc58761fc264227b5206c3422d3e2f0e1 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/classes/java/main/model/FirefighterMovementStrategy.class b/build/classes/java/main/model/FirefighterMovementStrategy.class
index a7e82814dcd7764b818f928aa222c4e050206b5e..1b4076d6366e98f96534d1d1bfde9412e1c1bb62 100644
Binary files a/build/classes/java/main/model/FirefighterMovementStrategy.class and b/build/classes/java/main/model/FirefighterMovementStrategy.class differ
diff --git a/build/classes/java/main/model/ModelElement.class b/build/classes/java/main/model/ModelElement.class
index f25365988f7be31d5fcd37b91a7ff522e7ea62b4..ab695532d616c8cf4fa9ac577236893340a8bc44 100644
Binary files a/build/classes/java/main/model/ModelElement.class and b/build/classes/java/main/model/ModelElement.class differ
diff --git a/build/classes/java/main/model/NeighborManager.class b/build/classes/java/main/model/NeighborManager.class
index 01b224f71ad1973c7de3635541412b2c3cbed94d..7133104bbb463fd3f508b73accc7f98276064e7d 100644
Binary files a/build/classes/java/main/model/NeighborManager.class and b/build/classes/java/main/model/NeighborManager.class differ
diff --git a/build/classes/java/main/model/SimpleFireSpreadStrategy.class b/build/classes/java/main/model/SimpleFireSpreadStrategy.class
index 4872840e6f583d9a7d6e2edaa32a72ecbfc3cd69..595ad5f73d206af2527a6fdd05093fffdca17a2e 100644
Binary files a/build/classes/java/main/model/SimpleFireSpreadStrategy.class and b/build/classes/java/main/model/SimpleFireSpreadStrategy.class differ
diff --git a/build/classes/java/main/module-info.class b/build/classes/java/main/module-info.class
index 2d36f31e00263254200792535cef161d3614a592..88bc26991b02427659843d54b36d2169ec1b6e75 100644
Binary files a/build/classes/java/main/module-info.class and b/build/classes/java/main/module-info.class differ
diff --git a/build/classes/java/main/util/Position.class b/build/classes/java/main/util/Position.class
index d12c7d257b24eef49df64717f88005a92a0e4940..7dbbd0104ae6dc1c44c869a30946c4ca30af8edf 100644
Binary files a/build/classes/java/main/util/Position.class and b/build/classes/java/main/util/Position.class differ
diff --git a/build/classes/java/main/util/TargetStrategy.class b/build/classes/java/main/util/TargetStrategy.class
index 04599712d1092272285862026cf36df6c3b3c46e..29d1e02d75754f3461b19603c654e7b3c458f1cb 100644
Binary files a/build/classes/java/main/util/TargetStrategy.class and b/build/classes/java/main/util/TargetStrategy.class differ
diff --git a/build/classes/java/main/view/FirefighterGrid.class b/build/classes/java/main/view/FirefighterGrid.class
index 78c07d311e5bfb93b53917515264d697a601d8b8..18e46ef5be06988a93fa104fac2993de3f3c5349 100644
Binary files a/build/classes/java/main/view/FirefighterGrid.class and b/build/classes/java/main/view/FirefighterGrid.class differ
diff --git a/build/classes/java/main/view/Grid.class b/build/classes/java/main/view/Grid.class
index ddb93c29851f2511e39a03e77db1a6ef7b1e41ae..c4fa5e96b46909e2a89e512f2ad9c2d4d042260c 100644
Binary files a/build/classes/java/main/view/Grid.class and b/build/classes/java/main/view/Grid.class differ
diff --git a/build/classes/java/main/view/ViewElement.class b/build/classes/java/main/view/ViewElement.class
index 6e0cdce8e71535b4532cc24280dfccfee469a210..6e0ba4cb9d010f7ec89661d33c7f27a0eeba7153 100644
Binary files a/build/classes/java/main/view/ViewElement.class and b/build/classes/java/main/view/ViewElement.class differ
diff --git a/build/classes/java/test/model/FirefighterBoardTest.class b/build/classes/java/test/model/FirefighterBoardTest.class
new file mode 100644
index 0000000000000000000000000000000000000000..a0d71f0e7a0e444e0331454984cd677da7957fb9
Binary files /dev/null and b/build/classes/java/test/model/FirefighterBoardTest.class differ
diff --git a/build/distributions/firefighter-shadow.tar b/build/distributions/firefighter-shadow.tar
new file mode 100644
index 0000000000000000000000000000000000000000..a5c7784ec2465e0063d63410fe13538dd65eda6e
Binary files /dev/null and b/build/distributions/firefighter-shadow.tar differ
diff --git a/build/distributions/firefighter-shadow.zip b/build/distributions/firefighter-shadow.zip
new file mode 100644
index 0000000000000000000000000000000000000000..0c1caf97cb1e82cb07f2de702cb277531e05b4b1
Binary files /dev/null and b/build/distributions/firefighter-shadow.zip differ
diff --git a/build/distributions/firefighter.tar b/build/distributions/firefighter.tar
new file mode 100644
index 0000000000000000000000000000000000000000..cb82184ff5ea66324b8a972a3b10b5e605e3e053
Binary files /dev/null and b/build/distributions/firefighter.tar differ
diff --git a/build/distributions/firefighter.zip b/build/distributions/firefighter.zip
new file mode 100644
index 0000000000000000000000000000000000000000..0884f890ea02c128b9a67be3865e20efba7031af
Binary files /dev/null and b/build/distributions/firefighter.zip differ
diff --git a/build/install/firefighter-shadow/bin/firefighter b/build/install/firefighter-shadow/bin/firefighter
new file mode 100755
index 0000000000000000000000000000000000000000..ecdb49f7161492f27d686545536b691fbc98cf31
--- /dev/null
+++ b/build/install/firefighter-shadow/bin/firefighter
@@ -0,0 +1,183 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+##  firefighter start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/.." >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="firefighter"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and FIREFIGHTER_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/lib/firefighter-all.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=`expr $i + 1`
+    done
+    case $i in
+        0) set -- ;;
+        1) set -- "$args0" ;;
+        2) set -- "$args0" "$args1" ;;
+        3) set -- "$args0" "$args1" "$args2" ;;
+        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $FIREFIGHTER_OPTS -jar "\"$CLASSPATH\"" "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
\ No newline at end of file
diff --git a/build/install/firefighter-shadow/bin/firefighter.bat b/build/install/firefighter-shadow/bin/firefighter.bat
new file mode 100755
index 0000000000000000000000000000000000000000..9e2b7852d7d9a99ebb07330343dc8410bff878dd
--- /dev/null
+++ b/build/install/firefighter-shadow/bin/firefighter.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  firefighter startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%..
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and FIREFIGHTER_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\lib\firefighter-all.jar
+
+@rem Execute firefighter
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %FIREFIGHTER_OPTS%  -jar "%CLASSPATH%" %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable FIREFIGHTER_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%FIREFIGHTER_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
\ No newline at end of file
diff --git a/build/install/firefighter-shadow/lib/firefighter-all.jar b/build/install/firefighter-shadow/lib/firefighter-all.jar
new file mode 100644
index 0000000000000000000000000000000000000000..d89d277896c186f81bdedda0944269a911b13256
Binary files /dev/null and b/build/install/firefighter-shadow/lib/firefighter-all.jar differ
diff --git a/build/libs/firefighter-all.jar b/build/libs/firefighter-all.jar
new file mode 100644
index 0000000000000000000000000000000000000000..4d96d916601c71cff5491caa76660f7f282a2ed4
Binary files /dev/null and b/build/libs/firefighter-all.jar differ
diff --git a/build/libs/firefighter.jar b/build/libs/firefighter.jar
new file mode 100644
index 0000000000000000000000000000000000000000..d8dab65624dde65d70f5b73fdf1561585519888a
Binary files /dev/null and b/build/libs/firefighter.jar differ
diff --git a/build/scripts/firefighter b/build/scripts/firefighter
new file mode 100755
index 0000000000000000000000000000000000000000..f14c33053ef5daa948cb848df0d5f2d8fe4204a1
--- /dev/null
+++ b/build/scripts/firefighter
@@ -0,0 +1,251 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+##############################################################################
+#
+#   firefighter start up script for POSIX generated by Gradle.
+#
+#   Important for running:
+#
+#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+#       noncompliant, but you have some other compliant shell such as ksh or
+#       bash, then to run this script, type that shell name before the whole
+#       command line, like:
+#
+#           ksh firefighter
+#
+#       Busybox and similar reduced shells will NOT work, because this script
+#       requires all of these POSIX shell features:
+#         * functions;
+#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+#         * compound commands having a testable exit status, especially «case»;
+#         * various built-in commands including «command», «set», and «ulimit».
+#
+#   Important for patching:
+#
+#   (2) This script targets any POSIX shell, so it avoids extensions provided
+#       by Bash, Ksh, etc; in particular arrays are avoided.
+#
+#       The "traditional" practice of packing multiple parameters into a
+#       space-separated string is a well documented source of bugs and security
+#       problems, so this is (mostly) avoided, by progressively accumulating
+#       options in "$@", and eventually passing that to Java.
+#
+#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+#       and FIREFIGHTER_OPTS) rely on word-splitting, this is performed explicitly;
+#       see the in-line comments for details.
+#
+#       There are tweaks for specific operating systems such as AIX, CygWin,
+#       Darwin, MinGW, and NonStop.
+#
+#   (3) This script is generated from the Groovy template
+#       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+#       within the Gradle project.
+#
+#       You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
+    [ -h "$app_path" ]
+do
+    ls=$( ls -ld "$app_path" )
+    link=${ls#*' -> '}
+    case $link in             #(
+      /*)   app_path=$link ;; #(
+      *)    app_path=$APP_HOME$link ;;
+    esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}.." > /dev/null && printf '%s
+' "$PWD" ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+    echo "$*"
+} >&2
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in                #(
+  CYGWIN* )         cygwin=true  ;; #(
+  Darwin* )         darwin=true  ;; #(
+  MSYS* | MINGW* )  msys=true    ;; #(
+  NONSTOP* )        nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/lib/firefighter.jar:$APP_HOME/lib/javafx-fxml-21-linux.jar:$APP_HOME/lib/javafx-controls-21-linux.jar:$APP_HOME/lib/javafx-graphics-21-linux.jar:$APP_HOME/lib/javafx-base-21-linux.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD=$JAVA_HOME/jre/sh/java
+    else
+        JAVACMD=$JAVA_HOME/bin/java
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD=java
+    if ! command -v java >/dev/null 2>&1
+    then
+        die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+    case $MAX_FD in #(
+      max*)
+        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+        # shellcheck disable=SC2039,SC3045
+        MAX_FD=$( ulimit -H -n ) ||
+            warn "Could not query maximum file descriptor limit"
+    esac
+    case $MAX_FD in  #(
+      '' | soft) :;; #(
+      *)
+        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+        # shellcheck disable=SC2039,SC3045
+        ulimit -n "$MAX_FD" ||
+            warn "Could not set maximum file descriptor limit to $MAX_FD"
+    esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+#   * args from the command line
+#   * the main class name
+#   * -classpath
+#   * -D...appname settings
+#   * --module-path (only if needed)
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and FIREFIGHTER_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+    JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    for arg do
+        if
+            case $arg in                                #(
+              -*)   false ;;                            # don't mess with options #(
+              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
+                    [ -e "$t" ] ;;                      #(
+              *)    false ;;
+            esac
+        then
+            arg=$( cygpath --path --ignore --mixed "$arg" )
+        fi
+        # Roll the args list around exactly as many times as the number of
+        # args, so each arg winds up back in the position where it started, but
+        # possibly modified.
+        #
+        # NB: a `for` loop captures its iteration list before it begins, so
+        # changing the positional parameters here affects neither the number of
+        # iterations, nor the values presented in `arg`.
+        shift                   # remove old arg
+        set -- "$@" "$arg"      # push replacement arg
+    done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and FIREFIGHTER_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Collect all arguments for the java command:
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+#     and any embedded shellness will be escaped.
+#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+#     treated as '${Hostname}' itself on the command line.
+
+set -- \
+        -classpath "$CLASSPATH" \
+        app.SimulatorMain \
+        "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+    die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+#   set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $FIREFIGHTER_OPTS" |
+        xargs -n1 |
+        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+        tr '\n' ' '
+    )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/build/scripts/firefighter.bat b/build/scripts/firefighter.bat
new file mode 100644
index 0000000000000000000000000000000000000000..8a549278323de8af8270f8c39555b9d64b6caed5
--- /dev/null
+++ b/build/scripts/firefighter.bat
@@ -0,0 +1,94 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem  firefighter startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%..
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and FIREFIGHTER_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\lib\firefighter.jar;%APP_HOME%\lib\javafx-fxml-21-linux.jar;%APP_HOME%\lib\javafx-controls-21-linux.jar;%APP_HOME%\lib\javafx-graphics-21-linux.jar;%APP_HOME%\lib\javafx-base-21-linux.jar
+
+
+@rem Execute firefighter
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %FIREFIGHTER_OPTS%  -classpath "%CLASSPATH%" app.SimulatorMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable FIREFIGHTER_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%FIREFIGHTER_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/build/scriptsShadow/firefighter b/build/scriptsShadow/firefighter
new file mode 100755
index 0000000000000000000000000000000000000000..ecdb49f7161492f27d686545536b691fbc98cf31
--- /dev/null
+++ b/build/scriptsShadow/firefighter
@@ -0,0 +1,183 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+##  firefighter start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/.." >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="firefighter"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and FIREFIGHTER_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/lib/firefighter-all.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=`expr $i + 1`
+    done
+    case $i in
+        0) set -- ;;
+        1) set -- "$args0" ;;
+        2) set -- "$args0" "$args1" ;;
+        3) set -- "$args0" "$args1" "$args2" ;;
+        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $FIREFIGHTER_OPTS -jar "\"$CLASSPATH\"" "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
\ No newline at end of file
diff --git a/build/scriptsShadow/firefighter.bat b/build/scriptsShadow/firefighter.bat
new file mode 100644
index 0000000000000000000000000000000000000000..9d9829681fb66d0a67461026443aef372fc9b694
--- /dev/null
+++ b/build/scriptsShadow/firefighter.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  firefighter startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%..
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and FIREFIGHTER_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\lib\firefighter-all.jar
+
+@rem Execute firefighter
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %FIREFIGHTER_OPTS%  -jar "%CLASSPATH%" %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable FIREFIGHTER_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%FIREFIGHTER_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
\ No newline at end of file
diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin
index c35a8e994b06ea45060a2d6552cb0167e010d663..48e50bc390ac5092c726fc747b9c7671c94c9b48 100644
Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ
diff --git a/build/tmp/jar/MANIFEST.MF b/build/tmp/jar/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..59499bce4a2bd51cba227b7c00fcf745b19c95a4
--- /dev/null
+++ b/build/tmp/jar/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/build/tmp/shadowJar/MANIFEST.MF b/build/tmp/shadowJar/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..2c5dafadb5f53a219e1c22537b872baf7d0b350d
--- /dev/null
+++ b/build/tmp/shadowJar/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: app.SimulatorMain
+
diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java
index e88b0e9856086cc6f53f2782175393dca6365eb6..12878f7c6f4c083a7a742c397ecc44f355e33023 100644
--- a/src/main/java/app/SimulatorApplication.java
+++ b/src/main/java/app/SimulatorApplication.java
@@ -11,49 +11,51 @@ import java.io.IOException;
 import java.net.URL;
 
 public class SimulatorApplication extends javafx.application.Application {
-  private static final String VIEW_RESOURCE_PATH = "/view/view.fxml";
-  private static final String APP_NAME = "Firefighter simulator";
-  private static final int ROW_COUNT = 20;
-  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 = 3;
-  public static final int INITIAL_FIREFIGHTER_COUNT = 6;
-
-  private Stage primaryStage;
-  private Parent view;
-  private void initializePrimaryStage(Stage primaryStage) {
-    this.primaryStage = primaryStage;
-    this.primaryStage.setTitle(APP_NAME);
-    this.primaryStage.setOnCloseRequest(event -> Platform.exit());
-    this.primaryStage.setResizable(true);
-    this.primaryStage.sizeToScene();
-  }
-
-  @Override
-  public void start(Stage primaryStage) throws IOException {
-    initializePrimaryStage(primaryStage);
-    initializeView();
-    showScene();
-  }
-
-  private void initializeView() throws IOException {
-    FXMLLoader loader = new FXMLLoader();
-    URL location = SimulatorApplication.class.getResource(VIEW_RESOURCE_PATH);
-    loader.setLocation(location);
-    view = loader.load();
-    Controller controller = loader.getController();
-    controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT,
-            INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT);
-  }
-
-  private void showScene() {
-    Scene scene = new Scene(view);
-    primaryStage.setScene(scene);
-    primaryStage.show();
-  }
-
-  public static void main(String[] args) {
-    launch(args);
-  }
+    private static final String VIEW_RESOURCE_PATH = "/view/view.fxml";
+    private static final String APP_NAME = "Firefighter Simulator";
+    private static final int ROW_COUNT = 20;
+    private static final int COLUMN_COUNT = 20;
+    private static final int BOX_WIDTH = 30;
+    private static final int BOX_HEIGHT = 30;
+    public static final int INITIAL_FIRE_COUNT = 5;
+    public static final int INITIAL_FIREFIGHTER_COUNT = 4;
+
+    private Stage primaryStage;
+    private Parent view;
+
+    private void initializePrimaryStage(Stage primaryStage) {
+        this.primaryStage = primaryStage;
+        this.primaryStage.setTitle(APP_NAME);
+        this.primaryStage.setOnCloseRequest(event -> Platform.exit());
+        this.primaryStage.setResizable(false);
+        this.primaryStage.sizeToScene();
+    }
+
+    @Override
+    public void start(Stage primaryStage) throws IOException {
+        initializePrimaryStage(primaryStage);
+        initializeView();
+        showScene();
+    }
+
+    private void initializeView() throws IOException {
+        FXMLLoader loader = new FXMLLoader();
+        URL location = SimulatorApplication.class.getResource(VIEW_RESOURCE_PATH);
+        loader.setLocation(location);
+        view = loader.load();
+
+        Controller controller = loader.getController();
+        controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT,
+                INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT);
+    }
+
+    private void showScene() {
+        Scene scene = new Scene(view);
+        primaryStage.setScene(scene);
+        primaryStage.show();
+    }
+
+    public static void main(String[] args) {
+        launch(args);
+    }
 }
diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index 2a60897c6eb8ba847cb8589840c16a0f175ce0a3..fa5224d2c629e1966f2d405e9d1300652eddff9d 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -1,141 +1,95 @@
 package controller;
 
-import javafx.animation.Animation;
 import javafx.animation.KeyFrame;
 import javafx.animation.Timeline;
-import javafx.event.ActionEvent;
-import javafx.event.EventHandler;
 import javafx.fxml.FXML;
 import javafx.scene.control.Button;
 import javafx.scene.control.Label;
 import javafx.scene.control.ToggleButton;
-import javafx.scene.control.ToggleGroup;
 import javafx.util.Duration;
-import javafx.util.Pair;
-import model.Board;
-import model.ModelElement;
 import model.FirefighterBoard;
-import util.Position;
-import view.Grid;
-import view.ViewElement;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static java.util.Objects.requireNonNull;
+import view.FirefighterGrid;
 
 public class Controller {
 
-  public static final int PERIOD_IN_MILLISECONDS = 50;
-  @FXML
-  public Button restartButton;
+  private FirefighterBoard board;
+  private Timeline timeline;
+
   @FXML
-  public Button oneStepButton;
+  private Label generationNumberLabel;
+
   @FXML
-  public Label generationNumberLabel;
+  private Button restartButton;
+
   @FXML
-  private ToggleButton pauseToggleButton;
+  private Button oneStepButton;
+
   @FXML
   private ToggleButton playToggleButton;
-  @FXML
-  private Grid<ViewElement> grid;
-  private Timeline timeline;
-  private Board<List<ModelElement>> board;
 
   @FXML
-  private void initialize() {
-    initializePlayAndPauseToggleButtons();
-    initializeTimeline();
-  }
-
-  private void initializePlayAndPauseToggleButtons() {
-    ToggleGroup toggleGroup = new PersistentToggleGroup();
-    toggleGroup.getToggles().addAll(playToggleButton, pauseToggleButton);
-    pauseToggleButton.setSelected(true);
-  }
+  private ToggleButton pauseToggleButton;
 
-  private void setModel(FirefighterBoard firefighterBoard) {
-    this.board = requireNonNull(firefighterBoard, "firefighter.model is null");
-  }
+  @FXML
+  private FirefighterGrid grid;
 
-  private void updateBoard(){
-    List<Position> updatedPositions = board.updateToNextGeneration();
-    List<Pair<Position, ViewElement>> updatedSquares = new ArrayList<>();
-    for(Position updatedPosition : updatedPositions){
-      List<ModelElement> squareState = board.getState(updatedPosition);
-      ViewElement viewElement = getViewElement(squareState);
-      updatedSquares.add(new Pair<>(updatedPosition, viewElement));
-    }
-    grid.repaint(updatedSquares);
-    updateGenerationLabel(board.stepNumber());
-  }
+  public void initialize(int boxWidth, int boxHeight, int columns, int rows, int fireCount, int firefighterCount) {
+    // Initialize the simulation board and connect it to the grid
+    board = new FirefighterBoard(columns, rows, fireCount, firefighterCount);
+    grid.initialize(columns, rows, boxWidth, boxHeight, board);
 
-  private void repaintGrid(){
-    int columnCount = board.columnCount();
-    int rowCount = board.rowCount();
-    ViewElement[][] viewElements = new ViewElement[rowCount][columnCount];
-    for(int column = 0; column < columnCount; column++)
-      for(int row = 0; row < rowCount; row++)
-        viewElements[row][column] = getViewElement(board.getState(new Position(row, column)));
-    grid.repaint(viewElements);
-    updateGenerationLabel(board.stepNumber());
-  }
+    // Initialize timeline for automatic progression
+    timeline = new Timeline(new KeyFrame(Duration.millis(100), event -> updateGame()));
+    timeline.setCycleCount(Timeline.INDEFINITE);
 
-  private ViewElement getViewElement(List<ModelElement> squareState) {
-    if(squareState.contains(ModelElement.FIREFIGHTER)){
-      return ViewElement.FIREFIGHTER;
-    }
-    if (squareState.contains(ModelElement.FIRE)){
-      return ViewElement.FIRE;
-    }
-    return ViewElement.EMPTY;
+    // Ensure initial UI state is consistent
+    updateGenerationLabel();
+    pauseToggleButton.setSelected(true);
+    stopSimulation();
+    board.reset();
+    grid.repaint();
+    updateGenerationLabel();
   }
 
-  private void initializeTimeline() {
-    Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS);
-    EventHandler<ActionEvent> eventHandler =
-            event -> updateBoard();
-    KeyFrame keyFrame = new KeyFrame(duration, eventHandler);
-    timeline = new Timeline(keyFrame);
-    timeline.setCycleCount(Animation.INDEFINITE);
-  }
 
-  public void play() {
-    timeline.play();
+  @FXML
+  private void restartButtonAction() {
+    stopSimulation();
+    board.reset();
+    grid.repaint();
+    updateGenerationLabel();
   }
-
-  public void pause() {
-    timeline.pause();
+  @FXML
+  private void oneStepButtonAction() {
+    stopSimulation();
+    updateGame();
   }
 
-  public void pauseToggleButtonAction() {
-    this.pause();
+  @FXML
+  private void playToggleButtonAction() {
+    startSimulation();
   }
 
-  public void playToggleButtonAction() {
-    this.play();
+  @FXML
+  private void pauseToggleButtonAction() {
+    stopSimulation();
   }
 
-  public void restartButtonAction() {
-    this.pause();
-    board.reset();
-    pauseToggleButton.setSelected(true);
-    repaintGrid();
+  private void startSimulation() {
+    timeline.play();
   }
 
-  public void initialize(int squareWidth, int squareHeight, int columnCount,
-                                int rowCount, int initialFireCount, int initialFirefighterCount) {
-    grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
-    this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount));
-    repaintGrid();
+  private void stopSimulation() {
+    timeline.stop();
   }
 
-  public void oneStepButtonAction() {
-    this.pause();
-    updateBoard();
+  private void updateGame() {
+    board.updateToNextGeneration();
+    grid.repaint();
+    updateGenerationLabel();
   }
 
-  private void updateGenerationLabel(int value){
-    generationNumberLabel.setText(Integer.toString(value));
+  private void updateGenerationLabel() {
+    generationNumberLabel.setText(String.valueOf(board.stepNumber()));
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/model/FireManager.java b/src/main/java/model/FireManager.java
deleted file mode 100644
index e843edffb68418dc041d7492eb3a030f6d3d8686..0000000000000000000000000000000000000000
--- a/src/main/java/model/FireManager.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package model;
-
-import util.Position;
-
-import java.util.*;
-
-public class FireManager {
-    private Set<Position> firePositions;
-    private int turnCounter;
-    private FireSpreadStrategy fireSpreadStrategy;
-
-    public FireManager(FireSpreadStrategy fireSpread) {
-        this.firePositions = new HashSet<>();
-        this.turnCounter = 0;
-        this.fireSpreadStrategy = fireSpread;
-    }
-    public void initializeFires(int fireCount, int rowCount, int columnCount, Random random) {
-        firePositions.clear();
-        for (int i = 0; i < fireCount; i++) {
-            firePositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
-        }
-    }
-    public List<Position> fireSpread(Map<Position, List<Position>> neighbors){
-        List<Position> newFires = new ArrayList<>();
-        if (turnCounter % 2 == 0) {
-            for (Position fire : firePositions) {
-                List<Position> neighborList = neighbors.get(fire);
-                if (neighborList != null){
-                    for (Position neighbor : neighborList) {
-                        if (!firePositions.contains(neighbor)) {
-                            newFires.add(neighbor);
-                        }
-                    }
-                }
-            }
-        }
-        firePositions.addAll(newFires);
-        turnCounter++;
-        return newFires;
-    }
-    public void extinguish(Position position){
-        if (firePositions.contains(position)) {
-            firePositions.remove(position);
-        }
-    }
-    public Set<Position> getFirePositions() {
-        return firePositions;
-    }
-}
diff --git a/src/main/java/model/FireSpreadStrategy.java b/src/main/java/model/FireSpreadStrategy.java
deleted file mode 100644
index a775891351fe0a721567e1a33f99d43078cb151a..0000000000000000000000000000000000000000
--- a/src/main/java/model/FireSpreadStrategy.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package model;
-
-import util.Position;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public interface FireSpreadStrategy {
-    List<Position> spreadFire(Set<Position> positions, Map<Position, List<Position>> neighbors);
-}
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index ea6f8034b0eeaac4c5c9e5ff81b8c67bfc808913..5181cb6ec19926bff50a1d45432c038965e97f72 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -1,61 +1,88 @@
 package model;
 
 import util.Position;
-
+import javafx.util.Pair;
 import java.util.*;
 
 public class FirefighterBoard implements Board<List<ModelElement>> {
+    private final int columnCount;
+    private final int rowCount;
+    private final int initialFireCount;
+    private final int initialFirefighterCount;
+
+    private List<Position> firefighterPositions;
+    private Set<Position> firePositions;
+    private final Map<Position, List<Position>> neighbors;
+    private final Position[][] positions;
 
-    private int rowCount;
-    private int columnCount;
-    private final FireManager fireManager;
-    private final FirefighterManager firefighterManager;
-    private final NeighborManager neighborManager;
-    private int step;
+    private int step = 0;
 
+    // Constructor for FirefighterBoard
     public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
         this.columnCount = columnCount;
         this.rowCount = rowCount;
-        this.neighborManager = new NeighborManager(rowCount, columnCount);
+        this.initialFireCount = initialFireCount;
+        this.initialFirefighterCount = initialFirefighterCount;
 
-        this.fireManager = new FireManager(new SimpleFireSpreadStrategy());
-        this.firefighterManager = new FirefighterManager(new SimpleFirefighterMovementStrategy());
+        this.positions = new Position[rowCount][columnCount];
+        this.firefighterPositions = new ArrayList<>();
+        this.firePositions = new HashSet<>();
+        this.neighbors = new HashMap<>();
 
-        Random random = new Random();
-        fireManager.initializeFires(initialFireCount, rowCount,columnCount, random);
-        firefighterManager.initializeFireFightersPositions(initialFirefighterCount,rowCount,columnCount,random);
-        this.step = 0;
+        initializeBoard();
     }
 
-    @Override
-    public List<ModelElement> getState(Position position) {
-        List<ModelElement> elements = new ArrayList<>();
+    private void initializeBoard() {
+        Random random = new Random();
+
+        // Initialize fire positions
+        for (int i = 0; i < initialFireCount; i++) {
+            firePositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
+        }
 
-        // Check if the position contains a fire
-        if (fireManager.getFirePositions().contains(position)) {
-            elements.add(ModelElement.FIRE);
+        // Initialize firefighter positions
+        for (int i = 0; i < initialFirefighterCount; i++) {
+            firefighterPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
         }
 
-        // Check if the position contains a firefighter
-        if (firefighterManager.getFirefighterPositions().contains(position)) {
-            elements.add(ModelElement.FIREFIGHTER);
+        // Initialize neighbors map
+        for (int row = 0; row < rowCount; row++) {
+            for (int col = 0; col < columnCount; col++) {
+                positions[row][col] = new Position(row, col);
+                neighbors.put(positions[row][col], calculateNeighbors(row, col));
+            }
         }
+    }
 
-        return elements;
+    private List<Position> calculateNeighbors(int row, int col) {
+        List<Position> adjacentPositions = new ArrayList<>();
+        if (row > 0) adjacentPositions.add(new Position(row - 1, col));  // Top neighbor
+        if (col > 0) adjacentPositions.add(new Position(row, col - 1));  // Left neighbor
+        if (row < rowCount - 1) adjacentPositions.add(new Position(row + 1, col));  // Bottom neighbor
+        if (col < columnCount - 1) adjacentPositions.add(new Position(row, col + 1));  // Right neighbor
+        return adjacentPositions;
     }
 
     @Override
-    public void setState(List<ModelElement> state, Position position) {
-        fireManager.extinguish(position);
-        firefighterManager.getFirefighterPositions().remove(position);
-
-        // Add elements based on the new state
-        for (ModelElement element : state) {
-            switch (element) {
-                case FIRE -> fireManager.getFirePositions().add(position);
-                case FIREFIGHTER -> firefighterManager.getFirefighterPositions().add(position);
+    public List<ModelElement> getState(Position position) {
+        List<ModelElement> result = new ArrayList<>();
+        for (ModelElement element : ModelElement.values()){
+            switch (element){
+                case FIRE -> {
+                    if (firePositions.contains(position)) {
+                        result.add(ModelElement.FIRE);
+                    }
+                }
+                case FIREFIGHTER -> {
+                    if (firefighterPositions.contains(position)) {
+                        result.add(ModelElement.FIREFIGHTER);
+                    }
+                }
+                default -> {
+                }
             }
         }
+        return result;
     }
 
     @Override
@@ -69,59 +96,93 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     }
 
     @Override
-    public List<Position> updateToNextGeneration() {
-        List<Position> modifiedPositions = new ArrayList<>();
-
-        // Spread the fires and update affected positions
-        modifiedPositions.addAll(fireManager.fireSpread(neighborManager.getNeighbors()));
-
-        // Move firefighters and update affected positions
-        modifiedPositions.addAll(firefighterManager.moveFireFighters(
-                fireManager.getFirePositions(),
-                neighborManager.getNeighbors()
-        ));
-
-        // Increment the step count
-        step++;
-
-        return modifiedPositions;
+    public int stepNumber() {
+        return step;
     }
 
     @Override
     public void reset() {
-        // Reset step and reinitialize managers
-        this.step = 0;
-
-        Random random = new Random();
-        fireManager.getFirePositions().clear();
-        firefighterManager.getFirefighterPositions().clear();
+        step = 0;
+        firefighterPositions.clear();
+        firePositions.clear();
 
-        fireManager.initializeFires(fireManager.getFirePositions().size(), rowCount, columnCount, random);
-        firefighterManager.initializeFireFightersPositions(
-                firefighterManager.getFirefighterPositions().size(), rowCount, columnCount, random
-        );
+        initializeBoard();
     }
 
     @Override
-    public int stepNumber() {
-        return step;
-    }
-}
-
-
-
-
-
+    public void setState(List<ModelElement> state, Position position) {
+        firePositions.remove(position);
+        firefighterPositions.remove(position);
 
+        for (ModelElement element : state) {
+            switch (element) {
+                case FIRE -> firePositions.add(position);
+                case FIREFIGHTER -> firefighterPositions.add(position);
+            }
+        }
+    }
 
+    @Override
+    public List<Position> updateToNextGeneration() {
+        List<ModelElement> elements = List.of(
+            ModelElement.FIRE,
+            ModelElement.FIREFIGHTER
+        );
+        List<Position> modifiedPositions = new ArrayList<>();
 
+        for(ModelElement element : elements) {
+            Strategy strategy = switch(element) {
+                case FIRE -> new SimpleFireSpreadStrategy(firePositions, neighbors,step);
+                case FIREFIGHTER -> new FirefighterMovementStrategy(firefighterPositions,firePositions,neighbors);
+                default -> throw new IllegalStateException("Type de modèle inconnu : " + element);
+            };
+            modifiedPositions.addAll(strategy.update());
 
+            switch (element) {
+                case FIRE -> firePositions = strategy.getFirePositions();
+                case FIREFIGHTER -> firefighterPositions = strategy.getModelPositions();
+            }
+        }
+        step++;
+        return modifiedPositions;
+    }
 
+    private Set<Position> spreadFire() {
+        Set<Position> newFirePositions = new HashSet<>();
+        for (Position firePosition : firePositions) {
+            newFirePositions.addAll(neighbors.get(firePosition));  // Spread fire to neighbors
+        }
+        return newFirePositions;
+    }
 
+    private void extinguishNearbyFire(List<Position> modifiedPositions) {
+        for (Position firefighterPosition : firefighterPositions) {
+            List<Position> nearbyFires = neighbors.get(firefighterPosition);
+            for (Position neighbor : nearbyFires) {
+                if (firePositions.contains(neighbor)) {
+                    firePositions.remove(neighbor);  // Extinguish fire in neighboring positions
+                    modifiedPositions.add(neighbor);
+                }
+            }
+        }
+    }
 
+    public List<Pair<Position, ModelElement>> getUpdatedElements() {
+        List<Pair<Position, ModelElement>> updatedElements = new ArrayList<>();
 
+        // Add fire positions
+        for (Position firePosition : firePositions) {
+            updatedElements.add(new Pair<>(firePosition, ModelElement.FIRE));
+        }
 
+        // Add firefighter positions
+        for (Position firefighterPosition : firefighterPositions) {
+            updatedElements.add(new Pair<>(firefighterPosition, ModelElement.FIREFIGHTER));
+        }
 
+        return updatedElements;
+    }
+}
 
 
 
diff --git a/src/main/java/model/FirefighterManager.java b/src/main/java/model/FirefighterManager.java
deleted file mode 100644
index 5a7422fbdb9c2e1d72d59958545ed218e8158484..0000000000000000000000000000000000000000
--- a/src/main/java/model/FirefighterManager.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package model;
-
-import util.Position;
-
-import java.util.*;
-
-public class FirefighterManager {
-    private List<Position> firefighterPositions;
-    private FirefighterMovementStrategy firefighterMovementStrategy;
-
-    public FirefighterManager(FirefighterMovementStrategy firefighterMovementStrategy) {
-        this.firefighterPositions = new ArrayList<>();
-        this.firefighterMovementStrategy = firefighterMovementStrategy;
-    }
-    public void initializeFireFightersPositions(int count, int rowCount, int columnCount, Random random) {
-        for (int i = 0; i < count; i++) {
-            firefighterPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
-        }
-    }
-    public List<Position> moveFireFighters(Set<Position> firePositions, Map<Position, List<Position>> neighbors) {
-        List<Position> modifiedPositions = new ArrayList<>();
-
-        for (int i = 0; i < firefighterPositions.size(); i++) {
-            Position firefighter = firefighterPositions.get(i);
-            for (Position neighbor : neighbors.get(firefighter)) {
-                if (firePositions.contains(neighbor)) {
-                    firePositions.remove(neighbor); // Extinguish fire at the neighbor
-                    modifiedPositions.add(neighbor); // Track extinguished fire position
-                }
-            }
-
-            Position closestFire = findClosestFire(firefighter, firePositions);
-
-            if (closestFire != null ) {
-                Position newPosition = moveTowards(firefighter, closestFire);
-                firefighterPositions.set(i, newPosition);
-                modifiedPositions.add(newPosition);
-            }
-
-            for (Position neighbor : neighbors.get(firefighter)) {
-                if (firePositions.contains(neighbor)) {
-                    firePositions.remove(neighbor);
-                    modifiedPositions.add(neighbor);
-                }
-            }
-        }
-
-        return modifiedPositions;
-    }
-    public List<Position> getFirefighterPositions() {
-        return firefighterPositions;
-    }
-
-    private Position findClosestFire(Position firefighter, Set<Position> firePositions) {
-        Position closestFire = null;
-        int minDistance = Integer.MAX_VALUE;
-
-        for (Position fire : firePositions) {
-            int distance = Math.abs(fire.getRow() - firefighter.getRow()) + Math.abs(fire.getCol() - firefighter.getCol());
-            if (distance < minDistance) {
-                minDistance = distance;
-                closestFire = fire;
-            }
-        }
-
-        return closestFire;
-    }
-
-    private Position moveTowards(Position firefighter, Position target) {
-        int currentRow = firefighter.getRow();
-        int currentCol = firefighter.getCol();
-
-        int targetRow = target.getRow();
-        int targetCol = target.getCol();
-
-        if (currentRow < targetRow) {
-            return new Position(currentRow + 1, currentCol); // Move down
-        } else if (currentRow > targetRow) {
-            return new Position(currentRow - 1, currentCol); // Move up
-        } else if (currentCol < targetCol) {
-            return new Position(currentRow, currentCol + 1); // Move right
-        } else if (currentCol > targetCol) {
-            return new Position(currentRow, currentCol - 1); // Move left
-        }
-
-        return firefighter;
-    }
-
-
-
-}
diff --git a/src/main/java/model/FirefighterMovementStrategy.java b/src/main/java/model/FirefighterMovementStrategy.java
index f06ab934f56736b2ef07959db7b1b3744109e819..b8c4f3b5131548522bd513ba2c45e4dbad80524d 100644
--- a/src/main/java/model/FirefighterMovementStrategy.java
+++ b/src/main/java/model/FirefighterMovementStrategy.java
@@ -1,8 +1,65 @@
 package model;
 
 import util.Position;
+import util.TargetStrategy;
+
 import java.util.*;
 
-public interface FirefighterMovementStrategy {
-    Position moveToClosestFire(Position current, Set<Position> firePositions, Map<Position, List<Position>> neighbors);
+public class FirefighterMovementStrategy implements Strategy {
+    private final TargetStrategy targetStrategy = new TargetStrategy();
+    private List<Position> firefighterPositions;
+    private final Set<Position> firePositions;
+    private final Map<Position, List<Position>> neighbors;
+
+    public FirefighterMovementStrategy(List<Position> firefighterPositions, Set<Position> firePositions, Map<Position, List<Position>> neighbors) {
+        this.firefighterPositions = firefighterPositions;
+        this.firePositions = firePositions;
+        this.neighbors = neighbors;
+    }
+
+    @Override
+    public List<Position> update() {
+List<Position> modifiedPositions = new ArrayList<>();
+        List<Position> newFirefighterPositions = new ArrayList<>();
+
+        for (Position firefighterPosition : firefighterPositions) {
+            Position nextPosition = NextValidPosition(firefighterPosition);
+
+            List<Position> firesToExtinguish = new ArrayList<>(neighbors.getOrDefault(nextPosition, List.of()));
+            firesToExtinguish.add(nextPosition);
+            firesToExtinguish.removeIf(pos -> !firePositions.contains(pos));
+
+            extinguishAll(firesToExtinguish);
+            modifiedPositions.addAll(firesToExtinguish);
+
+            // Update positions
+            newFirefighterPositions.add(nextPosition);
+            modifiedPositions.add(firefighterPosition);
+            modifiedPositions.add(nextPosition);
+        }
+
+        firefighterPositions = newFirefighterPositions;
+        return modifiedPositions;
+    }
+
+    private Position NextValidPosition(Position currentPosition) {
+        Position target = targetStrategy.neighborClosestToFire(currentPosition, firePositions, neighbors);
+        return target;
+    }
+
+    private void extinguishAll(List<Position> positions) {
+        firePositions.removeAll(positions);
+    }
+
+
+    @Override
+    public List<Position> getModelPositions() {
+        return firefighterPositions;
+    }
+
+    @Override
+    public Set<Position> getFirePositions() {
+        return firePositions;
+    }
 }
+
diff --git a/src/main/java/model/Initializer.java b/src/main/java/model/Initializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..373eb05ba57e27989095c591c562e7129b132491
--- /dev/null
+++ b/src/main/java/model/Initializer.java
@@ -0,0 +1,113 @@
+package model;
+
+import util.Position;
+
+import java.util.*;
+
+public class Initializer {
+    private final int columnCount;
+    private final int rowCount;
+    private final int initialFireCount;
+    private final int initialFirefighterCount;
+
+    private final Position[][] positions;
+    private final Map<Position, List<Position>> neighbors;
+    private final List<Position> firefighterPositions;
+    private final Set<Position> firePositions;
+    private int step = 0;
+
+    private final Random randomGenerator = new Random();
+
+    public Initializer(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
+        this.columnCount = columnCount;
+        this.rowCount = rowCount;
+        this.initialFireCount = initialFireCount;
+        this.initialFirefighterCount = initialFirefighterCount;
+
+        this.positions = new Position[rowCount][columnCount];
+        this.neighbors = new HashMap<>();
+        this.firePositions = new HashSet<>();
+        this.firefighterPositions = new ArrayList<>();
+
+        initializePositions();
+        initializeNeighbors();
+        initializeElements();
+    }
+    private void initializePositions() {
+        for (int row = 0; row < rowCount; row++) {
+            for (int column = 0; column < columnCount; column++) {
+                positions[row][column] = new Position(row, column);
+            }
+        }
+    }
+    private void initializeNeighbors() {
+        for (int row = 0; row < rowCount; row++) {
+            for (int column = 0; column < columnCount; column++) {
+                List<Position> adjacentPositions = new ArrayList<>();
+                if (row > 0) adjacentPositions.add(new Position(row - 1, column));  // Top neighbor
+                if (column > 0) adjacentPositions.add(new Position(row, column - 1));  // Left neighbor
+                if (row < rowCount - 1) adjacentPositions.add(new Position(row + 1, column));  // Bottom neighbor
+                if (column < columnCount - 1) adjacentPositions.add(new Position(row, column + 1));  // Right neighbor
+                neighbors.put(positions[row][column], adjacentPositions);
+            }
+        }
+    }
+    private void initializeElements() {
+
+    }
+    private void initializeFirePositions() {
+        addRandomPositions(firePositions, initialFireCount);
+    }
+    private void initializeFirefighters() {
+            addRandomPositions(firefighterPositions, initialFirefighterCount);
+    }
+
+    private void addRandomPositions(Collection<Position> targetCollection, int count) {
+        while (targetCollection.size() < count) {
+            Position randomPosition = randomPosition();
+            if (isValid(randomPosition)) {
+                targetCollection.add(randomPosition);
+            }
+        }
+    }
+    private boolean isValid(Position targetPosition) {
+        return !firePositions.contains(targetPosition);
+    }
+    private Position randomPosition() {
+        return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
+    }
+
+    public int getColumnCount() {
+        return columnCount;
+    }
+
+    public int getRowCount() {
+        return rowCount;
+    }
+
+    public int getInitialFireCount() {
+        return initialFireCount;
+    }
+
+    public int getInitialFirefighterCount() {
+        return initialFirefighterCount;
+    }
+
+    public Position[][] getPositions() {
+        return positions;
+    }
+
+    public Map<Position, List<Position>> getNeighbors() {
+        return neighbors;
+    }
+
+    public List<Position> getFirefighterPositions() {
+        return firefighterPositions;
+    }
+
+    public Set<Position> getFirePositions() {
+        return firePositions;
+    }
+    public int getStep() {return step;}
+
+}
diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java
index 759eee5e54c3a39472d8f7defbbbe6a2b67b8f00..5212cc5dc358e893318e4c01fb2926782f07b496 100644
--- a/src/main/java/model/ModelElement.java
+++ b/src/main/java/model/ModelElement.java
@@ -1,5 +1,16 @@
 package model;
 
+
 public enum ModelElement {
-  FIREFIGHTER, FIRE
+  FIREFIGHTER("blue"), FIRE("red");
+
+  private final String color;
+
+  ModelElement(String color) {
+    this.color = color;
+  }
+
+  public String getColor() {
+    return color;
+  }
 }
diff --git a/src/main/java/model/SimpleFireSpreadStrategy.java b/src/main/java/model/SimpleFireSpreadStrategy.java
index af5438d7a352124c299e18111432dc2e9ceb2fd6..b8f9e863c81fd4dc39c42301da89345524b2d43d 100644
--- a/src/main/java/model/SimpleFireSpreadStrategy.java
+++ b/src/main/java/model/SimpleFireSpreadStrategy.java
@@ -1,19 +1,53 @@
 package model;
 
 import util.Position;
+import java.util.*;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.ArrayList;
+public class SimpleFireSpreadStrategy implements Strategy {
+    private final Set<Position> firePositions;
+    private final Map<Position, List<Position>> neighbors;
+    private final int step;
+
+    public SimpleFireSpreadStrategy(Set<Position> firePositions, Map<Position, List<Position>> neighbors, int step) {
+        this.firePositions = firePositions;
+        this.neighbors = neighbors;
+        this.step = step;
+    }
 
-public class SimpleFireSpreadStrategy implements FireSpreadStrategy {
     @Override
-    public List<Position> spreadFire(Set<Position> positions, Map<Position, List<Position>> neighbors) {
-        List<Position> newFirePositions = new ArrayList<>();
-        for (Position fire : positions) {
-            newFirePositions.addAll(neighbors.get(fire));
+    public List<Position> update() {
+        if(step %2 != 0){
+            return Collections.emptyList();
+        }
+        List<Position> modifiedPositions = new ArrayList<>();
+        Set<Position> newFirePositions = new HashSet<>();
+
+        for (Position firePosition : firePositions) {
+            spreadFire(firePosition, newFirePositions);
         }
-        return newFirePositions;
+        firePositions.addAll(newFirePositions);
+        modifiedPositions.addAll(newFirePositions);
+        return modifiedPositions;
+    }
+    private void spreadFire(Position firePosition, Set<Position> newFirePositions) {
+        List<Position> potentialPositions = neighbors.getOrDefault(firePosition, Collections.emptyList());
+        for (Position potentialPosition : potentialPositions) {
+            if (canPropagateTo(potentialPosition)) {
+                newFirePositions.add(potentialPosition);
+            }
+        }
+    }
+    private boolean canPropagateTo(Position firePosition) {
+        return true;
+    }
+
+    @Override
+    public List<Position> getModelPositions() {
+        throw new UnsupportedOperationException("Fire positions can't be accessed as Model Positions.");
+    }
+
+    @Override
+    public Set<Position> getFirePositions() {
+        return firePositions;
     }
 }
diff --git a/src/main/java/model/SimpleFirefighterMovementStrategy.java b/src/main/java/model/SimpleFirefighterMovementStrategy.java
deleted file mode 100644
index 8fb526850b9c6bb4a4defe62a597c36b34281cbc..0000000000000000000000000000000000000000
--- a/src/main/java/model/SimpleFirefighterMovementStrategy.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package model;
-
-import util.Position;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class SimpleFirefighterMovementStrategy implements FirefighterMovementStrategy {
-    @Override
-    public Position moveToClosestFire(Position current, Set<Position> firePositions, Map<Position, List<Position>> neighbors) {
-        Position closestFire = null;
-        int minDistance = Integer.MAX_VALUE;
-
-        for (Position fire : firePositions) {
-            int distance = calculateDistance(current, fire);
-            if (distance < minDistance) {
-                minDistance = distance;
-                closestFire = fire;
-            }
-        }
-
-        return closestFire != null && !closestFire.equals(current) ? closestFire : current;
-    }
-
-    private int calculateDistance(Position a, Position b) {
-        return Math.abs(a.getRow() - b.getRow()) + Math.abs(a.getCol() - b.getCol());
-
-
-    }
-}
diff --git a/src/main/java/model/Strategy.java b/src/main/java/model/Strategy.java
new file mode 100644
index 0000000000000000000000000000000000000000..8e0e7d75568b6cc8119ebee7f9880a1aed31b2ab
--- /dev/null
+++ b/src/main/java/model/Strategy.java
@@ -0,0 +1,12 @@
+package model;
+
+import util.Position;
+
+import java.util.List;
+import java.util.Set;
+
+public interface Strategy {
+    List<Position> update();
+    List<Position> getModelPositions();
+    Set<Position> getFirePositions();
+}
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 4c36d97709b342e457203c75d081fc5cc1955c0f..799ba44c209f7828d34ac9bbdb8402487c97144f 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -2,7 +2,8 @@ module firefighter {
   requires javafx.controls;
   requires javafx.fxml;
   requires javafx.graphics;
-  opens controller to javafx.fxml;
+    opens controller to javafx.fxml;
   exports app;
   opens app to javafx.fxml;
+  opens view to javafx.fxml;
 }
diff --git a/src/main/java/package-info.java b/src/main/java/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/main/java/view/FirefighterGrid.java b/src/main/java/view/FirefighterGrid.java
index 4c9041f034ec9a4eb07ce4334de237f1e99ccdc9..ab926abfa39a23b8fdf3fb818e03f25bd1f78c53 100644
--- a/src/main/java/view/FirefighterGrid.java
+++ b/src/main/java/view/FirefighterGrid.java
@@ -1,99 +1,70 @@
 package view;
 
 import javafx.scene.canvas.Canvas;
+import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.paint.Color;
 import javafx.util.Pair;
+import model.ModelElement;
+import model.FirefighterBoard;
 import util.Position;
 
-import java.util.List;
+public class FirefighterGrid extends Canvas {
 
-public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
-
-    private void paintElementAtPosition(ViewElement element, Position position) {
-        paintBox(position.row(), position.column(), element.color);
-    }
+    private int columns;
+    private int rows;
     private int boxWidth;
     private int boxHeight;
-    private int columnCount;
-    private int rowCount;
-
-    @Override
-    public void repaint(List<Pair<Position, ViewElement>> positionedElements) {
-        clear(positionedElements);
-        paint(positionedElements);
-        paintLines();
-    }
+    private FirefighterBoard board;
 
-    private void clear(List<Pair<Position, ViewElement>> positionedElements) {
-        for (Pair<Position, ViewElement> positionElement : positionedElements) {
-            Position position = positionElement.getKey();
-            clearBox(position.row(), position.column());
-        }
-    }
-
-    private void paint(List<Pair<Position, ViewElement>> positionedElements) {
-        for(Pair<Position, ViewElement> pair : positionedElements){
-            paintElementAtPosition(pair.getValue(), pair.getKey());
-        }
-    }
-
-    @Override
-    public void repaint(ViewElement[][] elements) {
-        clear();
-        paint(elements);
-        paintLines();
-    }
-
-    private void clear() {
-        getGraphicsContext2D().clearRect(0,0,getWidth(), getHeight());
-    }
-
-    private void paint(ViewElement[][] elements) {
-        for(int column = 0; column < columnCount; column++)
-            for(int row = 0; row < rowCount; row++){
-                paintElementAtPosition(elements[row][column], new Position(row, column));
-            }
-    }
-
-    public int columnCount() {
-        return columnCount;
-    }
-
-    public int rowCount() {
-        return rowCount;
-    }
-
-    @Override
-    public void setDimensions(int columnCount, int rowCount, int boxWidth, int boxHeight) {
+    // Initialize the grid dimensions and board reference
+    public void initialize(int columns, int rows, int boxWidth, int boxHeight, FirefighterBoard board) {
+        this.columns = columns;
+        this.rows = rows;
         this.boxWidth = boxWidth;
         this.boxHeight = boxHeight;
-        this.columnCount = columnCount;
-        this.rowCount = rowCount;
-        super.setWidth(boxWidth * columnCount);
-        super.setHeight(boxHeight * rowCount);
-    }
-
-    private void paintLines(){
-        paintHorizontalLines();
-        paintVerticalLines();
+        this.board = board;
+        setWidth(columns * boxWidth);  // Set canvas width based on grid size
+        setHeight(rows * boxHeight);   // Set canvas height based on grid size
     }
 
-    private void paintVerticalLines() {
-        for(int column = 0; column < columnCount; column++)
-            getGraphicsContext2D().strokeLine(column * boxWidth, 0,column * boxWidth, getHeight());
-    }
+    // Repaint the grid and all elements (fire and firefighter)
+    public void repaint() {
+        if (board == null) return; // Exit if board is not set
+        GraphicsContext gc = getGraphicsContext2D();
+        gc.clearRect(0, 0, getWidth(), getHeight());  // Clear the canvas before drawing
+
+        // Iterate over the list of updated elements (positions and elements like fire or firefighter)
+        for (Pair<Position, ModelElement> pair : board.getUpdatedElements()) {
+            Position position = pair.getKey(); // Get the Position from the Pair
+            ModelElement element = pair.getValue(); // Get the ModelElement (either FIRE or FIREFIGHTER)
+
+            // Set the color based on the element type
+            if (element == ModelElement.FIRE) {
+                gc.setFill(Color.RED);  // Fire is red
+            } else if (element == ModelElement.FIREFIGHTER) {
+                gc.setFill(Color.BLUE);  // Firefighter is blue
+            } else {
+                gc.setFill(Color.WHITE);  // Empty space is white
+            }
 
-    private void paintHorizontalLines() {
-        for(int row = 0; row < rowCount; row++)
-            getGraphicsContext2D().strokeLine(0, row * boxHeight, getWidth(), row * boxHeight);
-    }
+            // Draw the element on the grid at the appropriate position
+            gc.fillRect(position.getCol() * boxWidth, position.getRow() * boxHeight, boxWidth, boxHeight);
+            gc.setStroke(Color.LIGHTGRAY);  // Grid border color
+            gc.strokeRect(position.getCol() * boxWidth, position.getRow() * boxHeight, boxWidth, boxHeight);
+        }
 
-    private void paintBox(int row, int column, Color color){
-        getGraphicsContext2D().setFill(color);
-        getGraphicsContext2D().fillRect(column * boxWidth,row * boxHeight, boxWidth, boxHeight);
+        // Optionally, draw the grid lines on top of the elements
+        drawGridLines(gc);
     }
 
-    private void clearBox(int row, int column){
-        getGraphicsContext2D().clearRect(column * boxWidth,row * boxHeight, boxWidth, boxHeight);
+    // Helper method to draw the grid lines
+    private void drawGridLines(GraphicsContext gc) {
+        gc.setStroke(Color.GRAY);
+        for (int col = 0; col < columns; col++) {
+            gc.strokeLine(col * boxWidth, 0, col * boxWidth, getHeight());  // Vertical lines
+        }
+        for (int row = 0; row < rows; row++) {
+            gc.strokeLine(0, row * boxHeight, getWidth(), row * boxHeight);  // Horizontal lines
+        }
     }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/view/ViewElement.java b/src/main/java/view/ViewElement.java
index ffb76112e1af543df5af41fa906082ef11be9967..f0a7922c36e72b5c7419e01f27d5845f770e9b9e 100644
--- a/src/main/java/view/ViewElement.java
+++ b/src/main/java/view/ViewElement.java
@@ -4,7 +4,9 @@ import javafx.scene.paint.Color;
 
 public enum ViewElement {
   FIREFIGHTER(Color.BLUE), FIRE(Color.RED), EMPTY(Color.WHITE);
+
   final Color color;
+
   ViewElement(Color color) {
     this.color = color;
   }