diff --git a/src/main/java/model/update/NextGenerationUpdater.java b/src/main/java/model/update/NextGenerationUpdater.java
new file mode 100644
index 0000000000000000000000000000000000000000..72de8c2de2c00ca8730dbd305498b55bf0371644
--- /dev/null
+++ b/src/main/java/model/update/NextGenerationUpdater.java
@@ -0,0 +1,50 @@
+package model.update;
+
+import model.Cloud;
+import model.Fire;
+import model.Firefighter;
+import model.Mountain;
+import util.Position;
+
+import java.util.List;
+import java.util.Map;
+
+public class NextGenerationUpdater {
+    private final Fire fire;
+    private final List<Cloud> clouds;
+    private final List<Firefighter> firefighters;
+    private final List<Mountain> mountains;
+    private final Map<Position, List<Position>> neighbors;
+    private int step;
+
+    public NextGenerationUpdater(Fire fire, List<Cloud> clouds, List<Firefighter> firefighters, List<Mountain> mountains, Map<Position, List<Position>> neighbors) {
+        this.fire = fire;
+        this.clouds = clouds;
+        this.firefighters = firefighters;
+        this.mountains = mountains;
+        this.neighbors = neighbors;
+        this.step = 0;
+    }
+
+    public List<Position> updateToNextGeneration() {
+        FirefighterUpdater firefighterUpdater = new FirefighterUpdater(firefighters, neighbors, fire);
+        List<Position> modifiedPositions = firefighterUpdater.updateFirefighters(Mountain.getMountainPositions(mountains));
+
+        if (step % 2 == 0) {
+            modifiedPositions.addAll(fire.spreadFire(Mountain.getMountainPositions(mountains)));
+        }
+
+        for (Cloud cloud : clouds) {
+            cloud.move();
+            cloud.protectFromFire(fire);
+            cloud.extinguishSurroundingFires(fire);
+        }
+
+        step++;
+        return modifiedPositions;
+    }
+
+    public void resetStep() {
+        this.step = 0;
+    }
+}