diff --git a/src/main/java/model/Cell.java b/src/main/java/model/Cell.java
index f7f62749df1c3193503dce5e366a671762967f21..c84523359bbd4309adc7f2c178b09d073ca994cb 100644
--- a/src/main/java/model/Cell.java
+++ b/src/main/java/model/Cell.java
@@ -11,7 +11,7 @@ import java.util.List;
  */
 public class Cell<T> implements Lens<T> {
 
-    //TODO: ajouter la ou les propriétés nécessaires
+    private T content;
 
     // la liste des objets écoutant les modifications du contenu de la cellule
     private final List<OnChangeListener<T>> listeners = new ArrayList<>();
@@ -21,7 +21,7 @@ public class Cell<T> implements Lens<T> {
      * @param initialContent the value initially stored by the cell.
      */
     public Cell(T initialContent) {
-        //TODO: à compléter
+        this.content = initialContent;
     }
 
     /** Add a {@link OnChangeListener} to react to any change of value in the cell.
@@ -40,8 +40,13 @@ public class Cell<T> implements Lens<T> {
      * @param value the new content of this {@link Cell}
      */
     public void set(T value) {
-        //TODO: modifier le contenu de la cellule, puis appeler les méthodes valueChanged des
-        // listeners
+        T oldValue = this.content;
+        this.content = value;
+        for (OnChangeListener L :listeners) {
+            L.valueChanged(initialContent,value);
+            initialContent = value ;
+        }
+
     }
 
     /**
@@ -50,7 +55,6 @@ public class Cell<T> implements Lens<T> {
      * @return the current content of this {@link Cell}
      */
     public T get(){
-        //TODO: à compléter
-        return null;
+        return this.content;
     }
 }
diff --git a/src/main/java/model/ConstantCellInitializer.java b/src/main/java/model/ConstantCellInitializer.java
index 39a5b7160e7cf25f8240daff179ae177fcd92407..3a099c4c832bb3ca927fa8a36c5d4cdc185cc3bc 100644
--- a/src/main/java/model/ConstantCellInitializer.java
+++ b/src/main/java/model/ConstantCellInitializer.java
@@ -11,7 +11,7 @@ import matrix.MatrixInitializer;
  * @param <T> the type of content of each cell
  */
 public class ConstantCellInitializer<T>  implements MatrixInitializer<Cell<T>> {
-    //TODO: ajouter la/les propriétes nécessaires
+    private T defaultValue;
 
     /** Make a new {@link MatrixInitializer} with cells containing a {@link Cell} with the same
      * value.
@@ -19,12 +19,12 @@ public class ConstantCellInitializer<T>  implements MatrixInitializer<Cell<T>> {
      * @param defaultValue the value stored in each cell.
      */
     public ConstantCellInitializer(T defaultValue) {
-        //TODO: à compléter
+        this.defaultValue = defaultValue;
     }
 
     @Override
     public Cell<T> initialValueAt(Coordinate coordinate) {
-        //TODO: à compléter
-        return null;
+
+        return new Cell<>(defaultValue);
     }
 }
diff --git a/src/main/java/model/NextGenerationInitializer.java b/src/main/java/model/NextGenerationInitializer.java
index f9462bfbd6fe1b55ad7ee10ada452a78825b6a2e..bdc3f22681154afc137062634dc5273b037c184b 100644
--- a/src/main/java/model/NextGenerationInitializer.java
+++ b/src/main/java/model/NextGenerationInitializer.java
@@ -5,6 +5,9 @@ import matrix.MatrixInitializer;
 import matrix.ListMatrix;
 import controller.Simulation;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 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.
@@ -12,8 +15,7 @@ import controller.Simulation;
  * @param <S> the type of states in the simulation.
  */
 public class NextGenerationInitializer<S extends State<S>> implements MatrixInitializer<S> {
-
-    //TODO: ajouter les propriétés nécessaires
+    private final CellularAutomatonSimulation<S> simulation;
 
     /** Create a {@link MatrixInitializer} to compute the next generation in
      * a 2D cellular automaton.
@@ -21,15 +23,20 @@ public class NextGenerationInitializer<S extends State<S>> implements MatrixInit
      * @param simulation the {@link Simulation} representing the cellular automaton.
      */
     public NextGenerationInitializer(CellularAutomatonSimulation<S> simulation) {
-        //TODO: à compléter
+        this.simulation = simulation;
     }
 
     @Override
     public S initialValueAt(Coordinate coordinate) {
-        //TODO: à compléter
-        return null;
+        List <Coordinate> coordinates = coordinate.orthogonalNeighbours();
+        List<S> states = new ArrayList<>();
+        for (Coordinate coor : coordinates) {
+            states.add(simulation.at(this.wrap(coordinate)).get());
+        }
+        return simulation.at(coordinate).get().update(states);
     }
 
+
     /** Computes the grid {@link Coordinate} for an arbitrary {@link Coordinate}, even outside
      * the grid. This is done by considering that the grid wraps over its edges, connecting the left side to the right
      * side, and the top side to the bottom side. This way, every cell has 4 orthogonal
@@ -39,10 +46,9 @@ public class NextGenerationInitializer<S extends State<S>> implements MatrixInit
      * @return a corresponding {@link Coordinate}, that is inside the grid.
      */
     Coordinate wrap(Coordinate coordinate) {
-        //TODO: à compléter
         //Il faut recalculer les coordonnées x et y modulo les dimensions de la grille.
         //Pour le modulo, utiliser la fonction ci-dessous, qui s'assure que le résultat est positif.
-        return null;
+        return new Coordinate(modulo(coordinate.x(),this.simulation.numberOfColumns()), modulo(coordinate.y(),this.simulation.numberOfRows()));
     }
 
     /** The non-negative remainder of n divided by d.
diff --git a/src/main/java/model/automata/GameOfLifeAutomaton.java b/src/main/java/model/automata/GameOfLifeAutomaton.java
index 72b0854181d9be458b6fc85b6f69297ca8692ff5..0db4800e6ad942f1bcc9a17c76443412b6350d82 100644
--- a/src/main/java/model/automata/GameOfLifeAutomaton.java
+++ b/src/main/java/model/automata/GameOfLifeAutomaton.java
@@ -5,21 +5,22 @@ import model.CellularAutomaton;
 import java.util.Random;
 
 public class GameOfLifeAutomaton implements CellularAutomaton<GameOfLifeState> {
+    private final int numberOfColumns;
+    private final int numberOfRows;
 
     public GameOfLifeAutomaton(int numberOfColumns, int numberOfRows) {
-        //TODO: à compléter
+        this.numberOfColumns = numberOfColumns;
+        this.numberOfRows = numberOfRows ;
     }
 
     @Override
     public int numberOfColumns() {
-        //TODO: à compléter
-        return 0;
+        return numberOfColumns;
     }
 
     @Override
     public int numberOfRows() {
-        //TODO: à compléter
-        return 0;
+        return numberOfRows;
     }
 
     @Override
@@ -29,7 +30,6 @@ public class GameOfLifeAutomaton implements CellularAutomaton<GameOfLifeState> {
 
     @Override
     public GameOfLifeState randomState(Random generator) {
-        //TODO: à compléter
-        return null;
+        return generator.nextBoolean() ? GameOfLifeState.ALIVE : GameOfLifeState.DEAD;
     }
 }
diff --git a/src/main/java/model/automata/GameOfLifeState.java b/src/main/java/model/automata/GameOfLifeState.java
index 8f64cd8b046a3692fddf17fa2a0ca33a664b20e3..e3f06936e9d1bf1ead42879e91917bc428b0e035 100644
--- a/src/main/java/model/automata/GameOfLifeState.java
+++ b/src/main/java/model/automata/GameOfLifeState.java
@@ -37,17 +37,9 @@ public enum GameOfLifeState implements State<GameOfLifeState> {
     @Override
     public GameOfLifeState update(List<GameOfLifeState> neighbours) {
         int count = State.count(ALIVE, neighbours);
-        if this == ALIVE {
-            if(count == 2 || count == 3) {
-                return GameOfLifeState.ALIVE;
-            }
-        }
-        else if this == DEAD {
-            if (count ==3) {
-                return GameOfLifeState.ALIVE;
-            }
-        }
-        return this.next();
+        if (count == 3) return ALIVE ;
+        if ((count == 2) && this.equals(ALIVE))return ALIVE ;
+        return DEAD ;
     }
 
 }