diff --git a/.gradle/8.10.2/executionHistory/executionHistory.bin b/.gradle/8.10.2/executionHistory/executionHistory.bin
index cf5a960ec7f7900010aea5be45e24718226af6e2..f6264f83d26b9805dd698461c9d850c5885e0876 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 f5e032ebd2785801b772397c831686017a8244f6..ea447a5c4ad764b00e95092aa5b3df0a48803d12 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 c148c1bc29cdedc846b72a678f760346fa875247..885ac781984bacc0a039b609b3999b6becef5489 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 f1ae7c3e5b7a9eb9afc3412e20c7cf3dec627541..4e33d30c25f2393247a13632145ba2582b44b3f9 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 14b6a2674e4806a02c0138c38bdae8b4aff3b145..887d9133bceb30ddce1ed7881efde9664b04bd65 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 99d6f908f0717a5a58f2fdbb18137440bea75e64..9ea26fd05e8268051b9ef9db3e21df482cf83307 100644
Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe
index 140230ec6b331e08f23b455dfe2ec91081f6cea2..ef0277adcabaa569125da33fe27b05b0df4d0427 100644
Binary files a/.gradle/file-system.probe and b/.gradle/file-system.probe differ
diff --git a/build/classes/java/main/model/BoardData.class b/build/classes/java/main/model/BoardData.class
index 1473192238ebff191ff33a083801c7c099c24bc6..07eb07f10a711f6f8ef0f19cf60c4172975d4ba7 100644
Binary files a/build/classes/java/main/model/BoardData.class and b/build/classes/java/main/model/BoardData.class differ
diff --git a/build/classes/java/main/model/Cloud.class b/build/classes/java/main/model/Cloud.class
index 06e95edf3b33b161168864be8ffffba74857967f..8abe5c73fad43333b2acc6717f97fb586a2837cf 100644
Binary files a/build/classes/java/main/model/Cloud.class and b/build/classes/java/main/model/Cloud.class differ
diff --git a/build/classes/java/main/model/Element.class b/build/classes/java/main/model/Element.class
index 86796ebda7b006c90771da8c76c0f4b5e8ec76c5..8e2eb1350365848b15dcaf78c2b55cde5c7ddfb1 100644
Binary files a/build/classes/java/main/model/Element.class and b/build/classes/java/main/model/Element.class differ
diff --git a/build/classes/java/main/model/ElementFactory.class b/build/classes/java/main/model/ElementFactory.class
index 1b7fa6bcc30af5a9bcdb5ceb5a1fbb1348f69532..1bd421ef615c9e45a152c2d4978560b948f63951 100644
Binary files a/build/classes/java/main/model/ElementFactory.class and b/build/classes/java/main/model/ElementFactory.class differ
diff --git a/build/classes/java/main/model/FFBoard.class b/build/classes/java/main/model/FFBoard.class
index 0f2a7b7e07aa8a014a7734a4fdc2d26a98d31397..88e8dad177692b2b612535247661c3c9569e5824 100644
Binary files a/build/classes/java/main/model/FFBoard.class and b/build/classes/java/main/model/FFBoard.class differ
diff --git a/build/classes/java/main/model/FFBoardData.class b/build/classes/java/main/model/FFBoardData.class
index 91b496a7e3f5a2c2f110a80343fd16e16ddb31a9..4483f542bcd15ccbb57cf01f6a013a227d435dcd 100644
Binary files a/build/classes/java/main/model/FFBoardData.class and b/build/classes/java/main/model/FFBoardData.class differ
diff --git a/build/classes/java/main/model/FFUpdater.class b/build/classes/java/main/model/FFUpdater.class
index cb3fcfe29e1991cf939f4dbdd623cb7555b7e7e3..3e585d7404d70b661e216810cc914f7a9c8d105b 100644
Binary files a/build/classes/java/main/model/FFUpdater.class and b/build/classes/java/main/model/FFUpdater.class differ
diff --git a/build/classes/java/main/model/FFboardFiller.class b/build/classes/java/main/model/FFboardFiller.class
new file mode 100644
index 0000000000000000000000000000000000000000..823516ccceb333663f42a9f493b95ff07bf5d14e
Binary files /dev/null and b/build/classes/java/main/model/FFboardFiller.class differ
diff --git a/build/classes/java/main/model/Fire.class b/build/classes/java/main/model/Fire.class
index adc931bcb0f5300d061e968519e0c2d97c2a4676..360986a08a7cb0be7450bcd306c3e8e7a6573fd0 100644
Binary files a/build/classes/java/main/model/Fire.class and b/build/classes/java/main/model/Fire.class differ
diff --git a/build/classes/java/main/model/FireBehavior.class b/build/classes/java/main/model/FireBehavior.class
index 86c2daaaf647a93a3f70c5472da3ed461ca3810b..319534dc2c14b6a6c143d71d7a0211911b945a3b 100644
Binary files a/build/classes/java/main/model/FireBehavior.class and b/build/classes/java/main/model/FireBehavior.class differ
diff --git a/build/classes/java/main/model/FireFactory.class b/build/classes/java/main/model/FireFactory.class
new file mode 100644
index 0000000000000000000000000000000000000000..815e81bb9b9ce8b3b04724e69b9468342e16ba1c
Binary files /dev/null and b/build/classes/java/main/model/FireFactory.class differ
diff --git a/build/classes/java/main/model/FireFighter.class b/build/classes/java/main/model/FireFighter.class
index 58f6f0535b52686f36a7fb60fddc8df9a1077855..1e2297e2ca73c58649903e7346f5ad3fa4f6f0b8 100644
Binary files a/build/classes/java/main/model/FireFighter.class and b/build/classes/java/main/model/FireFighter.class differ
diff --git a/build/classes/java/main/model/FirefighterBehavior.class b/build/classes/java/main/model/FirefighterBehavior.class
index da533f51f0f2dbfa4e9c02edd044965785859d50..704bf8be9a867e3fc60307903f234a7a3fffa56d 100644
Binary files a/build/classes/java/main/model/FirefighterBehavior.class and b/build/classes/java/main/model/FirefighterBehavior.class differ
diff --git a/build/classes/java/main/model/Land.class b/build/classes/java/main/model/Land.class
new file mode 100644
index 0000000000000000000000000000000000000000..cc196ad2cb290b7506aebcb8074e7378df7e0631
Binary files /dev/null and b/build/classes/java/main/model/Land.class differ
diff --git a/build/classes/java/main/model/TangibleBehavior.class b/build/classes/java/main/model/TangibleBehavior.class
index 073a9b1484d16129dace3fae3e881f17e3cfa1a1..02e1e1bca2906667c62dbe82da8609e9e78ddf6a 100644
Binary files a/build/classes/java/main/model/TangibleBehavior.class and b/build/classes/java/main/model/TangibleBehavior.class differ
diff --git a/build/classes/java/main/model/ZoneDependent.class b/build/classes/java/main/model/ZoneDependent.class
new file mode 100644
index 0000000000000000000000000000000000000000..2aae31c665e51fc937c9336a7923a3127d04148b
Binary files /dev/null and b/build/classes/java/main/model/ZoneDependent.class differ
diff --git a/build/classes/java/main/view/ViewElement.class b/build/classes/java/main/view/ViewElement.class
index 4fb4b9ad28e188f1cc2416bd319836c60f879e8c..1e3f14e9413c7d72ffe3178a764deb88ed309051 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/tmp/compileJava/compileTransaction/stash-dir/CloudBehavior.class.uniqueId1 b/build/tmp/compileJava/compileTransaction/stash-dir/CloudBehavior.class.uniqueId1
new file mode 100644
index 0000000000000000000000000000000000000000..b82fcd18821403a9d9289b8aa19200fd231f8b71
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/CloudBehavior.class.uniqueId1 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Fire.class.uniqueId7 b/build/tmp/compileJava/compileTransaction/stash-dir/Fire.class.uniqueId7
new file mode 100644
index 0000000000000000000000000000000000000000..360986a08a7cb0be7450bcd306c3e8e7a6573fd0
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/Fire.class.uniqueId7 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FireFighterBehavior.class.uniqueId8 b/build/tmp/compileJava/compileTransaction/stash-dir/FireFighterBehavior.class.uniqueId8
new file mode 100644
index 0000000000000000000000000000000000000000..704bf8be9a867e3fc60307903f234a7a3fffa56d
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/FireFighterBehavior.class.uniqueId8 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/SlowFire.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/SlowFire.class.uniqueId0
new file mode 100644
index 0000000000000000000000000000000000000000..c463e9921eec27a20924cec99609498cd217f76f
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/SlowFire.class.uniqueId0 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/StandardFire.class.uniqueId6 b/build/tmp/compileJava/compileTransaction/stash-dir/StandardFire.class.uniqueId6
new file mode 100644
index 0000000000000000000000000000000000000000..81358e7c16260b8d1d77d2d7a0650163f6d5df8f
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/StandardFire.class.uniqueId6 differ
diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin
index 858a4f8e11dd2f5778dcd1d3339b95b6e58ad5f2..72404e03bcab8bf54fc8e2fe55f9219b328d7448 100644
Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ
diff --git a/src/main/java/model/BoardData.java b/src/main/java/model/BoardData.java
index 480058ee90beae0af405d2dc67304f322a856282..2cad06371a2db77d49df8292fcb06e1b96f55d4a 100644
--- a/src/main/java/model/BoardData.java
+++ b/src/main/java/model/BoardData.java
@@ -8,12 +8,13 @@ import java.util.Map;
 public interface BoardData {
     public List<List<Element>> getElements();
     public Cell<Element> getCell(Position position);
-    public void addElement(Element element);
+    public Boolean addElement(Element element);
     public void removeElement(Element element);
     public Map<Position, List<Position>> getNeighbors();
     public List<Position> getNeighbor(Position position);
     public int getStep();
     public void setStep(int step);
     public void initialize();
-
+    public int getColumnCount();
+    public int getRowCount();
 }
diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java
index cbc141be22a3a3c0df53a946243dd91f6c843518..1e8f9bf631a687eabcb32bc2c546bc4c9901d2fc 100644
--- a/src/main/java/model/Cloud.java
+++ b/src/main/java/model/Cloud.java
@@ -22,7 +22,13 @@ public Position getPosition() {
 public ModelElement getType() {
         return type;
         }
-@Override
+
+        @Override
+        public Behavior getBehavior() {
+                return behavior;
+        }
+
+        @Override
 public List<Position> updateSelf(BoardData boardData) {
         List<Position> positions=behavior.update(boardData,this);
         List<Position> modifPositions=new ArrayList<>(positions);
diff --git a/src/main/java/model/Element.java b/src/main/java/model/Element.java
index c07f6c105fc11219a9ab81b930f2ae0e80e86977..014f446ae0ca7a4e62c824edf8762d06286c1a8c 100644
--- a/src/main/java/model/Element.java
+++ b/src/main/java/model/Element.java
@@ -5,5 +5,6 @@ import util.Position;
 public interface Element {
     Position getPosition();
     ModelElement getType();
+    Behavior getBehavior();
 
 }
diff --git a/src/main/java/model/ElementFactory.java b/src/main/java/model/ElementFactory.java
index 0447cc41ce5c14f11773df2f205d22027a757d92..b634d40630f74e226692a8f747864100195917a6 100644
--- a/src/main/java/model/ElementFactory.java
+++ b/src/main/java/model/ElementFactory.java
@@ -2,10 +2,11 @@ package model;
 
 import util.Position;
 
-public class ElementFactory {
-    //this is using the factoryMethod design pattern (I'm writing this it just in case )
-    public static Element createElement(BoardData boardData,ModelElement modelElement, Position position){
-        return modelElement.instanciate(position);
-    }
+import java.util.List;
+import java.util.Map;
+
+public interface ElementFactory {
+    public ModelElement getNewType(BoardData boardData, Position position);
+    public Element getNewElement(BoardData boardData, Position position);
 
 }
diff --git a/src/main/java/model/FFBoard.java b/src/main/java/model/FFBoard.java
index bf5baf0217f8b05d18f7a291e964952eb86d1c8a..6134a3dac511a0578ae1d283cbc694b45eaac9bb 100644
--- a/src/main/java/model/FFBoard.java
+++ b/src/main/java/model/FFBoard.java
@@ -29,17 +29,15 @@ public class FFBoard implements Board<List<ModelElement>> {
   public void initializeElements() {
     boardData.initialize();
     FFUpdater= new FFUpdater();
-    for (int index = 0; index < initialFireCount; index++)
-      boardData.addElement(new StandardFire(randomPosition()));
-     /*for (int index = 0; index < initialFirefighterCount; index++)
-       boardData.addElement(new StandardFireFighter(randomPosition()));
-    for (int index = 0; index < 2; index++)
-      boardData.addElement(new MotorizedFireFighter(randomPosition()));
-    for (int index = 0; index < 10; index++)
-      boardData.addElement(new Cloud(randomPosition()));*/
-    for (int index = 0; index < 1000; index++)
-      boardData.addElement(new Rock(randomPosition()));
-
+    FFboardFiller filler=new FFboardFiller();
+    filler.fillBoard(boardData,new int[]{
+            5,//firefighter
+            2,//motorized firefighter
+            3,//clouds
+            10,//mountains
+            5,//roads
+            10,//rocks
+            10});//fires
   }
 
   private Position randomPosition() {
diff --git a/src/main/java/model/FFBoardData.java b/src/main/java/model/FFBoardData.java
index 6b21770128f75b952b0303d8464c18df2397857c..37a3fbf12d7d0d26b641effb109758e9e3f1e3ed 100644
--- a/src/main/java/model/FFBoardData.java
+++ b/src/main/java/model/FFBoardData.java
@@ -9,7 +9,7 @@ public class FFBoardData implements BoardData{
     private List<List<Element>> elementList;
     private Map<Position, List<Position>> neighbors = new HashMap<Position, List<Position>>();
     private int step;
-    private int columnCount,rowCount;
+    public int columnCount,rowCount;
     private List<List<Cell<Element>>> cells;
     public FFBoardData(int columnCount, int rowCount) {
         this.columnCount=columnCount;
@@ -43,6 +43,16 @@ public class FFBoardData implements BoardData{
         }
     }
 
+    @Override
+    public int getColumnCount() {
+        return columnCount;
+    }
+
+    @Override
+    public int getRowCount() {
+        return rowCount;
+    }
+
 
     @Override
     public List<List<Element>> getElements() {
@@ -66,13 +76,17 @@ public class FFBoardData implements BoardData{
     public List<Position> getNeighbor(Position position) {
         return neighbors.get(position);
     }
-    public void addElement(Element element){
-        if(element!=null)
-        {
-            elementList.get(element.getType().ordinal()).add(element);
-            getCell(element.getPosition()).Content.add(element);
-            FFUpdater.modifiedPositions.add(element.getPosition());
-        }
+    public Boolean addElement(Element element){
+        if(element==null){ return false;}
+        if (element.getBehavior()!=null)
+            if (element.getBehavior() instanceof TangibleBehavior<?>)
+                if (!((TangibleBehavior)element.getBehavior()).isLegal(this,element.getPosition()))
+                    return false;
+        System.out.println(element.getType());
+        elementList.get(element.getType().ordinal()).add(element);
+        getCell(element.getPosition()).Content.add(element);
+        FFUpdater.modifiedPositions.add(element.getPosition());
+        return true;
     }
     public void removeElement(Element element){
         FFUpdater.modifiedPositions.add(element.getPosition());
diff --git a/src/main/java/model/FFUpdater.java b/src/main/java/model/FFUpdater.java
index 26f5d4cd426950ea704ac44920dc59ed389a11cd..f3f8ab4600de709c4cbdaf1311fdb20e16437716 100644
--- a/src/main/java/model/FFUpdater.java
+++ b/src/main/java/model/FFUpdater.java
@@ -18,7 +18,6 @@ public class FFUpdater implements Updater {
         updatables.clear();
         modifiedPositions=new ArrayList<Position>();
         for (ModelElement modelElement: ModelElement.values()) {
-        System.out.println(modelElement+" "+modelElement.isUpdatable());
         if (modelElement.isUpdatable())
             for (Element e:boardData.getElements().get(modelElement.ordinal())) {
                 updatables.add((Updatable) e);
diff --git a/src/main/java/model/FFboardFiller.java b/src/main/java/model/FFboardFiller.java
new file mode 100644
index 0000000000000000000000000000000000000000..b552d3bb177f5062ceef7c6aab289c750892b090
--- /dev/null
+++ b/src/main/java/model/FFboardFiller.java
@@ -0,0 +1,25 @@
+package model;
+
+import util.Position;
+import view.ViewElement;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Modifier;
+import java.util.Random;
+
+public class FFboardFiller {
+    Random random=new Random();
+    public void fillBoard(BoardData boardData,int[] counter){
+        for(ViewElement ve:ViewElement.values()){
+            if (ve!=ViewElement.EMPTY)
+            while(counter[ve.ordinal()]>0) {
+                Element element;
+                do {
+                    Position p=new Position(random.nextInt(boardData.getRowCount()), random.nextInt(boardData.getColumnCount()));
+                    element= ve.instanciate(boardData,p);
+                }while (!boardData.addElement(element));
+                counter[ve.ordinal()]--;
+            }
+        }
+    }
+}
diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java
index 9e9cf5d78d876be75943a741830196fbd5ba01dd..c83de9d9fd0345fb764dbd7c1d47199cd9da251c 100644
--- a/src/main/java/model/Fire.java
+++ b/src/main/java/model/Fire.java
@@ -7,22 +7,20 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Stream;
 
-public abstract class Fire implements Element,Updatable,Printable{
+public abstract class Fire implements Element,Updatable,Printable,ZoneDependent{
     int counter;
     int delay;
     ModelElement type;
     Position position;
     static Behavior behavior=new FireBehavior();
-    static Map<ModelElement,ModelElement> fireDictionary=new HashMap<>();
-     //.put(MAISON,FEUMAISON)
+    public static FireFactory factory=new FireFactory();
 
     public Fire(int delay, ModelElement type, Position position) {
         this.counter=0;
         this.delay = delay;
         this.type = type;
         this.position = position;
-        fireDictionary.put(ModelElement.ROCK,ModelElement.SLOWFIRE);
-        fireDictionary.put(ModelElement.MOUNTAIN,null);
+
     }
     @Override
     public Position getPosition() {
@@ -32,21 +30,24 @@ public abstract class Fire implements Element,Updatable,Printable{
     public ModelElement getType() {
         return type;
     }
-    public static Fire getNewFireByType(BoardData boardData, Position position){
-        List<ModelElement> s = boardData.getCell(position).Content.stream().map(x -> x.getType()).toList();
-        for(Map.Entry<ModelElement,ModelElement> entry: fireDictionary.entrySet()){
-            System.out.println(entry.toString()+" "+s.contains(entry.getKey())+" "+entry.getValue());
-            if (s.contains(entry.getKey())) return (Fire) entry.getValue().instanciate(position);
-        }
-        return new StandardFire(position);
-    }
+
     @Override
     public List<Position> updateSelf(BoardData boardData) {
         counter++;
         List<Position> positions=behavior.update(boardData,this);
         for (Position p:positions) {
-            boardData.addElement(getNewFireByType(boardData,p));
+            boardData.addElement(getFactory().getNewElement(boardData,p));
         }
         return positions;
     }
+
+    @Override
+    public ElementFactory getFactory() {
+        return factory;
+    }
+
+    @Override
+    public Behavior getBehavior() {
+        return behavior;
+    }
 }
diff --git a/src/main/java/model/FireBehavior.java b/src/main/java/model/FireBehavior.java
index a321873b1098480bb3aec961c4a7abb3b2a5b8be..c75a0d372cfe4e1ccf4b514ee23392c47a3cd33f 100644
--- a/src/main/java/model/FireBehavior.java
+++ b/src/main/java/model/FireBehavior.java
@@ -22,12 +22,8 @@ public class FireBehavior extends FFBehavior  implements TangibleBehavior<ModelE
         public List<Position> legalNeighbors(BoardData boardData,Position position) {
             List<Position> neighbors=new ArrayList<>(boardData.getNeighbor(position));
             for (Position p:boardData.getNeighbor(position)) {
-                for (Element e:boardData.getCell(p).Content) {
-                    if (e instanceof Fire) neighbors.remove(p);
-                    for(ModelElement o:getObstacles())
-                        if (e.getType()==o) neighbors.remove(p);
+                if (!isLegal(boardData,p)) neighbors.remove(p);
                 }
-            }
             return neighbors;
         }
     @Override
@@ -40,38 +36,19 @@ public class FireBehavior extends FFBehavior  implements TangibleBehavior<ModelE
             return neighbors;
     }
 
-    @Override
-    public List<ModelElement> getObstacles() {
-        return obstacles;
-    }
-    /*@Override
-    public List<Position> getNext(BoardData boardData) {
-        List<Position> firePositions = boardData.getPositions().get(element.ordinal());
-        List<Position> newFirePositions = new ArrayList<>();
-        if (boardData.getStep() % 2 == 0) {
-            for (Position fire : firePositions) {
-                for (Position neighbor:legalNeighbors(boardData).get(fire)) {
-                if (!newFirePositions.contains(neighbor))
-                    newFirePositions.add(neighbor);
-                }
-            }
-        }
-        return newFirePositions;
-    }
-
     @Override
     public List<ModelElement> getObstacles() {
         return obstacles;
     }
 
     @Override
-    public Map<Position, List<Position>> legalNeighbors(BoardData boardData) {
-        Map<Position,List<Position>> neigbors= super.legalNeighbors(boardData);
-        for (Map.Entry<Position,List<Position>> entry: neigbors.entrySet()) {
-            for (ModelElement e:getObstacles()) {
-                entry.getValue().removeAll(boardData.getPositions().get(e.ordinal()));
-            }
+    public Boolean isLegal(BoardData boardData,Position position) {
+        System.out.println("is legal");
+        for (Element e:boardData.getCell(position).Content) {
+            if (e instanceof Fire) return false;
+            for(ModelElement o:getObstacles())
+                if (e.getType()==o) return false;
         }
-        return neigbors;
-    }*/
+        return true;
+    }
 }
diff --git a/src/main/java/model/FireFactory.java b/src/main/java/model/FireFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..cb54c47dfd98d7cf62978866bfb51da82f68531c
--- /dev/null
+++ b/src/main/java/model/FireFactory.java
@@ -0,0 +1,30 @@
+package model;
+
+import util.Position;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class FireFactory implements ElementFactory{
+    static Map<ModelElement,ModelElement> fireDictionary=new HashMap<>();
+    static{
+        fireDictionary.put(ModelElement.ROCK,ModelElement.SLOWFIRE);
+    }
+    public ModelElement getNewType(BoardData boardData, Position position){
+        List<ModelElement> s = boardData.getCell(position).Content.stream().map(x -> x.getType()).toList();
+        System.out.println("getnewtype");
+        for(Map.Entry<ModelElement,ModelElement> entry: fireDictionary.entrySet()){
+            if (s.contains(entry.getKey())) return entry.getValue();
+        }
+        return ModelElement.FIRE;
+    }
+    public Element getNewElement(BoardData boardData, Position position){
+        List<ModelElement> s = boardData.getCell(position).Content.stream().map(x -> x.getType()).toList();
+        System.out.println("getnewtype");
+        for(Map.Entry<ModelElement,ModelElement> entry: fireDictionary.entrySet()){
+            if (s.contains(entry.getKey())) return entry.getValue().instanciate(position);
+        }
+        return new StandardFireFighter(position);
+    }
+}
diff --git a/src/main/java/model/FireFighter.java b/src/main/java/model/FireFighter.java
index dbebf1bfba19a73422e634a4f56e56ee13fecd35..c3db79510b5bd5a41c2c71ae9194d23fc93301b6 100644
--- a/src/main/java/model/FireFighter.java
+++ b/src/main/java/model/FireFighter.java
@@ -37,4 +37,9 @@ public List<Position> updateSelf(BoardData boardData) {
         }
         return modifPositions;
         }
+
+        @Override
+        public Behavior getBehavior() {
+                return behavior;
+        }
 }
diff --git a/src/main/java/model/FireFighterBehavior.java b/src/main/java/model/FireFighterBehavior.java
index d6b517acc4983dcd670246cca0f13b59f8c017dc..f1cb00d20460593fd8cf37ebf55ac4dd64a99649 100644
--- a/src/main/java/model/FireFighterBehavior.java
+++ b/src/main/java/model/FireFighterBehavior.java
@@ -37,6 +37,15 @@ public class FireFighterBehavior extends FFBehavior implements TangibleBehavior<
         return obstacles;
     }
 
+    @Override
+    public Boolean isLegal(BoardData boardData, Position position) {
+        for (Element e:boardData.getCell(position).Content) {
+            for(ModelElement o:getObstacles())
+                if (e.getType()==o) return false;
+        }
+        return  true;
+    }
+
     public void extinguish(BoardData boardData, Position position){
         List<Position> l=new ArrayList<>(legalNeighbors(boardData,position));
         l.add(position);
@@ -52,11 +61,8 @@ public class FireFighterBehavior extends FFBehavior implements TangibleBehavior<
     public List<Position> legalNeighbors(BoardData boardData,Position position) {
         List<Position> neighbors=new ArrayList<>(boardData.getNeighbor(position));
         for (Position p:boardData.getNeighbor(position)) {
-            for (Element e:boardData.getCell(p).Content) {
-                for(ModelElement o:getObstacles())
-                    if (e.getType()==o) neighbors.remove(p);
+            if (!isLegal(boardData,p)) neighbors.remove(p);
             }
-        }
         return neighbors;
     }
     @Override
diff --git a/src/main/java/model/Land.java b/src/main/java/model/Land.java
index 07fb949a101c756a24b5064df125baa27b4bd799..0bc0183fd3937bdee7abce53ea620b0bc595b725 100644
--- a/src/main/java/model/Land.java
+++ b/src/main/java/model/Land.java
@@ -20,4 +20,8 @@ public abstract class Land implements Element ,Printable{
         return type;
     }
 
+    @Override
+    public Behavior getBehavior() {
+        return null;
+    }
 }
diff --git a/src/main/java/model/TangibleBehavior.java b/src/main/java/model/TangibleBehavior.java
index 9ca6669215ee1edabd510b27591e8ac4ec02b94e..8aaa13c3f58d34411a364d3289508851437ac5bf 100644
--- a/src/main/java/model/TangibleBehavior.java
+++ b/src/main/java/model/TangibleBehavior.java
@@ -6,4 +6,5 @@ import java.util.List;
 
 public interface TangibleBehavior<E> extends Behavior {
     public List<E> getObstacles();
+    public Boolean isLegal(BoardData boardData,Position position);
 }
diff --git a/src/main/java/model/ZoneDependent.java b/src/main/java/model/ZoneDependent.java
new file mode 100644
index 0000000000000000000000000000000000000000..19e501e1a244edf9b8f555d6e3848ef9dac643c4
--- /dev/null
+++ b/src/main/java/model/ZoneDependent.java
@@ -0,0 +1,10 @@
+package model;
+
+import util.Position;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ZoneDependent {
+    public ElementFactory getFactory();
+}
diff --git a/src/main/java/view/ViewElement.java b/src/main/java/view/ViewElement.java
index a070081c774f71adb7e63157061cdd6f6ee06cc2..b5c4762b1fccda9b52b6eff6390d6cbb1df7f5fe 100644
--- a/src/main/java/view/ViewElement.java
+++ b/src/main/java/view/ViewElement.java
@@ -2,13 +2,54 @@ package view;
 
 import javafx.scene.paint.Color;
 import model.*;
+import util.Position;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 
 public enum ViewElement {
-  FIREFIGHTER(Color.BLUE, StandardFireFighter.class), MOTORIZEDFIREFIGHTER(Color.DARKBLUE, MotorizedFireFighter.class), FIRE(Color.RED,Fire.class),CLOUD(Color.GRAY, Cloud.class)  ,MOUNTAIN(Color.BROWN, Mountain.class),ROAD(Color.BLACK, Road.class),ROCK(Color.LIGHTYELLOW, Rock.class), EMPTY(Color.WHITE, null);
+  FIREFIGHTER(Color.BLUE, StandardFireFighter.class),
+  MOTORIZEDFIREFIGHTER(Color.DARKBLUE, MotorizedFireFighter.class),
+  CLOUD(Color.GRAY, Cloud.class)  ,
+  MOUNTAIN(Color.BROWN, Mountain.class),
+  ROAD(Color.BLACK, Road.class),
+  ROCK(Color.LIGHTYELLOW, Rock.class),
+  FIRE(Color.RED,Fire.class,Fire.factory),
+  EMPTY(Color.WHITE, null);
   final Color color;
   public final Class<?> c;
+  final ElementFactory elementFactory;
   ViewElement(Color color, Class<?> c) {
     this.color = color;
     this.c = c;
+    this.elementFactory=null;
+  }
+  ViewElement(Color color, Class<?> c,ElementFactory elementFactory) {
+    this.color = color;
+    this.c = c;
+    this.elementFactory=elementFactory;
+  }
+  public Element instanciate(BoardData boardData,Position position){
+    Element element;
+      Class<?>[] arg2=new Class[]{BoardData.class,Position.class};
+      Class<?>[] arg1=new Class[]{Position.class};
+      if (elementFactory!=null) {
+        element=elementFactory.getNewElement(boardData,position);
+      }
+      else {
+        try {
+          element=(Element)this.c.getDeclaredConstructor(arg1).newInstance(position);
+        } catch (InstantiationException e) {
+          throw new RuntimeException(e);
+        } catch (IllegalAccessException e) {
+          throw new RuntimeException(e);
+        } catch (InvocationTargetException e) {
+          throw new RuntimeException(e);
+        } catch (NoSuchMethodException e) {
+          throw new RuntimeException(e);
+        }
+      }
+      return element;
   }
 }