diff --git a/CityDoctorParent/CityDoctorCheckResult/pom.xml b/CityDoctorParent/CityDoctorCheckResult/pom.xml
index 1e0b0ee67a676dc5dbe3716e74459070ffd43a7e..26828461ded0e90b9011bb4f23ee6977c98b3e45 100644
--- a/CityDoctorParent/CityDoctorCheckResult/pom.xml
+++ b/CityDoctorParent/CityDoctorCheckResult/pom.xml
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>de.hft.stuttgart</groupId>
diff --git a/CityDoctorParent/CityDoctorEdge/pom.xml b/CityDoctorParent/CityDoctorEdge/pom.xml
index a0f20756efe753ad2d45f0bc9514e4abae59c9ea..b4b4dcdda9845ddc99e94e72991656da79ba66da 100644
--- a/CityDoctorParent/CityDoctorEdge/pom.xml
+++ b/CityDoctorParent/CityDoctorEdge/pom.xml
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>de.hft.stuttgart</groupId>
diff --git a/CityDoctorParent/CityDoctorEdge/src/main/java/de/hft/stuttgart/citydoctor2/edge/Vector2d.java b/CityDoctorParent/CityDoctorEdge/src/main/java/de/hft/stuttgart/citydoctor2/edge/Vector2d.java
index 4ff8e6ccc5d434f7ca2690f501463f8e0561e0ed..c6bed4925715cd3e1928ea466ca5875b97e2375d 100644
--- a/CityDoctorParent/CityDoctorEdge/src/main/java/de/hft/stuttgart/citydoctor2/edge/Vector2d.java
+++ b/CityDoctorParent/CityDoctorEdge/src/main/java/de/hft/stuttgart/citydoctor2/edge/Vector2d.java
@@ -29,7 +29,6 @@ public class Vector2d {
 		this.y = y;
 	}
 
-	@SuppressWarnings("SuspiciousNameCombination")
     public Vector2d getPerpendicularVector() {
 		return new Vector2d(y, -x);
 	}
diff --git a/CityDoctorParent/CityDoctorModel/pom.xml b/CityDoctorParent/CityDoctorModel/pom.xml
index 2354ab19d548ea33db673f519204cfee747cd009..ae6596624a1ea2d200a04a17e1621f461e0e6c79 100644
--- a/CityDoctorParent/CityDoctorModel/pom.xml
+++ b/CityDoctorParent/CityDoctorModel/pom.xml
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>de.hft.stuttgart</groupId>
@@ -58,6 +60,14 @@
 			<groupId>org.locationtech.proj4j</groupId>
 			<artifactId>proj4j</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.locationtech.jts</groupId>
+			<artifactId>jts-core</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>io.github.earcut4j</groupId>
+			<artifactId>earcut4j</artifactId>
+		</dependency>
 	</dependencies>
 	<build>
 		<resources>
@@ -84,7 +94,8 @@
 					<prefix>git</prefix>
 					<verbose>false</verbose>
 					<generateGitPropertiesFile>true</generateGitPropertiesFile>
-					<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
+					<generateGitPropertiesFilename>
+						${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
 					<gitDescribe>
 						<skip>false</skip>
 						<always>false</always>
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 ca4b61389f12353e1f5f6128761d8cc590a91d7a..3879e29e1e4180057d990d4e0b665642a73f1362 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
@@ -60,10 +60,8 @@ import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
  * @author Matthias Betz
  *
  */
-@SuppressWarnings("unused")
 public interface HealingMethod {
 	
-	
 	public HealingID getID();
 
 	default boolean visit(CheckError e, ModificationListener l) {
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java
index 320635e3725af267f74a3f887cf94f1c3c61ce43..09ce064577ac0a068374b9d502d6fc0917387760 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java
@@ -804,19 +804,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
 		}
 	}
 
-//	private void parseAndAddCompositeSurface(MultiSurfaceProperty ms, Lod lod, CityObject co) {
-//		if (ms == null || ms.getObject() == null) {
-//			return;
-//		}
-//		List<SurfaceProperty> surfaces = ms.getObject().getSurfaceMember();
-//		for (SurfaceProperty surface : surfaces) {
-//			if (surface.getObject() instanceof CompositeSurface cs) {
-//				Geometry geom = parseCompositeSurface(cs, lod);
-//				co.addGeometry(geom);
-//			}
-//		}
-//	}
-
 	private void parseImplicitGeometry(AbstractOccupiedSpace aos, CityObject co) {
 		for (int i = 1; i <= 3; i++) {
 			if (aos.getImplicitRepresentation(i) == null) {
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/MovedPolygon.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/MovedPolygon.java
index 4019f80215eee08283d9d596b7e564737a0052e0..c05fc4eb9076810bf7767f8af2dabe4a0450ce03 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/MovedPolygon.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/MovedPolygon.java
@@ -39,6 +39,25 @@ public class MovedPolygon {
 	private MovedRing exteriorRing;
 	private List<MovedRing> innerRings;
 
+	/**
+	 * Moves the polygon by the first exterior vertex. The center of the polygon
+	 * will not me the origin, the polygon will just be near the origin. This can
+	 * eliviate numeric issues in large calculations.
+	 * 
+	 * @param p the polygon that is moved to the center.
+	 * @return the moved polygon.
+	 */
+	public static MovedPolygon ofPolygon(Polygon p) {
+		Vector3d movedBy = p.getExteriorRing().getVertices().get(0);
+		MovedPolygon indPoly = new MovedPolygon();
+		indPoly.original = p;
+		indPoly.exteriorRing = MovedRing.ofRing(p.getExteriorRing(), movedBy);
+		for (LinearRing inner : p.getInnerRings()) {
+			indPoly.addInnerRing(MovedRing.ofRing(inner, movedBy));
+		}
+		return indPoly;
+	}
+
 	public static MovedPolygon ofPolygon(Polygon p, Vector3d movedBy) {
 		MovedPolygon indPoly = new MovedPolygon();
 		indPoly.original = p;
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Polygon2d.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Polygon2d.java
index 6ccf32f3eeb71c03ccf3d4b6efffcc7f98219594..bd766219edecf5514bb521158c5ad048be8e8a58 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Polygon2d.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Polygon2d.java
@@ -40,6 +40,11 @@ public class Polygon2d {
 		ProjectionAxis axis = ProjectionAxis.of(poly);
 		return projectTo2D(poly, axis);
 	}
+	
+	public static Polygon2d withProjection(MovedPolygon poly) {
+		ProjectionAxis axis = ProjectionAxis.of(poly.getOriginal());
+		return projectTo2D(poly, axis);
+	}
 
 	public static Polygon2d withProjection(MovedPolygon poly, ProjectionAxis projectionAxis) {
 		return projectTo2D(poly, projectionAxis);
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/ProjectionAxis.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/ProjectionAxis.java
index 15e0494f12c59a571871185d988f3f7b9c12b61e..afbac56ac0e731c025ce61fc0f5b55d6e1321aa7 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/ProjectionAxis.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/ProjectionAxis.java
@@ -34,7 +34,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
  *
  */
 public class ProjectionAxis {
-	
+
 	private static final String DIVISOR_IS_0 = "Divisor is 0";
 
 	private final int[] axis;
@@ -87,20 +87,36 @@ public class ProjectionAxis {
 		this.axis = axis;
 	}
 
+	/**
+	 * This will write the two coordinates determined in this projection axis into a
+	 * given array at the startIndex location. The array has to have at least a
+	 * length of startIndex + 1.
+	 * 
+	 * @param v          the vector from which the coordinates are taken.
+	 * @param array      the array that is written to.
+	 * @param startIndex the start location in the array.
+	 */
+	public void writeCoordinatesOfVectorInArray(Vector3d v, double[] array, int startIndex) {
+		array[startIndex] = v.getCoordinate(axis[0]);
+		array[startIndex + 1] = v.getCoordinate(axis[1]);
+	}
+
 	public Vector2d project(Vector3d v) {
 		return new Vector2d(v.getCoordinate(axis[0]), v.getCoordinate(axis[1]));
 	}
 
 	/**
 	 * calculates the missing coordinate for 3d vector from the plane and this axis.
+	 * 
 	 * @return the projected 3d point.
 	 */
 	public Vector3d projectToPlane(Plane plane, Vector2d v) {
 		return projectToPlane(plane, v.getX(), v.getY());
 	}
-	
+
 	/**
 	 * calculates the missing coordinate for 3d vector from the plane and this axis.
+	 * 
 	 * @return the projected 3d point.
 	 */
 	public Vector3d projectToPlane(Plane plane, double vectorX, double vectorY) {
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Vector3d.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Vector3d.java
index ab5f495feea7441312bd8203cd10da69084d0488..df1486e30fa0109b0eb40bd85bb6e1c4bec8fe45 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Vector3d.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Vector3d.java
@@ -22,6 +22,8 @@ import java.io.Serial;
 import java.io.Serializable;
 import java.util.Arrays;
 
+import org.locationtech.jts.geom.Coordinate;
+
 /**
  * A three dimensional vector
  * 
@@ -44,6 +46,17 @@ public class Vector3d implements Serializable {
 	public Vector3d() {
 		this(0d, 0d, 0d);
 	}
+	
+	/**
+	 * Convert JTS Coordinate class to Vector3d.
+	 * @param coord JTS Coordinate
+	 */
+	public Vector3d(Coordinate coord) {
+		coords = new double[3];
+		coords[0] = coord.getX();
+		coords[1] = coord.getY();
+		coords[2] = coord.getZ();
+	}
 
 	public Vector3d(double x, double y, double z) {
 		coords = new double[3];
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/tesselation/EarcutTesselator.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/tesselation/EarcutTesselator.java
new file mode 100644
index 0000000000000000000000000000000000000000..acfc90f753a0b01a18f94ff71b0664389d4e5962
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/tesselation/EarcutTesselator.java
@@ -0,0 +1,88 @@
+package de.hft.stuttgart.citydoctor2.tesselation;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
+import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
+import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
+import de.hft.stuttgart.citydoctor2.math.ProjectionAxis;
+import de.hft.stuttgart.citydoctor2.math.Triangle3d;
+import earcut4j.Earcut;
+
+/**
+ * Tesselator to create triangles out of polygons. Uses earcut4j implementation.
+ * 
+ * @author Matthias Betz
+ *
+ */
+public class EarcutTesselator {
+
+	public static TesselatedPolygon tesselatePolygon(Polygon p) {
+		// sum number of vertices, don't use duplicate last point
+		// assume polygons are closed
+		int nrOfVertices = p.getExteriorRing().getVertices().size() - 1;
+		int[] holeStart = null;
+		if (!p.getInnerRings().isEmpty()) {
+			holeStart = new int[p.getInnerRings().size()];
+			List<LinearRing> innerRings = p.getInnerRings();
+			for (int i = 0; i < innerRings.size(); i++) {
+				LinearRing r = innerRings.get(i);
+				holeStart[i] = nrOfVertices;
+				nrOfVertices += r.getVertices().size() - 1;
+			}
+		}
+		// collect vertices
+		// find most dominant projection axis for 2d projection
+		ProjectionAxis axis = ProjectionAxis.of(p);
+		
+		double[] vertices = new double[nrOfVertices * 2];
+		List<Vertex> vertexObjects = new ArrayList<>();
+		addVerticesToList(p.getExteriorRing(), vertexObjects);
+		for (LinearRing innerRing : p.getInnerRings()) {
+			addVerticesToList(innerRing, vertexObjects);
+		}
+		
+		// write the vector data according to the projection axis into the array
+		int start = addRingToArray(p.getExteriorRing(), vertices, 0, axis);
+		for (LinearRing innerRing : p.getInnerRings()) {
+			start = addRingToArray(innerRing, vertices, start, axis);
+		}
+		
+		// triangulation
+		List<Integer> indices = Earcut.earcut(vertices, holeStart, 2);
+		List<Triangle3d> triangles = new ArrayList<>();
+		if (indices.size() % 3 != 0) {
+			throw new IllegalStateException();
+		}
+		for (int i = 0; i < indices.size(); i = i + 3) {
+			Triangle3d t = new Triangle3d(vertexObjects.get(indices.get(i + 0)),
+					vertexObjects.get(indices.get(i + 1)),
+					vertexObjects.get(indices.get(i + 2)));
+			triangles.add(t);
+		}
+		return new TesselatedPolygon(triangles, p);
+	}
+
+	private static void addVerticesToList(LinearRing ring, List<Vertex> vertexObjects) {
+		List<Vertex> vertices = ring.getVertices();
+		for (int i = 0; i < vertices.size() - 1; i++) {
+			Vertex v = vertices.get(i);
+			vertexObjects.add(v);
+		}
+	}
+
+	private static int addRingToArray(LinearRing ring, double[] vertices, int start, ProjectionAxis axis) {
+		List<Vertex> ringVertices = ring.getVertices();
+		for (int i = 0; i < ringVertices.size() - 1; i++) {
+			Vertex v = ringVertices.get(i);
+			axis.writeCoordinatesOfVectorInArray(v, vertices, start);
+			start = start + 2;
+		}
+		return start;
+	}
+	
+	private EarcutTesselator() {
+	}
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/tesselation/JoglTesselator.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/tesselation/JoglTesselator.java
index d20c878d73b6b9b702aa2e453a3ff36c3503bf27..a98c330b5cb68851bd5ca60506e63ba086fdcf50 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/tesselation/JoglTesselator.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/tesselation/JoglTesselator.java
@@ -33,7 +33,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
 import de.hft.stuttgart.citydoctor2.math.Vector3d;
 
 /**
- * Tesselator to create triangles out of polygons.
+ * Tesselator to create triangles out of polygons. Uses JOGL implementation.
  * 
  * @author Matthias Betz
  *
@@ -102,6 +102,10 @@ public class JoglTesselator {
 	}
 
 	public static TesselatedPolygon tesselatePolygon(Polygon p) {
+		return tesselatePolygon(p, true);
+	}
+	
+	public static TesselatedPolygon tesselatePolygon(Polygon p, boolean discardDegeneratedTriangles) {
 		ArrayList<Vector3d> vertices = new ArrayList<>();
 		Vector3d normal = p.calculateNormalNormalized();
 		synchronized (tess) {
@@ -121,7 +125,7 @@ public class JoglTesselator {
 			GLU.gluTessEndPolygon(tess);
 			ArrayList<Integer> indices = new ArrayList<>();
 			for (Primitive primitive : primitives) {
-				primitive.fillListWithIndices(indices);
+				primitive.fillListWithIndices(indices, discardDegeneratedTriangles);
 			}
 			primitives.clear();
 			return new TesselatedPolygon(vertices, indices, p);
@@ -137,7 +141,7 @@ public class JoglTesselator {
 		GLU.gluTessEndContour(tess);
 	}
 
-	public static TesselatedRing tesselateRing(LinearRing r) {
+	public static TesselatedRing tesselateRing(LinearRing r, boolean discardDegeneratedTriangles) {
 		ArrayList<Vector3d> vertices = new ArrayList<>();
 		Vector3d normal = r.calculateNormal();
 		synchronized (tess) {
@@ -147,12 +151,16 @@ public class JoglTesselator {
 			GLU.gluTessEndPolygon(tess);
 			ArrayList<Integer> indices = new ArrayList<>();
 			for (Primitive primitive : primitives) {
-				primitive.fillListWithIndices(indices);
+				primitive.fillListWithIndices(indices, discardDegeneratedTriangles);
 			}
 			primitives.clear();
 			return new TesselatedRing(vertices, indices, r);
 		}
 	}
+	
+	public static TesselatedRing tesselateRing(LinearRing r) {
+		return tesselateRing(r, true);
+	}
 
 	private JoglTesselator() {
 		// only static useage
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/tesselation/Primitive.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/tesselation/Primitive.java
index 3f59db768d54a9dcb3c1cada8cf4f20572f8c982..4e65d89076bb0cd6da5ca7b52326e00d57b1436a 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/tesselation/Primitive.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/tesselation/Primitive.java
@@ -49,30 +49,34 @@ public class Primitive {
 		this.type = type;
 	}
 
-	public void fillListWithIndices(List<Integer> indices) {
+	public void fillListWithIndices(List<Integer> indices, boolean discardDegeneratedTriangles) {
 		switch (type) {
 		case GL.GL_TRIANGLES:
 			for (int i = 0; i < pIndices.size(); i += 3) {
-				addToListIfAreaNonNull(pIndices.get(i), pIndices.get(i + 1), pIndices.get(i + 2), indices);
+				addToListIfAreaNonNull(pIndices.get(i), pIndices.get(i + 1), pIndices.get(i + 2), indices,
+						discardDegeneratedTriangles);
 			}
 			break;
 		case GL.GL_TRIANGLE_STRIP:
 			for (int i = 0; i < pIndices.size() - 2; i++) {
 				if (i % 2 == 0) {
-					addToListIfAreaNonNull(pIndices.get(i), pIndices.get(i + 1), pIndices.get(i + 2), indices);
+					addToListIfAreaNonNull(pIndices.get(i), pIndices.get(i + 1), pIndices.get(i + 2), indices,
+							discardDegeneratedTriangles);
 				} else {
-					addToListIfAreaNonNull(pIndices.get(i), pIndices.get(i + 2), pIndices.get(i + 1), indices);
+					addToListIfAreaNonNull(pIndices.get(i), pIndices.get(i + 2), pIndices.get(i + 1), indices,
+							discardDegeneratedTriangles);
 				}
 			}
 			break;
 		case GL.GL_TRIANGLE_FAN:
 			Integer first = pIndices.get(0);
 			for (int i = 0; i < pIndices.size() - 2; i++) {
-				addToListIfAreaNonNull(first, pIndices.get(i + 1), pIndices.get(i + 2), indices);
+				addToListIfAreaNonNull(first, pIndices.get(i + 1), pIndices.get(i + 2), indices,
+						discardDegeneratedTriangles);
 			}
 			break;
 		default:
-			throw new IllegalStateException("unknown type found: " + type);
+			throw new IllegalStateException("unknown triangle type found: " + type);
 		}
 	}
 
@@ -80,20 +84,21 @@ public class Primitive {
 		pIndices.add(i);
 	}
 
-	private void addToListIfAreaNonNull(Integer i1, Integer i2, Integer i3, List<Integer> indices) {
+	private void addToListIfAreaNonNull(Integer i1, Integer i2, Integer i3, List<Integer> indices,
+			boolean discardDegeneratedTriangles) {
 		Vector3d v1 = vertices.get(i1);
 		Vector3d v2 = vertices.get(i2);
 		Vector3d v3 = vertices.get(i3);
-		double area = Math.abs(calculateAreaOfTriangle(v1, v2, v3));
-		if (area > AREA_EPSILON) {
+		if (discardDegeneratedTriangles && Math.abs(calculateAreaOfTriangle(v1, v2, v3)) <= AREA_EPSILON) {
+			// switch to discard degenerated triangles is enabled and triangle has nearly no area
+			logger.trace("Tesselator created degenerated triangle, ignoring");
+		} else {
 			indices.add(i1);
 			indices.add(i2);
 			indices.add(i3);
-		} else {
-			logger.trace("Tesselator created degenerated triangle, ignoring");
 		}
 	}
-	
+
 	/**
 	 * Calculates the area of a triangle given by the 3 points
 	 * 
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/PolygonIntersection.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/PolygonIntersection.java
index 62f9b877aea4dd7857f0120beaba8c943b58d5db..8b23003d2ef7152723c5085c6c551d246d2d5dfa 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/PolygonIntersection.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/PolygonIntersection.java
@@ -25,6 +25,7 @@ import java.util.List;
 import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
 import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
 import de.hft.stuttgart.citydoctor2.math.Segment3d;
+import de.hft.stuttgart.citydoctor2.math.Triangle3d;
 
 /**
  * Result of a polygon polygon intersection.
@@ -38,7 +39,7 @@ public class PolygonIntersection implements Serializable {
 	private static final long serialVersionUID = -6301963226688351725L;
 
 	public enum IntersectionType {
-		NONE, LINE, POLYGON
+		NONE, LINE, POLYGON, TRIANGLES
 	}
 
 	private final IntersectionType type;
@@ -47,10 +48,30 @@ public class PolygonIntersection implements Serializable {
 
 	private Polygon p1;
 	private Polygon p2;
+	
+	private Triangle3d t1;
+	private Triangle3d t2;
 
 	public static PolygonIntersection none() {
 		return new PolygonIntersection(IntersectionType.NONE);
 	}
+	
+	
+	public static PolygonIntersection triangles(Triangle3d t1, Triangle3d t2) {
+		PolygonIntersection poly = new PolygonIntersection(IntersectionType.TRIANGLES);
+		poly.p1 = t1.getPartOf().getOriginal();
+		poly.p2 = t2.getPartOf().getOriginal();
+		poly.t1 = t1;
+		poly.t2 = t2;
+		return poly;
+	}
+	
+	public static PolygonIntersection any(Polygon p1, Polygon p2) {
+		PolygonIntersection poly = new PolygonIntersection(IntersectionType.POLYGON);
+		poly.p1 = p1;
+		poly.p2 = p2;
+		return poly;
+	}
 
 	public static PolygonIntersection lines(List<Segment3d> lines, Polygon p1, Polygon p2) {
 		PolygonIntersection poly = new PolygonIntersection(IntersectionType.LINE);
@@ -75,6 +96,14 @@ public class PolygonIntersection implements Serializable {
 	public Polygon getP2() {
 		return p2;
 	}
+	
+	public Triangle3d getT1() {
+		return t1;
+	}
+	
+	public Triangle3d getT2() {
+		return t2;
+	}
 
 	private PolygonIntersection(IntersectionType type) {
 		this.type = type;
diff --git a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties
index ddba2444a0e7b17ccb89ea6b0eb324fe2e585fa5..be6dc1cb7827abc21d06ff6ea4eedc779cd6eee7 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties
+++ b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties
@@ -119,4 +119,13 @@ OpenFileDialog.loadFailed=Failed to load CityGML File
 MainWindow.memoryLabel=Memory:
 CheckDialog.checksReenabledAlert=Some checks have been reenabled so that other wanted checks can be executed\nSee the log for more information.
 MainWindow.availableLabel=Available:
-OpenFileDialog.lowMemoryLabel=Low Memory Consumption Mode
\ No newline at end of file
+OpenFileDialog.lowMemoryLabel=Low Memory Consumption Mode
+ErrorItemVisitor.intersection=Intersection
+ErrorItemVisitor.component=Component
+ErrorItemVisitor.nameOfAttribute=Name of attribute
+ErrorItemVisitor.childId=Child id
+ErrorItemVisitor.distance=Distance
+ErrorItemVisitor.pointTouchesEdge=Point touches edge
+ErrorItemVisitor.degeneratedRing=Degenerated ring
+ErrorItemVisitor.deviation=Deviation
+ErrorItemVisitor.triangles=Triangles
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties
index b93a1419fd7c859b8da3210dbafd579b8d424eb5..a1a556493019c8721283ed5f84137a3893021448 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties
+++ b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties
@@ -117,4 +117,13 @@ OpenFileDialog.loadFailed=Konnte CityGML Datei nicht laden
 MainWindow.memoryLabel=Speicher:
 CheckDialog.checksReenabledAlert=Manche Pr\u00fcfungen wurden reaktiviert damit andere gewollte Pr\u00fcfungen durchgef\u00fchrt werden k\u00f6nnen\nMehr Details sind im Log geschrieben
 MainWindow.availableLabel=Verf\u00fcgbar:
-OpenFileDialog.lowMemoryLabel=Reduzierter Speicherverbrauchsmodus
\ No newline at end of file
+OpenFileDialog.lowMemoryLabel=Reduzierter Speicherverbrauchsmodus
+ErrorItemVisitor.intersection=Verschneidung
+ErrorItemVisitor.component=Komponente
+ErrorItemVisitor.nameOfAttribute=Name des Attributs
+ErrorItemVisitor.childId=Kind ID
+ErrorItemVisitor.distance=Distanz
+ErrorItemVisitor.pointTouchesEdge=Punkt ber\u00fchrt Kante
+ErrorItemVisitor.degeneratedRing=Degenerierter Ring
+ErrorItemVisitor.deviation=Abweichung
+ErrorItemVisitor.triangles=Dreiecke
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java
index 2e33ed82d319293fbc67ffcd3472e71b41311d33..0d5e778e7fc4895c30bb9e599c7a09fd6bc315ac 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java
@@ -423,6 +423,7 @@ public class Checker {
 		}
 	}
 
+	@SuppressWarnings("resource")
 	public static SvrlContentHandler executeSchematronValidationIfAvailable(ValidationConfiguration config,
 			InputStream in) {
 		if (config.getSchematronFilePath() != null && !config.getSchematronFilePath().isEmpty()) {
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidSelfIntCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidSelfIntCheck.java
index 5b47c79a862a26c2c8ee62b959abcdece6e3b6ad..0eefd3498e4f95f4b290be5e3c193252e5eee90e 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidSelfIntCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidSelfIntCheck.java
@@ -75,7 +75,7 @@ public class SolidSelfIntCheck extends Check {
 			return;
 		}
 		CheckResult cr;
-		List<PolygonIntersection> intersections = SelfIntersectionUtil.doesSolidSelfIntersect2(g);
+		List<PolygonIntersection> intersections = SelfIntersectionUtil.calculateSolidSelfIntersection(g);
 		if (intersections.isEmpty()) {
 			cr = new CheckResult(this, ResultStatus.OK, null);
 		} else {
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/util/SelfIntersectionUtil.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/util/SelfIntersectionUtil.java
index a68b0b4b5fc5b8926cb52ca9064aa47d0a14880f..602eb04545a19a7052a10e30eda1f7f72d45a1ca 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/util/SelfIntersectionUtil.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/util/SelfIntersectionUtil.java
@@ -62,6 +62,7 @@ import de.hft.stuttgart.citydoctor2.math.Segment3d;
 import de.hft.stuttgart.citydoctor2.math.Triangle3d;
 import de.hft.stuttgart.citydoctor2.math.Vector2d;
 import de.hft.stuttgart.citydoctor2.math.Vector3d;
+import de.hft.stuttgart.citydoctor2.tesselation.EarcutTesselator;
 import de.hft.stuttgart.citydoctor2.tesselation.JoglTesselator;
 import de.hft.stuttgart.citydoctor2.tesselation.TesselatedPolygon;
 import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection;
@@ -75,15 +76,33 @@ import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection.IntersectionType;
  */
 public class SelfIntersectionUtil {
 
-
 	private static final Logger logger = LogManager.getLogger(SelfIntersectionUtil.class);
-	
+
 	private static final GeometryFactory factory = new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING));
 
 	private SelfIntersectionUtil() {
 
 	}
 
+	public static List<PolygonIntersection> calculateSolidSelfIntersection(Geometry g) {
+		List<TesselatedPolygon> tesselatedPolygons = new ArrayList<>();
+		for (Polygon p : g.getPolygons()) {
+			tesselatedPolygons.add(EarcutTesselator.tesselatePolygon(p));
+		}
+		List<PolygonIntersection> intersections = new ArrayList<>();
+		for (int i = 0; i < tesselatedPolygons.size() - 1; i++) {
+			TesselatedPolygon p1 = tesselatedPolygons.get(i);
+			for (int j = i + 1; j < tesselatedPolygons.size(); j++) {
+				TesselatedPolygon p2 = tesselatedPolygons.get(j);
+				GeometrySelfIntersection intersection = doPolygonsIntersect(p1, p2);
+				if (intersection != null) {
+					intersections.add(PolygonIntersection.triangles(intersection.t1(), intersection.t2()));
+				}
+			}
+		}
+		return intersections;
+	}
+
 	public static GeometrySelfIntersection doesSolidSelfIntersect(Geometry g) {
 		return selfIntersectionJava(g);
 	}
@@ -114,14 +133,15 @@ public class SelfIntersectionUtil {
 		return intersections;
 	}
 
-	private static void performEdgeSelfIntersection(List<PolygonIntersection> intersections, Map<Polygon, EdgePolygon> edgePolyMap,
-			Polygon p1, Polygon p2) {
+	private static void performEdgeSelfIntersection(List<PolygonIntersection> intersections,
+			Map<Polygon, EdgePolygon> edgePolyMap, Polygon p1, Polygon p2) {
 		EdgePolygon edgeP1 = edgePolyMap.get(p1);
 		EdgePolygon edgeP2 = edgePolyMap.get(p2);
-		List<PolygonPolygonIntersection> results = IntersectPlanarPolygons.intersectPolygons(edgeP1, edgeP2, 0.000001, 0.001);
+		List<PolygonPolygonIntersection> results = IntersectPlanarPolygons.intersectPolygons(edgeP1, edgeP2, 0.000001,
+				0.001);
 		if (!results.isEmpty()) {
 			// at least one intersection happened
-			for (PolygonPolygonIntersection result: results) {
+			for (PolygonPolygonIntersection result : results) {
 				// Ensure that Intersection-Edge is not a Null-Line.
 				// If it is a Null-Line, detected Intersection is a False-Positive.
 				if (!result.getPolyLine().isNullLine()) {
diff --git a/CityDoctorParent/Extensions/CityDoctorAutoPro/pom.xml b/CityDoctorParent/Extensions/CityDoctorAutoPro/pom.xml
index 0961ad7b8239efb00392f675c80464911b3292c0..f2045edde1a531b854b1deae451297d35e6bd60f 100644
--- a/CityDoctorParent/Extensions/CityDoctorAutoPro/pom.xml
+++ b/CityDoctorParent/Extensions/CityDoctorAutoPro/pom.xml
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>de.hft.stuttgart</groupId>
diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/pom.xml b/CityDoctorParent/Extensions/CityDoctorGUI/pom.xml
index 2d70d35792a929a7e2e7f9e897431b5f14b70fc1..150b533eaa61840c2b4fd88a569985917359dfcb 100644
--- a/CityDoctorParent/Extensions/CityDoctorGUI/pom.xml
+++ b/CityDoctorParent/Extensions/CityDoctorGUI/pom.xml
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>de.hft.stuttgart</groupId>
@@ -45,6 +47,18 @@
 			<groupId>org.apache.logging.log4j</groupId>
 			<artifactId>log4j-slf4j18-impl</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.openjfx</groupId>
+			<artifactId>javafx-controls</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.openjfx</groupId>
+			<artifactId>javafx-fxml</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.openjfx</groupId>
+			<artifactId>javafx-swing</artifactId>
+		</dependency>
 	</dependencies>
 	<profiles>
 		<profile>
@@ -68,9 +82,11 @@
 									<goal>wget</goal>
 								</goals>
 								<configuration>
-									<uri>https://download.bell-sw.com/java/${jre-version}/bellsoft-jre${jre-version}-windows-amd64-full.zip</uri>
+									<uri>
+										https://download.bell-sw.com/java/${jre-version}/bellsoft-jre${jre-version}-windows-amd64-full.zip</uri>
 									<unpack>false</unpack>
-									<outputDirectory>${project.build.directory}/jre/jre-win</outputDirectory>
+									<outputDirectory>
+										${project.build.directory}/jre/jre-win</outputDirectory>
 									<outputFileName>win-runtime.zip</outputFileName>
 								</configuration>
 							</execution>
@@ -81,9 +97,11 @@
 									<goal>wget</goal>
 								</goals>
 								<configuration>
-									<uri>https://download.bell-sw.com/java/${jre-version}/bellsoft-jre${jre-version}-linux-amd64-full.tar.gz</uri>
+									<uri>
+										https://download.bell-sw.com/java/${jre-version}/bellsoft-jre${jre-version}-linux-amd64-full.tar.gz</uri>
 									<unpack>false</unpack>
-									<outputDirectory>${project.build.directory}/jre/jre-lin</outputDirectory>
+									<outputDirectory>
+										${project.build.directory}/jre/jre-lin</outputDirectory>
 									<outputFileName>lin-runtime.tar.gz</outputFileName>
 								</configuration>
 							</execution>
@@ -94,9 +112,11 @@
 									<goal>wget</goal>
 								</goals>
 								<configuration>
-									<uri>https://download.bell-sw.com/java/${jre-version}/bellsoft-jre${jre-version}-macos-amd64-full.zip</uri>
+									<uri>
+										https://download.bell-sw.com/java/${jre-version}/bellsoft-jre${jre-version}-macos-amd64-full.zip</uri>
 									<unpack>false</unpack>
-									<outputDirectory>${project.build.directory}/jre/jre-mac</outputDirectory>
+									<outputDirectory>
+										${project.build.directory}/jre/jre-mac</outputDirectory>
 									<outputFileName>mac-runtime.zip</outputFileName>
 								</configuration>
 							</execution>
@@ -112,9 +132,16 @@
 								<phase>install</phase>
 								<configuration>
 									<target name="unpack">
-										<untar src="${project.build.directory}/jre/jre-lin/lin-runtime.tar.gz" dest="${project.build.directory}/jre/jre-lin/runtime" compression="gzip"></untar>
-										<unzip src="${project.build.directory}/jre/jre-win/win-runtime.zip" dest="${project.build.directory}/jre/jre-win/runtime"></unzip>
-										<unzip src="${project.build.directory}/jre/jre-mac/mac-runtime.zip" dest="${project.build.directory}/jre/jre-mac/runtime"></unzip>
+										<untar
+											src="${project.build.directory}/jre/jre-lin/lin-runtime.tar.gz"
+											dest="${project.build.directory}/jre/jre-lin/runtime"
+											compression="gzip"></untar>
+										<unzip
+											src="${project.build.directory}/jre/jre-win/win-runtime.zip"
+											dest="${project.build.directory}/jre/jre-win/runtime"></unzip>
+										<unzip
+											src="${project.build.directory}/jre/jre-mac/mac-runtime.zip"
+											dest="${project.build.directory}/jre/jre-mac/runtime"></unzip>
 									</target>
 								</configuration>
 								<goals>
@@ -136,9 +163,11 @@
 									<goal>single</goal>
 								</goals>
 								<configuration>
-									<finalName>${project.artifactId}-${project.version}-no-runtime</finalName>
+									<finalName>
+										${project.artifactId}-${project.version}-no-runtime</finalName>
 									<descriptors>
-										<descriptor>${project.basedir}/src/assembly/no_runtime/assembly.xml</descriptor>
+										<descriptor>
+											${project.basedir}/src/assembly/no_runtime/assembly.xml</descriptor>
 									</descriptors>
 								</configuration>
 							</execution>
@@ -149,9 +178,11 @@
 									<goal>single</goal>
 								</goals>
 								<configuration>
-									<finalName>${project.artifactId}-${project.version}-win</finalName>
+									<finalName>
+										${project.artifactId}-${project.version}-win</finalName>
 									<descriptors>
-										<descriptor>${project.basedir}/src/assembly/win/assembly.xml</descriptor>
+										<descriptor>
+											${project.basedir}/src/assembly/win/assembly.xml</descriptor>
 									</descriptors>
 								</configuration>
 							</execution>
@@ -162,9 +193,11 @@
 									<goal>single</goal>
 								</goals>
 								<configuration>
-									<finalName>${project.artifactId}-${project.version}-lin</finalName>
+									<finalName>
+										${project.artifactId}-${project.version}-lin</finalName>
 									<descriptors>
-										<descriptor>${project.basedir}/src/assembly/lin/assembly.xml</descriptor>
+										<descriptor>
+											${project.basedir}/src/assembly/lin/assembly.xml</descriptor>
 									</descriptors>
 								</configuration>
 							</execution>
@@ -175,9 +208,11 @@
 									<goal>single</goal>
 								</goals>
 								<configuration>
-									<finalName>${project.artifactId}-${project.version}-mac</finalName>
+									<finalName>
+										${project.artifactId}-${project.version}-mac</finalName>
 									<descriptors>
-										<descriptor>${project.basedir}/src/assembly/mac/assembly.xml</descriptor>
+										<descriptor>
+											${project.basedir}/src/assembly/mac/assembly.xml</descriptor>
 									</descriptors>
 								</configuration>
 							</execution>
diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ListErrorVisitor.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ListErrorVisitor.java
index 65b7cc10bb7303e0d841cd22335782c29af9fb17..ae8c3112f9c2434cc53829ef38b315e666535ede 100644
--- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ListErrorVisitor.java
+++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ListErrorVisitor.java
@@ -43,6 +43,7 @@ import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
 import de.hft.stuttgart.citydoctor2.datastructure.Edge;
 import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
 import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
+import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection;
 import javafx.scene.paint.Color;
 
 public class ListErrorVisitor implements ErrorVisitor {
@@ -171,7 +172,11 @@ public class ListErrorVisitor implements ErrorVisitor {
 
 	@Override
 	public void visit(SolidSelfIntError err) {
-		// nothing to display for now
+		controller.clearHighlights();
+		for (PolygonIntersection intersection : err.getIntersections()) {
+			controller.addHighlight(intersection.getP1(), geom);
+			controller.addHighlight(intersection.getP2(), geom);
+		}
 	}
 
 	@Override
@@ -208,22 +213,22 @@ public class ListErrorVisitor implements ErrorVisitor {
 
 	@Override
 	public void visit(NotCeilingError err) {
-		// nothing to display
+		controller.highlight(err.getPolygon(), geom);
 	}
 
 	@Override
 	public void visit(NotFloorError err) {
-		// nothing to display
+		controller.highlight(err.getPolygon(), geom);
 	}
 
 	@Override
 	public void visit(NotWallError err) {
-		// nothing to display
+		controller.highlight(err.getPolygon(), geom);
 	}
 
 	@Override
 	public void visit(NotGroundError err) {
-		// nothing to display
+		controller.highlight(err.getPolygon(), geom);
 	}
 
 	@Override
diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ErrorItemVisitor.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ErrorItemVisitor.java
index 52fb5a4b8b7051712e9952ff103884ee1f859520..d28cca5eb34404b17232085c5ed1ba4ae7d95c03 100644
--- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ErrorItemVisitor.java
+++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/ErrorItemVisitor.java
@@ -39,16 +39,23 @@ import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
 import de.hft.stuttgart.citydoctor2.check.error.DegeneratedRingError;
 import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
 import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
+import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
 import de.hft.stuttgart.citydoctor2.datastructure.Edge;
+import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
+import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType;
 import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
 import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
 import de.hft.stuttgart.citydoctor2.gui.CheckStatus;
+import de.hft.stuttgart.citydoctor2.math.Triangle3d;
+import de.hft.stuttgart.citydoctor2.utils.Localization;
+import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection;
+import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection.IntersectionType;
 import javafx.scene.control.TreeItem;
 
 public class ErrorItemVisitor implements ErrorVisitor {
-	
-	private static final String NAME_OF_ATTRIBUTE = "Name of Attribute: ";
-	private static final String CHILD_ID = "ChildId: ";
+
+	private static String nameOfAttribute = Localization.getText("ErrorItemVisitor.nameOfAttribute") + ": ";
+	private static String childId = Localization.getText("ErrorItemVisitor.childId") + ": ";
 	private final TreeItem<Renderable> root;
 
 	public ErrorItemVisitor(TreeItem<Renderable> root) {
@@ -74,7 +81,7 @@ public class ErrorItemVisitor implements ErrorVisitor {
 	@Override
 	public void visit(MultipleConnectedComponentsError err) {
 		for (int i = 0; i < err.getComponents().size(); i++) {
-			TextNode textNode = new TextNode("Component " + i);
+			TextNode textNode = new TextNode(Localization.getText("ErrorItemVisitor.component") + " " + i);
 			TreeItem<Renderable> textItem = new TreeItem<>(textNode);
 			root.getChildren().add(textItem);
 			List<Polygon> component = err.getComponents().get(i);
@@ -99,7 +106,7 @@ public class ErrorItemVisitor implements ErrorVisitor {
 		TreeItem<Renderable> vertexItem = new TreeItem<>(vertexNode);
 		root.getChildren().add(vertexItem);
 		for (int i = 0; i < err.getComponents().size(); i++) {
-			TextNode textNode = new TextNode("Component " + i);
+			TextNode textNode = new TextNode(Localization.getText("ErrorItemVisitor.component") + " " + i);
 			TreeItem<Renderable> textItem = new TreeItem<>(textNode);
 			root.getChildren().add(textItem);
 			List<Polygon> component = err.getComponents().get(i);
@@ -144,7 +151,7 @@ public class ErrorItemVisitor implements ErrorVisitor {
 	@Override
 	public void visit(UnknownCheckError err) {
 		// not displayed
-		
+
 	}
 
 	@Override
@@ -159,11 +166,11 @@ public class ErrorItemVisitor implements ErrorVisitor {
 		LinearRingNode ringNode = new LinearRingNode(err.getRing(), CheckStatus.NOT_CHECKED);
 		TreeItem<Renderable> ringItem = new TreeItem<>(ringNode);
 		root.getChildren().add(ringItem);
-		
+
 		VertexNode vertexNode = new VertexNode(err.getVertex1());
 		TreeItem<Renderable> vertexItem = new TreeItem<>(vertexNode);
 		root.getChildren().add(vertexItem);
-		
+
 		vertexNode = new VertexNode(err.getVertex2());
 		vertexItem = new TreeItem<>(vertexNode);
 		root.getChildren().add(vertexItem);
@@ -193,7 +200,7 @@ public class ErrorItemVisitor implements ErrorVisitor {
 		LinearRingNode ringNode = new LinearRingNode(err.getRing(), CheckStatus.NOT_CHECKED);
 		TreeItem<Renderable> ringItem = new TreeItem<>(ringNode);
 		root.getChildren().add(ringItem);
-		
+
 		if (err.getRing().getGmlId().isGenerated()) {
 			PolygonNode polyNode = new PolygonNode(err.getRing().getParent(), CheckStatus.NOT_CHECKED);
 			TreeItem<Renderable> polyItem = new TreeItem<>(polyNode);
@@ -206,8 +213,9 @@ public class ErrorItemVisitor implements ErrorVisitor {
 		PolygonNode polyNode = new PolygonNode(err.getPolygon(), CheckStatus.NOT_CHECKED);
 		TreeItem<Renderable> polyItem = new TreeItem<>(polyNode);
 		root.getChildren().add(polyItem);
-		
-		TextNode textNode = new TextNode("Deviation: " + err.getDeviation());
+
+		TextNode textNode = new TextNode(
+				Localization.getText("ErrorItemVisitor.deviation") + ": " + err.getDeviation());
 		TreeItem<Renderable> textItem = new TreeItem<>(textNode);
 		root.getChildren().add(textItem);
 	}
@@ -217,15 +225,16 @@ public class ErrorItemVisitor implements ErrorVisitor {
 		PolygonNode polyNode = new PolygonNode(err.getPolygon(), CheckStatus.NOT_CHECKED);
 		TreeItem<Renderable> polyItem = new TreeItem<>(polyNode);
 		root.getChildren().add(polyItem);
-		
+
 		VertexNode vertexNode = new VertexNode(err.getVertex());
 		TreeItem<Renderable> vertexItem = new TreeItem<>(vertexNode);
 		root.getChildren().add(vertexItem);
-		
-		TextNode textNode = new TextNode("Distance: " + err.getDistance() + "m");
+
+		TextNode textNode = new TextNode(
+				Localization.getText("ErrorItemVisitor.distance") + ": " + err.getDistance() + "m");
 		TreeItem<Renderable> textItem = new TreeItem<>(textNode);
 		root.getChildren().add(textItem);
-		
+
 	}
 
 	@Override
@@ -237,18 +246,54 @@ public class ErrorItemVisitor implements ErrorVisitor {
 
 	@Override
 	public void visit(SolidSelfIntError err) {
-		PolygonNode polyNode1 = new PolygonNode(err.getIntersections().get(0).getP1(), CheckStatus.NOT_CHECKED);
-		TreeItem<Renderable> polyItem1 = new TreeItem<>(polyNode1);
-		root.getChildren().add(polyItem1);
-		PolygonNode polyNode2 = new PolygonNode(err.getIntersections().get(0).getP2(), CheckStatus.NOT_CHECKED);
-		TreeItem<Renderable> polyItem2 = new TreeItem<>(polyNode2);
-		root.getChildren().add(polyItem2);
+		List<PolygonIntersection> intersections = err.getIntersections();
+		for (int i = 0; i < intersections.size(); i++) {
+			PolygonIntersection pi = intersections.get(i);
+			TextNode intersectionNode = new TextNode(Localization.getText("ErrorItemVisitor.intersection") + " " + i);
+			TreeItem<Renderable> intersectionItem = new TreeItem<>(intersectionNode);
+			root.getChildren().add(intersectionItem);
+
+			PolygonNode polyNode1 = new PolygonNode(pi.getP1(), CheckStatus.NOT_CHECKED);
+			TreeItem<Renderable> polyItem1 = new TreeItem<>(polyNode1);
+			intersectionItem.getChildren().add(polyItem1);
+			PolygonNode polyNode2 = new PolygonNode(pi.getP2(), CheckStatus.NOT_CHECKED);
+			TreeItem<Renderable> polyItem2 = new TreeItem<>(polyNode2);
+			intersectionItem.getChildren().add(polyItem2);
+			PolygonIntersection intersection = err.getIntersections().get(0);
+			if (intersection.getType() == IntersectionType.TRIANGLES) {
+				TextNode trianglesNode = new TextNode(Localization.getText("ErrorItemVisitor.triangles"));
+				TreeItem<Renderable> trianglesItem = new TreeItem<>(trianglesNode);
+				intersectionItem.getChildren().add(trianglesItem);
+
+				ConcretePolygon c = createPolygonForTriangle(intersection.getT1());
+				PolygonNode pN1 = new PolygonNode(c, CheckStatus.NOT_CHECKED);
+				TreeItem<Renderable> pI1 = new TreeItem<>(pN1);
+				trianglesItem.getChildren().add(pI1);
+
+				ConcretePolygon c2 = createPolygonForTriangle(intersection.getT2());
+				PolygonNode pN2 = new PolygonNode(c2, CheckStatus.NOT_CHECKED);
+				TreeItem<Renderable> pI2 = new TreeItem<>(pN2);
+				trianglesItem.getChildren().add(pI2);
+			}
+		}
+	}
+
+	private ConcretePolygon createPolygonForTriangle(Triangle3d t) {
+		ConcretePolygon c = new ConcretePolygon();
+		LinearRing extRing = new LinearRing(LinearRingType.EXTERIOR);
+		Vertex start = new Vertex(t.getP1());
+		extRing.getVertices().add(start);
+		extRing.getVertices().add(new Vertex(t.getP2()));
+		extRing.getVertices().add(new Vertex(t.getP3()));
+		extRing.getVertices().add(start);
+		c.setExteriorRing(extRing);
+		return c;
 	}
 
 	@Override
 	public void visit(TooFewPolygonsError err) {
 		// not displayed
-		
+
 	}
 
 	@Override
@@ -256,11 +301,11 @@ public class ErrorItemVisitor implements ErrorVisitor {
 		LinearRingNode ringNode = new LinearRingNode(err.getRing(), CheckStatus.NOT_CHECKED);
 		TreeItem<Renderable> ringItem = new TreeItem<>(ringNode);
 		root.getChildren().add(ringItem);
-		
+
 		VertexNode vertexNode = new VertexNode(err.getVertex1());
 		TreeItem<Renderable> vertexItem = new TreeItem<>(vertexNode);
 		root.getChildren().add(vertexItem);
-		
+
 		vertexNode = new VertexNode(err.getVertex2());
 		vertexItem = new TreeItem<>(vertexNode);
 		root.getChildren().add(vertexItem);
@@ -272,11 +317,11 @@ public class ErrorItemVisitor implements ErrorVisitor {
 		LinearRingNode ringNode = new LinearRingNode(err.getRing(), CheckStatus.NOT_CHECKED);
 		TreeItem<Renderable> ringItem = new TreeItem<>(ringNode);
 		root.getChildren().add(ringItem);
-		
+
 		EdgeNode edgeNode = new EdgeNode(err.getEdge1());
 		TreeItem<Renderable> edgeItem = new TreeItem<>(edgeNode);
 		root.getChildren().add(edgeItem);
-		
+
 		EdgeNode edge2Node = new EdgeNode(err.getEdge2());
 		TreeItem<Renderable> edge2Item = new TreeItem<>(edge2Node);
 		root.getChildren().add(edge2Item);
@@ -288,18 +333,18 @@ public class ErrorItemVisitor implements ErrorVisitor {
 
 	@Override
 	public void visit(PointTouchesEdgeError err) {
-		TextNode textNode = new TextNode("Point touches edge");
+		TextNode textNode = new TextNode(Localization.getText("ErrorItemVisitor.pointTouchesEdge"));
 		TreeItem<Renderable> textItem = new TreeItem<>(textNode);
 		root.getChildren().add(textItem);
-		
+
 		VertexNode vertexNode = new VertexNode(err.getVertex());
 		TreeItem<Renderable> vertexItem = new TreeItem<>(vertexNode);
 		root.getChildren().add(vertexItem);
-		
+
 		EdgeNode edgeNode = new EdgeNode(err.getEdge());
 		TreeItem<Renderable> edgeItem = new TreeItem<>(edgeNode);
 		root.getChildren().add(edgeItem);
-		
+
 		LinearRingNode ringNode = new LinearRingNode(err.getRing(), CheckStatus.NOT_CHECKED);
 		TreeItem<Renderable> ringItem = new TreeItem<>(ringNode);
 		root.getChildren().add(ringItem);
@@ -337,7 +382,7 @@ public class ErrorItemVisitor implements ErrorVisitor {
 	public void visit(CheckError err) {
 		// not used
 	}
-	
+
 	@Override
 	public void visit(SchematronError err) {
 		TextNode textNode = new TextNode(err.getErrorIdString());
@@ -347,17 +392,18 @@ public class ErrorItemVisitor implements ErrorVisitor {
 
 	@Override
 	public void visit(SurfaceUnfragmentedError err) {
-		TextNode textNode = new TextNode("Deviation: " + err.getAngleDeviation());
+		TextNode textNode = new TextNode(
+				Localization.getText("ErrorItemVisitor.deviation") + ": " + err.getAngleDeviation());
 		TreeItem<Renderable> textItem = new TreeItem<>(textNode);
 		root.getChildren().add(textItem);
 	}
 
 	@Override
 	public void visit(DegeneratedRingError err) {
-		TextNode textNode = new TextNode("Type: degenerated ring");
+		TextNode textNode = new TextNode(Localization.getText("ErrorItemVisitor.degeneratedRing"));
 		TreeItem<Renderable> textItem = new TreeItem<>(textNode);
 		root.getChildren().add(textItem);
-	
+
 		LinearRingNode polyNode = new LinearRingNode(err.getRing(), CheckStatus.NOT_CHECKED);
 		TreeItem<Renderable> polyItem = new TreeItem<>(polyNode);
 		root.getChildren().add(polyItem);
@@ -366,11 +412,11 @@ public class ErrorItemVisitor implements ErrorVisitor {
 	@Override
 	public void visit(AttributeMissingError err) {
 		if (!err.getChildId().isEmpty()) {
-			TextNode textNode = new TextNode(CHILD_ID + err.getChildId());
+			TextNode textNode = new TextNode(childId + err.getChildId());
 			TreeItem<Renderable> textItem = new TreeItem<>(textNode);
 			root.getChildren().add(textItem);
 		}
-		TextNode nameNode = new TextNode(NAME_OF_ATTRIBUTE + err.getNameOfAttribute());
+		TextNode nameNode = new TextNode(nameOfAttribute + err.getNameOfAttribute());
 		TreeItem<Renderable> nameItem = new TreeItem<>(nameNode);
 		root.getChildren().add(nameItem);
 
@@ -379,23 +425,23 @@ public class ErrorItemVisitor implements ErrorVisitor {
 	@Override
 	public void visit(AttributeValueWrongError err) {
 		if (!err.getChildId().isEmpty()) {
-			TextNode textNode = new TextNode(CHILD_ID + err.getChildId());
+			TextNode textNode = new TextNode(childId + err.getChildId());
 			TreeItem<Renderable> textItem = new TreeItem<>(textNode);
 			root.getChildren().add(textItem);
 		}
-		TextNode nameNode = new TextNode(NAME_OF_ATTRIBUTE + err.getNameOfAttribute());
+		TextNode nameNode = new TextNode(nameOfAttribute + err.getNameOfAttribute());
 		TreeItem<Renderable> nameItem = new TreeItem<>(nameNode);
 		root.getChildren().add(nameItem);
 	}
-	
+
 	@Override
 	public void visit(AttributeInvalidError err) {
 		if (!err.getChildId().isEmpty()) {
-			TextNode textNode = new TextNode(CHILD_ID + err.getChildId());
+			TextNode textNode = new TextNode(childId + err.getChildId());
 			TreeItem<Renderable> textItem = new TreeItem<>(textNode);
 			root.getChildren().add(textItem);
 		}
-		TextNode nameNode = new TextNode(NAME_OF_ATTRIBUTE + err.getNameOfAttribute());
+		TextNode nameNode = new TextNode(nameOfAttribute + err.getNameOfAttribute());
 		TreeItem<Renderable> nameItem = new TreeItem<>(nameNode);
 		root.getChildren().add(nameItem);
 	}
diff --git a/CityDoctorParent/Extensions/CityDoctorHealer/pom.xml b/CityDoctorParent/Extensions/CityDoctorHealer/pom.xml
index 69468d1e55408ce4be180a4aed5b0727c43c8e4a..809c4f014afc0237fc40de0aeb992057a79f14a8 100644
--- a/CityDoctorParent/Extensions/CityDoctorHealer/pom.xml
+++ b/CityDoctorParent/Extensions/CityDoctorHealer/pom.xml
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>de.hft.stuttgart</groupId>
@@ -8,7 +10,7 @@
 		<relativePath>../../pom.xml</relativePath>
 	</parent>
 	<artifactId>CityDoctorHealer</artifactId>
-	
+
 	<dependencies>
 		<dependency>
 			<groupId>de.hft.stuttgart</groupId>
@@ -37,9 +39,12 @@
 				<extensions>true</extensions>
 				<configuration>
 					<javahClassNames>
-						<javahClassName>de.hft.stuttgart.citydoctor2.connect.edge.CppFeature</javahClassName>
-						<javahClassName>de.hft.stuttgart.citydoctor2.CppInitializer</javahClassName>
-						<javahClassName>de.hft.stuttgart.citydoctor2.connect.edge.CppHealResult</javahClassName>
+						<javahClassName>
+							de.hft.stuttgart.citydoctor2.connect.edge.CppFeature</javahClassName>
+						<javahClassName>
+							de.hft.stuttgart.citydoctor2.CppInitializer</javahClassName>
+						<javahClassName>
+							de.hft.stuttgart.citydoctor2.connect.edge.CppHealResult</javahClassName>
 					</javahClassNames>
 				</configuration>
 			</plugin>
diff --git a/CityDoctorParent/Extensions/CityDoctorHealerGUI/pom.xml b/CityDoctorParent/Extensions/CityDoctorHealerGUI/pom.xml
index 75d728721234cb365d8ed2be8aa20643035de95b..4b461ef2dd96987a25017216f1e54c3e5a59dc85 100644
--- a/CityDoctorParent/Extensions/CityDoctorHealerGUI/pom.xml
+++ b/CityDoctorParent/Extensions/CityDoctorHealerGUI/pom.xml
@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0">
+<project xmlns="http://maven.apache.org/POM/4.0.0" 
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
+             http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
 		<groupId>de.hft.stuttgart</groupId>
@@ -24,6 +26,14 @@
 			<groupId>de.hft.stuttgart</groupId>
 			<artifactId>CityDoctorAutoPro</artifactId>
 		</dependency>
+					<dependency>
+				<groupId>org.openjfx</groupId>
+				<artifactId>javafx-controls</artifactId>
+			</dependency>
+			<dependency>
+				<groupId>org.openjfx</groupId>
+				<artifactId>javafx-fxml</artifactId>
+			</dependency>
 	</dependencies>
 	<build>
 		<plugins>
diff --git a/CityDoctorParent/pom.xml b/CityDoctorParent/pom.xml
index 1056362e0f8be559df80de1c8a425dc2bd9dce1f..e927a41af825f3a84dccaea5b74a7ea101e7ac63 100644
--- a/CityDoctorParent/pom.xml
+++ b/CityDoctorParent/pom.xml
@@ -1,277 +1,270 @@
 <?xml version="1.0" encoding="utf-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>de.hft.stuttgart</groupId>
-    <artifactId>CityDoctorParent</artifactId>
-    <version>3.16.0</version>
-    <packaging>pom</packaging>
-    <name>CityDoctorParent</name>
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <maven.compiler.source>17</maven.compiler.source>
-        <maven.compiler.target>17</maven.compiler.target>
-        <log4j.version>2.18.0</log4j.version>
-        <revision>${project.version}</revision>
-        <nonMavenLibsPath>${project.baseUri}../non-maven-libs</nonMavenLibsPath>
-        <jre-version-short>17.0.10</jre-version-short>
-        <jre-version>${jre-version-short}+13</jre-version>
-        <jfx-version>17.0.12</jfx-version>
-    </properties>
-    <repositories>
-        <repository>
-            <id>non-maven-libs</id>
-            <url>${nonMavenLibsPath}</url>
-        </repository>
-        <repository>
-            <id>sonartype</id>
-            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
-        </repository>
-    </repositories>
-    <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-surefire-plugin</artifactId>
-                    <version>2.22.0</version>
-                    <configuration>
-                        <testFailureIgnore>false</testFailureIgnore>
-                        <excludes>
-                            <exclude>**/SolidSelfIntCheckFalsePositiveBigMeshTest.java</exclude>
-                        </excludes>
-                    </configuration>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-        <plugins>
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.13.0</version>
-                <configuration>
-                    <showWarnings>true</showWarnings>
-                    <showDeprecation>true</showDeprecation>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.plexus</groupId>
-                <artifactId>plexus-compiler-api</artifactId>
-                <version>2.15.0</version>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.plexus</groupId>
-                <artifactId>plexus-compiler-manager</artifactId>
-                <version>2.15.0</version>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.plexus</groupId>
-                <artifactId>plexus-compiler-eclipse</artifactId>
-                <version>2.15.0</version>
-            </plugin>
-            <plugin>
-                <groupId>org.openjfx</groupId>
-                <artifactId>javafx-maven-plugin</artifactId>
-                <version>0.0.8</version>
-            </plugin>
-        </plugins>
-    </build>
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.openjfx</groupId>
-                <artifactId>javafx-controls</artifactId>
-                <version>${jfx-version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.openjfx</groupId>
-                <artifactId>javafx-fxml</artifactId>
-                <version>${jfx-version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.openjfx</groupId>
-                <artifactId>javafx-swing</artifactId>
-                <version>${jfx-version}</version>
-            </dependency>
-            <dependency>
-                <groupId>de.hft.stuttgart</groupId>
-                <artifactId>CityDoctorModel</artifactId>
-                <version>${revision}</version>
-            </dependency>
-            <dependency>
-                <groupId>de.hft.stuttgart</groupId>
-                <artifactId>CityDoctorAutoPro</artifactId>
-                <version>${revision}</version>
-            </dependency>
-            <dependency>
-                <groupId>de.hft.stuttgart</groupId>
-                <artifactId>CityDoctorValidation</artifactId>
-                <version>${revision}</version>
-            </dependency>
-            <dependency>
-                <groupId>de.hft.stuttgart</groupId>
-                <artifactId>CityDoctorGUI</artifactId>
-                <version>${revision}</version>
-            </dependency>
-            <dependency>
-                <groupId>de.hft.stuttgart</groupId>
-                <artifactId>CityDoctorEdge</artifactId>
-                <version>${revision}</version>
-            </dependency>
-            <dependency>
-                <groupId>de.hft.stuttgart</groupId>
-                <artifactId>CityDoctorCheckResult</artifactId>
-                <version>${revision}</version>
-            </dependency>
-            <dependency>
-                <groupId>de.hft.stuttgart</groupId>
-                <artifactId>CityDoctorHealer</artifactId>
-                <version>${revision}</version>
-            </dependency>
-            <dependency>
-                <groupId>net.sf.saxon</groupId>
-                <artifactId>Saxon-HE</artifactId>
-                <version>12.2</version>
-            </dependency>
-            <dependency>
-                <groupId>org.hibernate</groupId>
-                <artifactId>hibernate-core</artifactId>
-                <version>5.6.9.Final</version>
-            </dependency>
-            <dependency>
-                <groupId>org.citygml4j</groupId>
-                <artifactId>citygml4j-core</artifactId>
-                <version>3.2.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.citygml4j</groupId>
-                <artifactId>citygml4j-xml</artifactId>
-                <version>3.2.0</version>
-            </dependency>
-            <dependency>
-                <groupId>de.hft.stuttgart</groupId>
-                <artifactId>citygml4j-quality-ade</artifactId>
-                <version>3.2.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.xmlgraphics</groupId>
-                <artifactId>fop</artifactId>
-                <version>2.7</version>
-            </dependency>
-            <dependency>
-                <groupId>org.jdom</groupId>
-                <artifactId>jdom2</artifactId>
-                <version>2.0.6.1</version>
-            </dependency>
-            <dependency>
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>4.13.2</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.jogamp.gluegen</groupId>
-                <artifactId>gluegen-rt-main</artifactId>
-                <version>2.3.2</version>
-            </dependency>
-            <dependency>
-                <groupId>gov.nist.math</groupId>
-                <artifactId>jama</artifactId>
-                <version>1.0.3</version>
-            </dependency>
-            <dependency>
-                <groupId>org.jogamp.jogl</groupId>
-                <artifactId>jogl-all-main</artifactId>
-                <version>2.3.2</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.logging.log4j</groupId>
-                <artifactId>log4j-api</artifactId>
-                <version>${log4j.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.logging.log4j</groupId>
-                <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>
-                <version>2.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.logging.log4j</groupId>
-                <artifactId>log4j-slf4j18-impl</artifactId>
-                <version>${log4j.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.locationtech.proj4j</groupId>
-                <artifactId>proj4j</artifactId>
-                <version>1.1.5</version>
-            </dependency>
-            <dependency>
-                <groupId>org.hibernate</groupId>
-                <artifactId>hibernate-search-orm</artifactId>
-                <version>5.11.9.Final</version>
-            </dependency>
-            <dependency>
-                <groupId>org.locationtech.jts</groupId>
-                <artifactId>jts-core</artifactId>
-                <version>1.19.0</version>
-            </dependency>
-            <dependency>
-                <groupId>com.sun.xml.bind</groupId>
-                <artifactId>jaxb-impl</artifactId>
-                <version>2.3.3</version>
-            </dependency>
-            <dependency>
-                <groupId>jakarta.xml.bind</groupId>
-                <artifactId>jakarta.xml.bind-api</artifactId>
-                <version>2.3.3</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-    <dependencies>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <version>4.6.1</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.openjfx</groupId>
-            <artifactId>javafx-controls</artifactId>
-            <version>${jfx-version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.openjfx</groupId>
-            <artifactId>javafx-fxml</artifactId>
-            <version>${jfx-version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.openjfx</groupId>
-            <artifactId>javafx-swing</artifactId>
-            <version>${jfx-version}</version>
-        </dependency>
-    </dependencies>
-    <modules>
-        <!--CityDoctor2 Core Modules-->
-        <module>CityDoctorModel</module>
-        <module>CityDoctorValidation</module>
-        <module>CityDoctorEdge</module>
-        <module>CityDoctorCheckResult</module>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>de.hft.stuttgart</groupId>
+	<artifactId>CityDoctorParent</artifactId>
+	<version>3.16.0</version>
+	<packaging>pom</packaging>
+	<name>CityDoctorParent</name>
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<maven.compiler.source>17</maven.compiler.source>
+		<maven.compiler.target>17</maven.compiler.target>
+		<log4j.version>2.18.0</log4j.version>
+		<revision>${project.version}</revision>
+		<nonMavenLibsPath>${project.baseUri}../non-maven-libs</nonMavenLibsPath>
+		<jre-version-short>17.0.10</jre-version-short>
+		<jre-version>${jre-version-short}+13</jre-version>
+		<jfx-version>17.0.12</jfx-version>
+	</properties>
+	<repositories>
+		<repository>
+			<id>non-maven-libs</id>
+			<url>${nonMavenLibsPath}</url>
+		</repository>
+		<repository>
+			<id>sonartype</id>
+			<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+		</repository>
+	</repositories>
+	<build>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-surefire-plugin</artifactId>
+					<version>2.22.0</version>
+					<configuration>
+						<testFailureIgnore>false</testFailureIgnore>
+						<excludes>
+							<exclude>
+								**/SolidSelfIntCheckFalsePositiveBigMeshTest.java</exclude>
+						</excludes>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+		<plugins>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.13.0</version>
+				<configuration>
+					<showWarnings>true</showWarnings>
+					<showDeprecation>true</showDeprecation>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.codehaus.plexus</groupId>
+				<artifactId>plexus-compiler-api</artifactId>
+				<version>2.15.0</version>
+			</plugin>
+			<plugin>
+				<groupId>org.codehaus.plexus</groupId>
+				<artifactId>plexus-compiler-manager</artifactId>
+				<version>2.15.0</version>
+			</plugin>
+			<plugin>
+				<groupId>org.codehaus.plexus</groupId>
+				<artifactId>plexus-compiler-eclipse</artifactId>
+				<version>2.15.0</version>
+			</plugin>
+			<plugin>
+				<groupId>org.openjfx</groupId>
+				<artifactId>javafx-maven-plugin</artifactId>
+				<version>0.0.8</version>
+			</plugin>
+		</plugins>
+	</build>
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.openjfx</groupId>
+				<artifactId>javafx-controls</artifactId>
+				<version>${jfx-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.openjfx</groupId>
+				<artifactId>javafx-fxml</artifactId>
+				<version>${jfx-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.openjfx</groupId>
+				<artifactId>javafx-swing</artifactId>
+				<version>${jfx-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>de.hft.stuttgart</groupId>
+				<artifactId>CityDoctorModel</artifactId>
+				<version>${revision}</version>
+			</dependency>
+			<dependency>
+				<groupId>de.hft.stuttgart</groupId>
+				<artifactId>CityDoctorAutoPro</artifactId>
+				<version>${revision}</version>
+			</dependency>
+			<dependency>
+				<groupId>de.hft.stuttgart</groupId>
+				<artifactId>CityDoctorValidation</artifactId>
+				<version>${revision}</version>
+			</dependency>
+			<dependency>
+				<groupId>de.hft.stuttgart</groupId>
+				<artifactId>CityDoctorGUI</artifactId>
+				<version>${revision}</version>
+			</dependency>
+			<dependency>
+				<groupId>de.hft.stuttgart</groupId>
+				<artifactId>CityDoctorEdge</artifactId>
+				<version>${revision}</version>
+			</dependency>
+			<dependency>
+				<groupId>de.hft.stuttgart</groupId>
+				<artifactId>CityDoctorCheckResult</artifactId>
+				<version>${revision}</version>
+			</dependency>
+			<dependency>
+				<groupId>de.hft.stuttgart</groupId>
+				<artifactId>CityDoctorHealer</artifactId>
+				<version>${revision}</version>
+			</dependency>
+			<dependency>
+				<groupId>net.sf.saxon</groupId>
+				<artifactId>Saxon-HE</artifactId>
+				<version>12.2</version>
+			</dependency>
+			<dependency>
+				<groupId>org.hibernate</groupId>
+				<artifactId>hibernate-core</artifactId>
+				<version>5.6.9.Final</version>
+			</dependency>
+			<dependency>
+				<groupId>org.citygml4j</groupId>
+				<artifactId>citygml4j-core</artifactId>
+				<version>3.2.0</version>
+			</dependency>
+			<dependency>
+				<groupId>org.citygml4j</groupId>
+				<artifactId>citygml4j-xml</artifactId>
+				<version>3.2.0</version>
+			</dependency>
+			<dependency>
+				<groupId>de.hft.stuttgart</groupId>
+				<artifactId>citygml4j-quality-ade</artifactId>
+				<version>3.2.0</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.xmlgraphics</groupId>
+				<artifactId>fop</artifactId>
+				<version>2.7</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jdom</groupId>
+				<artifactId>jdom2</artifactId>
+				<version>2.0.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>junit</groupId>
+				<artifactId>junit</artifactId>
+				<version>4.13.2</version>
+				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.jogamp.gluegen</groupId>
+				<artifactId>gluegen-rt-main</artifactId>
+				<version>2.3.2</version>
+			</dependency>
+			<dependency>
+				<groupId>gov.nist.math</groupId>
+				<artifactId>jama</artifactId>
+				<version>1.0.3</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jogamp.jogl</groupId>
+				<artifactId>jogl-all-main</artifactId>
+				<version>2.3.2</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.logging.log4j</groupId>
+				<artifactId>log4j-api</artifactId>
+				<version>${log4j.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.logging.log4j</groupId>
+				<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>
+				<version>2.0</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.logging.log4j</groupId>
+				<artifactId>log4j-slf4j18-impl</artifactId>
+				<version>${log4j.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.locationtech.proj4j</groupId>
+				<artifactId>proj4j</artifactId>
+				<version>1.1.5</version>
+			</dependency>
+			<dependency>
+				<groupId>org.hibernate</groupId>
+				<artifactId>hibernate-search-orm</artifactId>
+				<version>5.11.9.Final</version>
+			</dependency>
+			<dependency>
+				<groupId>org.locationtech.jts</groupId>
+				<artifactId>jts-core</artifactId>
+				<version>1.20.0</version>
+			</dependency>
+			<dependency>
+				<groupId>com.sun.xml.bind</groupId>
+				<artifactId>jaxb-impl</artifactId>
+				<version>2.3.3</version>
+			</dependency>
+			<dependency>
+				<groupId>jakarta.xml.bind</groupId>
+				<artifactId>jakarta.xml.bind-api</artifactId>
+				<version>2.3.3</version>
+			</dependency>
+			<dependency>
+				<groupId>io.github.earcut4j</groupId>
+				<artifactId>earcut4j</artifactId>
+				<version>2.2.2</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+	<dependencies>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-core</artifactId>
+			<version>4.6.1</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+	<modules>
+		<!--CityDoctor2 Core Modules-->
+		<module>CityDoctorModel</module>
+		<module>CityDoctorValidation</module>
+		<module>CityDoctorEdge</module>
+		<module>CityDoctorCheckResult</module>
 
-        <!--CityDoctor2 Extension Modules-->
-        <module>Extensions/CityDoctorGUI</module>
-        <!--
+		<!--CityDoctor2 Extension Modules-->
+		<module>Extensions/CityDoctorGUI</module>
+		<!--
         <module>Extensions/CityDoctorAutoPro</module>
         <module>Extensions/CityDoctorHealer</module>
         <module>Extensions/CityDoctorHealerGenetic</module>
         <module>Extensions/CityDoctorHealerGUI</module>
         <module>Extensions/CityDoctorWebService</module>
         -->
-    </modules>
+	</modules>
 </project>
\ No newline at end of file