diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java
index a654fd4cce5ea15e2d6f1ab1b1b4f13d26b750b0..d0c3ea97b117ca4bf6ed240278ceb6576534bba5 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java
@@ -50,6 +50,7 @@ public class ConcretePolygon extends Polygon {
 	private BoundarySurface partOfSurface;
 	private Installation partfOfInstallation;
 	private CompositeCollection partOfComposite = null;
+	private PatchCollection partOfPatch = null;
 	private Geometry parent;
 	private LinkedPolygon linkedFromPolygon;
 	
@@ -141,6 +142,18 @@ public class ConcretePolygon extends Polygon {
 		this.partOfComposite = comp;
 	}
 
+	protected void setPartOfPatch(PatchCollection pc) {
+		this.partOfPatch = pc;
+	}
+
+	public PatchCollection getPartOfPatch(PatchCollection pc) {
+		return partOfPatch;
+	}
+
+	public boolean isPatchMember() {
+		return partOfPatch != null;
+	}
+
 	public CompositeCollection getPartOfComposite() {
 		return partOfComposite;
 	}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/PatchCollection.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/PatchCollection.java
new file mode 100644
index 0000000000000000000000000000000000000000..5416b33eefaa741115665beb89f578f5592cf297
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/PatchCollection.java
@@ -0,0 +1,33 @@
+package de.hft.stuttgart.citydoctor2.datastructure;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+
+public final class PatchCollection implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -1748657379840997228L;
+    private GmlId gmlId;
+
+    private List<ConcretePolygon> patchMembers = new ArrayList<>();
+
+    public void addPatchMember(ConcretePolygon patchMember) {
+        patchMembers.add(patchMember);
+        patchMember.setPartOfPatch(this);
+    }
+
+    public List<ConcretePolygon> getPatchMembers() {
+        return new ArrayList<>(patchMembers);
+    }
+
+    public void setGmlId(GmlId gmlId) {
+        this.gmlId = gmlId;
+    }
+
+    public GmlId getGmlId() {
+        return gmlId;
+    }
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java
index 4b99f27eb6357c2edd04892c8face5abe1073eda..369a82d3e0643e26b0172e026ef946135787baff 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java
@@ -65,24 +65,26 @@ public class Citygml3GeometryMapper extends GeometryWalker {
 
     @Override
     public void visit(Surface surface) {
-
-        // TODO: Implement like CompositeSurfaces, just with PolygonPatches
         if (surface.getPatches() != null && !surface.getPatches().isSetObjects()) {
             logger.warn("Surface {} has no PolygonPatches.", surface.getId());
             return;
         }
-        CompositeCollection comp = new CompositeCollection();
-        List<PolygonPatch> polygonPatches = (List<PolygonPatch>) surface.getPatches().getObjects();
-        Citygml3GeometryMapper recursiveMapper = new Citygml3GeometryMapper(config, vertexMap);
+        List<PolygonPatch> polygonPatches = new ArrayList<>();
+        GeometryWalker patchCollector = new GeometryWalker() {
+            @Override
+            public void visit(PolygonPatch pp) {
+                polygonPatches.add(pp);
+            }
+        };
+        surface.getPatches().getObjects().forEach(abstractSurfacePatch -> abstractSurfacePatch.accept(patchCollector));
+        PatchCollection patchCollection = new PatchCollection();
+        Citygml3GeometryMapper patchMapper = new Citygml3GeometryMapper(config, vertexMap);
         for (PolygonPatch patch : polygonPatches) {
-            recursiveMapper.parsePolygonPatch(patch.getExterior(), patch.getInterior());
+            patchMapper.parsePolygonPatch(patch.getExterior(), patch.getInterior());
         }
-
-        List<ConcretePolygon> compPolys = recursiveMapper.getPolygons();
-        compPolys.forEach(comp::addCompositeMember);
-        comp.addAllChildComposites(recursiveMapper.getComposites());
-        composites.add(comp);
-        polygons.addAll(compPolys);
+        List<ConcretePolygon> patchPolys = patchMapper.getPolygons();
+        patchPolys.forEach(patchCollection::addPatchMember);
+        polygons.addAll(patchPolys);
 
     }