diff --git a/src/main/java/controller/Simulation.java b/src/main/java/controller/Simulation.java
index 8c33146524a2ac98ab455a906ffbfa086ecfb61c..0329744059b963e449f1cecea5a79df74ec602be 100644
--- a/src/main/java/controller/Simulation.java
+++ b/src/main/java/controller/Simulation.java
@@ -37,7 +37,7 @@ public interface Simulation extends Iterable<Coordinate> {
      *
      * @param coordinate The {@link Coordinate} to advance to the next state.
      */
-    void next(Coordinate coordinate);
+    void cycleThrough(Coordinate coordinate);
 
     /**
      * Copies the state from the source {@link Coordinate} to the destination {@link Coordinate}.
diff --git a/src/main/java/model/CellularAutomatonSimulation.java b/src/main/java/model/CellularAutomatonSimulation.java
index 4f51254692cefda4e95edb8be3de494242c387da..2d5b286fb175708083eede60481e4f5c99ba34dd 100644
--- a/src/main/java/model/CellularAutomatonSimulation.java
+++ b/src/main/java/model/CellularAutomatonSimulation.java
@@ -42,14 +42,12 @@ public class CellularAutomatonSimulation<S extends State<S>>
 
     @Override
     public int numberOfColumns() {
-        //TODO: à compléter
-        return 0;
+         return this.automaton.numberOfColumns();
     }
 
     @Override
     public int numberOfRows() {
-        //TODO: à compléter
-        return 0;
+        return this.automaton.numberOfRows();
     }
 
     /**
@@ -59,13 +57,18 @@ public class CellularAutomatonSimulation<S extends State<S>>
      * @return The cell at the specified coordinate.
      */
     public Cell<S> at(Coordinate coordinate) {
-        //TODO: à compléter
-        return null;
+        return this.grid.get(coordinate);
     }
 
     @Override
     public void updateToNextGeneration() {
-        //TODO: à compléter, en utilisant nextGenerationMatrix()
+        Matrix<S> newStates = nextGenerationMatrix();
+        for (Coordinate coordinate : this) {
+            S newState = newStates.at(coordinate).get();
+            Cell<S> cell = this.at(coordinate);
+            cell.set(newState);
+        }
+        this.generationNumber.set(this.generationNumber.get() + 1);
     }
 
     /** Computes the {@link Matrix} of states obtained after a single step of updates
@@ -74,23 +77,28 @@ public class CellularAutomatonSimulation<S extends State<S>>
      * @return the states of each cell after one generation
      */
     private Matrix<S> nextGenerationMatrix() {
-        //TODO: à compléter
-        return null;
+        return new Matrix<>(
+                this.numberOfColumns(),
+                this.numberOfRows(),
+                new NextGenerationInitializer<>(this)
+        );
     }
     @Override
-    public void next(Coordinate coordinate) {
-        //TODO: à compléter
+    public void cycleThrough(Coordinate coordinate) {
+        Cell<S> cell = this.at(coordinate);
+        S newState = cell.get().cycle();
+        cell.set(newState);
     }
 
     @Override
     public void copy(Coordinate source, Coordinate destination) {
-        //TODO: à compléter
+        S state = this.at(source).get();
+        this.at(destination).set(state);
     }
 
     @Override
     public Color getColor(Coordinate coordinate) {
-        //TODO: à compléter
-        return null;
+         return this.at(coordinate).get().getColor();
     }
 
     @Override
@@ -108,13 +116,19 @@ public class CellularAutomatonSimulation<S extends State<S>>
 
     @Override
     public void clear() {
-        //TODO: à compléter (penser à remettre le nombre de génération à 0)
+        for (Coordinate coordinate : this) {
+            this.at(coordinate).set(this.automaton.defaultState());
+        }
+        this.generationNumber.set(0);
     }
 
 
     @Override
     public void reset() {
-        //TODO: à compléter (penser à remettre le nombre de génération à 0)
+        for (Coordinate coordinate : this) {
+            this.at(coordinate).set(this.automaton.randomState(this.generator));
+        }
+        this.generationNumber.set(0);
     }
 
     @Override
diff --git a/src/main/java/view/FillingMouseListener.java b/src/main/java/view/FillingMouseListener.java
index a4946eb3188788e721932033b65154f418b8d41b..fcc519964f211c88b3a0a5d227ba1218d17fb403 100644
--- a/src/main/java/view/FillingMouseListener.java
+++ b/src/main/java/view/FillingMouseListener.java
@@ -29,7 +29,7 @@ public class FillingMouseListener implements MouseListener {
 
     @Override
     public void onMousePressed(MouseEvent event, Coordinate coordinate) {
-        this.matrix.getController().getSimulation().next(coordinate);
+        this.matrix.getController().getSimulation().cycleThrough(coordinate);
         this.matrix.setMouseListener(
                 new FillingMouseListener(this.matrix, coordinate)
         );
diff --git a/src/main/java/view/WaitingMouseListener.java b/src/main/java/view/WaitingMouseListener.java
index 68601debb4757abdd55450b8b6d58f16ff5e8ba3..8b48548d0b9e05f3befbf57169493c7fe11fc964 100644
--- a/src/main/java/view/WaitingMouseListener.java
+++ b/src/main/java/view/WaitingMouseListener.java
@@ -14,7 +14,7 @@ class WaitingMouseListener implements MouseListener {
 
     @Override
     public void onMousePressed(MouseEvent event, Coordinate coordinate) {
-        this.matrix.getController().getSimulation().next(coordinate);
+        this.matrix.getController().getSimulation().cycleThrough(coordinate);
         this.matrix.setMouseListener(new FillingMouseListener(this.matrix, coordinate));
     }
 
diff --git a/src/test/java/model/CellularAutomatonSimulationTest.java b/src/test/java/model/CellularAutomatonSimulationTest.java
index 81c4eaca06a853af85fc445d56c4e9e22ae0b846..2c32450b9938160e48ba6a3731877ba88cde6ce3 100644
--- a/src/test/java/model/CellularAutomatonSimulationTest.java
+++ b/src/test/java/model/CellularAutomatonSimulationTest.java
@@ -78,7 +78,7 @@ class CellularAutomatonSimulationTest {
         Coordinate coordinate = Coordinate.of(1, 1);
         Cell<GameOfLifeState> cell = simulation.at(coordinate);
         GameOfLifeState oldState = cell.get();
-        simulation.next(coordinate);
+        simulation.cycleThrough(coordinate);
         assertNotEquals(oldState, cell.get());
     }