diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java
index 4dec1f148cd9506ebc0270ddcf3a7e9d1108739a..16b967ae36a7bcdc9ac74ae7641a357faab27f46 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckId.java
@@ -53,6 +53,7 @@ public class CheckId implements Serializable {
 	public static final CheckId C_SE_BS_ROOF_UNFRAGMENTED = new CheckId("C_SE_BS_ROOF_UNFRAGMENTED");
 	public static final CheckId C_GE_S_NOT_CLOSED = new CheckId("C_GE_S_NOT_CLOSED");
 	public static final CheckId C_GE_P_ORIENTATION_RINGS_SAME = new CheckId("C_GE_P_ORIENTATION_RINGS_SAME");
+	public static final CheckId C_SE_POLYGON_WITHOUT_SURFACE = new CheckId("C_SE_POLYGON_WITHOUT_SURFACE");
 	
 	private String name;
 
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorId.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorId.java
index dad78701833168ed15e664982d3e0baa6aafba5e..4b9045e2d81e957fc1f332bc5e563c4abec06c51 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorId.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorId.java
@@ -63,6 +63,7 @@ public class ErrorId implements Serializable {
 	public static final ErrorId SE_SCHEMATRON_ERROR = new ErrorId("SE_SCHEMATRON_ERROR");
 	public static final ErrorId SE_BS_UNFRAGMENTED = new ErrorId("SE_BS_UNFRAGMENTED");
 	public static final ErrorId GE_P_DEGENERATED_RING = new ErrorId("GE_P_DEGENERATED_POLYGON");
+	public static final ErrorId SE_POLYGON_WITHOUT_SURFACE = new ErrorId("SE_POLYGON_WITHOUT_SURFACE");
 
 	private String name;
 
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorVisitor.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorVisitor.java
index d0a1012a3ba661956332e10d1463548ca7984a7e..231213631be162d965b26c00f666ccfc5ddef7d0 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorVisitor.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorVisitor.java
@@ -40,6 +40,7 @@ import de.hft.stuttgart.citydoctor2.check.error.PolygonHoleOutsideError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonInteriorDisconnectedError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonIntersectingRingsError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonSameOrientationError;
+import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonWrongOrientationError;
 import de.hft.stuttgart.citydoctor2.check.error.RingDuplicatePointError;
 import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError;
@@ -130,6 +131,8 @@ public interface ErrorVisitor {
 	
 	public void visit(AttributeValueWrongError err);
 
-	public void visit(AttributeInvalidError cdErr);
+	public void visit(AttributeInvalidError err);
+	
+	public void visit(PolygonWithoutSurfaceError err);
 
 }
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingID.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingID.java
index 5fb33a88283a6abcc35109288c229758a5dcd355..12e8d19fcc77f879444144819b0f72010015b5f9 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingID.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingID.java
@@ -36,6 +36,7 @@ public class HealingID {
 	public static final HealingID S_NOT_CLOSED = new HealingID("S_NOT_CLOSED");
 	public static final HealingID P_NON_PLANAR_POLYGON_CPP = new HealingID("P_NON_PLANAR_POLYGON_CPP");
 	public static final HealingID S_NOT_CLOSED_CPP = new HealingID("S_NOT_CLOSED_CPP");
+	public static final HealingID SE_POLYGON_WITHOUT_SURFACE = new HealingID("SE_POLYGON_WITHOUT_SURFACE");
 	
 	private String idString;
 	
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingMethod.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingMethod.java
index 38dc12e794d6caf95778e8e6f55ae5198e69686b..df909b774fda748f8085b99b0f72cfc041d824c5 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingMethod.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingMethod.java
@@ -39,6 +39,7 @@ import de.hft.stuttgart.citydoctor2.check.error.PolygonHoleOutsideError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonInteriorDisconnectedError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonIntersectingRingsError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonSameOrientationError;
+import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonWrongOrientationError;
 import de.hft.stuttgart.citydoctor2.check.error.RingDuplicatePointError;
 import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError;
@@ -195,6 +196,10 @@ public interface HealingMethod {
 	default boolean visit(AttributeMissingError err, ModificationListener l) {
 		return false;
 	}
+	
+	default boolean visit(PolygonWithoutSurfaceError err, ModificationListener l) {
+		return false;
+	}
 
 	public HealingMethod createNew();
 
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/QualityAdeErrorVisitor.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/QualityAdeErrorVisitor.java
index d576dc1dca50c709422620d28be188a6afc6ecb7..b9f67d61b8303ee5d282ffe3e4d67942a7eb16de 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/QualityAdeErrorVisitor.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/QualityAdeErrorVisitor.java
@@ -46,6 +46,7 @@ import de.hft.stuttgart.citydoctor2.check.error.PolygonHoleOutsideError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonInteriorDisconnectedError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonIntersectingRingsError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonSameOrientationError;
+import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonWrongOrientationError;
 import de.hft.stuttgart.citydoctor2.check.error.RingDuplicatePointError;
 import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError;
@@ -398,4 +399,9 @@ public class QualityAdeErrorVisitor implements ErrorVisitor {
 		res.getErrors().add(new AbstractErrorProperty(err));
 	}
 
+	@Override
+	public void visit(PolygonWithoutSurfaceError err) {
+		// not translated
+	}
+
 }
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Requirement.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Requirement.java
index b37888e8ad314d7f69aec4fce7bbcf0ebac94bb6..82c76162a00c1559fd52d1873c9a023e021513e1 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Requirement.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Requirement.java
@@ -66,7 +66,8 @@ public class Requirement implements Serializable {
 	public static final Requirement R_SE_BS_IS_FLOOR = new Requirement("R_SE_BS_IS_FLOOR", RequirementType.SEMANTIC);
 	public static final Requirement R_SE_BS_IS_WALL = new Requirement("R_SE_BS_IS_WALL", RequirementType.SEMANTIC);
 	public static final Requirement R_SE_BS_IS_GROUND = new Requirement("R_SE_BS_IS_GROUND", RequirementType.SEMANTIC);
-
+	public static final Requirement R_SE_POLYGON_WITHOUT_SURFACE = new Requirement("R_SE_POLYGON_WITHOUT_SURFACE", RequirementType.SEMANTIC);
+	
 	static {
 		// fill requirements with default parameters
 		ArrayList<DefaultParameter> defaultParameters = new ArrayList<>();
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/PolygonWithoutSurfaceError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/PolygonWithoutSurfaceError.java
new file mode 100644
index 0000000000000000000000000000000000000000..c5c1ea1c371761818e72467b0bf3bf4d60f8eb88
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/PolygonWithoutSurfaceError.java
@@ -0,0 +1,58 @@
+package de.hft.stuttgart.citydoctor2.check.error;
+
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.ErrorId;
+import de.hft.stuttgart.citydoctor2.check.ErrorReport;
+import de.hft.stuttgart.citydoctor2.check.ErrorType;
+import de.hft.stuttgart.citydoctor2.check.ErrorVisitor;
+import de.hft.stuttgart.citydoctor2.check.HealingMethod;
+import de.hft.stuttgart.citydoctor2.check.ModificationListener;
+import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
+import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
+
+public class PolygonWithoutSurfaceError implements CheckError {
+
+	private static final long serialVersionUID = 2676579487514583105L;
+	
+	private Polygon p;
+
+
+	public PolygonWithoutSurfaceError(Polygon polygon) {
+		p = polygon;
+	}
+
+	@Override
+	public ErrorType getType() {
+		return ErrorType.ERROR;
+	}
+
+	@Override
+	public ErrorId getErrorId() {
+		return ErrorId.SE_POLYGON_WITHOUT_SURFACE;
+	}
+	
+	public Polygon getPolygon() {
+		return p;
+	}
+
+	@Override
+	public GmlElement getFeature() {
+		return p;
+	}
+
+	@Override
+	public void accept(ErrorVisitor errorVisitor) {
+		errorVisitor.visit(this);
+	}
+
+	@Override
+	public boolean accept(HealingMethod method, ModificationListener l) {
+		return method.visit(this, l);
+	}
+
+	@Override
+	public void report(ErrorReport report) {
+		report.add(p);
+	}
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java
index d76d5b52ef67c7808170607fc385eeeaf07af48e..58a3c0047954e4c421529571ed82d01214f93e24 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java
@@ -91,6 +91,16 @@ public abstract class CityObject extends GmlElement {
 			}
 		}
 	}
+	
+	public void removeGeometry(Lod lod, GeometryType type) {
+		Iterator<Geometry> it = geometryList.iterator();
+		while (it.hasNext()) {
+			Geometry next = it.next();
+			if (next.getLod() == lod && next.getType() == type) {
+				it.remove();
+			}
+		}
+	}
 
 	public Geometry getHighestLodGeometry() {
 		Geometry highestLodGeometry = null;
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 16b42382326ba35a2d13dc1164c43e7e6a55a7a8..edafa292ecf2a68e49f65efe451143a32ba6d093 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
@@ -147,7 +147,7 @@ public class Citygml3GeometryMapper extends GeometryWalker {
 			trans.transform(p1, p2);
 			x = p2.x;
 			y = p2.y;
-			z = z / config.getFromMetres();
+			z = z / config.getFromMeters();
 		}
 		x = round(x, config.getNumberOfRoundingPlaces());
 		y = round(y, config.getNumberOfRoundingPlaces());
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java
index c3b9d486f964f01269234c056927e7b3b982a501..9ad346c5e491945990af29927d525eeeaae1ee27 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java
@@ -451,9 +451,9 @@ public class CityGmlParser {
 		double fromMetres = projection.getFromMetres();
 		if (fromMetres > 0) {
 			// also transform height information
-			config.setFromMetres(fromMetres);
+			config.setFromMeters(fromMetres);
 		} else {
-			config.setFromMetres(1.0);
+			config.setFromMeters(1.0);
 		}
 	}
 
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/ParserConfiguration.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/ParserConfiguration.java
index 5ace8d68ea90780aa5a832a787de119b52cb90c9..9adff4c2529f6da90c492c2e1e34e303cfe157b2 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/ParserConfiguration.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/ParserConfiguration.java
@@ -48,7 +48,7 @@ public class ParserConfiguration implements Serializable {
 	private boolean hasTransformation = false;
 	private boolean useLowMemoryConsumption = false;
 
-	private transient double fromMetres = 1.0;
+	private transient double fromMeters = 1.0;
 
 	public ParserConfiguration(int numberOfRoundingPlaces, boolean validate) {
 		this(numberOfRoundingPlaces, validate, false);
@@ -106,12 +106,12 @@ public class ParserConfiguration implements Serializable {
 		return originalTransform;
 	}
 
-	public void setFromMetres(double d) {
-		fromMetres = d;
+	public void setFromMeters(double d) {
+		fromMeters = d;
 	}
 
-	public double getFromMetres() {
-		return fromMetres;
+	public double getFromMeters() {
+		return fromMeters;
 	}
 	
 	public boolean useLowMemoryConsumption() {
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java
index 4337ac3366d35b7766b0d14ea78258852700be61..aed503f7600c42097b91266eeaafa3b55f7ef539 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java
@@ -59,12 +59,22 @@ public final class CityGmlUtils {
 		org.xmlobjects.gml.model.geometry.primitives.Polygon gmlPoly = new org.xmlobjects.gml.model.geometry.primitives.Polygon();
 		// exterior ring
 		LinearRing extLr = cdPoly.getExteriorRing();
+		if (extLr.getVertices().size() < 3) {
+			// this ring does not have enough points in it
+			// this leads to errors when exporting therefore ignore it
+			return null;
+		}
 		org.xmlobjects.gml.model.geometry.primitives.LinearRing gmlLr = createGmlRing(factory, config, extLr);
 		gmlPoly.setExterior(new AbstractRingProperty(gmlLr));
 
 		// interior rings
 		for (LinearRing lr : cdPoly.getInnerRings()) {
 			gmlLr = createGmlRing(factory, config, lr);
+			if (lr.getVertices().size() < 3) {
+				// this ring does not have enough points in it
+				// this leads to errors when exporting therefore ignore it
+				return null;
+			}
 			gmlPoly.getInterior().add(new AbstractRingProperty(gmlLr));
 		}
 		gmlPoly.setId(cdPoly.getGmlId().getGmlString());
@@ -73,6 +83,7 @@ public final class CityGmlUtils {
 
 	public static org.xmlobjects.gml.model.geometry.primitives.LinearRing createGmlRing(GeometryFactory factory,
 			ParserConfiguration config, LinearRing lr) {
+
 		ProjCoordinate p1 = new ProjCoordinate();
 		ProjCoordinate p2 = new ProjCoordinate();
 		List<Double> ringValues = new ArrayList<>();
@@ -87,12 +98,13 @@ public final class CityGmlUtils {
 				trans.transform(p1, p2);
 				x = p2.x;
 				y = p2.y;
-				z = z * config.getFromMetres();
+				z = z * config.getFromMeters();
 			}
 			ringValues.add(x);
 			ringValues.add(y);
 			ringValues.add(z);
 		}
+
 		org.xmlobjects.gml.model.geometry.primitives.LinearRing gmlLr = factory.createLinearRing(ringValues, 3);
 		gmlLr.setId(lr.getGmlId().getGmlString());
 		return gmlLr;
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/Checks.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/Checks.java
index 813170a93ed7ed69af5de5597c94fb4309225927..aa9ce41d27dedf7c13283001b25a0fceb639592c 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/Checks.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/Checks.java
@@ -52,6 +52,7 @@ import de.hft.stuttgart.citydoctor2.checks.semantics.IsCeilingCheck;
 import de.hft.stuttgart.citydoctor2.checks.semantics.IsFloorCheck;
 import de.hft.stuttgart.citydoctor2.checks.semantics.IsGroundCheck;
 import de.hft.stuttgart.citydoctor2.checks.semantics.IsWallCheck;
+import de.hft.stuttgart.citydoctor2.checks.semantics.PolygonWithoutSurfaceCheck;
 import de.hft.stuttgart.citydoctor2.checks.semantics.RoofSurfaceUnfragmentedCheck;
 import de.hft.stuttgart.citydoctor2.utils.Localization;
 
@@ -110,6 +111,7 @@ public class Checks {
 		publish(new IsCeilingCheck());
 		publish(new IsGroundCheck());
 		publish(new RoofSurfaceUnfragmentedCheck());
+		publish(new PolygonWithoutSurfaceCheck());
 		
 		// load checks from service loader
 		ServiceLoader<Check> checkLoader = ServiceLoader.load(Check.class);
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheck.java
new file mode 100644
index 0000000000000000000000000000000000000000..23c6c00a84f60ac999e9e6b249364ad6c0ca5f30
--- /dev/null
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheck.java
@@ -0,0 +1,54 @@
+package de.hft.stuttgart.citydoctor2.checks.semantics;
+
+import java.util.Collections;
+import java.util.Set;
+
+import de.hft.stuttgart.citydoctor2.check.Check;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError;
+import de.hft.stuttgart.citydoctor2.datastructure.Lod;
+import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
+
+public class PolygonWithoutSurfaceCheck extends Check {
+
+	@Override
+	public void check(Polygon poly) {
+		Lod lod = poly.getParent().getLod();
+		if (lod == Lod.LOD2 || lod == Lod.LOD3 || lod == Lod.LOD4) {
+			// only check LOD2-4
+			CheckResult cr;
+			if (poly.getPartOfSurface() == null) {
+				PolygonWithoutSurfaceError err = new PolygonWithoutSurfaceError(poly);
+				cr = new CheckResult(this, ResultStatus.ERROR, err);
+			} else {
+				cr = new CheckResult(this, ResultStatus.OK, null);
+			}
+			poly.addCheckResult(cr);
+		}
+	}
+
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return Collections.singleton(Requirement.R_SE_POLYGON_WITHOUT_SURFACE);
+	}
+
+	@Override
+	public CheckId getCheckId() {
+		return CheckId.C_SE_POLYGON_WITHOUT_SURFACE;
+	}
+
+	@Override
+	public RequirementType getType() {
+		return RequirementType.SEMANTIC;
+	}
+
+	@Override
+	public Check createNewInstance() {
+		return new PolygonWithoutSurfaceCheck();
+	}
+
+}
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheckTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheckTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..0bbb3fdf4b879f00ce94d5faded4996c4aa443e1
--- /dev/null
+++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/semantics/PolygonWithoutSurfaceCheckTest.java
@@ -0,0 +1,75 @@
+package de.hft.stuttgart.citydoctor2.checks.semantics;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import de.hft.stuttgart.citydoctor2.check.CheckError;
+import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.CheckResult;
+import de.hft.stuttgart.citydoctor2.check.ErrorId;
+import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError;
+import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
+import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
+import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
+import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
+import de.hft.stuttgart.citydoctor2.datastructure.Lod;
+import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
+
+public class PolygonWithoutSurfaceCheckTest {
+
+	@Test
+	public void testPolygonWithoutSurface() {
+		Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2);
+		Polygon poly = new ConcretePolygon();
+		geom.addPolygon(poly);
+		PolygonWithoutSurfaceCheck check = new PolygonWithoutSurfaceCheck();
+		poly.accept(check);
+		CheckResult checkResult = poly.getCheckResult(check);
+		assertNotNull(checkResult);
+		assertEquals(ResultStatus.ERROR, checkResult.getResultStatus());
+		assertEquals(CheckId.C_SE_POLYGON_WITHOUT_SURFACE, checkResult.getCheckIdentifier());
+		CheckError error = checkResult.getError();
+		assertNotNull(error);
+		assertEquals(ErrorId.SE_POLYGON_WITHOUT_SURFACE, error.getErrorId()); 
+		assertTrue(error instanceof PolygonWithoutSurfaceError);
+		PolygonWithoutSurfaceError errorCast = (PolygonWithoutSurfaceError) error;
+		assertSame(poly, errorCast.getPolygon());
+	}
+	
+	@Test
+	public void testPolygonWithSurface() {
+		Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD2);
+		Polygon poly = new ConcretePolygon();
+		BoundarySurface bs = new BoundarySurface(null);
+		bs.addGeometry(geom);
+		geom.addPolygon(poly);
+		PolygonWithoutSurfaceCheck check = new PolygonWithoutSurfaceCheck();
+		poly.accept(check);
+		CheckResult checkResult = poly.getCheckResult(check);
+		assertNotNull(checkResult);
+		assertEquals(ResultStatus.OK, checkResult.getResultStatus());
+		assertEquals(CheckId.C_SE_POLYGON_WITHOUT_SURFACE, checkResult.getCheckIdentifier());
+		CheckError error = checkResult.getError();
+		assertNull(error);
+	}
+	
+	@Test
+	public void testPolygonWithWrongLod() {
+		Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1);
+		Polygon poly = new ConcretePolygon();
+		BoundarySurface bs = new BoundarySurface(null);
+		bs.addGeometry(geom);
+		geom.addPolygon(poly);
+		PolygonWithoutSurfaceCheck check = new PolygonWithoutSurfaceCheck();
+		poly.accept(check);
+		CheckResult checkResult = poly.getCheckResult(check);
+		assertNull(checkResult);
+	}
+
+}
diff --git a/CityDoctorParent/pom.xml b/CityDoctorParent/pom.xml
index 50da97940ad1c095cf4670432b8efd5e56553da1..f392f00f42c30d75965293809eddea6e078773b3 100644
--- a/CityDoctorParent/pom.xml
+++ b/CityDoctorParent/pom.xml
@@ -103,12 +103,12 @@
 			<dependency>
 				<groupId>org.citygml4j</groupId>
 				<artifactId>citygml4j-core</artifactId>
-				<version>3.0.0</version>
+				<version>3.1.0</version>
 			</dependency>
 			<dependency>
 				<groupId>org.citygml4j</groupId>
 				<artifactId>citygml4j-xml</artifactId>
-				<version>3.0.0</version>
+				<version>3.1.0</version>
 			</dependency>
 			<dependency>
 				<groupId>de.hft.stuttgart</groupId>
@@ -156,6 +156,11 @@
 				<artifactId>log4j-core</artifactId>
 				<version>${log4j.version}</version>
 			</dependency>
+			<dependency>
+				<groupId>org.apache.logging.log4j</groupId>
+				<artifactId>log4j-jul</artifactId>
+				<version>${log4j.version}</version>
+			</dependency>
 			<dependency>
 				<groupId>org.yaml</groupId>
 				<artifactId>snakeyaml</artifactId>