diff --git a/src/main/java/model/AbstractGrid.java b/src/main/java/model/AbstractGrid.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f468c9fc6d3b9d07d2c84d848ba8fa2d911005f
--- /dev/null
+++ b/src/main/java/model/AbstractGrid.java
@@ -0,0 +1,65 @@
+package model;
+
+import java.util.Iterator;
+
+public abstract class AbstractGrid implements Grid {
+
+  protected final int numberOfRows;
+  protected final int numberOfColumns;
+
+  public AbstractGrid(int numberOfRows, int numberOfColumns) {
+    if(numberOfRows <= 0)
+      throw new IllegalArgumentException("The number of rows must be positive and not equal to " + numberOfRows);
+    if(numberOfColumns <= 0)
+      throw new IllegalArgumentException("The number of columns must be positive and not equal to " + numberOfColumns);
+    this.numberOfRows = numberOfRows;
+    this.numberOfColumns = numberOfColumns;
+  }
+
+  protected void initializeGrid() {
+    initializeSquares();
+    initializeNeighborhood();
+  }
+
+  protected abstract void initializeSquares();
+
+  private void initializeNeighborhood() {
+    for(int row = 0; row < getNumberOfRows(); row++)
+      for(int column = 0; column < getNumberOfColumns(); column++) {
+          for (CardinalDirection direction : CardinalDirection.values()){
+            int rowNeighbor = row + direction.deltaRow;
+            int columnNeighbor = column + direction.deltaColumn;
+            Square neighboringSquare =
+                    containsCoordinates(rowNeighbor, columnNeighbor) ? getSquare(rowNeighbor, columnNeighbor) : EmptySquare.EMPTY_SQUARE;
+            getSquare(row, column).setNeighbor(neighboringSquare, direction);
+          }
+        }
+  }
+
+  private boolean containsCoordinates(int row, int column){
+    return  0 <= row && row < numberOfRows && 0 <= column && column < numberOfColumns;
+  }
+
+  /**
+   * Returns an iterator over Squares.
+   *
+   * @return an Iterator.
+   */
+  @Override
+  public Iterator<Square> iterator() {
+    return new SquareGridIterator(this);
+  }
+
+  public int getNumberOfRows() {
+    return numberOfRows;
+  }
+
+  public int getNumberOfColumns() {
+    return numberOfColumns;
+  }
+
+  public void fill(TileGenerator tileGenerator){
+    for(Square square : this)
+      square.put(tileGenerator.nextTile(square));
+  }
+}
diff --git a/src/main/java/model/ArrayGrid.java b/src/main/java/model/ArrayGrid.java
index 05783a225a43f066bdcc9b74ca5e35f64da42c8d..5c958ea713c6900c1649cd84505ed69b78081e08 100644
--- a/src/main/java/model/ArrayGrid.java
+++ b/src/main/java/model/ArrayGrid.java
@@ -1,9 +1,6 @@
 package model;
-import java.util.Iterator;
 
-public class ArrayGrid implements Grid {
-  private final int numberOfRows;
-  private final int numberOfColumns;
+public class ArrayGrid extends AbstractGrid {
   private final Square[][] squares;
   /**
    * Creates a new {@code Grid} instance given the number of rows and columns.
@@ -14,68 +11,19 @@ public class ArrayGrid implements Grid {
    *                                  less than or equal to 0
    */
   public ArrayGrid(int numberOfRows, int numberOfColumns) {
-    if(numberOfRows <= 0)
-      throw new IllegalArgumentException("The number of rows must be positive and not equal to " + numberOfRows);
-    if(numberOfColumns <= 0)
-      throw new IllegalArgumentException("The number of columns must be positive and not equal to " + numberOfColumns);
-    this.numberOfRows = numberOfRows;
-    this.numberOfColumns = numberOfColumns;
+    super(numberOfRows, numberOfColumns);
     squares = new ArraySquare[getNumberOfRows()][getNumberOfColumns()];
     initializeGrid();
   }
 
-  private void initializeGrid() {
-    initializeSquares();
-    initializeNeighborhood();
-  }
-
-  private void initializeSquares() {
+  @Override
+  protected void initializeSquares() {
     for(int row = 0; row < getNumberOfRows(); row++)
       for(int column = 0; column < getNumberOfColumns(); column++)
         squares[row][column] = new ArraySquare();
   }
 
-  private void initializeNeighborhood() {
-    for(int row = 0; row < getNumberOfRows(); row++)
-      for(int column = 0; column < getNumberOfColumns(); column++) {
-          for (CardinalDirection direction : CardinalDirection.values()){
-            int rowNeighbor = row + direction.deltaRow;
-            int columnNeighbor = column + direction.deltaColumn;
-            Square neighboringSquare =
-                    containsCoordinates(rowNeighbor, columnNeighbor) ? getSquare(rowNeighbor, columnNeighbor) : EmptySquare.EMPTY_SQUARE;
-            getSquare(row, column).setNeighbor(neighboringSquare, direction);
-          }
-        }
-  }
-
-  private boolean containsCoordinates(int row, int column){
-    return  0 <= row && row < numberOfRows && 0 <= column && column < numberOfColumns;
-  }
-
-  /**
-   * Returns an iterator over Squares.
-   *
-   * @return an Iterator.
-   */
-  @Override
-  public Iterator<Square> iterator() {
-    return new SquareGridIterator(this);
-  }
-
   public Square getSquare(int rowIndex, int columnIndex) {
     return squares[rowIndex][columnIndex];
   }
-
-  public int getNumberOfRows() {
-    return numberOfRows;
-  }
-
-  public int getNumberOfColumns() {
-    return numberOfColumns;
-  }
-
-  public void fill(TileGenerator tileGenerator){
-    for(Square square : this)
-      square.put(tileGenerator.nextTile(square));
-  }
 }
diff --git a/src/main/java/model/SquareGridIterator.java b/src/main/java/model/SquareGridIterator.java
index ae1dd2f307d4b7c952d086188b3ef81f6fdd2498..e364cea4929adfc03df98fbc27e997924b144fd3 100644
--- a/src/main/java/model/SquareGridIterator.java
+++ b/src/main/java/model/SquareGridIterator.java
@@ -5,9 +5,9 @@ import java.util.Iterator;
 public class SquareGridIterator implements Iterator<Square> {
   private int rowNext;
   private int columnNext;
-  private final ArrayGrid grid;
+  private final Grid grid;
 
-  SquareGridIterator(ArrayGrid grid) {
+  SquareGridIterator(Grid grid) {
     this.rowNext = 0;
     this.columnNext = 0;
     this.grid = grid;