diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java
index e421951eb4f7dbc6ff8c94d12ef4a5791f8389c7..20db528d800d2ec41a403592921730671d472616 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Check.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.error.DependenciesNotMetError;
 import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding;
@@ -98,6 +99,8 @@ public abstract class Check {
 	public List<CheckId> getDependencies() {
 		return Collections.emptyList();
 	}
+	
+	public abstract Set<Requirement> appliesToRequirements();
 
 	/**
 	 * Getter for the check id.
@@ -111,7 +114,7 @@ public abstract class Check {
 	 * 
 	 * @return the check type
 	 */
-	public abstract CheckType getType();
+	public abstract RequirementType getType();
 
 	/**
 	 * Checks whether the check can be executed on this checkable, meaning the
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 1fac3387e9b3beab32bc0e5dcf17f2b223e8b0d9..4dec1f148cd9506ebc0270ddcf3a7e9d1108739a 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
@@ -44,14 +44,13 @@ public class CheckId implements Serializable {
 	public static final CheckId C_GE_P_HOLE_OUTSIDE = new CheckId("C_GE_P_HOLE_OUTSIDE");
 	public static final CheckId IS_CEILING = new CheckId("IS_CEILING");
 	public static final CheckId C_GE_P_INNER_RINGS_NESTED = new CheckId("C_GE_P_INNER_RINGS_NESTED");
-	public static final CheckId C_SEM_BS_NOT_CEILING = new CheckId("C_SEM_BS_NOT_CEILING");
-	public static final CheckId C_SEM_BS_NOT_FLOOR = new CheckId("C_SEM_BS_NOT_FLOOR");
-	public static final CheckId C_SEM_BS_NOT_GROUND = new CheckId("C_SEM_BS_NOT_GROUND");
-	public static final CheckId C_SEM_F_MISSING_ID = new CheckId("C_SEM_F_MISSING_ID");
-	public static final CheckId C_SEM_BS_GROUND_NOT_FRAGMENTED = new CheckId("C_SEM_BS_GROUND_NOT_FRAGMENTED");
-	public static final CheckId C_SEM_BS_IS_WALL = new CheckId("C_SEM_BS_IS_WALL");
-	public static final CheckId C_SEM_SCHEMATRON = new CheckId("C_SEM_SCHEMATRON");
-	public static final CheckId C_SEM_BS_ROOF_NOT_FRAGMENTED = new CheckId("C_SEM_BS_ROOF_NOT_FRAGMENTED");
+	public static final CheckId C_SE_BS_IS_CEILING = new CheckId("C_SE_BS_IS_CEILING");
+	public static final CheckId C_SE_BS_IS_FLOOR = new CheckId("C_SE_BS_IS_FLOOR");
+	public static final CheckId C_SE_BS_IS_GROUND = new CheckId("C_SE_BS_IS_GROUND");
+	public static final CheckId C_SE_BS_GROUND_NOT_FRAGMENTED = new CheckId("C_SE_BS_GROUND_NOT_FRAGMENTED");
+	public static final CheckId C_SE_BS_IS_WALL = new CheckId("C_SE_BS_IS_WALL");
+	public static final CheckId C_SE_SCHEMATRON = new CheckId("C_SE_SCHEMATRON");
+	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");
 	
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java
index e281a64db05f146777c57c606705a5f84a4b918f..005c4b31f08123d6fe21731f2358d5befe954cae 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java
@@ -31,7 +31,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
 /**
  * Interface to indicate that this object can be checked by Checks.
  * 
- * @author Matthias Betz - 12bema1bif@hft-stuttgart.de
+ * @author Matthias Betz
  *
  */
 public abstract class Checkable implements Serializable {
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/DefaultParameter.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/DefaultParameter.java
index 0c48ec13c4c132113288701dc9805d6033a6540b..2bb9aee3f9134f960d2e784fa82fa8081ce80817 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/DefaultParameter.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/DefaultParameter.java
@@ -18,6 +18,8 @@
  */
 package de.hft.stuttgart.citydoctor2.check;
 
+import java.io.Serializable;
+
 /**
  * Describes a parameter for a check including the default value as a String.
  * All values are a String as they are passed to the check as a Map<String,
@@ -26,15 +28,17 @@ package de.hft.stuttgart.citydoctor2.check;
  * @author Matthias Betz
  *
  */
-public class DefaultParameter {
+public class DefaultParameter implements Serializable {
 
+	private static final long serialVersionUID = -4587211298078974066L;
+	
 	private String name;
-	private String defaultValue;
+	private String value;
 	private Unit unitType;
 
 	public DefaultParameter(String name, String defaultValue, Unit unitType) {
 		this.name = name;
-		this.defaultValue = defaultValue;
+		this.value = defaultValue;
 		this.unitType = unitType;
 	}
 
@@ -56,8 +60,8 @@ public class DefaultParameter {
 	 * 
 	 * @return the defaultValue
 	 */
-	public String getDefaultValue() {
-		return defaultValue;
+	public String getValue() {
+		return value;
 	}
 
 	/*
@@ -68,10 +72,10 @@ public class DefaultParameter {
 	@Override
 	public String toString() {
 		StringBuilder builder = new StringBuilder();
-		builder.append("CheckParameter [name=");
+		builder.append("DefaultParameter [name=");
 		builder.append(name);
-		builder.append(", defaultValue=");
-		builder.append(defaultValue);
+		builder.append(", value=");
+		builder.append(value);
 		builder.append("]");
 		return builder.toString();
 	}
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 44049e0d366ff714a8f25d3d964ad0e628bd8b47..0176a3d4b005c257a38ca3ab49f921f0d1e0d442 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
@@ -56,13 +56,12 @@ public class ErrorId implements Serializable {
 	public static final ErrorId GE_P_ORIENTATION_RINGS_SAME = new ErrorId("GE_P_ORIENTATION_RINGS_SAME");
 	public static final ErrorId GE_S_NOT_CLOSED = new ErrorId("GE_S_NOT_CLOSED");
 	public static final ErrorId GE_S_TOO_FEW_POLYGONS = new ErrorId("GE_S_TOO_FEW_POLYGONS");
-	public static final ErrorId SEM_F_MISSING_ID = new ErrorId("SEM_F_MISSING_ID");
-	public static final ErrorId SEM_BS_NOT_CEILING = new ErrorId("SEM_BS_NOT_CEILING");
-	public static final ErrorId SEM_BS_NOT_WALL = new ErrorId("SEM_BS_NOT_WALL");
-	public static final ErrorId SEM_BS_NOT_FLOOR = new ErrorId("SEM_BS_NOT_FLOOR");
-	public static final ErrorId SEM_BS_NOT_GROUND = new ErrorId("SEM_BS_NOT_GROUND");
-	public static final ErrorId SEM_SCHEMATRON_ERROR = new ErrorId("SEM_SCHEMATRON_ERROR");
-	public static final ErrorId SEM_BS_UNFRAGMENTED = new ErrorId("SEM_BS_UNFRAGMENTED");
+	public static final ErrorId SE_BS_NOT_CEILING = new ErrorId("SE_BS_NOT_CEILING");
+	public static final ErrorId SE_BS_NOT_WALL = new ErrorId("SE_BS_NOT_WALL");
+	public static final ErrorId SE_BS_NOT_FLOOR = new ErrorId("SE_BS_NOT_FLOOR");
+	public static final ErrorId SE_BS_NOT_GROUND = new ErrorId("SE_BS_NOT_GROUND");
+	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_POLYGON = new ErrorId("GE_P_DEGENERATED_POLYGON");
 
 	private String name;
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
new file mode 100644
index 0000000000000000000000000000000000000000..2368be5cc24fc6565c34c83d1166f61cfb73a08d
--- /dev/null
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Requirement.java
@@ -0,0 +1,136 @@
+/*-
+ *  Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
+ * 
+ *  This file is part of CityDoctor2.
+ *
+ *  CityDoctor2 is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Lesser General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  CityDoctor2 is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public License
+ *  along with CityDoctor2.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package de.hft.stuttgart.citydoctor2.check;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class Requirement implements Serializable {
+
+	private static final long serialVersionUID = -590639811553512803L;
+
+	private static final String DISTANCE_TOLERANCE = "distanceTolerance";
+	private static final String ANGLE_TOLERANCE = "angleTolerance";
+	private static final String TYPE_STRING = "type";
+	private static final String DEGENERATED_POLYGON_TOLERANCE = "degeneratedPolygonTolerance";
+	private static final String LOWER_ANGLE_NAME = "lowerAngle";
+	private static final String UPPER_ANGLE_NAME = "upperAngle";
+
+	public static final Requirement R_GE_R_TOO_FEW_POINTS = new Requirement("R_GE_R_TOO_FEW_POINTS", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_R_NOT_CLOSED = new Requirement("R_GE_R_NOT_CLOSED", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_R_CONSECUTIVE_POINTS_SAME = new Requirement("R_GE_R_CONSECUTIVE_POINTS_SAME", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_R_SELF_INTERSECTION = new Requirement("R_GE_R_SELF_INTERSECTION", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_P_NON_PLANAR = new Requirement("R_GE_P_NON_PLANAR", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_P_INTERIOR_DISCONNECTED = new Requirement("R_GE_P_INTERIOR_DISCONNECTED", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_P_INTERSECTING_RINGS = new Requirement("R_GE_P_INTERSECTING_RINGS", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_P_HOLE_OUTSIDE = new Requirement("R_GE_P_HOLE_OUTSIDE", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_P_ORIENTATION_RINGS_SAME = new Requirement("R_GE_P_ORIENTATION_RINGS_SAME", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_P_INNER_RINGS_NESTED = new Requirement("R_GE_P_INNER_RINGS_NESTED", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_S_TOO_FEW_POLYGONS = new Requirement("R_GE_S_TOO_FEW_POLYGONS", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_S_NOT_CLOSED = new Requirement("R_GE_S_NOT_CLOSED", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_S_NON_MANIFOLD_EDGE = new Requirement("R_GE_S_NON_MANIFOLD_EDGE", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_S_POLYGON_WRONG_ORIENTATION = new Requirement(
+			"R_GE_S_POLYGON_WRONG_ORIENTATION", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION = new Requirement(
+			"R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_S_NON_MANIFOLD_VERTEX = new Requirement("R_GE_S_NON_MANIFOLD_VERTEX", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_S_SELF_INTERSECTION = new Requirement("R_GE_S_SELF_INTERSECTION", RequirementType.GEOMETRY);
+	public static final Requirement R_GE_S_MULTIPLE_CONNECTED_COMPONENTS = new Requirement(
+			"R_GE_S_MULTIPLE_CONNECTED_COMPONENTS", RequirementType.GEOMETRY);
+	public static final Requirement R_SE_ATTRIBUTES_EXISTING = new Requirement("R_SE_ATTRIBUTES_EXISTING", RequirementType.SEMANTIC);
+	public static final Requirement R_SE_ATTRIBUTES_CORRECT = new Requirement("R_SE_ATTRIBUTES_CORRECT", RequirementType.SEMANTIC);
+	public static final Requirement R_GE_R_NULL_AREA = new Requirement("R_GE_R_NULL_AREA", RequirementType.GEOMETRY);
+
+	public static final Requirement R_SE_BS_GROUND_UNFRAGMENTED = new Requirement("R_SE_BS_GROUND_UNFRAGMENTED", RequirementType.SEMANTIC);
+	public static final Requirement R_SE_BS_ROOF_UNFRAGMENTED = new Requirement("R_SE_BS_GROUND_UNFRAGMENTED", RequirementType.SEMANTIC);
+	public static final Requirement R_SE_BS_IS_CEILING = new Requirement("R_SE_BS_IS_CEILING", RequirementType.SEMANTIC);
+	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);
+
+	static {
+		// fill requirements with default parameters
+		ArrayList<DefaultParameter> defaultParameters = new ArrayList<>();
+		defaultParameters.add(new DefaultParameter(TYPE_STRING, "distance", Unit.NONE));
+		defaultParameters.add(new DefaultParameter(DISTANCE_TOLERANCE, "0.01", Unit.METER));
+		defaultParameters.add(new DefaultParameter(ANGLE_TOLERANCE, "1", Unit.DEGREE));
+		defaultParameters.add(new DefaultParameter(DEGENERATED_POLYGON_TOLERANCE, "0.00000", Unit.METER));
+		R_GE_P_NON_PLANAR.parameters = Collections.unmodifiableList(defaultParameters);
+
+		defaultParameters = new ArrayList<>();
+		defaultParameters.add(new DefaultParameter(LOWER_ANGLE_NAME, "45", Unit.DEGREE));
+		defaultParameters.add(new DefaultParameter(UPPER_ANGLE_NAME, "135", Unit.DEGREE));
+		R_SE_BS_IS_WALL.parameters = Collections.unmodifiableList(defaultParameters);
+	}
+
+	private String id;
+	private RequirementType type;
+	private List<DefaultParameter> parameters;
+
+	public Requirement(String id, RequirementType type) {
+		this.id = id;
+		this.type = type;
+		parameters = Collections.emptyList();
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public List<DefaultParameter> getDefaultParameter() {
+		return parameters;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((id == null) ? 0 : id.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		Requirement other = (Requirement) obj;
+		if (id == null) {
+			if (other.id != null)
+				return false;
+		} else if (!id.equals(other.id))
+			return false;
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		return id;
+	}
+
+	public RequirementType getType() {
+		return type;
+	}
+
+}
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckType.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementType.java
similarity index 97%
rename from CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckType.java
rename to CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementType.java
index b8f2afdeb1570f70e157eab3b78182e8d2ddd24c..46d63f3f8fd3ff5cb5e3f12ec2a282fb8a125843 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckType.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementType.java
@@ -26,7 +26,7 @@ package de.hft.stuttgart.citydoctor2.check;
  * @author Matthias Betz
  *
  */
-public enum CheckType {
+public enum RequirementType {
 
 	GEOMETRY, SEMANTIC
 
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotCeilingError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotCeilingError.java
index 4ed6bea9be3872e7e88b8f87b6d50a8d91692b62..699ad8b8549224b53bd5c6490ec6559eb24ffbe2 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotCeilingError.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotCeilingError.java
@@ -79,7 +79,7 @@ public class NotCeilingError implements CheckError {
 
 	@Override
 	public ErrorId getErrorId() {
-		return ErrorId.SEM_BS_NOT_CEILING;
+		return ErrorId.SE_BS_NOT_CEILING;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotFloorError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotFloorError.java
index 1b8198f1a8148f34037dcad01d074995fbf40fdb..7f4aea9fef8998552dbe93807ce03a7032533607 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotFloorError.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotFloorError.java
@@ -77,7 +77,7 @@ public class NotFloorError implements CheckError {
 
 	@Override
 	public ErrorId getErrorId() {
-		return ErrorId.SEM_BS_NOT_FLOOR;
+		return ErrorId.SE_BS_NOT_FLOOR;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotGroundError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotGroundError.java
index b810a6f7a04f21b90b3d76c910e3a77561214f54..90395bcf61bf8e749472bcf9d3f65fe166e710db 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotGroundError.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotGroundError.java
@@ -79,7 +79,7 @@ public class NotGroundError implements CheckError {
 
 	@Override
 	public ErrorId getErrorId() {
-		return ErrorId.SEM_BS_NOT_GROUND;
+		return ErrorId.SE_BS_NOT_GROUND;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotWallError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotWallError.java
index 44a3efa741fe553639fd034f3b2ecc6d218220aa..6eb0835f3a1d43f71e4943cde5dc6b8581d5e03b 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotWallError.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/NotWallError.java
@@ -82,7 +82,7 @@ public class NotWallError implements CheckError {
 
 	@Override
 	public ErrorId getErrorId() {
-		return ErrorId.SEM_BS_NOT_WALL;
+		return ErrorId.SE_BS_NOT_WALL;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SchematronError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SchematronError.java
index f12702766b4948137212b619dacabeef3ae885a6..cdc72e8fc79b5aa601fe848ad81bb72e88ccb945 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SchematronError.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SchematronError.java
@@ -94,7 +94,7 @@ public class SchematronError implements CheckError {
 
 	@Override
 	public ErrorId getErrorId() {
-		return ErrorId.SEM_SCHEMATRON_ERROR;
+		return ErrorId.SE_SCHEMATRON_ERROR;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SurfaceUnfragmentedError.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SurfaceUnfragmentedError.java
index 55d02c6d25f16724fb77c5f954dc6470b3f1670e..16ceb6b34d7798c5f2917f0384991fe2c983325b 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SurfaceUnfragmentedError.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/SurfaceUnfragmentedError.java
@@ -77,7 +77,7 @@ public class SurfaceUnfragmentedError implements CheckError {
 
 	@Override
 	public ErrorId getErrorId() {
-		return ErrorId.SEM_BS_UNFRAGMENTED;
+		return ErrorId.SE_BS_UNFRAGMENTED;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundingBox.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundingBox.java
index 13889c26704856b4dd1e38ebd4bfa056a2c1e145..357f39d4db29541220cc76b63a4c15ea89961cca 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundingBox.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundingBox.java
@@ -42,6 +42,10 @@ public class BoundingBox {
 	public static BoundingBox of(List<Polygon> polygons) {
 		return BoundingBoxCalculator.calculateBoundingBox(polygons);
 	}
+	
+	public static BoundingBox ofPoints(List<? extends Vector3d> points) {
+		return BoundingBoxCalculator.calculateBoundingBoxFromPoints(points);
+	}
 
 	/**
 	 * Creates an axis aligned bounding box of the whole model.
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/CovarianceMatrix.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/CovarianceMatrix.java
index f6df612f296f7809db0d6e8ef6729d2038ab67e3..0c58931eadedc13920765de1a5b5b793e49e9b2c 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/CovarianceMatrix.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/CovarianceMatrix.java
@@ -56,6 +56,12 @@ public class CovarianceMatrix {
 			covValues[1][2] += ydiff * zdiff;
 			covValues[2][2] += zdiff * zdiff;
 		}
+		covValues[0][0] /= vertices.size();
+		covValues[0][1] /= vertices.size();
+		covValues[0][2] /= vertices.size();
+		covValues[1][1] /= vertices.size();
+		covValues[1][2] /= vertices.size();
+		covValues[2][2] /= vertices.size();
 		// the covariance matrix is symmetric, so we can fill in the remaining values
 		covValues[1][0] = covValues[0][1];
 		covValues[2][0] = covValues[0][2];
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Matrix3x3d.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Matrix3x3d.java
index c112ee3a59e979d7f5e3f1e198755e683c4ab1a4..5d751930d3fa8c7e04f56f907130beb5f7a16782 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Matrix3x3d.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/math/Matrix3x3d.java
@@ -135,7 +135,7 @@ public class Matrix3x3d {
 	/**
 	 * Multiplies this matrix with a 3-dim vector.
 	 * 
-	 * @param other the vector
+	 * @param the multiplied vector
 	 * @return the result stored in a new vector
 	 */
 	public Vector3d mult(Vector3d other) {
diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/BoundingBoxCalculator.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/BoundingBoxCalculator.java
index 5ff2bf86d2ce9000aef0974a1557daae6b20b349..2d50bf660c9d767dbe27e61096eb32891360793e 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/BoundingBoxCalculator.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/BoundingBoxCalculator.java
@@ -63,17 +63,20 @@ public class BoundingBoxCalculator {
 			for (Vertex v : p.getExteriorRing().getVertices()) {
 				if (v.getX() < lowX) {
 					lowX = v.getX();
-				} else if (v.getX() > highX) {
+				}
+				if (v.getX() > highX) {
 					highX = v.getX();
 				}
 				if (v.getY() < lowY) {
 					lowY = v.getY();
-				} else if (v.getY() > highY) {
+				}
+				if (v.getY() > highY) {
 					highY = v.getY();
 				}
 				if (v.getZ() < lowZ) {
 					lowZ = v.getZ();
-				} else if (v.getZ() > highZ) {
+				}
+				if (v.getZ() > highZ) {
 					highZ = v.getZ();
 				}
 			}
@@ -92,7 +95,7 @@ public class BoundingBoxCalculator {
 	 */
 	public static BoundingBox calculateBoundingBox(CityDoctorModel model) {
 		Vector3d low = new Vector3d(Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE);
-		Vector3d high = new Vector3d(Double.MIN_VALUE, Double.MIN_VALUE, Double.MIN_VALUE);
+		Vector3d high = new Vector3d(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY);
 
 		findMinMax(low, high, model.getBuildings());
 		findMinMax(low, high, model.getBridges());
@@ -107,6 +110,40 @@ public class BoundingBoxCalculator {
 		return BoundingBox.of(result);
 	}
 
+	public static BoundingBox calculateBoundingBoxFromPoints(List<? extends Vector3d> points) {
+		double lowX = Double.MAX_VALUE;
+		double highX = Double.NEGATIVE_INFINITY;
+		double lowY = Double.MAX_VALUE;
+		double highY = Double.NEGATIVE_INFINITY;
+		double lowZ = Double.MAX_VALUE;
+		double highZ = Double.NEGATIVE_INFINITY;
+		// only need to check exterior rings
+		for (Vector3d v : points) {
+			if (v.getX() < lowX) {
+				lowX = v.getX();
+			}
+			if (v.getX() > highX) {
+				highX = v.getX();
+			}
+			if (v.getY() < lowY) {
+				lowY = v.getY();
+			}
+			if (v.getY() > highY) {
+				highY = v.getY();
+			}
+			if (v.getZ() < lowZ) {
+				lowZ = v.getZ();
+			}
+			if (v.getZ() > highZ) {
+				highZ = v.getZ();
+			}
+		}
+		Vector3d[] result = new Vector3d[2];
+		result[0] = new Vector3d(lowX, lowY, lowZ);
+		result[1] = new Vector3d(highX, highY, highZ);
+		return BoundingBox.of(result);
+	}
+
 	private static void findMinMax(Vector3d low, Vector3d high, List<? extends CityObject> features) {
 		for (CityObject co : features) {
 			findMinMax(low, high, co);
@@ -121,17 +158,20 @@ public class BoundingBoxCalculator {
 			for (Vertex v : geom.getVertices()) {
 				if (v.getX() < low.getX()) {
 					low.setX(v.getX());
-				} else if (v.getX() > high.getX()) {
+				}
+				if (v.getX() > high.getX()) {
 					high.setX(v.getX());
 				}
 				if (v.getY() < low.getY()) {
 					low.setY(v.getY());
-				} else if (v.getY() > high.getY()) {
+				}
+				if (v.getY() > high.getY()) {
 					high.setY(v.getY());
 				}
 				if (v.getZ() < low.getZ()) {
 					low.setZ(v.getZ());
-				} else if (v.getZ() > high.getZ()) {
+				}
+				if (v.getZ() > high.getZ()) {
 					high.setZ(v.getZ());
 				}
 			}
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 b439cdb377f94f849371dd8d33e1c0e446ea6879..c24700dfdf9778d280bc5100698a6b99defbc132 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
@@ -241,7 +241,7 @@ public class Checker {
 		ValidationPlan plan = new ValidationPlan();
 		List<Checking> filter = createFilter();
 
-		for (Entry<CheckId, CheckConfiguration> e : config.getChecks().entrySet()) {
+		for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) {
 			RequirementId reqId = mapToRequirement(e.getKey());
 			if (reqId == null) {
 				continue;
@@ -250,12 +250,12 @@ public class Checker {
 			req.setName(reqId);
 			req.setEnabled(e.getValue().isEnabled());
 			plan.getRequirements().add(req);
-			CheckPrototype proto = Checks.getCheckPrototypeForId(e.getKey());
 			Map<String, String> parameters = e.getValue().getParameters();
+			Map<String, de.hft.stuttgart.citydoctor2.check.Requirement> reqs = Checks.getAvailableRequirements();
 			if (parameters != null) {
 				for (Entry<String, String> param : parameters.entrySet()) {
 					Parameter p = new Parameter();
-					DefaultParameter defaultP = getDefaultParameter(param.getKey(), proto);
+					DefaultParameter defaultP = getDefaultParameter(param.getKey(), reqs);
 					if (defaultP != null) {
 						p.setUom(defaultP.getUnitType().getGmlRepresentation());
 					}
@@ -292,10 +292,14 @@ public class Checker {
 		return plan;
 	}
 
-	private DefaultParameter getDefaultParameter(String key, CheckPrototype proto) {
-		for (DefaultParameter param : proto.getDefaultParameter()) {
-			if (param.getName().equals(key)) {
-				return param;
+	private DefaultParameter getDefaultParameter(String key,
+			Map<String, de.hft.stuttgart.citydoctor2.check.Requirement> reqs) {
+		de.hft.stuttgart.citydoctor2.check.Requirement requirement = reqs.get(key);
+		if (requirement != null) {
+			for (DefaultParameter param : requirement.getDefaultParameter()) {
+				if (param.getName().equals(key)) {
+					return param;
+				}
 			}
 		}
 		return null;
@@ -382,43 +386,10 @@ public class Checker {
 		}
 	}
 
-	private RequirementId mapToRequirement(CheckId key) {
-		switch (key.getName()) {
-		case "C_GE_R_TOO_FEW_POINTS":
-			return RequirementId.R_GE_R_TOO_FEW_POINTS;
-		case "C_GE_R_NOT_CLOSED":
-			return RequirementId.R_GE_R_NOT_CLOSED;
-		case "C_GE_R_DUPLICATE_POINT":
-			return RequirementId.R_GE_R_CONSECUTIVE_POINTS_SAME;
-		case "C_GE_R_SELF_INTERSECTION":
-			return RequirementId.R_GE_R_SELF_INTERSECTION;
-		case "C_GE_P_INTERIOR_DISCONNECTED":
-			return RequirementId.R_GE_P_INTERIOR_DISCONNECTED;
-		case "C_GE_P_INTERSECTING_RINGS":
-			return RequirementId.R_GE_P_INTERSECTING_RINGS;
-		case "C_GE_P_NON_PLANAR":
-			return RequirementId.R_GE_P_NON_PLANAR;
-		case "C_GE_S_TOO_FEW_POLYGONS":
-			return RequirementId.R_GE_S_TOO_FEW_POLYGONS;
-		case "C_GE_S_NON_MANIFOLD_EDGE":
-			return RequirementId.R_GE_S_NON_MANIFOLD_EDGE;
-		case "C_GE_S_POLYGON_WRONG_ORIENTATION":
-			return RequirementId.R_GE_S_POLYGON_WRONG_ORIENTATION;
-		case "C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION":
-			return RequirementId.R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION;
-		case "C_GE_S_NON_MANIFOLD_VERTEX":
-			return RequirementId.R_GE_S_NON_MANIFOLD_VERTEX;
-		case "C_GE_S_SELF_INTERSECTION":
-			return RequirementId.R_GE_S_SELF_INTERSECTION;
-		case "C_GE_P_HOLE_OUTSIDE":
-			return RequirementId.R_GE_P_HOLE_OUTSIDE;
-		case "C_GE_P_INNER_RINGS_NESTED":
-			return RequirementId.R_GE_P_INNER_RINGS_NESTED;
-		case "C_GE_S_NOT_CLOSED":
-			return RequirementId.R_GE_S_NOT_CLOSED;
-		case "C_GE_S_MULTIPLE_CONNECTED_COMPONENTS":
-			return RequirementId.R_GE_S_MULTIPLE_CONNECTED_COMPONENTS;
-		default:
+	private RequirementId mapToRequirement(String requirementName) {
+		try {
+			return RequirementId.valueOf(requirementName);
+		} catch (IllegalArgumentException e) {
 			return null;
 		}
 	}
@@ -557,20 +528,71 @@ public class Checker {
 	}
 
 	private List<Check> collectEnabledChecksAndInit(ParserConfiguration parserConfig, ValidationConfiguration config) {
-		List<Check> checks = new ArrayList<>();
-		for (Entry<CheckId, CheckConfiguration> e : config.getChecks().entrySet()) {
-			if (e.getValue().isEnabled()) {
-				Check c = checkConfig.getCheckForId(e.getKey());
-				Map<String, String> parameters = new HashMap<>();
-				parameters.putAll(e.getValue().getParameters());
-				parameters.put("numberOfRoundingPlaces", "" + config.getNumberOfRoundingPlaces());
-				parameters.put("minVertexDistance", "" + config.getMinVertexDistance());
-				// initialize checks with parameters
-				c.init(parameters, parserConfig);
-				checks.add(c);
+		Set<CheckId> enabledCheck = new HashSet<>();
+		Map<CheckId, Map<String, String>> parameterMap = new HashMap<>();
+		for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) {
+			de.hft.stuttgart.citydoctor2.check.Requirement req = Checks.getAvailableRequirements().get(e.getKey());
+			if (req == null) {
+				logger.warn("Could not find any check that satisfies requirement {}, it will not be checked",
+						e.getKey());
+			} else {
+				if (e.getValue().isEnabled()) {
+					// this requirement is enabled
+					for (CheckPrototype proto : Checks.getCheckPrototypes()) {
+						if (proto.checksRequirements().contains(req)) {
+							// this requirement is checked by this check
+							// put all requirement parameter in the map
+							parameterMap.compute(proto.getCheckId(), (k, v) -> {
+								if (v == null) {
+									v = new HashMap<>();
+									v.put(GlobalParameters.NUMBER_OF_ROUNDING_PLACES,
+											config.getNumberOfRoundingPlacesAsString());
+									v.put(GlobalParameters.MIN_VERTEX_DISTANCE, config.getMinVertexDistanceAsString());
+								}
+								v.putAll(e.getValue().getParameters());
+								return v;
+							});
+							enabledCheck.add(proto.getCheckId());
+							collectDependencyChecks(proto, enabledCheck);
+						}
+					}
+				}
+			}
+		}
+		fillParameterMapsWithDefaultParameter(enabledCheck, parameterMap);
+		ArrayList<Check> checkList = new ArrayList<>();
+		for (CheckId id : enabledCheck) {
+			Check c = checkConfig.getCheckForId(id);
+			c.init(parameterMap.get(id), parserConfig);
+			checkList.add(c);
+		}
+		return checkList;
+	}
+
+	private void fillParameterMapsWithDefaultParameter(Set<CheckId> enabledCheck,
+			Map<CheckId, Map<String, String>> parameterMap) {
+		for (CheckId id : enabledCheck) {
+			CheckPrototype proto = Checks.getCheckPrototypeForId(id);
+			Map<String, String> map = parameterMap.computeIfAbsent(id, k -> new HashMap<>());
+			for (de.hft.stuttgart.citydoctor2.check.Requirement req : proto.checksRequirements()) {
+				if (proto.checksRequirements().contains(req)) {
+					for (DefaultParameter param : req.getDefaultParameter()) {
+						map.computeIfAbsent(param.getName(), k -> param.getValue());
+					}
+				}
+			}
+		}
+	}
+
+	private void collectDependencyChecks(CheckPrototype proto, Set<CheckId> enabledChecks) {
+		enabledChecks.addAll(proto.getDependencies());
+		for (CheckId id : proto.getDependencies()) {
+			if (enabledChecks.contains(id)) {
+				continue;
 			}
+			CheckPrototype depProto = Checks.getCheckPrototypeForId(id);
+			collectDependencyChecks(depProto, enabledChecks);
 		}
-		return checks;
 	}
 
 	private void checkCityModel(CityDoctorModel model, ProgressListener l) {
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/GlobalParameters.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/GlobalParameters.java
new file mode 100644
index 0000000000000000000000000000000000000000..74e197d67ce3696c08ce2a9ed21528b5a330c25a
--- /dev/null
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/GlobalParameters.java
@@ -0,0 +1,31 @@
+/*-
+ *  Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
+ * 
+ *  This file is part of CityDoctor2.
+ *
+ *  CityDoctor2 is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Lesser General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  CityDoctor2 is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public License
+ *  along with CityDoctor2.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package de.hft.stuttgart.citydoctor2.check;
+
+public class GlobalParameters {
+	
+	private GlobalParameters() {
+		
+	}
+	
+	public static final String SCHEMATRON_PATH = "schematronPath";
+	public static final String MIN_VERTEX_DISTANCE = "minVertexDistance";
+	public static final String NUMBER_OF_ROUNDING_PLACES = "numberOfRoundingPlaces";
+
+}
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckConfiguration.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementConfiguration.java
similarity index 93%
rename from CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckConfiguration.java
rename to CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementConfiguration.java
index 142a9b1e121e93cf9ab347d3f20a35356e271304..4ae0c72831a975ff4b654df1be978f17acc92f72 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckConfiguration.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/RequirementConfiguration.java
@@ -29,7 +29,7 @@ import java.util.Map;
  * @author Matthias Betz
  *
  */
-public class CheckConfiguration implements Serializable {
+public class RequirementConfiguration implements Serializable {
 
 	private static final long serialVersionUID = -1258195428669813888L;
 
@@ -59,10 +59,7 @@ public class CheckConfiguration implements Serializable {
 		}
 		return parameters;
 	}
-
-	/**
-	 * @param parameters Sets the parameters of this check.
-	 */
+	
 	public void setParameters(Map<String, String> parameters) {
 		this.parameters = parameters;
 	}
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/ValidationConfiguration.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/ValidationConfiguration.java
index 35fbe42c794824fa680a2123e4eb673efe617f68..75b0da902bcb5bdf7956be64480c5b6fee09ec61 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/ValidationConfiguration.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/ValidationConfiguration.java
@@ -28,6 +28,7 @@ import java.io.InputStream;
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -40,7 +41,6 @@ import org.yaml.snakeyaml.representer.Representer;
 import de.hft.stuttgart.citydoctor2.checks.CheckPrototype;
 import de.hft.stuttgart.citydoctor2.checks.Checks;
 import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
-import de.hft.stuttgart.citydoctor2.utils.Localization;
 
 /**
  * The validation configuration class represented in the yaml configuration
@@ -52,19 +52,17 @@ import de.hft.stuttgart.citydoctor2.utils.Localization;
  */
 public class ValidationConfiguration implements Serializable {
 
+	private static final String NUMBER_OF_ROUNDING_PLACES_DEFAULT = "8";
+	private static final String MIN_VERTEX_DISTANCE_DEFAULT = "0.0001";
 	private static final long serialVersionUID = -8020055032177740646L;
-
 	private static final Logger logger = LogManager.getLogger(ValidationConfiguration.class);
 
-	private int numberOfRoundingPlaces = 8;
-	private double minVertexDistance = 0.0001;
-
-	private String schematronFilePath = null;
-
+	
+	private Map<String, String> globalParameters;
 	private boolean xmlValidation = false;
 	private boolean useStreaming = false;
 	private FilterConfiguration filter;
-	private Map<CheckId, CheckConfiguration> checks;
+	private Map<String, RequirementConfiguration> requirements;
 
 	private ParserConfiguration parserConfig;
 
@@ -81,19 +79,20 @@ public class ValidationConfiguration implements Serializable {
 
 	public static ValidationConfiguration loadStandardValidationConfig() {
 		ValidationConfiguration config = new ValidationConfiguration();
-		config.checks = new HashMap<>();
+		config.requirements = new HashMap<>();
 		for (CheckPrototype c : Checks.getCheckPrototypes()) {
-			CheckConfiguration cConfig = new CheckConfiguration();
-			cConfig.setEnabled(true);
-			if (!c.getDefaultParameter().isEmpty()) {
-				Map<String, String> paramMap = new HashMap<>();
-				for (DefaultParameter param : c.getDefaultParameter()) {
-					paramMap.put(param.getName(), param.getDefaultValue());
+			for (Requirement req : c.checksRequirements()) {
+				RequirementConfiguration reqConfig = new RequirementConfiguration();
+				reqConfig.setEnabled(true);
+				for (DefaultParameter param : req.getDefaultParameter()) {
+					reqConfig.getParameters().put(param.getName(), param.getValue());
 				}
-				cConfig.setParameters(paramMap);
+				config.requirements.put(req.getId(), reqConfig);
 			}
-			config.checks.put(c.getCheckId(), cConfig);
 		}
+		config.globalParameters = new HashMap<>();
+		config.globalParameters.put(GlobalParameters.NUMBER_OF_ROUNDING_PLACES, NUMBER_OF_ROUNDING_PLACES_DEFAULT);
+		config.globalParameters.put(GlobalParameters.MIN_VERTEX_DISTANCE, MIN_VERTEX_DISTANCE_DEFAULT);
 		return config;
 	}
 
@@ -117,14 +116,6 @@ public class ValidationConfiguration implements Serializable {
 		this.xmlValidation = xmlValidation;
 	}
 
-	public String getSchematronFilePath() {
-		return schematronFilePath;
-	}
-
-	public void setSchematronFilePath(String schematronFilePath) {
-		this.schematronFilePath = schematronFilePath;
-	}
-
 	public boolean isUseStreaming() {
 		return useStreaming;
 	}
@@ -141,88 +132,67 @@ public class ValidationConfiguration implements Serializable {
 		this.filter = filter;
 	}
 
-	public Map<CheckId, CheckConfiguration> getChecks() {
-		if (checks == null) {
-			checks = new HashMap<>();
+	public Map<String, RequirementConfiguration> getRequirements() {
+		if (requirements == null) {
+			requirements = new HashMap<>();
 		}
-		return checks;
+		return requirements;
 	}
 
-	public void setChecks(Map<CheckId, CheckConfiguration> checks) {
-		this.checks = checks;
+	public Map<String, String> getGlobalParameters() {
+		if (globalParameters == null) {
+			globalParameters = new HashMap<>();
+		}
+		return globalParameters;
+	}
+	
+	public void setGlobalParameters(Map<String, String> globalParameters) {
+		this.globalParameters = globalParameters;
 	}
 
 	/**
-	 * Validates the configuration, adds all missing checks as enabled, reenables
-	 * checks that are necessary to perform other checks
+	 * Validates the configuration, adds all missing requirements as enabled.
 	 * 
-	 * @return true if it reenabled disabled checks, false otherwise
 	 */
-	public boolean validateConfiguration() {
-		for (CheckPrototype c : Checks.getCheckPrototypes()) {
-			// enable all checks that are missing in the validation config
-			checks.computeIfAbsent(c.getCheckId(), id -> {
-				CheckConfiguration cConfig = new CheckConfiguration();
-				cConfig.setEnabled(true);
-				return cConfig;
-			});
-		}
-		boolean reenabledChecks = reenableNecessaryChecks();
-		if (schematronFilePath != null && !schematronFilePath.isEmpty()) {
-			File f = new File(schematronFilePath);
-			if (!f.exists() || !f.isFile()) {
-				schematronFilePath = null;
-				if (logger.isWarnEnabled()) {
-					logger.warn(Localization.getText("ValidationConfiguration.missingSchematron"), f.getAbsolutePath());
+	public void validateConfiguration() {
+		logger.trace("Validating configuration");
+		Map<String, Requirement> availableRequirements = Checks.getAvailableRequirements();
+
+		for (Entry<String, RequirementConfiguration> entry : requirements.entrySet()) {
+			Requirement req = availableRequirements.get(entry.getKey());
+			if (req != null) {
+				for (DefaultParameter param : req.getDefaultParameter()) {
+					RequirementConfiguration config = entry.getValue();
+					config.getParameters().computeIfAbsent(param.getName(), k -> param.getValue());
 				}
 			}
 		}
-		return reenabledChecks;
-	}
-
-	private boolean reenableNecessaryChecks() {
-		boolean reenabledChecks = false;
-		for (java.util.Map.Entry<CheckId, CheckConfiguration> e : checks.entrySet()) {
-			if (!e.getValue().isEnabled()) {
-				continue;
-			}
-			CheckPrototype c = Checks.getCheckPrototypeForId(e.getKey());
-			for (CheckId dep : c.getDependencies()) {
-				CheckConfiguration checkConfig = checks.get(dep);
-				if (!checkConfig.isEnabled()) {
-					checkConfig.setEnabled(true);
-					reenabledChecks = true;
-					if (logger.isWarnEnabled()) {
-						logger.warn(Localization.getText("ValidationConfiguration.reenable"), dep, c.getCheckId());
-					}
+		for (Requirement req : availableRequirements.values()) {
+			requirements.computeIfAbsent(req.getId(), id -> {
+				RequirementConfiguration cConfig = new RequirementConfiguration();
+				cConfig.setEnabled(true);
+				for (DefaultParameter param : req.getDefaultParameter()) {
+					cConfig.getParameters().put(param.getName(), param.getValue());
 				}
-			}
-			insertMissingParametersWithDefaultParameters(e, c);
-		}
-		return reenabledChecks;
-	}
-
-	private void insertMissingParametersWithDefaultParameters(java.util.Map.Entry<CheckId, CheckConfiguration> e,
-			CheckPrototype c) {
-		for (DefaultParameter param : c.getDefaultParameter()) {
-			String configuredValue = e.getValue().getParameters().get(param.getName());
-			if (configuredValue == null) {
-				e.getValue().getParameters().put(param.getName(), param.getDefaultValue());
-			}
+				return cConfig;
+			});
 		}
+		globalParameters.computeIfAbsent(GlobalParameters.MIN_VERTEX_DISTANCE, k -> MIN_VERTEX_DISTANCE_DEFAULT);
+		globalParameters.computeIfAbsent(GlobalParameters.NUMBER_OF_ROUNDING_PLACES,
+				k -> NUMBER_OF_ROUNDING_PLACES_DEFAULT);
 	}
 
 	public int getNumberOfRoundingPlaces() {
-		return numberOfRoundingPlaces;
+		return Integer.parseInt(globalParameters.get(GlobalParameters.NUMBER_OF_ROUNDING_PLACES));
 	}
 
-	public void setNumberOfRoundingPlaces(int numberOfRoundingPlaces) {
-		this.numberOfRoundingPlaces = numberOfRoundingPlaces;
+	public void setNumberOfRoundingPlacesInGlobalParameters(int numberOfRoundingPlaces) {
+		globalParameters.put(GlobalParameters.NUMBER_OF_ROUNDING_PLACES, Integer.toString(numberOfRoundingPlaces));
 	}
 
 	public ParserConfiguration getParserConfiguration() {
 		if (parserConfig == null) {
-			parserConfig = new ParserConfiguration(numberOfRoundingPlaces, xmlValidation);
+			parserConfig = new ParserConfiguration(getNumberOfRoundingPlaces(), xmlValidation);
 		}
 		return parserConfig;
 	}
@@ -231,11 +201,31 @@ public class ValidationConfiguration implements Serializable {
 		this.parserConfig = parserConfig;
 	}
 
-	public void setMinVertexDistance(double minVertexDistance) {
-		this.minVertexDistance = minVertexDistance;
+	public void setMinVertexDistanceInGlobalParameters(double minVertexDistance) {
+		globalParameters.put(GlobalParameters.MIN_VERTEX_DISTANCE, Double.toString(minVertexDistance));
 	}
 
 	public double getMinVertexDistance() {
-		return minVertexDistance;
+		return Double.parseDouble(globalParameters.get(GlobalParameters.MIN_VERTEX_DISTANCE));
+	}
+
+	public String getSchematronFilePath() {
+		return globalParameters.get(GlobalParameters.SCHEMATRON_PATH);
+	}
+
+	public String getNumberOfRoundingPlacesAsString() {
+		return globalParameters.get(GlobalParameters.NUMBER_OF_ROUNDING_PLACES);
+	}
+
+	public String getMinVertexDistanceAsString() {
+		return globalParameters.get(GlobalParameters.MIN_VERTEX_DISTANCE);
+	}
+
+	public void setSchematronFilePathInGlobalParameters(String string) {
+		globalParameters.put(GlobalParameters.SCHEMATRON_PATH, string);
+	}
+	
+	public void setRequirements(Map<String, RequirementConfiguration> requirements) {
+		this.requirements = requirements;
 	}
 }
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckContainer.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckContainer.java
index e60d8ec13dea80c9cfc96d8bbeaf62098086d736..eb9ee057586379d73beffce6314ba100503f3f52 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckContainer.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckContainer.java
@@ -20,6 +20,7 @@ package de.hft.stuttgart.citydoctor2.checks;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -28,9 +29,10 @@ import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
 import de.hft.stuttgart.citydoctor2.check.Checkable;
 import de.hft.stuttgart.citydoctor2.check.DefaultParameter;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
 import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding;
@@ -68,6 +70,11 @@ public class CheckContainer extends Check {
 	public CheckContainer(Check check) {
 		this.check = check;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return check.appliesToRequirements();
+	}
 
 	@Override
 	public void init(Map<String, String> parameters, ParserConfiguration config) {
@@ -244,7 +251,7 @@ public class CheckContainer extends Check {
 	}
 
 	@Override
-	public CheckType getType() {
+	public RequirementType getType() {
 		return check.getType();
 	}
 
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckPrototype.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckPrototype.java
index 9676b59baaa5559ac22a2bbc3f3a8bd56a09a35c..975e9599f3b680ae14d817e9667c89d9ee9a6ad7 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckPrototype.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/CheckPrototype.java
@@ -19,11 +19,13 @@
 package de.hft.stuttgart.citydoctor2.checks;
 
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 import de.hft.stuttgart.citydoctor2.check.CheckId;
-import de.hft.stuttgart.citydoctor2.check.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
 import de.hft.stuttgart.citydoctor2.check.DefaultParameter;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 
 /**
  * This class is for having a read only access to a check for accessing meta
@@ -62,8 +64,12 @@ public class CheckPrototype {
 		return c.getDefaultParameter();
 	}
 
-	public CheckType getType() {
+	public RequirementType getType() {
 		return c.getType();
 	}
 
+	public Set<Requirement> checksRequirements() {
+		return c.appliesToRequirements();
+	}
+
 }
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 61af95865b8f245cf3a697b75011c38e5b4db286..813170a93ed7ed69af5de5597c94fb4309225927 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
@@ -29,15 +29,15 @@ import org.apache.logging.log4j.Logger;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 import de.hft.stuttgart.citydoctor2.check.CheckId;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
+import de.hft.stuttgart.citydoctor2.checks.geometry.AllPolygonsWrongOrientationCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.DuplicatePointsCheck;
-import de.hft.stuttgart.citydoctor2.checks.geometry.FaceOutCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.HoleOutsideCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.InteriorDisconnectedCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.ManifoldVertexCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.MultipleConnectedComponentCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.NestedRingsCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.NonManifoldEdgeCheck;
-import de.hft.stuttgart.citydoctor2.checks.geometry.NumPointsCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.PlanarCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.PolygonIntersectingRingsCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.PolygonSameOrientationCheck;
@@ -46,6 +46,7 @@ import de.hft.stuttgart.citydoctor2.checks.geometry.RingNotClosedCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.RingSelfIntCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.SolidNotClosedCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.SolidSelfIntCheck;
+import de.hft.stuttgart.citydoctor2.checks.geometry.TooFewPointsCheck;
 import de.hft.stuttgart.citydoctor2.checks.geometry.TooFewPolygonsCheck;
 import de.hft.stuttgart.citydoctor2.checks.semantics.IsCeilingCheck;
 import de.hft.stuttgart.citydoctor2.checks.semantics.IsFloorCheck;
@@ -69,6 +70,8 @@ public class Checks {
 
 	private static List<CheckPrototype> checkPrototypes;
 	private static Map<CheckId, CheckPrototype> prototypeMap;
+	private static Map<String, Requirement> availableRequirements;
+
 
 	private Map<CheckId, Check> checkMap;
 
@@ -78,7 +81,7 @@ public class Checks {
 
 		// add new checks here
 		// ring checks
-		publish(new NumPointsCheck());
+		publish(new TooFewPointsCheck());
 		publish(new RingNotClosedCheck());
 		publish(new DuplicatePointsCheck());
 		publish(new RingSelfIntCheck());
@@ -96,7 +99,7 @@ public class Checks {
 		publish(new SolidNotClosedCheck());
 		publish(new NonManifoldEdgeCheck());
 		publish(new PolygonWrongOrientationCheck());
-		publish(new FaceOutCheck());
+		publish(new AllPolygonsWrongOrientationCheck());
 		publish(new TooFewPolygonsCheck());
 		publish(new ManifoldVertexCheck());
 		publish(new SolidSelfIntCheck());
@@ -128,6 +131,30 @@ public class Checks {
 		}
 	}
 
+	private static Map<String, Requirement> collectRequirements() {
+		Map<String, Requirement> requirements = new HashMap<>();
+		for (CheckPrototype proto : checkPrototypes) {
+			for (Requirement req : proto.checksRequirements()) {
+				requirements.put(req.getId(), req);
+			}
+		}
+		return requirements;
+	}
+	
+	/**
+	 * Gets all requirements for which there are checks that can verify the
+	 * requirements. This is dependent on the available checks as only the checks
+	 * know which requirements they check.
+	 * 
+	 * @return a set of available requirements
+	 */
+	public static  Map<String, Requirement> getAvailableRequirements() {
+		if (availableRequirements == null) {
+			availableRequirements = collectRequirements();
+		}
+		return availableRequirements;
+	}
+	
 	private static void publish(Check check) {
 		CheckPrototype prototype = new CheckPrototype(check);
 		checkPrototypes.add(prototype);
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/AllPolygonsWrongOrientationCheck.java
similarity index 91%
rename from CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheck.java
rename to CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/AllPolygonsWrongOrientationCheck.java
index 00799cd3200d6f2d96c3355678954fc388aaf43c..17d3b1a28d0313ee8cd7a9edf55726928bfdd43c 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/AllPolygonsWrongOrientationCheck.java
@@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.AllPolygonsWrongOrientationError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
 import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
 import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
@@ -38,11 +41,12 @@ import de.hft.stuttgart.citydoctor2.math.Vector3d;
 import de.hft.stuttgart.citydoctor2.tesselation.TesselatedPolygon;
 
 /**
+ * Checks whether all polygons have the wrong orientation.
  * 
- * @author Matthias Betz - 71bema1mst@hft-stuttgart.de
+ * @author Matthias Betz
  *
  */
-public class FaceOutCheck extends Check {
+public class AllPolygonsWrongOrientationCheck extends Check {
 
 	private static final List<CheckId> dependencies;
 
@@ -171,15 +175,20 @@ public class FaceOutCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
 	public Check createNewInstance() {
-		return new FaceOutCheck();
+		return new AllPolygonsWrongOrientationCheck();
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/DuplicatePointsCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/DuplicatePointsCheck.java
index 3e8e6167a19298ec24b7a320784670ed2f716eb1..991e7f259e5661ab98f27d08f4410edbfd687572 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/DuplicatePointsCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/DuplicatePointsCheck.java
@@ -22,16 +22,19 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
 import de.hft.stuttgart.citydoctor2.check.Checkable;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.ConsecutivePointSameError;
 import de.hft.stuttgart.citydoctor2.check.error.RingDuplicatePointError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
 import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
 import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
@@ -44,7 +47,7 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
  * <dd>
  * <dd>CP_CLOSE</dd></dd>
  * 
- * @author Matthias Betz - 12bema1bif@hft-stuttgart.de
+ * @author Matthias Betz
  * 
  */
 public class DuplicatePointsCheck extends Check {
@@ -77,6 +80,11 @@ public class DuplicatePointsCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.asSet(Requirement.R_GE_R_CONSECUTIVE_POINTS_SAME, Requirement.R_GE_R_SELF_INTERSECTION);
+	}
 
 	@Override
 	public void check(LinearRing lr) {
@@ -114,8 +122,8 @@ public class DuplicatePointsCheck extends Check {
 	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/HoleOutsideCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/HoleOutsideCheck.java
index 68f60a14186571f533a6cdb89a503e8eb108bb24..8bb90e5a2df5ad5fec0ed29c7bed85e906c9a627 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/HoleOutsideCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/HoleOutsideCheck.java
@@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonHoleOutsideError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
 import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
 import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
@@ -79,10 +82,15 @@ public class HoleOutsideCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_P_HOLE_OUTSIDE);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/InteriorDisconnectedCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/InteriorDisconnectedCheck.java
index 95c3e4d24ecd300df18bde011a5f80a9208d8068..99fa9f41016c0ebf955c3d084705addcb01e73a4 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/InteriorDisconnectedCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/InteriorDisconnectedCheck.java
@@ -23,14 +23,17 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonInteriorDisconnectedError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
 import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
 import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
@@ -38,12 +41,18 @@ import de.hft.stuttgart.citydoctor2.math.Segment3d;
 import de.hft.stuttgart.citydoctor2.math.graph.CycleNode;
 import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
 
+/**
+ * Checks if a polygon is split up into multiple polygons by interior rings
+ * 
+ * @author Matthias Betz
+ *
+ */
 public class InteriorDisconnectedCheck extends Check {
-	
+
 	private static final String EPSILON_NAME = "minVertexDistance";
-	
+
 	private static final List<CheckId> dependencies;
-	
+
 	static {
 		ArrayList<CheckId> deps = new ArrayList<>();
 		deps.add(CheckId.C_GE_R_TOO_FEW_POINTS);
@@ -53,19 +62,17 @@ public class InteriorDisconnectedCheck extends Check {
 		deps.add(CheckId.C_GE_P_NON_PLANAR);
 		dependencies = Collections.unmodifiableList(deps);
 	}
-	
+
 	private double epsilon = 0.0001;
-	
+
 	@Override
 	public void init(Map<String, String> params, ParserConfiguration config) {
 		String epsilonString = params.get(EPSILON_NAME);
-		if (epsilonString == null) {
-			epsilon = 0.0001;
-		} else {
+		if (epsilonString != null) {
 			epsilon = Double.parseDouble(epsilonString);
 		}
 	}
-	
+
 	@Override
 	public void check(Polygon p) {
 		if (p.getInnerRings().isEmpty()) {
@@ -88,7 +95,7 @@ public class InteriorDisconnectedCheck extends Check {
 				}
 			}
 		}
-		
+
 		for (CycleNode node : nodeMap.values()) {
 			if (node.hasMoreThan2CycleDepth(null)) {
 				// found ring in graph with more than 1 node
@@ -127,7 +134,7 @@ public class InteriorDisconnectedCheck extends Check {
 						p.addCheckResult(cr);
 						return true;
 					}
-					
+
 				}
 			}
 		}
@@ -152,15 +159,20 @@ public class InteriorDisconnectedCheck extends Check {
 			nodeMap.put(lr, node);
 		}
 	}
-	
+
 	@Override
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_P_INTERIOR_DISCONNECTED);
+	}
+
+	@Override
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/ManifoldVertexCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/ManifoldVertexCheck.java
index 5a2c1c928e266b5b6c1d420ed6686ff069a78ed4..5e97cd55d6efd180910d6ec02a5d4092d034b1f7 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/ManifoldVertexCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/ManifoldVertexCheck.java
@@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.NonManifoldVertexError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.Edge;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
 import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
@@ -40,7 +43,7 @@ import de.hft.stuttgart.citydoctor2.math.graph.PolygonGraph;
  * Checks if the polygons adjacent to a vertex are attached via edges or are
  * they discontinuous.
  * 
- * @author Matthias Betz - 12bema1bif@hft-stuttgart.de
+ * @author Matthias Betz
  * 
  */
 public class ManifoldVertexCheck extends Check {
@@ -92,10 +95,15 @@ public class ManifoldVertexCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_S_NON_MANIFOLD_VERTEX);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/MultipleConnectedComponentCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/MultipleConnectedComponentCheck.java
index 0caf422718a704e99ffbd5eaa1c16eca38b8406f..3d879923cf386fb32ce17ae1ae77b06091fd9ca5 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/MultipleConnectedComponentCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/MultipleConnectedComponentCheck.java
@@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.MultipleConnectedComponentsError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
 import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
 import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
@@ -38,7 +41,7 @@ import de.hft.stuttgart.citydoctor2.math.graph.PolygonGraph;
 /**
  * Checks if all parts of a solid are connected or not.
  * 
- * @author Matthias Betz - 12bema1bif@hft-stuttgart.de
+ * @author Matthias Betz
  * 
  */
 public class MultipleConnectedComponentCheck extends Check {
@@ -86,10 +89,15 @@ public class MultipleConnectedComponentCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_S_MULTIPLE_CONNECTED_COMPONENTS);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NestedRingsCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NestedRingsCheck.java
index 7d5f9cc388ae96c6eb091513776b21a733c413a2..fed3f15e04d7c3aaf9d9cfe6b2e57fcac145749c 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NestedRingsCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NestedRingsCheck.java
@@ -21,20 +21,30 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.NestedRingError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
 import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
 import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
 
+/**
+ * Checks whether a inner ring is completely contained in another inner ring
+ * within the same polygon
+ * 
+ * @author Matthias Betz
+ *
+ */
 public class NestedRingsCheck extends Check {
-	
+
 	private static final List<CheckId> dependencies;
 
 	static {
@@ -47,7 +57,7 @@ public class NestedRingsCheck extends Check {
 		deps.add(CheckId.C_GE_P_ORIENTATION_RINGS_SAME);
 		dependencies = Collections.unmodifiableList(deps);
 	}
-	
+
 	@Override
 	public void check(Polygon p) {
 		for (LinearRing interiorRing : p.getInnerRings()) {
@@ -85,10 +95,15 @@ public class NestedRingsCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_P_INNER_RINGS_NESTED);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NonManifoldEdgeCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NonManifoldEdgeCheck.java
index 2f634d42d8d93ab0bd94b30f16997fb184136e36..9d4261cd61888fdcbc3b74e18ab4be89aaa25f74 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NonManifoldEdgeCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NonManifoldEdgeCheck.java
@@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.NonManifoldEdgeError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.Edge;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
 import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
@@ -37,7 +40,9 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
  * This class detects half edges with more than two neighbors, i.e.
  * non-2-manifold geometries
  * 
- * @author dwagner, alam
+ * @author dwagner
+ * @author alam
+ * @author Matthias Betz
  */
 
 public class NonManifoldEdgeCheck extends Check {
@@ -80,6 +85,11 @@ public class NonManifoldEdgeCheck extends Check {
 		}
 		g.addCheckResult(cr);
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_S_NON_MANIFOLD_EDGE);
+	}
 
 	@Override
 	public List<CheckId> getDependencies() {
@@ -87,8 +97,8 @@ public class NonManifoldEdgeCheck extends Check {
 	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheck.java
index 8f3a2c40c8878b18315adceaa8d021d758e86957..3b5a6fbe28a8726f67e13c7b295111ec9227c990 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NullAreaCheck.java
@@ -22,15 +22,18 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
 import de.hft.stuttgart.citydoctor2.check.DefaultParameter;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.Unit;
 import de.hft.stuttgart.citydoctor2.check.error.NullAreaError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
 import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
 import de.hft.stuttgart.citydoctor2.math.Line3d;
@@ -106,6 +109,11 @@ public class NullAreaCheck extends Check {
 		}
 		return area < 0.0001;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_R_NULL_AREA);
+	}
 
 	@Override
 	public List<CheckId> getDependencies() {
@@ -113,8 +121,8 @@ public class NullAreaCheck extends Check {
 	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PlanarCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PlanarCheck.java
index 9f63a86fd58173d7655607329c3ca9b0aaa8b938..46b42ff92f75dbeff8408c3ae740eed73add6d7d 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PlanarCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PlanarCheck.java
@@ -22,23 +22,28 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import Jama.EigenvalueDecomposition;
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
 import de.hft.stuttgart.citydoctor2.check.DefaultParameter;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.Unit;
+import de.hft.stuttgart.citydoctor2.check.error.DegeneratedPolygonError;
 import de.hft.stuttgart.citydoctor2.check.error.NonPlanarPolygonDistancePlaneError;
 import de.hft.stuttgart.citydoctor2.check.error.NonPlanarPolygonNormalsDeviation;
-import de.hft.stuttgart.citydoctor2.check.error.DegeneratedPolygonError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
+import de.hft.stuttgart.citydoctor2.datastructure.BoundingBox;
 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.CovarianceMatrix;
+import de.hft.stuttgart.citydoctor2.math.Matrix3x3d;
 import de.hft.stuttgart.citydoctor2.math.OrthogonalRegressionPlane;
 import de.hft.stuttgart.citydoctor2.math.Plane;
 import de.hft.stuttgart.citydoctor2.math.Triangle3d;
@@ -48,18 +53,19 @@ import de.hft.stuttgart.citydoctor2.tesselation.JoglTesselator;
 import de.hft.stuttgart.citydoctor2.tesselation.TesselatedPolygon;
 
 /**
- * Check class to check for planarity issues
+ * Check class to check for planarity issues as well as degenerated polygons.
+ * Checks for regression plane and normal issues.
  * 
  * @author Matthias Betz
  *
  */
 public class PlanarCheck extends Check {
 
-	private static final String DISTANCE = "distance";
-	private static final String DISTANCE_TOLERANCE = "distanceTolerance";
-	private static final String ANGLE_TOLERANCE = "angleTolerance";
-	private static final String TYPE = "type";
-	private static final String DEGENERATED_POLYGON_TOLERANCE = "degeneratedPolygonTolerance";
+	public static final String DISTANCE = "distance";
+	public static final String DISTANCE_TOLERANCE = "distanceTolerance";
+	public static final String ANGLE_TOLERANCE = "angleTolerance";
+	public static final String TYPE = "type";
+	public static final String DEGENERATED_POLYGON_TOLERANCE = "degeneratedPolygonTolerance";
 
 	private static final List<CheckId> dependencies;
 	private static final List<DefaultParameter> defaultParameters;
@@ -91,6 +97,8 @@ public class PlanarCheck extends Check {
 	public void init(Map<String, String> parameters, ParserConfiguration config) {
 		if (parameters.containsKey(TYPE)) {
 			planarCheckType = parameters.get(TYPE).toLowerCase();
+		} else {
+			throw new IllegalStateException("Parameter " + TYPE + " is missing from parameters");
 		}
 		if (parameters.containsKey(ANGLE_TOLERANCE)) {
 			rad = Math.toRadians(Double.parseDouble(parameters.get(ANGLE_TOLERANCE)));
@@ -115,8 +123,10 @@ public class PlanarCheck extends Check {
 		} else if ("angle".equals(planarCheckType)) {
 			// check for tiny edge as well
 			// store all used points in temporary list
-			Vector3d eigenvalues = calculatedEigenvalues(p);
-			if (checkEigenvalues(p, eigenvalues)) {
+			ArrayList<Vertex> vertices = collectVertices(p);
+			Vector3d centroid = CovarianceMatrix.getCentroid(vertices);
+			EigenvalueDecomposition ed = OrthogonalRegressionPlane.decompose(vertices, centroid);
+			if (checkEigenvalues(p, vertices, ed)) {
 				// found tiny edge error, abort further checking
 				return;
 			}
@@ -130,13 +140,6 @@ public class PlanarCheck extends Check {
 		}
 	}
 
-	private Vector3d calculatedEigenvalues(Polygon p) {
-		ArrayList<Vertex> vertices = collectVertices(p);
-		Vector3d centroid = CovarianceMatrix.getCentroid(vertices);
-		EigenvalueDecomposition ed = OrthogonalRegressionPlane.decompose(vertices, centroid);
-		return OrthogonalRegressionPlane.getEigenvalues(ed);
-	}
-
 	private void planarNormalDeviation(Polygon p) {
 		TesselatedPolygon tp = JoglTesselator.tesselatePolygon(p);
 		ArrayList<Vector3d> normals = new ArrayList<>();
@@ -185,13 +188,13 @@ public class PlanarCheck extends Check {
 		ArrayList<Vertex> vertices = collectVertices(p);
 		Vector3d centroid = CovarianceMatrix.getCentroid(vertices);
 		EigenvalueDecomposition ed = OrthogonalRegressionPlane.decompose(vertices, centroid);
-		Vector3d eigenvalues = OrthogonalRegressionPlane.getEigenvalues(ed);
 
-		if (checkEigenvalues(p, eigenvalues)) {
+		if (checkEigenvalues(p, vertices, ed)) {
 			// found tiny edge error, abort further checking
 			return;
 		}
 
+		Vector3d eigenvalues = OrthogonalRegressionPlane.getEigenvalues(ed);
 		Plane plane = OrthogonalRegressionPlane.calculatePlane(centroid, ed, eigenvalues);
 		for (Vertex v : vertices) {
 			double distance = plane.getDistance(v);
@@ -224,13 +227,25 @@ public class PlanarCheck extends Check {
 		return vertices;
 	}
 
-	private boolean checkEigenvalues(Polygon p, Vector3d eigenvalues) {
+	private boolean checkEigenvalues(Polygon p, List<Vertex> points, EigenvalueDecomposition ed) {
+		Matrix3x3d mat = new Matrix3x3d(ed.getV().getArray());
+		List<Vector3d> rotatedVertices = new ArrayList<>();
+		for (Vertex v : points) {
+			rotatedVertices.add(mat.mult(v));
+		}
+		BoundingBox bbox = BoundingBox.ofPoints(rotatedVertices);
+
 		int nrOfEigenvaluesBelowTolerance = 0;
-		for (double d : eigenvalues.getCoordinates()) {
-			if (d <= degeneratedPolygonTolerance) {
-				nrOfEigenvaluesBelowTolerance++;
-			}
+		if (bbox.getWidth() < degeneratedPolygonTolerance) {
+			nrOfEigenvaluesBelowTolerance++;
+		}
+		if (bbox.getHeight() < degeneratedPolygonTolerance) {
+			nrOfEigenvaluesBelowTolerance++;
+		}
+		if (bbox.getDepth() < degeneratedPolygonTolerance) {
+			nrOfEigenvaluesBelowTolerance++;
 		}
+
 		if (nrOfEigenvaluesBelowTolerance >= 2) {
 			CheckError err = new DegeneratedPolygonError(p);
 			p.addCheckResult(new CheckResult(this, ResultStatus.ERROR, err));
@@ -245,8 +260,13 @@ public class PlanarCheck extends Check {
 	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_P_NON_PLANAR);
+	}
+
+	@Override
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonIntersectingRingsCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonIntersectingRingsCheck.java
index 9eb7c24ff7e746ef9a546ee1e834fbc6a2f36b81..0e2e834f710a3273e97410bce98c41029729af1a 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonIntersectingRingsCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonIntersectingRingsCheck.java
@@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonIntersectingRingsError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
 import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
 import de.hft.stuttgart.citydoctor2.math.Polygon2d;
@@ -38,11 +41,16 @@ import de.hft.stuttgart.citydoctor2.math.Vector2d;
 import de.hft.stuttgart.citydoctor2.utils.Pair;
 import de.hft.stuttgart.citydoctor2.utils.SerializablePair;
 
+/**
+ * Checks whether linear rings within a polygon are intersecting with each other
+ * 
+ * @author Matthias Betz
+ *
+ */
 public class PolygonIntersectingRingsCheck extends Check {
-	
 
 	private static final List<CheckId> dependencies;
-	
+
 	static {
 		ArrayList<CheckId> deps = new ArrayList<>();
 		deps.add(CheckId.C_GE_R_TOO_FEW_POINTS);
@@ -54,7 +62,7 @@ public class PolygonIntersectingRingsCheck extends Check {
 		deps.add(CheckId.C_GE_P_INNER_RINGS_NESTED);
 		dependencies = Collections.unmodifiableList(deps);
 	}
-	
+
 	@Override
 	public void check(Polygon p) {
 		if (p.getInnerRings().isEmpty()) {
@@ -73,7 +81,7 @@ public class PolygonIntersectingRingsCheck extends Check {
 		}
 		p.addCheckResult(cr);
 	}
-	
+
 	public SerializablePair<LinearRing, LinearRing> interiorRingsIntersectWithExterior(Polygon p) {
 		List<Pair<LinearRing, List<Segment2d>>> ringSegments = projectTo2D(p);
 		for (int i = 0; i < ringSegments.size() - 1; i++) {
@@ -124,8 +132,13 @@ public class PolygonIntersectingRingsCheck extends Check {
 	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_P_INTERSECTING_RINGS);
+	}
+
+	@Override
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonSameOrientationCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonSameOrientationCheck.java
index 7257585efbe6f275644c7945af9f49b11495952d..778ec210ff6a9a65c1201f815e0de19a89897d2b 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonSameOrientationCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonSameOrientationCheck.java
@@ -21,22 +21,33 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonSameOrientationError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.checks.util.Orientation;
 import de.hft.stuttgart.citydoctor2.checks.util.RingOrientationUtil;
 import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
 import de.hft.stuttgart.citydoctor2.math.Polygon2d;
 import de.hft.stuttgart.citydoctor2.math.Ring2d;
 
+/**
+ * This class checks whether a linear ring and the exterior ring of a polygon
+ * have the same orientation. A inner ring must be oriented in the opposite
+ * direction than the exterior ring.
+ * 
+ * @author Matthias Betz
+ *
+ */
 public class PolygonSameOrientationCheck extends Check {
-	
+
 	private static final List<CheckId> dependencies;
 
 	static {
@@ -48,7 +59,7 @@ public class PolygonSameOrientationCheck extends Check {
 		deps.add(CheckId.C_GE_P_NON_PLANAR);
 		dependencies = Collections.unmodifiableList(deps);
 	}
-	
+
 	@Override
 	public void check(Polygon p) {
 		if (p.getInnerRings().isEmpty()) {
@@ -67,7 +78,7 @@ public class PolygonSameOrientationCheck extends Check {
 				return;
 			}
 		}
-		
+
 		// no error found, or the method would have terminated previously
 		CheckResult cr = new CheckResult(this, ResultStatus.OK, null);
 		p.addCheckResult(cr);
@@ -80,8 +91,13 @@ public class PolygonSameOrientationCheck extends Check {
 	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_P_ORIENTATION_RINGS_SAME);
+	}
+
+	@Override
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonWrongOrientationCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonWrongOrientationCheck.java
index c0e8fd9a2f4a1aa3808513ae84bf575f2fdfc158..38c9629c14efb3ebdd04d890194d4d9dbdcc5fb1 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonWrongOrientationCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/PolygonWrongOrientationCheck.java
@@ -21,28 +21,32 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.PolygonWrongOrientationError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.Edge;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
 import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
 
 /**
- * This class checks the orientation of each face of a solid
- * @author Matthias Betz - 12bema1bif@hft-stuttgart.de
+ * Checks whether polygons share a edge that is walked more than one time in the
+ * same direction by two or more polygons indicating that a polygon is oriented wrong.
+ * 
+ * @author Matthias Betz
  *
  */
 public class PolygonWrongOrientationCheck extends Check {
 
-
 	private static final List<CheckId> dependencies;
-	
+
 	static {
 		ArrayList<CheckId> deps = new ArrayList<>();
 		deps.add(CheckId.C_GE_R_TOO_FEW_POINTS);
@@ -57,19 +61,19 @@ public class PolygonWrongOrientationCheck extends Check {
 		deps.add(CheckId.C_GE_S_NON_MANIFOLD_EDGE);
 		dependencies = Collections.unmodifiableList(deps);
 	}
-	
+
 	@Override
 	public void check(Geometry g) {
 		// only for solids
 		if (g.getType() != GeometryType.SOLID) {
 			return;
 		}
-		
+
 		List<Edge> faultyEdges = new ArrayList<>();
 		for (Edge edge : g.getEdges()) {
 			if (edge.getNumberOfHalfEdges() != edge.getNumberOppositeHalfEdges()) {
 				faultyEdges.add(edge);
-			} 
+			}
 		}
 		CheckResult cr;
 		if (faultyEdges.isEmpty()) {
@@ -80,15 +84,20 @@ public class PolygonWrongOrientationCheck extends Check {
 		}
 		g.addCheckResult(cr);
 	}
-	
+
 	@Override
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
-	
+
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_S_POLYGON_WRONG_ORIENTATION);
+	}
+
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingNotClosedCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingNotClosedCheck.java
index 156af281fc8e7f67002339754fff52d4e42bef5c..b1948f7e5064dd9e734a956ed22e8c923090a3aa 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingNotClosedCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingNotClosedCheck.java
@@ -21,22 +21,25 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.RingNotClosedError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
 import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
 
 /**
- * CP_CLOSE checks the closeness a linear ring. A linear ring must end where it
+ * C_GE_R_NOT_CLOSED checks the closeness a linear ring. A linear ring must end where it
  * started.
  * 
- * @author Matthias Betz - 12bema1bif@hft-stuttgart.de
+ * @author Matthias Betz
  * 
  */
 public class RingNotClosedCheck extends Check {
@@ -69,8 +72,13 @@ public class RingNotClosedCheck extends Check {
 	}
 	
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
+	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_R_NOT_CLOSED);
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingSelfIntCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingSelfIntCheck.java
index f65b0f87170a1ce766aabf89dd7a275749806b64..05981213b99353e3d638f70044a38703848fea68 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingSelfIntCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/RingSelfIntCheck.java
@@ -22,16 +22,19 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.PointTouchesEdgeError;
 import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError;
 import de.hft.stuttgart.citydoctor2.checks.Checks;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.Edge;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
 import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
@@ -40,6 +43,13 @@ import de.hft.stuttgart.citydoctor2.math.DistanceResult;
 import de.hft.stuttgart.citydoctor2.math.Segment3d;
 import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
 
+/**
+ * Checks whether a ring self intersects. Also checks if a point is too close to
+ * an edge of the ring.
+ * 
+ * @author Matthias Betz
+ *
+ */
 public class RingSelfIntCheck extends Check {
 
 	private static final String EPSILON_NAME = "minVertexDistance";
@@ -138,8 +148,13 @@ public class RingSelfIntCheck extends Check {
 	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_R_SELF_INTERSECTION);
+	}
+
+	@Override
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidNotClosedCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidNotClosedCheck.java
index 2239d9459280456ffc13f02cd5a21eae320315d2..fb282bbe5e3ff2cd12c8ada297e645b39ccee7f7 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidNotClosedCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/SolidNotClosedCheck.java
@@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.Edge;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
 import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
@@ -37,8 +40,9 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
  * This class detects half edges without neighbor, i.e. holes in solid
  * geometries
  * 
- * @author dwagner, alam
- * @author Matthias Betz - 12bema1bif@hft-stuttgart.de
+ * @author dwagner
+ * @author alam
+ * @author Matthias Betz
  */
 public class SolidNotClosedCheck extends Check {
 
@@ -87,10 +91,15 @@ public class SolidNotClosedCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_S_NOT_CLOSED);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
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 ed5f7d065fef919c7dd54a91455f896e47be60d6..67f16dd4c120e05c325fb65644a9faae3057eb65 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
@@ -21,15 +21,18 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
 import de.hft.stuttgart.citydoctor2.check.GeometrySelfIntersection;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.checks.util.SelfIntersectionUtil;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
 import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
@@ -98,10 +101,15 @@ public class SolidSelfIntCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_S_SELF_INTERSECTION);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPointsCheck.java
similarity index 83%
rename from CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheck.java
rename to CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPointsCheck.java
index f2e7cbe8b0754eefcef7e4c53231b6cbfac1a96d..1eb348c325c58f8557335a0db3c9f0c2c325ff95 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPointsCheck.java
@@ -28,23 +28,25 @@ import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
 import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
 
 /**
- * CP_NUMPOINTS checks the minimum number of point in a linear ring. At least
+ * C_GE_R_TOO_FEW_POINTS checks the minimum number of point in a linear ring. At least
  * three vertices are minimum for a linear ring. <br/>
  * <br/>
  * <b>Dependency:</b> <br/>
  * <dd>
- * <dd>none</dd></dd>
+ * <dd>C_GE_R_NOT_CLOSED</dd></dd>
  * 
- * @author Matthias Betz - 12bema1bif@hft-stuttgart.de
+ * @author Matthias Betz
  */
-public class NumPointsCheck extends Check {
+public class TooFewPointsCheck extends Check {
 
 	private static final List<CheckId> dependencies;
 
@@ -95,15 +97,20 @@ public class NumPointsCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_R_TOO_FEW_POINTS);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
 	public Check createNewInstance() {
-		return new NumPointsCheck();
+		return new TooFewPointsCheck();
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPolygonsCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPolygonsCheck.java
index 9365e87ebbffc9f09b806e92c9fb6ad3ac7e7893..670e00942330074304ad63f97e968e9bce314d1a 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPolygonsCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/geometry/TooFewPolygonsCheck.java
@@ -21,21 +21,24 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import de.hft.stuttgart.citydoctor2.check.Check;
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
 import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
 
 /**
- * This class checks minimum number of planes for a solid
+ * This class checks minimum number of polygons for a solid
  * 
- * @author Matthias Betz 12bema1bif@hft-stuttgart.de
+ * @author Matthias Betz
  */
 public class TooFewPolygonsCheck extends Check {
 
@@ -59,7 +62,6 @@ public class TooFewPolygonsCheck extends Check {
 	 * not.
 	 * 
 	 * @param toBeCheckedGeometry The ViewableGeometry that has to be checked.
-	 * @return Vector of CDErrors
 	 */
 	@Override
 	public void check(Geometry g) {
@@ -81,10 +83,15 @@ public class TooFewPolygonsCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_GE_S_TOO_FEW_POLYGONS);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.GEOMETRY;
+	public RequirementType getType() {
+		return RequirementType.GEOMETRY;
 	}
 
 	@Override
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/GroundSurfaceUnfragmented.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/GroundSurfaceUnfragmented.java
index 55bcad728d5ebd9cf4f7a2b8b649b60812af1f5a..6ff7b13b5fbdce70a22118a2a6a0eaf8347e1791 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/GroundSurfaceUnfragmented.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/GroundSurfaceUnfragmented.java
@@ -21,12 +21,15 @@ package de.hft.stuttgart.citydoctor2.checks.semantics;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.checks.util.UnfragmentedCheck;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
@@ -66,10 +69,15 @@ public class GroundSurfaceUnfragmented extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_SE_BS_GROUND_UNFRAGMENTED);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.SEMANTIC;
+	public RequirementType getType() {
+		return RequirementType.SEMANTIC;
 	}
 
 	@Override
@@ -79,7 +87,7 @@ public class GroundSurfaceUnfragmented extends Check {
 
 	@Override
 	public CheckId getCheckId() {
-		return CheckId.C_SEM_BS_GROUND_NOT_FRAGMENTED;
+		return CheckId.C_SE_BS_GROUND_NOT_FRAGMENTED;
 	}
 
 }
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsCeilingCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsCeilingCheck.java
index c825c04b401dfaa6e73f340fdaf594c0fe7eaa83..67df459f4f584ffce836f2a56ebd1d5a076f7255 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsCeilingCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsCeilingCheck.java
@@ -21,13 +21,16 @@ package de.hft.stuttgart.citydoctor2.checks.semantics;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.NotCeilingError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
@@ -80,10 +83,15 @@ public class IsCeilingCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_CEILING);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.SEMANTIC;
+	public RequirementType getType() {
+		return RequirementType.SEMANTIC;
 	}
 
 	@Override
@@ -93,7 +101,7 @@ public class IsCeilingCheck extends Check {
 
 	@Override
 	public CheckId getCheckId() {
-		return CheckId.C_SEM_BS_NOT_CEILING;
+		return CheckId.C_SE_BS_IS_CEILING;
 	}
 
 }
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsFloorCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsFloorCheck.java
index e2e0017fd6e235adeb5f257c8ce911e0d41ed1c7..5e550825f79e0d3f84f32f495750491f3446b50a 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsFloorCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsFloorCheck.java
@@ -21,13 +21,16 @@ package de.hft.stuttgart.citydoctor2.checks.semantics;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.NotFloorError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
@@ -83,8 +86,13 @@ public class IsFloorCheck extends Check {
 	}
 	
 	@Override
-	public CheckType getType() {
-		return CheckType.SEMANTIC;
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_FLOOR);
+	}
+	
+	@Override
+	public RequirementType getType() {
+		return RequirementType.SEMANTIC;
 	}
 
 	@Override
@@ -94,7 +102,7 @@ public class IsFloorCheck extends Check {
 
 	@Override
 	public CheckId getCheckId() {
-		return CheckId.C_SEM_BS_NOT_FLOOR;
+		return CheckId.C_SE_BS_IS_FLOOR;
 	}
 
 }
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsGroundCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsGroundCheck.java
index 0d4e46fe261551e203a13ff356c58427cd1939e3..89a1b193a3adb66d932560ab02177c58ba14d882 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsGroundCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsGroundCheck.java
@@ -21,13 +21,16 @@ package de.hft.stuttgart.citydoctor2.checks.semantics;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.error.NotGroundError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
@@ -80,10 +83,15 @@ public class IsGroundCheck extends Check {
 	public List<CheckId> getDependencies() {
 		return dependencies;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_GROUND);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.SEMANTIC;
+	public RequirementType getType() {
+		return RequirementType.SEMANTIC;
 	}
 
 	@Override
@@ -93,6 +101,6 @@ public class IsGroundCheck extends Check {
 
 	@Override
 	public CheckId getCheckId() {
-		return CheckId.C_SEM_BS_NOT_GROUND;
+		return CheckId.C_SE_BS_IS_GROUND;
 	}
 }
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsWallCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsWallCheck.java
index 85437c59efb7778b1306475203d870440c05c690..4cfb380b92e3153242f44ea6b550cb4c2e921f5d 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsWallCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/IsWallCheck.java
@@ -22,15 +22,18 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
 import de.hft.stuttgart.citydoctor2.check.DefaultParameter;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.check.Unit;
 import de.hft.stuttgart.citydoctor2.check.error.NotWallError;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
@@ -132,14 +135,19 @@ public class IsWallCheck extends Check {
 		return dependencies;
 	}
 	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_WALL);
+	}
+	
 	@Override
 	public List<DefaultParameter> getDefaultParameter() {
 		return defaultParameters;
 	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.SEMANTIC;
+	public RequirementType getType() {
+		return RequirementType.SEMANTIC;
 	}
 
 	@Override
@@ -149,7 +157,7 @@ public class IsWallCheck extends Check {
 
 	@Override
 	public CheckId getCheckId() {
-		return CheckId.C_SEM_BS_IS_WALL;
+		return CheckId.C_SE_BS_IS_WALL;
 	}
 
 }
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/RoofSurfaceUnfragmentedCheck.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/RoofSurfaceUnfragmentedCheck.java
index 692ed2ee4f0839641c9b67d5b157d5452327c57c..e2e535fc591b0b4cb62a77342333e25923b12756 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/RoofSurfaceUnfragmentedCheck.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/semantics/RoofSurfaceUnfragmentedCheck.java
@@ -22,13 +22,16 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
 import de.hft.stuttgart.citydoctor2.check.DefaultParameter;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.Unit;
+import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
 import de.hft.stuttgart.citydoctor2.checks.util.UnfragmentedCheck;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
 import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
@@ -91,10 +94,15 @@ public class RoofSurfaceUnfragmentedCheck extends Check {
 	public List<DefaultParameter> getDefaultParameter() {
 		return defaultParameters;
 	}
+	
+	@Override
+	public Set<Requirement> appliesToRequirements() {
+		return CollectionUtils.singletonSet(Requirement.R_SE_BS_ROOF_UNFRAGMENTED);
+	}
 
 	@Override
-	public CheckType getType() {
-		return CheckType.SEMANTIC;
+	public RequirementType getType() {
+		return RequirementType.SEMANTIC;
 	}
 
 	@Override
@@ -104,7 +112,7 @@ public class RoofSurfaceUnfragmentedCheck extends Check {
 
 	@Override
 	public CheckId getCheckId() {
-		return CheckId.C_SEM_BS_ROOF_NOT_FRAGMENTED;
+		return CheckId.C_SE_BS_ROOF_UNFRAGMENTED;
 	}
 
 }
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/util/CollectionUtils.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/util/CollectionUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..cdbe4667f80817a29e9b36460c8bbbfd94ba4c67
--- /dev/null
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/checks/util/CollectionUtils.java
@@ -0,0 +1,43 @@
+/*-
+ *  Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
+ * 
+ *  This file is part of CityDoctor2.
+ *
+ *  CityDoctor2 is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Lesser General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  CityDoctor2 is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public License
+ *  along with CityDoctor2.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package de.hft.stuttgart.citydoctor2.checks.util;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class CollectionUtils {
+	
+	private CollectionUtils() {
+	}
+	
+	public static <T> Set<T> singletonSet(T v) {
+		HashSet<T> set = new HashSet<>(2);
+		set.add(v);
+		return set;
+	}
+
+	@SafeVarargs
+	public static <T> Set<T> asSet(T... values) {
+		HashSet<T> set = new HashSet<>((int) (values.length * 1.25));
+		set.addAll(Arrays.asList(values));
+		return set;
+	}
+
+}
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/XmlStreamReporter.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/XmlStreamReporter.java
index 1deaad7100546182d398adfe0ac6fedea60eeea3..82fd142d918a562eaff3411d8515fcae3b1be014 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/XmlStreamReporter.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/XmlStreamReporter.java
@@ -32,10 +32,9 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
-import de.hft.stuttgart.citydoctor2.check.CheckConfiguration;
 import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
 import de.hft.stuttgart.citydoctor2.check.ErrorType;
+import de.hft.stuttgart.citydoctor2.check.RequirementConfiguration;
 import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration;
 import de.hft.stuttgart.citydoctor2.checkresult.CheckReport;
 import de.hft.stuttgart.citydoctor2.checkresult.Environment;
@@ -115,10 +114,10 @@ public class XmlStreamReporter implements StreamReporter {
 		plan.setNumberOfRoundingPlaces(config.getNumberOfRoundingPlaces());
 		List<PlanCheck> checkConfigs = new ArrayList<>();
 		plan.setChecks(checkConfigs);
-		for (Entry<CheckId, CheckConfiguration> e : config.getChecks().entrySet()) {
+		for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) {
 			PlanCheck checkConfig = new PlanCheck();
 			checkConfigs.add(checkConfig);
-			checkConfig.setName(e.getKey().toString());
+			checkConfig.setName(e.getKey());
 			if (e.getValue().isEnabled()) {
 				checkConfig.setActivated(true);
 				Map<String, String> checkParams = e.getValue().getParameters();
diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java
index bfd739e009101bfb21c380e8055b33750a8dcd25..ebde6ffc0763231b72b4cabeacb70ca66ab7bde4 100644
--- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java
+++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/reporting/pdf/PdfStreamReporter.java
@@ -32,7 +32,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
-import de.hft.stuttgart.citydoctor2.check.CheckConfiguration;
+import de.hft.stuttgart.citydoctor2.check.RequirementConfiguration;
 import de.hft.stuttgart.citydoctor2.check.CheckError;
 import de.hft.stuttgart.citydoctor2.check.CheckId;
 import de.hft.stuttgart.citydoctor2.check.CheckResult;
@@ -133,8 +133,8 @@ public class PdfStreamReporter implements StreamReporter {
 		if (config.getSchematronFilePath() != null && !config.getSchematronFilePath().isEmpty()) {
 			vp.addTextElement("Schematron file: " + config.getSchematronFilePath());
 		}
-		for (Entry<CheckId, CheckConfiguration> e : config.getChecks().entrySet()) {
-			String text = e.getKey().toString();
+		for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) {
+			String text = e.getKey();
 			String color;
 			if (e.getValue().isEnabled()) {
 				text = text + " = enabled";
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckerTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckerTest.java
index 3d2b9d68927984f3c1275a2522c18047e6919699..9191678f777fd4fc3d1d79dd127a924bc185dd5d 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckerTest.java
+++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/CheckerTest.java
@@ -51,8 +51,8 @@ public class CheckerTest {
 	@Test
 	public void testSchematron() throws CityGmlParseException, InvalidGmlFileException {
 		ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig();
-		config.getChecks().get(CheckId.C_SEM_BS_ROOF_NOT_FRAGMENTED).setEnabled(false);
-		config.setSchematronFilePath("src/test/resources/schematronTest.xml");
+		config.getRequirements().get(Requirement.R_SE_BS_ROOF_UNFRAGMENTED.toString()).setEnabled(false);
+		config.setSchematronFilePathInGlobalParameters("src/test/resources/schematronTest.xml");
 		CityDoctorModel model = CityGmlParser.parseCityGmlFile(
 				"src/test/resources/SimpleSolid_SrefBS_SchematronTest.gml", config.getParserConfiguration());
 		Checker checker = new Checker(config, model);
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/ValidationConfigurationTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/ValidationConfigurationTest.java
index 45bfce21b2670c79b719a2ac0c5d46d63ed27394..c3f420e9d1f2e48b54258f3e050a1347556531d9 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/ValidationConfigurationTest.java
+++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/check/ValidationConfigurationTest.java
@@ -25,6 +25,7 @@ import java.io.FileNotFoundException;
 import org.junit.Test;
 
 import de.hft.stuttgart.citydoctor2.datastructure.FeatureType;
+import de.hft.stuttgart.quality.model.jaxb.RequirementId;
 
 public class ValidationConfigurationTest {
 
@@ -33,33 +34,33 @@ public class ValidationConfigurationTest {
 		String file = "src/test/resources/testConfig.yml";
 		ValidationConfiguration config = ValidationConfiguration.loadValidationConfig(file);
 		assertEquals(8, config.getNumberOfRoundingPlaces());
-		assertTrue(config.getChecks().containsKey(CheckId.C_GE_R_TOO_FEW_POINTS));
-		assertTrue(config.getChecks().get(CheckId.C_GE_P_NON_PLANAR).isEnabled());
+		assertTrue(config.getRequirements().containsKey(RequirementId.R_GE_R_TOO_FEW_POINTS.toString()));
+		assertFalse(config.getRequirements().get(RequirementId.R_GE_P_NON_PLANAR.toString()).isEnabled());
 		assertNull(config.getFilter());
 	}
-	
+
 	@Test
 	public void testLoadingConfigWithFilter() throws FileNotFoundException {
 		String file = "src/test/resources/testConfigWithFilter.yml";
 		ValidationConfiguration config = ValidationConfiguration.loadValidationConfig(file);
 		assertEquals(8, config.getNumberOfRoundingPlaces());
-		assertTrue(config.getChecks().containsKey(CheckId.C_GE_R_TOO_FEW_POINTS));
-		assertTrue(config.getChecks().get(CheckId.C_GE_P_NON_PLANAR).isEnabled());
-		
+		assertTrue(config.getRequirements().containsKey(RequirementId.R_GE_R_TOO_FEW_POINTS.toString()));
+		assertFalse(config.getRequirements().get(RequirementId.R_GE_P_NON_PLANAR.toString()).isEnabled());
+
 		FilterConfiguration filterConfig = config.getFilter();
 		assertNotNull(filterConfig);
-		
+
 		ExcludeFilterConfiguration excludeFilter = filterConfig.getExclude();
 		assertNotNull(excludeFilter);
-		
+
 		assertTrue(excludeFilter.getIds().contains("UUID-8972-kghf-asgv"));
 		assertTrue(excludeFilter.getIds().contains("UUID.*"));
 		assertTrue(excludeFilter.getTypes().contains(FeatureType.BUILDING));
 		assertTrue(excludeFilter.getTypes().contains(FeatureType.VEGETATION));
-		
+
 		IncludeFilterConfiguration includeFilter = filterConfig.getInclude();
 		assertNotNull(includeFilter);
-		
+
 		assertTrue(includeFilter.getIds().contains(".*"));
 		assertTrue(includeFilter.getTypes().contains(FeatureType.BUILDING));
 		assertTrue(includeFilter.getTypes().contains(FeatureType.VEGETATION));
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/CheckContainerTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/CheckContainerTest.java
index be6ff0a7c5ff3e541d4883f349b9cee68adbf124..6a0899789f393d1122788f759e884540f3cfb846 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/CheckContainerTest.java
+++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/CheckContainerTest.java
@@ -20,13 +20,16 @@ package de.hft.stuttgart.citydoctor2.checks;
 
 import static org.junit.Assert.assertEquals;
 
+import java.util.Set;
+
 import org.junit.Test;
 
 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.CheckType;
+import de.hft.stuttgart.citydoctor2.check.RequirementType;
 import de.hft.stuttgart.citydoctor2.check.ErrorId;
+import de.hft.stuttgart.citydoctor2.check.Requirement;
 import de.hft.stuttgart.citydoctor2.check.ResultStatus;
 import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding;
 import de.hft.stuttgart.citydoctor2.datastructure.Building;
@@ -43,7 +46,7 @@ public class CheckContainerTest {
 			}
 
 			@Override
-			public CheckType getType() {
+			public RequirementType getType() {
 				return null;
 			}
 
@@ -56,6 +59,11 @@ public class CheckContainerTest {
 			public CheckId getCheckId() {
 				return CheckId.C_GE_P_HOLE_OUTSIDE;
 			}
+
+			@Override
+			public Set<Requirement> appliesToRequirements() {
+				return null;
+			}
 			
 		};
 		CheckContainer cc = new CheckContainer(c);
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/DegeneratedPolygonCheckTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/DegeneratedPolygonCheckTest.java
index d15aed03f645172c65af5b74ba3fbf6a4d8d09f0..a2fcbe402ca24619cba650fa157661d9f9e7db1b 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/DegeneratedPolygonCheckTest.java
+++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/DegeneratedPolygonCheckTest.java
@@ -18,7 +18,7 @@
  */
 package de.hft.stuttgart.citydoctor2.checks.geometry;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -29,9 +29,7 @@ import java.util.Map;
 import org.junit.Test;
 
 import de.hft.stuttgart.citydoctor2.check.CheckError;
-import de.hft.stuttgart.citydoctor2.check.CheckId;
 import de.hft.stuttgart.citydoctor2.check.Checker;
-import de.hft.stuttgart.citydoctor2.check.ErrorId;
 import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration;
 import de.hft.stuttgart.citydoctor2.datastructure.Building;
 import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
@@ -43,10 +41,10 @@ import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType;
 import de.hft.stuttgart.citydoctor2.datastructure.Lod;
 import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
 import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import de.hft.stuttgart.quality.model.jaxb.RequirementId;
 
 public class DegeneratedPolygonCheckTest {
-	
-	
+
 	@Test
 	public void testDegeneratedPolygon() {
 		Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD1);
@@ -65,38 +63,25 @@ public class DegeneratedPolygonCheckTest {
 		lr.getVertices().add(v4);
 		lr.getVertices().add(v1);
 		geom.updateEdgesAndVertices();
-		
+
 		Building b = new Building();
 		b.addGeometry(geom);
-		
+
 		ParserConfiguration config = new ParserConfiguration(8, false);
 		CityDoctorModel model = new CityDoctorModel(config, new File(""));
 		model.addBuilding(b);
-		// model
-//		Edge [from=Vertex [x=427583.301, y=6003502.571, z=9.711], to=Vertex [x=427583.304, y=6003502.574, z=9.713]],
-//		Edge [from=Vertex [x=427583.304, y=6003502.574, z=9.713], to=Vertex [x=427583.304, y=6003502.574, z=4.097]],
-//		Edge [from=Vertex [x=427583.304, y=6003502.574, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=4.097]],
-//		Edge [from=Vertex [x=427583.301, y=6003502.571, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=9.711]]]
 
-		// test
-//		Edge [from=Vertex [x=427583.301, y=6003502.571, z=9.711], to=Vertex [x=427583.304, y=6003502.574, z=9.713]],
-//		Edge [from=Vertex [x=427583.304, y=6003502.574, z=9.713], to=Vertex [x=427583.304, y=6003502.574, z=4.097]],
-//		Edge [from=Vertex [x=427583.304, y=6003502.574, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=4.097]],
-//		Edge [from=Vertex [x=427583.301, y=6003502.571, z=4.097], to=Vertex [x=427583.301, y=6003502.571, z=9.711]]]
-		
-//		Segment3d [pointA=Vertex [x=427583.301, y=6003502.571, z=9.711], pointB=Vertex [x=427583.304, y=6003502.574, z=9.713]]
-//		Vertex [x=427583.301, y=6003502.571, z=9.711]
-		
 		ValidationConfiguration valConfig = ValidationConfiguration.loadStandardValidationConfig();
+		valConfig.setMinVertexDistanceInGlobalParameters(0.004);
 		Map<String, String> parameters = new HashMap<>();
-		parameters.put("degeneratedPolygonTolerance", "0.0001");
-		valConfig.getChecks().get(CheckId.C_GE_P_NON_PLANAR).setParameters(parameters);
+		parameters.put("degeneratedPolygonTolerance", "0.004");
+		valConfig.getRequirements().get(RequirementId.R_GE_P_NON_PLANAR.toString()).getParameters().putAll(parameters);
 		Checker c = new Checker(valConfig, model);
 		c.runChecks();
-		
+
 		List<CheckError> errors = new ArrayList<>();
 		b.collectContainedErrors(errors);
-		CheckError checkError = errors.get(0);
-		assertEquals(ErrorId.GE_P_DEGENERATED_POLYGON, checkError.getErrorId());
+		assertTrue(errors.isEmpty());
 	}
+
 }
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheckTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheckTest.java
index 96ea54215991053c76867b23695fd0d5b08bad86..68ecbbceecbec40232ff694c2b7e9e8f69f01637 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheckTest.java
+++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/FaceOutCheckTest.java
@@ -107,7 +107,7 @@ public class FaceOutCheckTest {
 	public void testGoodGeometry() {
 		Geometry geom = createGoodGeometry();
 		
-		FaceOutCheck foc = new FaceOutCheck();
+		AllPolygonsWrongOrientationCheck foc = new AllPolygonsWrongOrientationCheck();
 		foc.check(geom);
 		
 		Assert.assertEquals(ResultStatus.OK, geom.getCheckResult(foc).getResultStatus());
@@ -117,7 +117,7 @@ public class FaceOutCheckTest {
 	public void testBadGeometry() {
 		Geometry geom = createBadGeometry();
 		
-		FaceOutCheck foc = new FaceOutCheck();
+		AllPolygonsWrongOrientationCheck foc = new AllPolygonsWrongOrientationCheck();
 		foc.check(geom);
 		
 		Assert.assertEquals(ResultStatus.ERROR, geom.getCheckResult(foc).getResultStatus());
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheckTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheckTest.java
index b7a0b9b4ed935553cef91a3c425b2206746f7f6e..a9ab3bbce0db40040ffe2a9fea84c8b0851e8ef4 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheckTest.java
+++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/checks/geometry/NumPointsCheckTest.java
@@ -53,7 +53,7 @@ public class NumPointsCheckTest {
 		lr.addVertex(v2);
 		lr.addVertex(v0);
 		
-		NumPointsCheck check = new NumPointsCheck();
+		TooFewPointsCheck check = new TooFewPointsCheck();
 		ParserConfiguration config = new ParserConfiguration(8, false);
 		check.init(Collections.emptyMap(), config);
 		check.check(lr);
@@ -79,7 +79,7 @@ public class NumPointsCheckTest {
 		lr.addVertex(v3);
 		lr.addVertex(v0);
 		
-		NumPointsCheck check = new NumPointsCheck();
+		TooFewPointsCheck check = new TooFewPointsCheck();
 		ParserConfiguration config = new ParserConfiguration(8, false);
 		check.init(Collections.emptyMap(), config);
 		check.check(lr);
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/NonManifoldEdgeSystemTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/NonManifoldEdgeSystemTest.java
index f5a5885afba3ab1e7395a8b13f981fb76671afa4..a7044537fb7edcb2d9b5fefafd861d983eb1536c 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/NonManifoldEdgeSystemTest.java
+++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/NonManifoldEdgeSystemTest.java
@@ -34,6 +34,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
 import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
 import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException;
 import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
+import de.hft.stuttgart.quality.model.jaxb.RequirementId;
 
 /**
  * 
@@ -52,10 +53,10 @@ public class NonManifoldEdgeSystemTest {
 
 	@Test
 	public void testNonManifoldEdge2() throws CityGmlParseException, IOException, InvalidGmlFileException {
-		Map<CheckId, Map<String, String>> paramMap = new HashMap<>();
+		Map<String, Map<String, String>> paramMap = new HashMap<>();
 		Map<String, String> parameter = new HashMap<>();
 		parameter.put("distanceTolerance", "0.1");
-		paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter);
+		paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter);
 		CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-SO-0004-T0001.gml",
 				paramMap);
 		Geometry g = c.getBuildings().get(0).getGeometries().get(0);
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/PlanarTest.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/PlanarTest.java
index 24199737d5efc5bd79e0b71b1f15ceeff2defa87..0378718bbc58a4d79cebbfe747ecbd1f7e84fd2d 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/PlanarTest.java
+++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/PlanarTest.java
@@ -37,6 +37,7 @@ import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException;
 import de.hft.stuttgart.citydoctor2.parser.CityGmlParser;
 import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
 import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
+import de.hft.stuttgart.quality.model.jaxb.RequirementId;
 
 /**
  * 
@@ -113,10 +114,10 @@ public class PlanarTest {
 	
 	@Test
 	public void testPlanarPolygon4() throws CityGmlParseException, IOException, InvalidGmlFileException {
-		Map<CheckId, Map<String, String>> paramMap = new HashMap<>();
+		Map<String, Map<String, String>> paramMap = new HashMap<>();
 		Map<String, String> parameter = new HashMap<>();
 		parameter.put("distanceTolerance", "0.01");
-		paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter);
+		paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter);
 		CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-PO-0002-T0001.gml", paramMap);
 		Polygon p = TestUtil.getPolygonById("_Simple_BD.1_PG.2", c);
 		CheckResult cr = p.getCheckResult(CheckId.C_GE_P_NON_PLANAR);
@@ -126,11 +127,11 @@ public class PlanarTest {
 	
 	@Test
 	public void testPlanarPolygon5() throws CityGmlParseException, IOException, InvalidGmlFileException {
-		Map<CheckId, Map<String, String>> paramMap = new HashMap<>();
+		Map<String, Map<String, String>> paramMap = new HashMap<>();
 		Map<String, String> parameter = new HashMap<>();
 		parameter.put("type", "distance");
 		parameter.put("distanceTolerance", "0.5");
-		paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter);
+		paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter);
 		CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-PO-0002-T0001.gml", paramMap);
 		Polygon p = TestUtil.getPolygonById("_Simple_BD.1_PG.2", c);
 		CheckResult cr = p.getCheckResult(CheckId.C_GE_P_NON_PLANAR);
@@ -139,10 +140,10 @@ public class PlanarTest {
 	
 	@Test
 	public void testPlanarPolygon6() throws CityGmlParseException, IOException, InvalidGmlFileException {
-		Map<CheckId, Map<String, String>> paramMap = new HashMap<>();
+		Map<String, Map<String, String>> paramMap = new HashMap<>();
 		Map<String, String> parameter = new HashMap<>();
 		parameter.put("type", "both");
-		paramMap.put(CheckId.C_GE_P_NON_PLANAR, parameter);
+		paramMap.put(RequirementId.R_GE_P_NON_PLANAR.toString(), parameter);
 		CityDoctorModel c = TestUtil.loadAndCheckCityModel("src/test/resources/SimpleSolid_SrefBS-GE-gml-PO-0002-T0002.gml", paramMap);
 		Polygon p = TestUtil.getPolygonById("_Simple_BD.1_PG.1", c);
 		CheckResult cr = p.getCheckResult(CheckId.C_GE_P_NON_PLANAR);
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/TestUtil.java b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/TestUtil.java
index 30d0cc629768651743ef155bd24d0cc30eed5a9a..da96f4f1638425e7eac849ba7019508c6b2d06b8 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/TestUtil.java
+++ b/CityDoctorParent/CityDoctorValidation/src/test/java/de/hft/stuttgart/citydoctor2/systemtest/TestUtil.java
@@ -23,7 +23,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import de.hft.stuttgart.citydoctor2.check.CheckId;
 import de.hft.stuttgart.citydoctor2.check.Checker;
 import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration;
 import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
@@ -52,7 +51,7 @@ public class TestUtil {
 	public static CityDoctorModel loadAndCheckCityModel(String path, int  numberOfRoundingPlaces)
 			throws CityGmlParseException, IOException, InvalidGmlFileException {
 		ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig();
-		config.setNumberOfRoundingPlaces(numberOfRoundingPlaces);
+		config.setNumberOfRoundingPlacesInGlobalParameters(numberOfRoundingPlaces);
 		CityDoctorModel m = CityGmlParser.parseCityGmlFile(path, config.getParserConfiguration());
 		Checker c = new Checker(config, m);
 		c.runChecks();
@@ -63,8 +62,8 @@ public class TestUtil {
 	public static CityDoctorModel loadAndCheckCityModel(String path, int  numberOfRoundingPlaces, double minVertexDistance)
 			throws CityGmlParseException, IOException, InvalidGmlFileException {
 		ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig();
-		config.setNumberOfRoundingPlaces(numberOfRoundingPlaces);
-		config.setMinVertexDistance(minVertexDistance);
+		config.setNumberOfRoundingPlacesInGlobalParameters(numberOfRoundingPlaces);
+		config.setMinVertexDistanceInGlobalParameters(minVertexDistance);
 		CityDoctorModel m = CityGmlParser.parseCityGmlFile(path, config.getParserConfiguration());
 		Checker c = new Checker(config, m);
 		c.runChecks();
@@ -72,11 +71,11 @@ public class TestUtil {
 
 	}
 	
-	public static CityDoctorModel loadAndCheckCityModel(String path, Map<CheckId, Map<String, String>> paramMap)
+	public static CityDoctorModel loadAndCheckCityModel(String path, Map<String, Map<String, String>> paramMap)
 			throws CityGmlParseException, IOException, InvalidGmlFileException {
 		ValidationConfiguration valConfig = ValidationConfiguration.loadStandardValidationConfig();
-		for (Entry<CheckId, Map<String, String>> e : paramMap.entrySet()) {
-			valConfig.getChecks().get(e.getKey()).setParameters(e.getValue());
+		for (Entry<String, Map<String, String>> e : paramMap.entrySet()) {
+			valConfig.getRequirements().get(e.getKey()).getParameters().putAll(e.getValue());
 		}
 		CityDoctorModel m = CityGmlParser.parseCityGmlFile(path, valConfig.getParserConfiguration());
 		Checker c = new Checker(valConfig, m);
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfig.yml b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfig.yml
index 0c64010ac895e188c0dce2eb8ddb6ed8db868804..a7611706261c13d6d498703f8ca752bd252e384f 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfig.yml
+++ b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfig.yml
@@ -1,45 +1,53 @@
-numberOfRoundingPlaces: 8
+globalParameters:
+   numberOfRoundingPlaces: 8
+   # in m
+   minVertexDistance: 0.0001
+   schematronFilePath: ''
 useStreaming: false
 xmlValidation: false
-checks:
-   C_GE_R_TOO_FEW_POINTS:
+requirements:
+   R_GE_R_TOO_FEW_POINTS:
       enabled: true
-   C_GE_R_NOT_CLOSED:
+   R_GE_R_NOT_CLOSED:
       enabled: true
-   C_GE_R_DUPLICATE_POINT:
+   R_GE_R_CONSECUTIVE_POINTS_SAME:
       enabled: true
-   C_GE_R_SELF_INTERSECTION:
+   R_GE_R_SELF_INTERSECTION:
       enabled: true
-   C_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
+   R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
       enabled: true
-   C_GE_P_INTERIOR_DISCONNECTED:
+   R_GE_P_INTERIOR_DISCONNECTED:
       enabled: true
-   C_GE_P_INTERSECTING_RINGS:
+   R_GE_P_INTERSECTING_RINGS:
       enabled: true
-   C_GE_P_NON_PLANAR:
+   R_GE_P_NON_PLANAR:
       enabled: false
       parameters:
          # one of ("distance", "angle", "both")
          type: distance
+         # in m
          distanceTolerance: 0.01
-         angleTolerance: 0.1
-   C_GE_P_HOLE_OUTSIDE:
+         # in degree
+         angleTolerance: 1
+         # in m
+         degeneratedPolygonTolerance: 0
+   R_GE_P_HOLE_OUTSIDE:
       enabled: true
-   C_GE_P_ORIENTATION_RINGS_SAME:
+   R_GE_P_ORIENTATION_RINGS_SAME:
       enabled: true
-   C_GE_P_INNER_RINGS_NESTED:
+   R_GE_P_INNER_RINGS_NESTED:
       enabled: true
-   C_GE_S_TOO_FEW_POLYGONS:
+   R_GE_S_TOO_FEW_POLYGONS:
       enabled: true
-   C_GE_S_NOT_CLOSED:
+   R_GE_S_NOT_CLOSED:
       enabled: true
-   C_GE_S_NON_MANIFOLD_EDGE:
+   R_GE_S_NON_MANIFOLD_EDGE:
       enabled: true
-   C_GE_S_POLYGON_WRONG_ORIENTATION:
+   R_GE_S_POLYGON_WRONG_ORIENTATION:
       enabled: true
-   C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
+   R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
       enabled: true
-   C_GE_S_NON_MANIFOLD_VERTEX:
+   R_GE_S_NON_MANIFOLD_VERTEX:
       enabled: true
-   C_GE_S_SELF_INTERSECTION:
+   R_GE_S_SELF_INTERSECTION:
       enabled: true
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithExclude.yml b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithExclude.yml
index c279b3e54aa14b8548350914c2296ed04adca08d..3e052a7c86ff8dccc4f1eaf388efe8314e158848 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithExclude.yml
+++ b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithExclude.yml
@@ -1,4 +1,6 @@
-numberOfRoundingPlaces: 8
+globalParameters:
+   numberOfRoundingPlaces: 8
+   minVertexDistance: 0.0001
 filter:
    exclude:
        # available types: BUILDING, VEGETATION, TRANSPORTATION, BRIDGE, LAND, WATER
@@ -6,45 +8,47 @@ filter:
          - BUILDING
       # exlude matching ids (Regex)
       ids:
-checks:
-   C_GE_R_TOO_FEW_POINTS:
+requirements:
+   R_GE_R_TOO_FEW_POINTS:
       enabled: true
-   C_GE_R_NOT_CLOSED:
+   R_GE_R_NOT_CLOSED:
       enabled: true
-   C_GE_R_DUPLICATE_POINT:
+   R_GE_R_CONSECUTIVE_POINTS_SAME:
       enabled: true
-   C_GE_R_SELF_INTERSECTION:
+   R_GE_R_SELF_INTERSECTION:
       enabled: true
-   C_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
+   R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
       enabled: true
-   C_GE_P_INTERIOR_DISCONNECTED:
+   R_GE_P_INTERIOR_DISCONNECTED:
       enabled: true
-   C_GE_P_INTERSECTING_RINGS:
+   R_GE_P_INTERSECTING_RINGS:
       enabled: true
-   C_GE_P_NON_PLANAR:
+   R_GE_P_NON_PLANAR:
       enabled: false
       parameters:
          # one of ("distance", "angle", "both")
          type: distance
+         # in m
          distanceTolerance: 0.01
-         angleTolerance: 0.1
-   C_GE_P_HOLE_OUTSIDE:
+         # in degree
+         angleTolerance: 1
+   R_GE_P_HOLE_OUTSIDE:
       enabled: true
-   C_GE_P_ORIENTATION_RINGS_SAME:
+   R_GE_P_ORIENTATION_RINGS_SAME:
       enabled: true
-   C_GE_P_INNER_RINGS_NESTED:
+   R_GE_P_INNER_RINGS_NESTED:
       enabled: true
-   C_GE_S_TOO_FEW_POLYGONS:
+   R_GE_S_TOO_FEW_POLYGONS:
       enabled: true
-   C_GE_S_NOT_CLOSED:
+   R_GE_S_NOT_CLOSED:
       enabled: true
-   C_GE_S_NON_MANIFOLD_EDGE:
+   R_GE_S_NON_MANIFOLD_EDGE:
       enabled: true
-   C_GE_S_POLYGON_WRONG_ORIENTATION:
+   R_GE_S_POLYGON_WRONG_ORIENTATION:
       enabled: true
-   C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
+   R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
       enabled: true
-   C_GE_S_NON_MANIFOLD_VERTEX:
+   R_GE_S_NON_MANIFOLD_VERTEX:
       enabled: true
-   C_GE_S_SELF_INTERSECTION:
+   R_GE_S_SELF_INTERSECTION:
       enabled: true
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithFilter.yml b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithFilter.yml
index afd1032a7f70abac97364a6b6c073954f40f12e3..0b082f40f271838ed3ef0f2180dad50ce41d22b3 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithFilter.yml
+++ b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithFilter.yml
@@ -1,4 +1,7 @@
-numberOfRoundingPlaces: 8
+globalParameters: 
+   numberOfRoundingPlaces: 8
+   # in m
+   minVertexDistance: 0.0001
 filter:
    include:
       # available types: BUILDING, VEGETATION, TRANSPORTATION, BRIDGE, LAND, WATER
@@ -27,45 +30,47 @@ filter:
          - UUID-8972-kghf-asgv
          - UUID-567-asdf-GEGH
          - UUID.*
-checks:
-   C_GE_R_TOO_FEW_POINTS:
+requirements:
+   R_GE_R_TOO_FEW_POINTS:
       enabled: true
-   C_GE_R_NOT_CLOSED:
+   R_GE_R_NOT_CLOSED:
       enabled: true
-   C_GE_R_DUPLICATE_POINT:
+   R_GE_R_CONSECUTIVE_POINTS_SAME:
       enabled: true
-   C_GE_R_SELF_INTERSECTION:
+   R_GE_R_SELF_INTERSECTION:
       enabled: true
-   C_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
+   R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
       enabled: true
-   C_GE_P_INTERIOR_DISCONNECTED:
+   R_GE_P_INTERIOR_DISCONNECTED:
       enabled: true
-   C_GE_P_INTERSECTING_RINGS:
+   R_GE_P_INTERSECTING_RINGS:
       enabled: true
-   C_GE_P_NON_PLANAR:
+   R_GE_P_NON_PLANAR:
       enabled: false
       parameters:
          # one of ("distance", "angle", "both")
          type: distance
+         # in m
          distanceTolerance: 0.01
-         angleTolerance: 0.1
-   C_GE_P_HOLE_OUTSIDE:
+         # in degree
+         angleTolerance: 1
+   R_GE_P_HOLE_OUTSIDE:
       enabled: true
-   C_GE_P_ORIENTATION_RINGS_SAME:
+   R_GE_P_ORIENTATION_RINGS_SAME:
       enabled: true
-   C_GE_P_INNER_RINGS_NESTED:
+   R_GE_P_INNER_RINGS_NESTED:
       enabled: true
-   C_GE_S_TOO_FEW_POLYGONS:
+   R_GE_S_TOO_FEW_POLYGONS:
       enabled: true
-   C_GE_S_NOT_CLOSED:
+   R_GE_S_NOT_CLOSED:
       enabled: true
-   C_GE_S_NON_MANIFOLD_EDGE:
+   R_GE_S_NON_MANIFOLD_EDGE:
       enabled: true
-   C_GE_S_POLYGON_WRONG_ORIENTATION:
+   R_GE_S_POLYGON_WRONG_ORIENTATION:
       enabled: true
-   C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
+   R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
       enabled: true
-   C_GE_S_NON_MANIFOLD_VERTEX:
+   R_GE_S_NON_MANIFOLD_VERTEX:
       enabled: true
-   C_GE_S_SELF_INTERSECTION:
+   R_GE_S_SELF_INTERSECTION:
       enabled: true
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithInclude.yml b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithInclude.yml
index 2f8c5af6832e584e3df5d20e3fa14763e9876891..6f49da49aee6021f81bf01d635abad0eee6e5fbb 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithInclude.yml
+++ b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithInclude.yml
@@ -1,48 +1,49 @@
-numberOfRoundingPlaces: 8
+globalParameters:
+   numberOfRoundingPlaces: 8
 filter:
    include:
       # available types: BUILDING, VEGETATION, TRANSPORTATION, BRIDGE, LAND, WATER
       types:
          - TRANSPORTATION
-checks:
-   C_GE_R_TOO_FEW_POINTS:
+requirements:
+   R_GE_R_TOO_FEW_POINTS:
       enabled: true
-   C_GE_R_NOT_CLOSED:
+   R_GE_R_NOT_CLOSED:
       enabled: true
-   C_GE_R_DUPLICATE_POINT:
+   R_GE_R_CONSECUTIVE_POINTS_SAME:
       enabled: true
-   C_GE_R_SELF_INTERSECTION:
+   R_GE_R_SELF_INTERSECTION:
       enabled: true
-   C_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
+   R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
       enabled: true
-   C_GE_P_INTERIOR_DISCONNECTED:
+   R_GE_P_INTERIOR_DISCONNECTED:
       enabled: true
-   C_GE_P_INTERSECTING_RINGS:
+   R_GE_P_INTERSECTING_RINGS:
       enabled: true
-   C_GE_P_NON_PLANAR:
+   R_GE_P_NON_PLANAR:
       enabled: false
       parameters:
          # one of ("distance", "angle", "both")
          type: distance
          distanceTolerance: 0.01
          angleTolerance: 0.1
-   C_GE_P_HOLE_OUTSIDE:
+   R_GE_P_HOLE_OUTSIDE:
       enabled: true
-   C_GE_P_ORIENTATION_RINGS_SAME:
+   R_GE_P_ORIENTATION_RINGS_SAME:
       enabled: true
-   C_GE_P_INNER_RINGS_NESTED:
+   R_GE_P_INNER_RINGS_NESTED:
       enabled: true
-   C_GE_S_TOO_FEW_POLYGONS:
+   R_GE_S_TOO_FEW_POLYGONS:
       enabled: true
-   C_GE_S_NOT_CLOSED:
+   R_GE_S_NOT_CLOSED:
       enabled: true
-   C_GE_S_NON_MANIFOLD_EDGE:
+   R_GE_S_NON_MANIFOLD_EDGE:
       enabled: true
-   C_GE_S_POLYGON_WRONG_ORIENTATION:
+   R_GE_S_POLYGON_WRONG_ORIENTATION:
       enabled: true
-   C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
+   R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
       enabled: true
-   C_GE_S_NON_MANIFOLD_VERTEX:
+   R_GE_S_NON_MANIFOLD_VERTEX:
       enabled: true
-   C_GE_S_SELF_INTERSECTION:
+   R_GE_S_SELF_INTERSECTION:
       enabled: true
\ No newline at end of file
diff --git a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithStreaming.yml b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithStreaming.yml
index ea1009418f18e1c759bb077b9b9309086aaf3733..311740e36283048724408342783c113ad816e35b 100644
--- a/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithStreaming.yml
+++ b/CityDoctorParent/CityDoctorValidation/src/test/resources/testConfigWithStreaming.yml
@@ -1,45 +1,46 @@
-numberOfRoundingPlaces: 8
+globalParameters:
+   numberOfRoundingPlaces: 8
+   schematronFilePath: src/test/resources/schematronTest.xml
 useStreaming: true
-schematronFilePath: src/test/resources/schematronTest.xml
-checks:
-   C_GE_R_TOO_FEW_POINTS:
+requirements:
+   R_GE_R_TOO_FEW_POINTS:
       enabled: true
-   C_GE_R_NOT_CLOSED:
+   R_GE_R_NOT_CLOSED:
       enabled: true
-   C_GE_R_DUPLICATE_POINT:
+   R_GE_R_CONSECUTIVE_POINTS_SAME:
       enabled: true
-   C_GE_R_SELF_INTERSECTION:
+   R_GE_R_SELF_INTERSECTION:
       enabled: true
-   C_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
+   R_GE_S_MULTIPLE_CONNECTED_COMPONENTS:
       enabled: true
-   C_GE_P_INTERIOR_DISCONNECTED:
+   R_GE_P_INTERIOR_DISCONNECTED:
       enabled: true
-   C_GE_P_INTERSECTING_RINGS:
+   R_GE_P_INTERSECTING_RINGS:
       enabled: true
-   C_GE_P_NON_PLANAR:
+   R_GE_P_NON_PLANAR:
       enabled: false
       parameters:
          # one of ("distance", "angle", "both")
          type: distance
          distanceTolerance: 0.01
          angleTolerance: 0.1
-   C_GE_P_HOLE_OUTSIDE:
+   R_GE_P_HOLE_OUTSIDE:
       enabled: true
-   C_GE_P_ORIENTATION_RINGS_SAME:
+   R_GE_P_ORIENTATION_RINGS_SAME:
       enabled: true
-   C_GE_P_INNER_RINGS_NESTED:
+   R_GE_P_INNER_RINGS_NESTED:
       enabled: true
-   C_GE_S_TOO_FEW_POLYGONS:
+   R_GE_S_TOO_FEW_POLYGONS:
       enabled: true
-   C_GE_S_NOT_CLOSED:
+   R_GE_S_NOT_CLOSED:
       enabled: true
-   C_GE_S_NON_MANIFOLD_EDGE:
+   R_GE_S_NON_MANIFOLD_EDGE:
       enabled: true
-   C_GE_S_POLYGON_WRONG_ORIENTATION:
+   R_GE_S_POLYGON_WRONG_ORIENTATION:
       enabled: true
-   C_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
+   R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION:
       enabled: true
-   C_GE_S_NON_MANIFOLD_VERTEX:
+   R_GE_S_NON_MANIFOLD_VERTEX:
       enabled: true
-   C_GE_S_SELF_INTERSECTION:
+   R_GE_S_SELF_INTERSECTION:
       enabled: true
\ No newline at end of file