diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java
index 9186ea416621e98d79b0701e80d048f98aceda33..c3b9d486f964f01269234c056927e7b3b982a501 100644
--- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java
+++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java
@@ -47,6 +47,7 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.citygml4j.core.ade.ADEException;
 import org.citygml4j.core.ade.ADERegistry;
+import org.citygml4j.core.model.CityGMLVersion;
 import org.citygml4j.core.model.ade.ADEProperty;
 import org.citygml4j.core.model.core.AbstractCityObject;
 import org.citygml4j.core.model.core.AbstractCityObjectProperty;
@@ -55,7 +56,6 @@ import org.citygml4j.core.model.core.CityModel;
 import org.citygml4j.core.util.CityGMLConstants;
 import org.citygml4j.xml.CityGMLContext;
 import org.citygml4j.xml.CityGMLContextException;
-import org.citygml4j.xml.module.citygml.CityGMLModule;
 import org.citygml4j.xml.module.citygml.CityGMLModules;
 import org.citygml4j.xml.reader.ChunkOptions;
 import org.citygml4j.xml.reader.CityGMLInputFactory;
@@ -121,6 +121,7 @@ public class CityGmlParser {
 	private static List<QName> chunkProperties = new ArrayList<>();
 
 	static {
+		System.setProperty("javax.xml.transform.TransformerFactory", "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
 		FACTORY = SAXParserFactory.newInstance();
 		try {
 			FACTORY.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
@@ -311,8 +312,8 @@ public class CityGmlParser {
 			return null;
 		}
 		CityGMLContext gmlContext = CityGmlParser.getContext();
-		CityGMLModule module = CityGMLModules.getCityGMLModule(reader.getName().getNamespaceURI());
-		CityGMLOutputFactory factory = gmlContext.createCityGMLOutputFactory(module.getCityGMLVersion());
+		CityGMLVersion version = CityGMLModules.getCityGMLVersion(reader.getName().getNamespaceURI());
+		CityGMLOutputFactory factory = gmlContext.createCityGMLOutputFactory(version);
 		CityGMLChunkWriter writer = factory.createCityGMLChunkWriter(new File(outputFile),
 				StandardCharsets.UTF_8.name());
 		writer.withPrefix("qual", QualityADEModule.NAMESPACE_URI);
@@ -336,8 +337,8 @@ public class CityGmlParser {
 				if (chunk instanceof CityModel cModel) {
 					cModel.setCityObjectMembers(null);
 					mapper.setCityModel(cModel);
-					CityGMLModule module = CityGMLModules.getCityGMLModule(reader.getName().getNamespaceURI());
-					mapper.setCityGMLVersion(module.getCityGMLVersion());
+					CityGMLVersion version = CityGMLModules.getCityGMLVersion(reader.getName().getNamespaceURI());
+					mapper.setCityGMLVersion(version);
 				} else if (chunk instanceof AbstractCityObject aco) {
 					acos.add(aco);
 					aco.accept(mapper);
diff --git a/CityDoctorParent/CityDoctorValidation/pom.xml b/CityDoctorParent/CityDoctorValidation/pom.xml
index 1c9f95279aaa37d23996dbeaae93497cc33b1a8a..0782f6d7ade3092fbf89b4a96a61c7c5ac8399ff 100644
--- a/CityDoctorParent/CityDoctorValidation/pom.xml
+++ b/CityDoctorParent/CityDoctorValidation/pom.xml
@@ -21,10 +21,6 @@
 			<groupId>de.hft.stuttgart</groupId>
 			<artifactId>CityDoctorCheckResult</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>net.sf.saxon</groupId>
-			<artifactId>Saxon-HE</artifactId>
-		</dependency>
 		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
@@ -38,6 +34,10 @@
 					<groupId>xml-apis</groupId>
 					<artifactId>xml-apis</artifactId>
 				</exclusion>
+				<exclusion>
+					<groupId>xalan</groupId>
+					<artifactId>xalan</artifactId>
+				</exclusion>
 			</exclusions>
 		</dependency>
 		<dependency>
@@ -60,6 +60,17 @@
 			<groupId>de.hft.stuttgart</groupId>
 			<artifactId>citygml4j-quality-ade</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>name.dmaus.schxslt</groupId>
+			<artifactId>schxslt</artifactId>
+			<version>1.9.5</version>
+		</dependency>
+				 		<dependency>
+			<groupId>net.sf.saxon</groupId>
+			<artifactId>Saxon-HE</artifactId>
+		</dependency>
+		<!--
+		 -->
 	</dependencies>
 
 	<build>
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 81625c4a99cef6dc26ddbd9302efbd598f26b829..99c30d82e0acc13d3e1eeb75e6bd832a99dcd382 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
@@ -38,17 +38,19 @@ import java.util.Set;
 import java.util.stream.Stream;
 
 import javax.xml.XMLConstants;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
 import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.URIResolver;
+import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXResult;
 import javax.xml.transform.stream.StreamSource;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.w3c.dom.Document;
 
 import de.hft.stuttgart.citydoctor2.check.error.AttributeInvalidError;
 import de.hft.stuttgart.citydoctor2.check.error.AttributeMissingError;
@@ -85,15 +87,6 @@ import de.hft.stuttgart.quality.model.properties.RequirementProperty;
 import de.hft.stuttgart.quality.model.types.Checking;
 import de.hft.stuttgart.quality.model.types.Parameter;
 import de.hft.stuttgart.quality.model.types.ValidationPlan;
-import net.sf.saxon.lib.ResourceResolverWrappingURIResolver;
-import net.sf.saxon.s9api.DOMDestination;
-import net.sf.saxon.s9api.Destination;
-import net.sf.saxon.s9api.Processor;
-import net.sf.saxon.s9api.SAXDestination;
-import net.sf.saxon.s9api.SaxonApiException;
-import net.sf.saxon.s9api.XsltCompiler;
-import net.sf.saxon.s9api.XsltExecutable;
-import net.sf.saxon.s9api.XsltTransformer;
 
 /**
  * The main container class for checking. It contains the logic for validation,
@@ -446,54 +439,47 @@ public class Checker {
 			if (logger.isInfoEnabled()) {
 				logger.info(Localization.getText("Checker.schematronValidation"));
 			}
-			Processor processor = new Processor(false);
-			XsltCompiler xsltCompiler = processor.newXsltCompiler();
-			xsltCompiler.setResourceResolver(new ResourceResolverWrappingURIResolver(new URIResolver() {
 
-				@Override
-				public Source resolve(String href, String base) throws TransformerException {
-					return new StreamSource(Checker.class.getResourceAsStream(href));
-				}
-
-			}));
 			try {
-				XsltExecutable includeExecutable = xsltCompiler
-						.compile(new StreamSource(Checker.class.getResourceAsStream("iso_dsdl_include.xsl")));
-				XsltTransformer includeTransformer = includeExecutable.load();
-				includeTransformer.setSource(new StreamSource(new File(config.getSchematronFilePath())));
-
-				XsltExecutable expandExecutable = xsltCompiler
-						.compile(new StreamSource(Checker.class.getResourceAsStream("iso_abstract_expand.xsl")));
-				XsltTransformer expandTransformer = expandExecutable.load();
-				includeTransformer.setDestination(expandTransformer);
-
-				XsltExecutable xslt2Executable = xsltCompiler
-						.compile(new StreamSource(Checker.class.getResourceAsStream("iso_svrl_for_xslt2.xsl")));
-
-				XsltTransformer xslt2Transformer = xslt2Executable.load();
-				expandTransformer.setDestination(xslt2Transformer);
-
-				DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-				factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
-				factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
-				factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
-				Document doc = factory.newDocumentBuilder().newDocument();
-				DOMDestination domDestination = new DOMDestination(doc);
-				xslt2Transformer.setDestination(domDestination);
-				includeTransformer.transform();
-
-				XsltExecutable schematronExecutable = xsltCompiler.compile(new DOMSource(doc));
-				XsltTransformer schematronTransformer = schematronExecutable.load();
-				schematronTransformer.setSource(new StreamSource(in));
+				TransformerFactory transformerFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", Checker.class.getClassLoader());
+				transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
+				transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+
+				transformerFactory.setURIResolver(new URIResolver() {
+					
+					@Override
+					public Source resolve(String href, String base) throws TransformerException {
+						return new StreamSource(Checker.class.getResourceAsStream(href));
+					}
+				});
+				
+				Source dsdlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_dsdl_include.xsl"));
+				Transformer dsdlXslTransformer = transformerFactory.newTransformer(dsdlXslSource);
+				
+				DOMResult dsdlXslResult = new DOMResult();
+				dsdlXslTransformer.transform(new StreamSource(new File(config.getSchematronFilePath())), dsdlXslResult);
+			
+				Source abstractExpandXsl = new StreamSource(Checker.class.getResourceAsStream("iso_abstract_expand.xsl"));
+				Transformer abstractExpandTransformer = transformerFactory.newTransformer(abstractExpandXsl);
+				
+				DOMResult abstractExpandResult = new DOMResult();
+				abstractExpandTransformer.transform(new DOMSource(dsdlXslResult.getNode()), abstractExpandResult);
+				
+				Source svrlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_svrl_for_xslt2.xsl"));
+				Transformer svrlTransformer = transformerFactory.newTransformer(svrlXslSource);
+				
+				DOMResult schematronXsltResult = new DOMResult();
+				svrlTransformer.transform(new DOMSource(abstractExpandResult.getNode()), schematronXsltResult);
+
+				Transformer schematronTransformer = transformerFactory.newTransformer(new DOMSource(schematronXsltResult.getNode()));
+				Source cityGmlSource = new StreamSource(in);
+				
 				SvrlContentHandler handler = new SvrlContentHandler();
-				Destination dest = new SAXDestination(handler);
-				schematronTransformer.setDestination(dest);
-				schematronTransformer.transform();
-				if (logger.isInfoEnabled()) {
-					logger.info(Localization.getText("Checker.finishedSchematron"));
-				}
+				Result finalResult = new SAXResult(handler);
+				
+				schematronTransformer.transform(cityGmlSource, finalResult);
 				return handler;
-			} catch (SaxonApiException | ParserConfigurationException e) {
+			} catch (TransformerException e) {
 				logger.catching(e);
 			}
 		}
diff --git a/CityDoctorParent/pom.xml b/CityDoctorParent/pom.xml
index 2c03ffd23a2b862cc71dc4dc8972fb84cd6637b1..33107d363599909807410e256b32f843ffcd7baf 100644
--- a/CityDoctorParent/pom.xml
+++ b/CityDoctorParent/pom.xml
@@ -98,8 +98,8 @@
 			<dependency>
 				<groupId>net.sf.saxon</groupId>
 				<artifactId>Saxon-HE</artifactId>
-				<version>11.3</version>
-			</dependency>
+				<version>12.2</version>
+			</dependency> 
 			<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
 			<dependency>
 				<groupId>org.hibernate</groupId>
@@ -109,12 +109,12 @@
 			<dependency>
 				<groupId>org.citygml4j</groupId>
 				<artifactId>citygml4j-core</artifactId>
-				<version>3.0.0-rc.4</version>
+				<version>3.0.0</version>
 			</dependency>
 			<dependency>
 				<groupId>org.citygml4j</groupId>
 				<artifactId>citygml4j-xml</artifactId>
-				<version>3.0.0-rc.4</version>
+				<version>3.0.0</version>
 			</dependency>
 			<dependency>
 				<groupId>de.hft.stuttgart</groupId>