diff --git a/src/main/java/model/elements/TerrainHandler.java b/src/main/java/model/elements/TerrainHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..29aac7a157c19ddbe18c98d31213874ba4f781cc
--- /dev/null
+++ b/src/main/java/model/elements/TerrainHandler.java
@@ -0,0 +1,48 @@
+package model.elements;
+
+import model.ModelElement;
+import model.TerrainElement;
+import util.Position;
+
+import java.util.*;
+
+public class TerrainHandler implements ElementHandler {
+    private final List<TerrainElement> terrainElements;
+    private final Class<? extends TerrainElement> terrainType;
+    private final ModelElement modelElement;
+
+    public TerrainHandler(List<TerrainElement> terrainElements,
+                          Class<? extends TerrainElement> terrainType,
+                          ModelElement modelElement) {
+        this.terrainElements = terrainElements;
+        this.terrainType = terrainType;
+        this.modelElement = modelElement;
+    }
+
+    @Override
+    public void addElement(Position position) {
+        try {
+            TerrainElement element = terrainType.getConstructor(Position.class).newInstance(position);
+            terrainElements.add(element);
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to create terrain element", e);
+        }
+    }
+
+    @Override
+    public void removeElement(Position position) {
+        terrainElements.removeIf(element -> element.getPosition().equals(position) && terrainType.isInstance(element));
+    }
+
+    @Override
+    public boolean hasElement(Position position) {
+        return terrainElements.stream()
+                .anyMatch(element -> element.getPosition().equals(position) && terrainType.isInstance(element));
+    }
+
+    @Override
+    public ModelElement getModelElement() {
+        return modelElement;
+    }
+}
+