diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index 32e565779e3dad6299bcfe582e6f5a85816ffd20..01dae37f19b1102256c299687b836feaa1a22775 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -1,6 +1,6 @@
 package controller;
 
-import datastruct.Coordinate;
+import matrix.Coordinate;
 import javafx.animation.Animation;
 import javafx.animation.KeyFrame;
 import javafx.animation.Timeline;
@@ -11,7 +11,6 @@ import javafx.scene.control.Label;
 import javafx.scene.control.ToggleButton;
 import javafx.scene.control.ToggleGroup;
 import javafx.util.Duration;
-import model.CellularAutomatonSimulation;
 import view.MatrixPane;
 
 import static java.util.Objects.requireNonNull;
diff --git a/src/main/java/controller/Simulation.java b/src/main/java/controller/Simulation.java
index 8c33146524a2ac98ab455a906ffbfa086ecfb61c..71e5d0ff43fcaaf0d7c317c253ad34bedd934f5c 100644
--- a/src/main/java/controller/Simulation.java
+++ b/src/main/java/controller/Simulation.java
@@ -1,6 +1,6 @@
 package controller;
 
-import datastruct.Coordinate;
+import matrix.Coordinate;
 import javafx.scene.paint.Color;
 import model.OnChangeListener;
 
diff --git a/src/main/java/datastruct/ConstantMatrixInitializer.java b/src/main/java/datastruct/ConstantMatrixInitializer.java
deleted file mode 100644
index e13032bf492cd7afdbcf566c5b478e4c2d3cf11e..0000000000000000000000000000000000000000
--- a/src/main/java/datastruct/ConstantMatrixInitializer.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package datastruct;
-
-public class ConstantMatrixInitializer<T> implements MatrixInitializer<T> {
-
-    private final T constant;
-
-    public ConstantMatrixInitializer(T constant) {
-        this.constant = constant;
-    }
-    @Override
-    public T initialValueAt(Coordinate coordinate) {
-        return constant;
-    }
-}
diff --git a/src/main/java/datastruct/Matrix.java b/src/main/java/datastruct/Matrix.java
deleted file mode 100644
index f98bd7a2a5b7bcf877287220867bb5204be79eef..0000000000000000000000000000000000000000
--- a/src/main/java/datastruct/Matrix.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package datastruct;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-
-/**
- * Represents a matrix, a rectangular array, with generic values in each cell.
- *
- * @param <T> The type of values stored in the matrix cells.
- */
-public class Matrix<T> implements Iterable<T> {
-
-    private final List<List<T>> matrix;
-    private final int width;
-    private final int height;
-
-    /**
-     * Creates a new {@link Matrix} with the specified width, height, and an initializer to set
-     * values.
-     *
-     * @param width       The width of the {@link Matrix}.
-     * @param height      The height of the {@link Matrix}.
-     * @param initializer A matrix initializer to set values in the {@link Matrix}.
-     */
-    public Matrix(int width, int height, MatrixInitializer<T> initializer) {
-        this.width = width;
-        this.height = height;
-        this.matrix = new ArrayList<>();
-        this.initializeWith(initializer);
-    }
-
-    /**
-     * Creates a new {@link Matrix} with the specified width, height, and initial value for all
-     * cells.
-     *
-     * @param width        The width of the {@link Matrix}.
-     * @param height       The height of the {@link Matrix}.
-     * @param initialValue The initial value to set in all cells of the {@link Matrix}.
-     */
-    public Matrix(int width, int height, T initialValue) {
-        this(width, height, new ConstantMatrixInitializer<>(initialValue));
-    }
-
-    private void initializeWith(MatrixInitializer<T> initializer) {
-        for (int x = 0; x < width; x++) {
-            List<T> row = new ArrayList<>();
-            this.matrix.add(row);
-            for (int y = 0; y < height; y++) {
-                row.add(initializer.initialValueAt(Coordinate.of(x, y)));
-            }
-        }
-    }
-
-    /**
-     * Returns the width of the {@link Matrix}.
-     *
-     * @return The width of the {@link Matrix}.
-     */
-    public int width() {
-        return width;
-    }
-
-    /**
-     * Returns the height of the {@link Matrix}.
-     *
-     * @return The height of the {@link Matrix}.
-     */
-    public int height() {
-        return height;
-    }
-
-    /**
-     * Gets the value at the specified coordinates (x, y) in the {@link Matrix}.
-     *
-     * @param x The x-coordinate.
-     * @param y The y-coordinate.
-     * @return The value at the specified coordinates.
-     */
-    public T get(int x, int y) {
-        return this.matrix.get(x).get(y);
-    }
-
-    /**
-     * Gets the value at the specified {@link Coordinate} in the {@link Matrix}.
-     *
-     * @param coordinate The {@link Coordinate}.
-     * @return The value at the specified {@link Coordinate}.
-     */
-    public T get(Coordinate coordinate) {
-        return this.get(coordinate.x(), coordinate.y());
-    }
-
-    /**
-     * Sets the value at the specified coordinates (x, y) in the {@link Matrix}.
-     *
-     * @param x     The x-coordinate.
-     * @param y     The y-coordinate.
-     * @param value The value to set at the specified coordinates.
-     */
-    public void set(int x, int y, T value) {
-        this.matrix.get(x).set(y, value);
-    }
-
-
-    /**
-     * Sets the value at the specified {@link Coordinate} in the {@link Matrix}.
-     *
-     * @param coordinate The {@link Coordinate}.
-     * @param value      The value to set at the specified {@link Coordinate}.
-     */
-    public void set(Coordinate coordinate, T value) {
-        this.set(coordinate.x(), coordinate.y(), value);
-    }
-
-    /**
-     * Returns an {@link Iterator} that allows iterating over the elements in the {@link Matrix} in
-     * row-major order.
-     *
-     * @return An {@link Iterator} for the {@link Matrix}.
-     */
-    public Iterator<T> iterator() {
-        Iterator<Coordinate> coordIterator = this.coordinatesIterator();
-        return new MatrixIterator<>(this, coordIterator);
-    }
-
-    /**
-     * Returns an {@link Iterable} that provides access to the {@link Coordinate}s of the
-     * {@link Matrix} in row-major order. This means that a {@code for} loop on a {@link Matrix}
-     * will loop over the coordinates of the {@link Matrix}.
-     *
-     * @return An {@link Iterable} for the {@link Coordinate}s of the {@link Matrix}.
-     */
-    public Iterable<Coordinate> coordinates() {
-        return this::coordinatesIterator;
-    }
-
-    /**
-     * Returns an {@link Iterator} that allows iterating over the {@link Coordinate}s in the
-     * {@link Matrix} in row-major order.
-     *
-     * @return An {@link Iterator} for the {@link Matrix}.
-     */
-    private Iterator<Coordinate> coordinatesIterator() {
-        return new CoordinateIterator(this.width, this.height);
-    }
-
-    /**
-     * Returns a lens for accessing and modifying the value at the specified coordinates (x, y) in
-     * the {@link Matrix}.
-     *
-     * @param x The x-coordinate.
-     * @param y The y-coordinate.
-     * @return A lens for the specified coordinates.
-     */
-    public Lens<T> at(int x, int y) {
-        return new Lens<T>() {
-            @Override
-            public T get() {
-                return Matrix.this.get(x, y);
-            }
-
-            @Override
-            public void set(T value) {
-                Matrix.this.set(x, y, value);
-            }
-        };
-    }
-
-    /**
-     * Returns a lens for accessing and modifying the value at the specified coordinate in the
-     * {@link Matrix}.
-     *
-     * @param coordinate The {@link Coordinate}.
-     * @return A lens for the specified  {@link Coordinate}.
-     */
-    public Lens<T> at(Coordinate coordinate) {
-        return this.at(coordinate.x(), coordinate.y());
-    }
-
-}
diff --git a/src/main/java/matrix/ConstantMatrixInitializer.java b/src/main/java/matrix/ConstantMatrixInitializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..88d798b4b1a0e79292168f2a8d6f47024457fdae
--- /dev/null
+++ b/src/main/java/matrix/ConstantMatrixInitializer.java
@@ -0,0 +1,16 @@
+package matrix;
+
+public class ConstantMatrixInitializer<T> implements MatrixInitializer<T> {
+
+  // TODO: add instance variables
+
+  public ConstantMatrixInitializer(T constant) {
+    // TODO
+  }
+
+    @Override
+    public T initialValueAt(Coordinate coordinate) {
+      // TODO
+      return null;
+    }
+}
diff --git a/src/main/java/datastruct/Coordinate.java b/src/main/java/matrix/Coordinate.java
similarity index 76%
rename from src/main/java/datastruct/Coordinate.java
rename to src/main/java/matrix/Coordinate.java
index f7f7e22f440efd4cb15793ca3d1b4ecc8d5bda0c..f3e5ac009ee837b1c3998c6b1f033e42019669b6 100644
--- a/src/main/java/datastruct/Coordinate.java
+++ b/src/main/java/matrix/Coordinate.java
@@ -1,6 +1,5 @@
-package datastruct;
+package matrix;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -62,7 +61,15 @@ public record Coordinate(int x, int y) {
 
     /**
      * Computes and returns a list of orthogonal (adjacent in horizontal or vertical direction) neighbors.
-     *
+     *  | | | |
+     * ---------
+     *  | |X| |
+     * ---------
+     *  |X|O|X|
+     * ---------
+     *  | |X| |
+     * ---------
+     * | | | |
      * @return A list of orthogonal neighboring {@link Coordinate}s.
      */
     public List<Coordinate> orthogonalNeighbours() {
@@ -72,6 +79,15 @@ public record Coordinate(int x, int y) {
 
     /**
      * Computes and returns a list of diagonal (adjacent in diagonal direction) neighbors.
+     *  | | | |
+     * ---------
+     *  |X| |X|
+     * ---------
+     *  | |O| |
+     * ---------
+     *  |X| |X|
+     * ---------
+     * | | | |
      *
      * @return A list of diagonal neighboring {@link Coordinate}s.
      */
@@ -82,6 +98,15 @@ public record Coordinate(int x, int y) {
 
     /**
      * Computes and returns a list of all orthogonal and diagonal neighbors.
+     *      *  | | | |
+     *      * ---------
+     *      *  |X|X|X|
+     *      * ---------
+     *      *  |X|O|X|
+     *      * ---------
+     *      *  |X|X|X|
+     *      * ---------
+     *      * | | | |
      *
      * @return A list of all neighboring {@link Coordinate}s.
      */
@@ -94,4 +119,12 @@ public record Coordinate(int x, int y) {
     public String toString() {
         return "(" + this.x + "," + this.y + ")";
     }
+
+  public Coordinate minus(Coordinate corner) {
+    return new Coordinate(this.x - corner.x, this.y - corner.y);
+  }
+
+  public Coordinate plus(Coordinate corner) {
+      return new Coordinate(this.x + corner.x, this.y + corner.y);
+  }
 }
\ No newline at end of file
diff --git a/src/main/java/datastruct/CoordinateIterator.java b/src/main/java/matrix/CoordinateIterator.java
similarity index 98%
rename from src/main/java/datastruct/CoordinateIterator.java
rename to src/main/java/matrix/CoordinateIterator.java
index 37360d0720a983441f3d37d3d2e45550c727c30a..810b71287e52821943a45e52eb7959ace9df7f06 100644
--- a/src/main/java/datastruct/CoordinateIterator.java
+++ b/src/main/java/matrix/CoordinateIterator.java
@@ -1,4 +1,4 @@
-package datastruct;
+package matrix;
 
 import java.util.Iterator;
 import java.util.NoSuchElementException;
diff --git a/src/main/java/matrix/ListMatrix.java b/src/main/java/matrix/ListMatrix.java
new file mode 100644
index 0000000000000000000000000000000000000000..990ffa8cf1891a6b2e6086d7561645fd8b7467de
--- /dev/null
+++ b/src/main/java/matrix/ListMatrix.java
@@ -0,0 +1,68 @@
+package matrix;
+
+import java.util.List;
+
+
+/**
+ * Represents a matrix, a rectangular array, with generic values in each cell.
+ *
+ * @param <T> The type of values stored in the matrix cells.
+ */
+public class ListMatrix<T> implements Matrix<T> {
+
+  private final List<List<T>> matrix;
+  private final int width;
+  private final int height;
+
+  /**
+   * Creates a new {@link ListMatrix} with the specified width, height, and an initializer to set
+   * values.
+   *
+   * @param width       The width of the {@link ListMatrix}.
+   * @param height      The height of the {@link ListMatrix}.
+   * @param initializer A matrix initializer to set values in the {@link ListMatrix}.
+   */
+  public ListMatrix(int width, int height, MatrixInitializer<T> initializer) {
+    // TODO
+    this.width = 0;
+    this.height = 0;
+    this.matrix = null;
+    this.initializeWith(initializer); // fills the matrix using initializer
+  }
+
+  public ListMatrix(int width, int height, T constant) {
+    this(width, height, new ConstantMatrixInitializer<>(constant));
+  }
+
+  private void initializeWith(MatrixInitializer<T> initializer) {
+    // TODO initialize each cell of the matrix, with a value determined by initializer
+  }
+
+  public int width() {
+    // TODO
+    return 0;
+  }
+
+  public int height() {
+    // TODO
+    return 0;
+  }
+
+  @Override
+  public T get(int x, int y) {
+    // TODO
+    return null;
+  }
+
+
+  @Override
+  public void set(int x, int y, T newValue) {
+    // TODO
+  }
+
+  public Matrix<T> subMatrix(Coordinate corner, int width, int height) {
+    // TODO
+    return this;
+  }
+
+}
diff --git a/src/main/java/matrix/Matrix.java b/src/main/java/matrix/Matrix.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a797735bbb392d0a0e3165bd4faaad2aa8608c9
--- /dev/null
+++ b/src/main/java/matrix/Matrix.java
@@ -0,0 +1,85 @@
+package matrix;
+
+import java.util.Iterator;
+
+public interface Matrix<T> extends Iterable<T> {
+
+  /**
+   * Returns the width of the {@link Matrix}.
+   *
+   * @return The width of the {@link Matrix}.
+   */
+  int width();
+
+  /**
+   * Returns the height of the {@link Matrix}.
+   *
+   * @return The height of the {@link Matrix}.
+   */
+  int height();
+
+  /**
+   * Returns the value at the specified coordinates (x, y) in
+   * the {@link Matrix}.
+   *
+   * @param x The x-coordinate.
+   * @param y The y-coordinate.
+   * @return The content of the matrix at the coordinates (x,y).
+   */
+  T get(int x, int y);
+  /**
+   * Returns the value at the specified coordinates (x, y) in
+   * the {@link Matrix}.
+   *
+   * @param coordinate The coordinates (x,y).
+   * @return The content of the matrix at the coordinates (x,y).
+   */
+  default T get(Coordinate coordinate) {
+    return this.get(coordinate.x(), coordinate.y());
+  }
+
+  /**
+   *  Changes the value at the specified coordinates (x,y) in the {@link Matrix}
+   *
+   * @param x the x-coordinate
+   * @param y the y-coordinate
+   * @param newValue the value to assign to coordinates (x,y).
+   */
+  void set(int x, int y, T newValue);
+
+  /**
+   *  Changes the value at the specified coordinates (x,y) in the {@link Matrix}
+   *
+   * @param coordinate The coordinates (x,y)
+   * @param newValue the value to assign to coordinates (x,y).
+   */
+  default void set(Coordinate coordinate, T newValue) {
+    this.set(coordinate.x(), coordinate.y(), newValue);
+  }
+
+  Matrix<T> subMatrix(Coordinate corner, int width, int height);
+
+
+  /**
+   * Returns an {@link Iterable} that provides access to the {@link Coordinate}s of the
+   * {@link Matrix} in row-major order. This means that a {@code for} loop on a {@link Matrix}
+   * will loop over the coordinates of the {@link Matrix}.
+   *
+   * @return An {@link Iterable} for the {@link Coordinate}s of the {@link Matrix}.
+   */
+  default Iterable<Coordinate> coordinates() {
+    return () -> new CoordinateIterator(this.width(), this.height());
+  }
+
+  /**
+   * Returns an {@link Iterator} that allows iterating over the elements in the {@link Matrix} in
+   * row-major order.
+   *
+   * @return An {@link Iterator} for the {@link Matrix}.
+   */
+  default Iterator<T> iterator() {
+    Iterator<Coordinate> coords =
+      new CoordinateIterator(this.width(),this.height());
+    return new MatrixIterator<>(this, coords);
+  }
+}
diff --git a/src/main/java/datastruct/MatrixInitializer.java b/src/main/java/matrix/MatrixInitializer.java
similarity index 51%
rename from src/main/java/datastruct/MatrixInitializer.java
rename to src/main/java/matrix/MatrixInitializer.java
index dab2bf2900018e92094a81c9b04bdd005852e83e..492d15c3453095569dd901b763f83337d854cae8 100644
--- a/src/main/java/datastruct/MatrixInitializer.java
+++ b/src/main/java/matrix/MatrixInitializer.java
@@ -1,14 +1,14 @@
-package datastruct;
+package matrix;
 
 /**
- * An interface for initializing a {@link Matrix} by providing initial values for each cell.
+ * An interface for initializing a {@link ListMatrix} by providing initial values for each cell.
  *
- * @param <T> The type of values to initialize the {@link Matrix} with.
+ * @param <T> The type of values to initialize the {@link ListMatrix} with.
  */
 public interface MatrixInitializer<T> {
 
     /**
-     * Returns the initial value to be set in a {@link Matrix} cell at the specified
+     * Returns the initial value to be set in a {@link ListMatrix} cell at the specified
      * {@link Coordinate}.
      *
      * @param coordinate The {@link Coordinate} at which to set the initial value.
diff --git a/src/main/java/datastruct/MatrixIterator.java b/src/main/java/matrix/MatrixIterator.java
similarity index 96%
rename from src/main/java/datastruct/MatrixIterator.java
rename to src/main/java/matrix/MatrixIterator.java
index f0d1f661e7510d699515156f1a456bc994461424..d775f9ef5b92da66d070582f49feaa6a934b6d0e 100644
--- a/src/main/java/datastruct/MatrixIterator.java
+++ b/src/main/java/matrix/MatrixIterator.java
@@ -1,4 +1,4 @@
-package datastruct;
+package matrix;
 
 import java.util.Iterator;
 import java.util.NoSuchElementException;
diff --git a/src/main/java/model/Cell.java b/src/main/java/model/Cell.java
index 03780346a5a4b46bb5c2b61d704ec27ee00bef63..f7f62749df1c3193503dce5e366a671762967f21 100644
--- a/src/main/java/model/Cell.java
+++ b/src/main/java/model/Cell.java
@@ -1,7 +1,5 @@
 package model;
 
-import datastruct.Lens;
-
 import java.util.ArrayList;
 import java.util.List;
 
diff --git a/src/main/java/model/CellularAutomatonSimulation.java b/src/main/java/model/CellularAutomatonSimulation.java
index 4f51254692cefda4e95edb8be3de494242c387da..d08c7a4eb05750d514d2929720bba2c0beeeb694 100644
--- a/src/main/java/model/CellularAutomatonSimulation.java
+++ b/src/main/java/model/CellularAutomatonSimulation.java
@@ -1,8 +1,8 @@
 package model;
 
 import controller.Simulation;
-import datastruct.Coordinate;
-import datastruct.Matrix;
+import matrix.Coordinate;
+import matrix.ListMatrix;
 import javafx.scene.paint.Color;
 
 import java.util.Iterator;
@@ -18,7 +18,7 @@ import java.util.Random;
 public class CellularAutomatonSimulation<S extends State<S>>
         implements Simulation {
 
-    private final Matrix<Cell<S>> grid;
+    private final ListMatrix<Cell<S>> grid;
     private final Cell<Integer> generationNumber = new Cell<>(0);
     private final CellularAutomaton<S> automaton;
     private final Random generator;
@@ -31,7 +31,7 @@ public class CellularAutomatonSimulation<S extends State<S>>
      */
     public CellularAutomatonSimulation(CellularAutomaton<S> automaton, Random generator) {
         this.automaton = automaton;
-        this.grid = new Matrix<>(
+        this.grid = new ListMatrix<>(
                 automaton.numberOfColumns(),
                 automaton.numberOfRows(),
                 new ConstantCellInitializer<>(automaton.defaultState())
@@ -68,12 +68,12 @@ public class CellularAutomatonSimulation<S extends State<S>>
         //TODO: à compléter, en utilisant nextGenerationMatrix()
     }
 
-    /** Computes the {@link Matrix} of states obtained after a single step of updates
+    /** Computes the {@link ListMatrix} of states obtained after a single step of updates
      * of the simulation.
      *
      * @return the states of each cell after one generation
      */
-    private Matrix<S> nextGenerationMatrix() {
+    private ListMatrix<S> nextGenerationMatrix() {
         //TODO: à compléter
         return null;
     }
diff --git a/src/main/java/model/ConstantCellInitializer.java b/src/main/java/model/ConstantCellInitializer.java
index c44714566bb35f8b7eaacc90d7acc321d27f8cc8..39a5b7160e7cf25f8240daff179ae177fcd92407 100644
--- a/src/main/java/model/ConstantCellInitializer.java
+++ b/src/main/java/model/ConstantCellInitializer.java
@@ -1,11 +1,11 @@
 package model;
 
-import datastruct.Coordinate;
-import datastruct.Matrix;
-import datastruct.MatrixInitializer;
+import matrix.Coordinate;
+import matrix.ListMatrix;
+import matrix.MatrixInitializer;
 
 /**
- *  An initializer for {@link Matrix} of {@link Cell}s, where each cell is initialized to the
+ *  An initializer for {@link ListMatrix} of {@link Cell}s, where each cell is initialized to the
  *  same value.
  *
  * @param <T> the type of content of each cell
diff --git a/src/main/java/datastruct/Lens.java b/src/main/java/model/Lens.java
similarity index 96%
rename from src/main/java/datastruct/Lens.java
rename to src/main/java/model/Lens.java
index a98fd46ffe1fc6f6f63b51ba704c87ecb83e1122..254415ed97d7bbd98fdd8b17db0eaf495a3872e1 100644
--- a/src/main/java/datastruct/Lens.java
+++ b/src/main/java/model/Lens.java
@@ -1,4 +1,4 @@
-package datastruct;
+package model;
 
 /**
  * A lens interface representing a view into a mutable state.
diff --git a/src/main/java/model/NextGenerationInitializer.java b/src/main/java/model/NextGenerationInitializer.java
index ad03fdf0a14dc41e72f1bfbd4beb976bcf212a9f..f9462bfbd6fe1b55ad7ee10ada452a78825b6a2e 100644
--- a/src/main/java/model/NextGenerationInitializer.java
+++ b/src/main/java/model/NextGenerationInitializer.java
@@ -1,14 +1,12 @@
 package model;
 
-import datastruct.Coordinate;
-import datastruct.MatrixInitializer;
-import datastruct.Matrix;
+import matrix.Coordinate;
+import matrix.MatrixInitializer;
+import matrix.ListMatrix;
 import controller.Simulation;
-import java.util.ArrayList;
-import java.util.List;
 
 /**
- * An initializer for a {@link Matrix} of states, where each state is computed based on the value
+ * An initializer for a {@link ListMatrix} of states, where each state is computed based on the value
  * of its neighbours in a {@link Simulation} of a cellular automaton.
  *
  * @param <S> the type of states in the simulation.
diff --git a/src/main/java/view/FillingMouseListener.java b/src/main/java/view/FillingMouseListener.java
index a4946eb3188788e721932033b65154f418b8d41b..30a9a29f8aebf5dd418c37e5d8557e3604f45542 100644
--- a/src/main/java/view/FillingMouseListener.java
+++ b/src/main/java/view/FillingMouseListener.java
@@ -1,6 +1,6 @@
 package view;
 
-import datastruct.Coordinate;
+import matrix.Coordinate;
 import javafx.scene.input.MouseEvent;
 
 public class FillingMouseListener implements MouseListener {
diff --git a/src/main/java/view/MatrixPane.java b/src/main/java/view/MatrixPane.java
index 050f73930aeb7f17b4b95ed8bb2ff3aec5f9dfda..99f049ea91346ad80af0ed393c38d9b8c73de1cf 100644
--- a/src/main/java/view/MatrixPane.java
+++ b/src/main/java/view/MatrixPane.java
@@ -1,7 +1,7 @@
 package view;
 
 import controller.Controller;
-import datastruct.Coordinate;
+import matrix.Coordinate;
 import javafx.scene.input.MouseDragEvent;
 import javafx.scene.input.MouseEvent;
 import javafx.scene.layout.GridPane;
diff --git a/src/main/java/view/MouseListener.java b/src/main/java/view/MouseListener.java
index 775cc91de92b1ca00c324365a04ecd53c0439cff..5852db084912b04e6b960f4f89b271219f17f140 100644
--- a/src/main/java/view/MouseListener.java
+++ b/src/main/java/view/MouseListener.java
@@ -1,6 +1,6 @@
 package view;
 
-import datastruct.Coordinate;
+import matrix.Coordinate;
 import javafx.scene.input.MouseEvent;
 
 interface MouseListener {
diff --git a/src/main/java/view/WaitingMouseListener.java b/src/main/java/view/WaitingMouseListener.java
index 68601debb4757abdd55450b8b6d58f16ff5e8ba3..ecab1d150f928d6d10321fbf6be876c0de6df359 100644
--- a/src/main/java/view/WaitingMouseListener.java
+++ b/src/main/java/view/WaitingMouseListener.java
@@ -1,6 +1,6 @@
 package view;
 
-import datastruct.Coordinate;
+import matrix.Coordinate;
 import javafx.scene.input.MouseEvent;
 
 class WaitingMouseListener implements MouseListener {
diff --git a/src/test/java/datastruct/ConstantMatrixInitializerTest.java b/src/test/java/matrix/ConstantMatrixInitializerTest.java
similarity index 77%
rename from src/test/java/datastruct/ConstantMatrixInitializerTest.java
rename to src/test/java/matrix/ConstantMatrixInitializerTest.java
index 4db9c2a7d37554e5eb11c7a6c15a28064421dbe5..74350891205c4a038b9d4aec3216b0f82027e4a2 100644
--- a/src/test/java/datastruct/ConstantMatrixInitializerTest.java
+++ b/src/test/java/matrix/ConstantMatrixInitializerTest.java
@@ -1,4 +1,4 @@
-package datastruct;
+package matrix;
 
 import org.junit.jupiter.api.Test;
 
@@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.*;
 class ConstantMatrixInitializerTest {
     @Test
     public void testMatrixInitializationWithConstantValue() {
-        Matrix<String> matrix = new Matrix<>(3, 3, new ConstantMatrixInitializer<>("X"));
+        ListMatrix<String> matrix = new ListMatrix<>(3, 3, new ConstantMatrixInitializer<>("X"));
 
         // Test that all cells have the constant value.
         for (int x = 0; x < 3; x++) {
@@ -19,7 +19,7 @@ class ConstantMatrixInitializerTest {
 
     @Test
     public void testMatrixInitializationWithConstantValue2() {
-        Matrix<Integer> matrix = new Matrix<>(3, 5, new ConstantMatrixInitializer<>(12));
+        ListMatrix<Integer> matrix = new ListMatrix<>(3, 5, new ConstantMatrixInitializer<>(12));
 
         // Test that all cells have the constant value.
         for (int x = 0; x < 3; x++) {
diff --git a/src/test/java/datastruct/CoordinateIteratorTest.java b/src/test/java/matrix/CoordinateIteratorTest.java
similarity index 98%
rename from src/test/java/datastruct/CoordinateIteratorTest.java
rename to src/test/java/matrix/CoordinateIteratorTest.java
index 90be82e7250425d8ff455b65f74a6f0dadd5ac22..5339f994cef0d6ff7446e73499c791eb1215cbc7 100644
--- a/src/test/java/datastruct/CoordinateIteratorTest.java
+++ b/src/test/java/matrix/CoordinateIteratorTest.java
@@ -1,4 +1,4 @@
-package datastruct;
+package matrix;
 
 import org.junit.jupiter.api.Test;
 
diff --git a/src/test/java/datastruct/CoordinateTest.java b/src/test/java/matrix/CoordinateTest.java
similarity index 99%
rename from src/test/java/datastruct/CoordinateTest.java
rename to src/test/java/matrix/CoordinateTest.java
index bddaae9ce239168d12a0c5f89b6411d41bb8243f..fccb4c96b0a9ac3aedb839c4db79a26559966712 100644
--- a/src/test/java/datastruct/CoordinateTest.java
+++ b/src/test/java/matrix/CoordinateTest.java
@@ -1,4 +1,4 @@
-package datastruct;
+package matrix;
 
 import org.junit.jupiter.api.Test;
 
diff --git a/src/test/java/datastruct/MatrixTest.java b/src/test/java/matrix/ListMatrixTest.java
similarity index 64%
rename from src/test/java/datastruct/MatrixTest.java
rename to src/test/java/matrix/ListMatrixTest.java
index 346c29bed09667ea471416d7f5455ebe0597ca72..f2f309a92953a8520d288a2bd2e41e30610a8ac9 100644
--- a/src/test/java/datastruct/MatrixTest.java
+++ b/src/test/java/matrix/ListMatrixTest.java
@@ -1,4 +1,4 @@
-package datastruct;
+package matrix;
 
 import org.junit.jupiter.api.Test;
 
@@ -6,14 +6,14 @@ import java.util.Iterator;
 
 import static org.junit.jupiter.api.Assertions.*;
 
-class MatrixTest {
+class ListMatrixTest {
 
     private final MatrixInitializer<Integer> sumInitializer =
             coord -> coord.x() + coord.y();
 
     @Test
     public void testMatrixCreationWithInitializer() {
-        Matrix<Integer> matrix = new Matrix<>(3, 4, sumInitializer);
+        ListMatrix<Integer> matrix = new ListMatrix<>(3, 4, sumInitializer);
         assertEquals(3, matrix.width());
         assertEquals(4, matrix.height());
         assertEquals(4, matrix.get(2, 2));
@@ -24,7 +24,7 @@ class MatrixTest {
 
     @Test
     public void testMatrixCreationWithInitialValue() {
-        Matrix<String> matrix = new Matrix<>(2, 2, "Foo");
+        ListMatrix<String> matrix = new ListMatrix<>(2, 2, "Foo");
         assertEquals(2, matrix.width());
         assertEquals(2, matrix.height());
         assertEquals("Foo", matrix.get(1, 1)); // Test a specific cell value.
@@ -32,28 +32,28 @@ class MatrixTest {
 
     @Test
     public void testMatrixSetAndGet() {
-        Matrix<Integer> matrix = new Matrix<>(3, 3, 0);
-        matrix.set(1, 1, 42);
+        ListMatrix<Integer> matrix = new ListMatrix<>(3, 3, 0);
+        matrix.set(1, 1,42);
         assertEquals(42, matrix.get(1, 1));
-        matrix.set(0, 2, 10);
+        matrix.set(0, 2,10);
         assertEquals(10, matrix.get(0, 2));
-        matrix.set(Coordinate.of(2, 2), 99);
+        matrix.set(Coordinate.of(2, 2),99);
         assertEquals(99, matrix.get(Coordinate.of(2, 2)));
     }
 
     @Test
     public void testMatrixWidthAndHeight() {
-        Matrix<String> matrix = new Matrix<>(4, 2, "A");
+        ListMatrix<String> matrix = new ListMatrix<>(4, 2, "A");
         assertEquals(4, matrix.width());
         assertEquals(2, matrix.height());
-        matrix.set(3, 1, "B");
+        matrix.set(3, 1,"B");
         assertEquals(4, matrix.width());
         assertEquals(2, matrix.height());
     }
 
     @Test
     public void testMatrixIterator() {
-        Matrix<Integer> matrix = new Matrix<>(2, 2, sumInitializer);
+        ListMatrix<Integer> matrix = new ListMatrix<>(2, 2, sumInitializer);
         Iterator<Integer> iterator = matrix.iterator();
         assertTrue(iterator.hasNext());
         assertEquals(0, iterator.next());
@@ -68,7 +68,7 @@ class MatrixTest {
 
     @Test
     public void testMatrixCoordinates() {
-        Matrix<Integer> matrix = new Matrix<>(2, 2, 0);
+        ListMatrix<Integer> matrix = new ListMatrix<>(2, 2, 0);
         Iterable<Coordinate> coordinates = matrix.coordinates();
         int count = 0;
         for (Coordinate coord : coordinates) {
@@ -77,12 +77,24 @@ class MatrixTest {
         assertEquals(4, count);
     }
 
+
     @Test
-    public void testMatrixLens() {
-        Matrix<Integer> matrix = new Matrix<>(2, 2, 0);
-        Lens<Integer> lens = matrix.at(1, 1);
-        assertEquals(0, lens.get());
-        lens.set(42);
-        assertEquals(42, matrix.get(1, 1));
+    public void testSubMatrix() {
+      Matrix<Integer> matrix = new ListMatrix<>(5, 5, 0);
+      for (int x = 0; x < 5; x++) {
+        for (int y = 0; y < 5; y++) {
+          matrix.set(x,y,x + y * 5);
+        }
+      }
+      Matrix<Integer> sub = matrix.subMatrix(Coordinate.of(2,1),2,3);
+      assertEquals(2, sub.width());
+      assertEquals(3, sub.height());
+      for (int x = 2; x < 4; x++) {
+        for (int y = 1; y < 4; y++) {
+          assertEquals(x + y * 5, sub.get(x-2,y-1));
+        }
+      }
     }
+
+
 }
diff --git a/src/test/java/model/CellularAutomatonSimulationTest.java b/src/test/java/model/CellularAutomatonSimulationTest.java
index 81c4eaca06a853af85fc445d56c4e9e22ae0b846..cd7dd67ba39a8f11640171b1493d77d2f90ba4f9 100644
--- a/src/test/java/model/CellularAutomatonSimulationTest.java
+++ b/src/test/java/model/CellularAutomatonSimulationTest.java
@@ -1,6 +1,6 @@
 package model;
 
-import datastruct.Coordinate;
+import matrix.Coordinate;
 import javafx.scene.paint.Color;
 import model.automata.GameOfLifeAutomaton;
 import static model.automata.GameOfLifeState.*;
diff --git a/src/test/java/model/NextGenerationInitializerTest.java b/src/test/java/model/NextGenerationInitializerTest.java
index b2e8ea71824fff1e65d46ce887d1dc5ac30967f3..8edee89c31ec04fe4bbc521d570602ae65f0570a 100644
--- a/src/test/java/model/NextGenerationInitializerTest.java
+++ b/src/test/java/model/NextGenerationInitializerTest.java
@@ -1,7 +1,6 @@
 package model;
 
-import controller.Simulation;
-import datastruct.Coordinate;
+import matrix.Coordinate;
 import model.automata.GameOfLifeAutomaton;
 import model.automata.GameOfLifeState;
 import org.junit.jupiter.api.BeforeEach;