diff --git a/src/main/java/model/Board.java b/src/main/java/model/Board.java
index cf0d9686e7d14ad05a92f7e3203adb32eda4f9d8..f5686246697e6c6f4339e6b2be9bc4e99008b0e8 100644
--- a/src/main/java/model/Board.java
+++ b/src/main/java/model/Board.java
@@ -1,5 +1,6 @@
 package model;
 
+import util.Neighbour;
 import util.Position;
 
 import java.util.List;
@@ -35,6 +36,7 @@ public interface Board<S> {
   Map<Position, Extinguisher> getExtinguishers();
 
   Map<Position, Fire> getFires();
+   Neighbour getNeighbor();
 
 
   /**
diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java
index bf1c2312da8d46722ce80edb5a2e6fbf8f604a5f..c11fd8bcfd1c9a3ca572aa70b0777ff95adcb81e 100644
--- a/src/main/java/model/Cloud.java
+++ b/src/main/java/model/Cloud.java
@@ -13,17 +13,17 @@ public class Cloud extends Extinguisher {
         element = ModelElement.CLOUD;
     }
 
-    public List<Position>update(FirefighterBoard firefighterBoard){
+    public List<Position>update(Board<List<ModelElement>> firefighterBoard){
         List<Position> modifiedPositions = new ArrayList<>();
 
         Position currentPosition = this.getPosition();
-        Position newPosition = firefighterBoard.randomNeighbor(currentPosition);
+        Position newPosition = firefighterBoard.getNeighbor().randomNeighbor(currentPosition);
         this.setPosition(newPosition);
         modifiedPositions.add(currentPosition);
         modifiedPositions.add(newPosition);
 
 
-        firefighterBoard.extinguish(newPosition);
+        extinguish(firefighterBoard,newPosition);
 
         return modifiedPositions;
     }
diff --git a/src/main/java/model/Element.java b/src/main/java/model/Element.java
index 8f6d84dfa00f113ef859682b5495612d11d01d9c..e4a3b0b8606ba3c7937cd877e8508c1071810ad2 100644
--- a/src/main/java/model/Element.java
+++ b/src/main/java/model/Element.java
@@ -12,6 +12,6 @@ public interface Element {
 
     ModelElement getElement();
 
-    List<Position> update(FirefighterBoard firefighterBoard);
+    List<Position> update(Board<List<ModelElement>> firefighterBoard);
 
 }
diff --git a/src/main/java/model/Extinguisher.java b/src/main/java/model/Extinguisher.java
index c40981f3a8ac611dc397389073a0ed8b02249322..9c7904801936be7e3e13695d0054f30e45d81802 100644
--- a/src/main/java/model/Extinguisher.java
+++ b/src/main/java/model/Extinguisher.java
@@ -37,6 +37,6 @@ public abstract class Extinguisher implements Element{
 
     }
 
-    public abstract List<Position> update(FirefighterBoard firefighterBoard);
+    public abstract List<Position> update(Board<List<ModelElement>> firefighterBoard);
 
 }
diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java
index edc20746815c90857cf07a103c63147a65e38f79..157258a8a47c702ef48eb83cf336493d78e6225e 100644
--- a/src/main/java/model/Fire.java
+++ b/src/main/java/model/Fire.java
@@ -33,15 +33,15 @@ public class Fire implements Element {
     }
 
 
-    public List<Position> update(FirefighterBoard firefighterBoard) {
+    public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
         List<Position> modifiedPositions = new ArrayList<>();
         if (firefighterBoard.stepNumber() % 2 == 0) {
             Set<Position> newFirePositions = new HashSet<>();
             for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) {
-                List<Position> neighboursAvaiable = firefighterBoard.getNeighbors().get(fire);
+                List<Position> neighboursAvaiable = firefighterBoard.getNeighbor().getNeighbors().get(fire);
                 neighboursAvaiable.removeAll(firefighterBoard.getObstacles().keySet());
 
-                newFirePositions.addAll(firefighterBoard.getNeighbors().get(fire));
+                newFirePositions.addAll(firefighterBoard.getNeighbor().getNeighbors().get(fire));
             }
 
 
diff --git a/src/main/java/model/FireFighter.java b/src/main/java/model/FireFighter.java
index 139a030f7a0f149840b749ce7a35e062ca262118..96fddbfc0ccaec446cfd264994326d249a7791fd 100644
--- a/src/main/java/model/FireFighter.java
+++ b/src/main/java/model/FireFighter.java
@@ -21,20 +21,20 @@ public class FireFighter extends Extinguisher {
     }
 
 
-    public List<Position> update(FirefighterBoard firefighterBoard){
+    public List<Position> update(Board<List<ModelElement>> firefighterBoard){
         List<Position> modifiedPositions = new ArrayList<>();
 
         Position currentPosition = this.getPosition();
-        Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, firefighterBoard.getFires().keySet(), firefighterBoard.getNeighbors());
+        Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, firefighterBoard.getFires().keySet(), firefighterBoard.getNeighbor().getNeighbors());
 
         this.setPosition(newPosition);
         modifiedPositions.add(currentPosition);
         modifiedPositions.add(newPosition);
 
-        firefighterBoard.extinguish(newPosition);
+        extinguish(firefighterBoard,newPosition);
 
-        for (Position neighbor : firefighterBoard.getNeighbors().get(newPosition)) {
-            firefighterBoard.extinguish(neighbor);
+        for (Position neighbor : firefighterBoard.getNeighbor().getNeighbors().get(newPosition)) {
+            extinguish(firefighterBoard,neighbor);
             modifiedPositions.add(neighbor);
         }
 
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index 1aaa4f23fa21611a66e1ab44b58d1124bd6ed7e3..b58ba0bde7dc7b0d18d4a1ab85e779d46fa8d9bc 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -1,5 +1,6 @@
 package model;
 
+import util.Neighbour;
 import util.Position;
 import util.TargetStrategy;
 
@@ -18,8 +19,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   private Map<Position, Fire> fires = new HashMap<>();
   private Map<Position, Extinguisher> extinguishers = new HashMap<>();
   private Map<Position, Obstacle> obstacles = new HashMap<>();
+  private final Neighbour neighbour;
 
-  private final Map<Position, List<Position>> neighbors = new HashMap<>();
   private final Position[][] positions;
   private int step = 0;
   private final Random randomGenerator = new Random();
@@ -28,8 +29,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     this.columnCount = columnCount;
     this.rowCount = rowCount;
     this.positions = new Position[rowCount][columnCount];
-
-    initializePositionsAndNeighbors();
+    this.neighbour = new Neighbour(this);
+    initializePositions();
 
     this.initialFireCount = initialFireCount;
     this.initialFirefighterCount = initialFirefighterCount;
@@ -38,61 +39,37 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     initializeElements();
   }
 
-  private void initializePositionsAndNeighbors() {
+  private void initializePositions() {
     for (int column = 0; column < columnCount; column++) {
       for (int row = 0; row < rowCount; row++) {
         positions[row][column] = new Position(row, column);
       }
     }
-
-    for (int column = 0; column < columnCount; column++) {
-      for (int row = 0; row < rowCount; row++) {
-        neighbors.put(positions[row][column], calculateNeighbors(row, column));
-      }
-    }
-  }
-
-  private List<Position> calculateNeighbors(int row, int column) {
-    List<Position> list = new ArrayList<>();
-    if (row > 0) list.add(positions[row - 1][column]);
-    if (column > 0) list.add(positions[row][column - 1]);
-    if (row < rowCount - 1) list.add(positions[row + 1][column]);
-    if (column < columnCount - 1) list.add(positions[row][column + 1]);
-    return list;
   }
 
   public void initializeElements() {
-
-
   fires.clear();
   extinguishers.clear();
   obstacles.clear();
 
-
-
-
     for (int index = 0; index < initialFireCount; index++) {
       Position position = randomPosition();
       fires.put(position,new Fire(position));
-
-
     }
 
     for (int index = 0; index < initialFirefighterCount; index++) {
       Position position = randomPosition();
       extinguishers.put(position,new FireFighter(position));
-
     }
+
     for (int index = 0; index < initialCloudCount; index++) {
       Position position = randomPosition();
       extinguishers.put(position,new Cloud(position));
-
     }
 
     for (int index = 0; index < initialRoadCount; index++) {
       Position position = randomPosition();
       obstacles.put(position,new Road(position));
-
     }
 
   }
@@ -115,17 +92,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
       if (obstacle.getPosition().equals(position)) result.add(obstacle.getElement());
     }
 
-
     return result;
   }
 
-
-  Position randomNeighbor(Position position) {
-    List<Position> neighborPositions = neighbors.get(position);
-    return neighborPositions.get(randomGenerator.nextInt(neighborPositions.size()));
-  }
-
-
   @Override
   public int rowCount() {
     return rowCount;
@@ -136,6 +105,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     return columnCount;
   }
 
+
+
   public List<Position> updateToNextGeneration() {
 
     Fire fire = new Fire(randomPosition());
@@ -144,18 +115,15 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     for(Extinguisher element : extinguishers.values()){
       modifiedPositions.addAll(element.update(this));
     }
-
-
     modifiedPositions.addAll(fire.update(this));
 
-
     step++;
     return modifiedPositions;
   }
 
 
-  public Map<Position, List<Position>> getNeighbors() {
-    return neighbors;
+  public Neighbour getNeighbor() {
+    return neighbour;
   }
 
   @Override
@@ -167,9 +135,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
 
 
   public Map<Position,Fire>getFires(){
-
     return this.fires;
-
   }
 
   @Override
@@ -181,25 +147,22 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     return obstacles;
   }
 
+
   @Override
   public void reset() {
     step = 0;
     initializeElements();
   }
 
-  public void extinguish(Position position) {
-    if (this.fires.containsKey(position)) {
-      this.fires.remove(position);
-    }
 
-  }
 
 
   @Override
   public void setState(List<ModelElement> state, Position position) {
-    extinguish(position);
+
     if(extinguishers.containsKey(position)){
       extinguishers.remove(position);
+      extinguishers.get(position).extinguish(this,position);
     }
 
 
diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java
index b441468ecdb207a1e981278f4a2a7c19be8a46a1..b151e953b94e3d7e59d53e28dfbe60e866359ad9 100644
--- a/src/main/java/model/ModelElement.java
+++ b/src/main/java/model/ModelElement.java
@@ -1,9 +1,14 @@
 package model;
 
 public enum ModelElement {
-  FIREFIGHTER,
-  FIRE,
-  CLOUD,
-  ROAD;
+
+  FIREFIGHTER(10),
+  FIRE(10),
+  CLOUD(10),
+  ROAD(5);
+
+  ModelElement(int initialNumber) {
+
+  }
 }
 
diff --git a/src/main/java/model/Obstacle.java b/src/main/java/model/Obstacle.java
index b9347496ea1b97ab06493d0f376b0ff33fcfc6d2..f4e8cf358c491db9c46e73d69787ae9cac63b3f1 100644
--- a/src/main/java/model/Obstacle.java
+++ b/src/main/java/model/Obstacle.java
@@ -25,10 +25,9 @@ public abstract class Obstacle implements Element{
         return this.element;
     }
 
-    @Override
-    public List<Position> update(FirefighterBoard firefighterBoard) {
-        List<Position>positionList = new ArrayList<>();
-        return positionList;
+
+    public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
+        return null;
     }