diff --git a/src/main/java/model/AbstractGrid.java b/src/main/java/model/AbstractGrid.java
index 0f468c9fc6d3b9d07d2c84d848ba8fa2d911005f..90e5b54bfcd8db8bfbf217e8b960ee71fafaa15e 100644
--- a/src/main/java/model/AbstractGrid.java
+++ b/src/main/java/model/AbstractGrid.java
@@ -3,10 +3,17 @@ package model;
 import java.util.Iterator;
 
 public abstract class AbstractGrid implements Grid {
-
   protected final int numberOfRows;
   protected final int numberOfColumns;
 
+  /**
+   * Creates a new {@code Grid} instance given the number of rows and columns.
+   *
+   * @param numberOfRows    the number of rows
+   * @param numberOfColumns the number of columns
+   * @throws IllegalArgumentException if {@code numberOfRows} or {@code numberOfColumns} are
+   *                                  less than or equal to 0
+   */
   public AbstractGrid(int numberOfRows, int numberOfColumns) {
     if(numberOfRows <= 0)
       throw new IllegalArgumentException("The number of rows must be positive and not equal to " + numberOfRows);
diff --git a/src/main/java/model/ArrayGrid.java b/src/main/java/model/ArrayGrid.java
index 5c958ea713c6900c1649cd84505ed69b78081e08..413999546a29c268876200133e9f7210c2c17974 100644
--- a/src/main/java/model/ArrayGrid.java
+++ b/src/main/java/model/ArrayGrid.java
@@ -2,14 +2,7 @@ package model;
 
 public class ArrayGrid extends AbstractGrid {
   private final Square[][] squares;
-  /**
-   * Creates a new {@code Grid} instance given the number of rows and columns.
-   *
-   * @param numberOfRows    the number of rows
-   * @param numberOfColumns the number of columns
-   * @throws IllegalArgumentException if {@code numberOfRows} or {@code numberOfColumns} are
-   *                                  less than or equal to 0
-   */
+
   public ArrayGrid(int numberOfRows, int numberOfColumns) {
     super(numberOfRows, numberOfColumns);
     squares = new ArraySquare[getNumberOfRows()][getNumberOfColumns()];
diff --git a/src/main/java/model/ListGrid.java b/src/main/java/model/ListGrid.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9e9bdfd6c5eb2afddb2ae7315bb87f56be704e2
--- /dev/null
+++ b/src/main/java/model/ListGrid.java
@@ -0,0 +1,29 @@
+package model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ListGrid extends AbstractGrid{
+  private final List<List<Square>> squares;
+
+  public ListGrid(int numberOfRows, int numberOfColumns) {
+    super(numberOfRows, numberOfColumns);
+    squares = new ArrayList<>();
+    initializeGrid();
+  }
+
+  @Override
+  protected void initializeSquares() {
+    for(int row = 0; row < getNumberOfRows(); row++){
+      List<Square> squareRow = new ArrayList<>();
+      for(int column = 0; column < getNumberOfColumns(); column++)
+        squareRow.add(new ArraySquare());
+      squares.add(squareRow);
+    }
+  }
+
+  @Override
+  public Square getSquare(int rowIndex, int columnIndex) {
+    return squares.get(rowIndex).get(columnIndex);
+  }
+}
diff --git a/src/main/java/view/GridCanvas.java b/src/main/java/view/GridCanvas.java
index 914ac364ea2797f57839cff62a02bd1d1efaeb21..0ace2bf63d82631c8b7867870a2cd86459d99c61 100644
--- a/src/main/java/view/GridCanvas.java
+++ b/src/main/java/view/GridCanvas.java
@@ -26,7 +26,7 @@ public class GridCanvas extends Canvas {
     this.numberOfRows = numberOfRows;
     this.setWidth(tileWidth * numberOfColumns);
     this.setHeight(tileHeight * numberOfRows);
-    grid = new ArrayGrid(numberOfRows, numberOfColumns);
+    grid = new ListGrid(numberOfRows, numberOfColumns);
     graphicsContext = getGraphicsContext2D();
   }
 
diff --git a/src/test/java/model/ListGridTest.java b/src/test/java/model/ListGridTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1ed4a8da0d1284bc36e31705f4a9bb104328462
--- /dev/null
+++ b/src/test/java/model/ListGridTest.java
@@ -0,0 +1,68 @@
+package model;
+
+import javafx.scene.paint.Color;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.Iterator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ListGridTest {
+  Grid arrayGridThreeTimesFour;
+  @BeforeEach
+  void initializeGrid(){
+    arrayGridThreeTimesFour = new ListGrid(3, 4);
+  }
+
+  @Test
+  void testGetNumberOfRows(){
+    assertThat(arrayGridThreeTimesFour.getNumberOfRows()).isEqualTo(3);
+  }
+
+  @Test
+  void testGetNumberOfColumns(){
+    assertThat(arrayGridThreeTimesFour.getNumberOfColumns()).isEqualTo(4);
+  }
+
+  @Test
+  void testSquaresAreNotNull_afterConstruction(){
+    for(int row = 0; row < arrayGridThreeTimesFour.getNumberOfRows(); row++)
+      for(int column = 0; column < arrayGridThreeTimesFour.getNumberOfColumns(); column++)
+        assertThat(arrayGridThreeTimesFour.getSquare(row,column)).isNotNull();
+  }
+
+  @Test
+  void testNeighbor(){
+    Square square22 = arrayGridThreeTimesFour.getSquare(2,2);
+    assertThat(square22.getNeighbor(CardinalDirection.NORTH))
+            .isEqualTo(arrayGridThreeTimesFour.getSquare(1, 2));
+    assertThat(square22.getNeighbor(CardinalDirection.EAST))
+            .isEqualTo(arrayGridThreeTimesFour.getSquare(2, 3));
+    assertThat(square22.getNeighbor(CardinalDirection.SOUTH))
+            .isEqualTo(EmptySquare.EMPTY_SQUARE);
+    assertThat(square22.getNeighbor(CardinalDirection.WEST))
+            .isEqualTo(arrayGridThreeTimesFour.getSquare(2, 1));
+  }
+
+  @Test
+  void testFill(){
+    Tile redTile = new UniformTile(new ColoredSide(Color.RED));
+    arrayGridThreeTimesFour.fill(square -> redTile);
+    for(int row = 0; row < arrayGridThreeTimesFour.getNumberOfRows(); row++)
+      for(int column = 0; column < arrayGridThreeTimesFour.getNumberOfColumns(); column++)
+        assertThat(arrayGridThreeTimesFour.getSquare(row,column).getTile()).isEqualTo(redTile);
+  }
+
+  @Test
+  void testIterator(){
+    Iterator<Square> iterator = arrayGridThreeTimesFour.iterator();
+    assertThat(iterator.hasNext()).isTrue();
+    for(int row = 0; row < arrayGridThreeTimesFour.getNumberOfRows(); row++) {
+      for (int column = 0; column < arrayGridThreeTimesFour.getNumberOfColumns(); column++) {
+        assertThat(iterator.next()).isEqualTo(arrayGridThreeTimesFour.getSquare(row, column));
+      }
+    }
+    assertThat(iterator.hasNext()).isFalse();
+  }
+}
\ No newline at end of file