diff --git a/src/main/java/matrix/ConstantMatrixInitializer.java b/src/main/java/matrix/ConstantMatrixInitializer.java
index 88d798b4b1a0e79292168f2a8d6f47024457fdae..86d2574d6268dfd4e86f08a5d69b95792263e212 100644
--- a/src/main/java/matrix/ConstantMatrixInitializer.java
+++ b/src/main/java/matrix/ConstantMatrixInitializer.java
@@ -2,15 +2,15 @@ package matrix;
 
 public class ConstantMatrixInitializer<T> implements MatrixInitializer<T> {
 
-  // TODO: add instance variables
+  private T constant ;
 
   public ConstantMatrixInitializer(T constant) {
-    // TODO
+    this.constant = constant;
   }
 
     @Override
     public T initialValueAt(Coordinate coordinate) {
-      // TODO
-      return null;
+
+      return constant;
     }
 }
diff --git a/src/main/java/matrix/ListMatrix.java b/src/main/java/matrix/ListMatrix.java
index 418e05d20f2c6e4cd387a7b4de998819cd72a9b8..5074b6cdeb1ebb9a7a29e19cf7b1941b68ea8292 100644
--- a/src/main/java/matrix/ListMatrix.java
+++ b/src/main/java/matrix/ListMatrix.java
@@ -1,5 +1,6 @@
 package matrix;
 
+import java.util.ArrayList;
 import java.util.List;
 
 
@@ -23,10 +24,9 @@ public class ListMatrix<T> implements Matrix<T> {
    * @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.width = width;
+    this.height = height;
+    this.matrix = new ArrayList<>(width);
     this.initializeWith(initializer); // fills the matrix using initializer
   }
 
@@ -35,8 +35,17 @@ public class ListMatrix<T> implements Matrix<T> {
   }
 
   private void initializeWith(MatrixInitializer<T> initializer) {
-    // TODO initialize each cell of the matrix, with a value determined by initializer
-  }
+    for (int x=0; x<width; x++) {
+      List<T> column = new ArrayList<>(height);
+
+      for (int y = 0; y < height; y++) {
+        column.add(initializer.initialValueAt(new Coordinate(x, y)));
+      }
+      matrix.add(column);
+    }
+
+    }
+
 
   public int width() {
     return width;
@@ -48,14 +57,14 @@ public class ListMatrix<T> implements Matrix<T> {
 
   @Override
   public T get(int x, int y) {
-    // TODO
-    return null;
+
+    return matrix.get(x).get(y);
   }
 
 
   @Override
   public void set(int x, int y, T newValue) {
-    // TODO
+    matrix.get(x).set(y,newValue);
   }
 
 }
diff --git a/src/main/java/matrix/Matrix.java b/src/main/java/matrix/Matrix.java
index f2c908e63e1e44a2552bbf98a946fba6ba6bee6b..bc595112a651ed3422a1234317995a31546d7644 100644
--- a/src/main/java/matrix/Matrix.java
+++ b/src/main/java/matrix/Matrix.java
@@ -58,7 +58,7 @@ public interface Matrix<T> extends Iterable<T> {
   }
 
   default Matrix<T> subMatrix(Coordinate corner, int width, int height){
-    return null ;
+    return new ListMatrix<>(width(), height(), new SubMatrixInitializer<>(this.corner));
   }
 
 
diff --git a/src/main/java/matrix/SubMatrixInitializer.java b/src/main/java/matrix/SubMatrixInitializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..368487f55302515acd794169718829e4b8b21b06
--- /dev/null
+++ b/src/main/java/matrix/SubMatrixInitializer.java
@@ -0,0 +1,18 @@
+package matrix;
+public class SubMatrixInitializer <T> implements MatrixInitializer<T> {
+
+    private final Matrix <T> matrix;
+
+    private final Coordinate corner ;
+
+    public SubMatrixInitializer(Matrix<T> matrix, Coordinate corner) {
+        this.matrix = matrix;
+        this.corner = corner;
+    }
+
+    @Override
+
+    public T initalValueAt(Coordinate coordinate) {
+        return matrix.get(coordinate.plus(corner));
+    }
+}