diff --git a/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java b/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java
index 9f037c014a67db763acd76d9ddc67e583558b8dd..819906330a715b5aa9e62afebcf793ebd3b7138a 100644
--- a/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java
+++ b/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java
@@ -37,6 +37,7 @@ import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -62,6 +63,8 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
     private static final Set<ValidationSchema> namespaceSchemaMap = new HashSet<>();
     private ValidationCatalogResolver validationCatalogResolver; /* for DTDs */
     private ValidationResourceResolver validationResourceResolver; /* for schema/relaxNG/... */
+
+    private SLUBXmlErrorHandler validationErrorHandler;
     public Set<ValidationSchema> getNamespaceSchemaMap() {
         return namespaceSchemaMap;
     }
@@ -91,7 +94,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
                 }
             }
         } catch (ParserConfigurationException | SAXException | IOException | URISyntaxException e) {
-            System.out.println(" ERROR in loadnamespaceSchemaMap " + e.getStackTrace() );
+            System.out.println(" ERROR in loadnamespaceSchemaMap " + Arrays.toString(e.getStackTrace()));
             log.error("parsing expection parsing namespace schema map file " + namespaceSchemaMapFile + " ," + e.getMessage());
         }
     }
@@ -114,7 +117,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
             uri = new URI(sUri);
         } else {
             uri = remapUri(namespaceSchemaMapFile, sUri);
-            if (debug) System.out.println( "================ URI: " + uri);
+            if (debug) System.out.println( "SCHEMACATALOG, remap to URI: " + uri);
         }
         ValidationSchema v = new ValidationSchema(namespace, schematype, uri);
             namespaceSchemaMap.add(v);
@@ -124,9 +127,6 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
     private URI remapUri(String namespaceSchemaMapFile, String sUri) throws URISyntaxException {
         URI partUri = new URI(sUri);
         String baseStr = "file://" + new File(namespaceSchemaMapFile).getAbsoluteFile().getParent() + "/";
-        if (debug) {
-            System.out.println("BASE    =" + baseStr);
-        }
         URI baseUri = new URI( baseStr);
         return baseUri.resolve(partUri);
     }
@@ -137,8 +137,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
         assert ("namespace".equals(attr_strings.get(1)));
         assert ("schemauri".equals(attr_strings.get(2)));
         NamedNodeMap attributes = node.getAttributes();
-        List<String> attr_list = attr_strings.stream().map(s -> attributes.getNamedItem(s).getTextContent()).toList();
-        return attr_list;
+        return attr_strings.stream().map(s -> attributes.getNamedItem(s).getTextContent()).toList();
     }
 
     private static boolean checkAttributesOfNamespaceSchemaMapFile(String attr_type) {
@@ -149,6 +148,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
         dbf.setNamespaceAware(true);
         dbf.setValidating(false);
         dbf.setExpandEntityReferences(false);
+        validationErrorHandler = new SLUBXmlErrorHandler();
     }
 
     /** init params to configure the plugin via xml forms
@@ -165,7 +165,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
         };
         validationCatalogResolver = new ValidationCatalogResolver(catalogs, errors, debug);
         loadNamespaceSchemaMap( initp.get("schemacatalog").trim() );
-        validationResourceResolver = new ValidationResourceResolver(namespaceSchemaMap, errors, debug);
+        validationResourceResolver = new ValidationResourceResolver(namespaceSchemaMap, debug);
     }
 
     private XmlInfoRecord getXMLinfo(Document doc) {
@@ -269,6 +269,7 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
                 //System.out.println("## is wellformed");
                 wellformed = true;
                 errors.clear();
+                validationErrorHandler = new SLUBXmlErrorHandler(); // reset errorhandler
                 Optional<ValidationSchema> optSchema = assignSchema(doc);
                 //System.out.println("## schema assigned...");
                 if (optSchema.isEmpty()) {
@@ -308,14 +309,16 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
         for (int i=0; i<childNodes.getLength(); i++) {
             var child = childNodes.item(i);
             var child_ns =  child.getNamespaceURI();
-            if (child_ns != null && child_ns != root_ns) {
-                System.out.println( "root ns = " + root_ns + " child ns = " + child_ns);
+            if (child_ns != null && !child_ns.equals(root_ns)) {
+                if (debug) {
+                    System.out.println("RECURSIVE SCHEMA VALIDATOR: root ns = " + root_ns + " child ns = " + child_ns);
+                }
                 var res = validationResourceResolver.find_by_ns( child_ns);
                 if (res.isEmpty()) {
                     this.valid=false;
-                    throw new SAXException("No entry for child namespace found: " + child_ns);
+                    throw new SAXException("RECURSIVE SCHEMA VALIDATOR: No entry for child namespace found: " + child_ns);
                 } else {
-                    assert(! res.get().schemaType.equals("dtd"));
+                    assert(res.get().schemaType == ValidationSchemaType.schema);
                     var schema = res.get();
                     validateFormatAgainstSchemaRecursively(childNodes.item(i), schema);
                 }
@@ -330,18 +333,12 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
         var schemaType = validationSchema.schemaType;
         if (schemaType == ValidationSchemaType.schema) {
             SLUBValidateSchema validator = new SLUBValidateSchema( validationResourceResolver );
-            // Slect validation roots from DOM
-
+            // Select validation roots from DOM
             check_ns_of_childs(root);
-
             valid = validator.validateAgainst(root, validationSchema.schemaURI);
-            /*
-            valid = validator.validateAgainst(doc, validationSchema.schemaURI);
-             */
-            errors.addAll( validator.get_errors() );
         }
         else {
-            reportError("unsupported schema uri="+ validationSchema.schemaURI + " of type: " + validationSchema.schemaType);
+            reportError("RECURSIVE SCHEMA VALIDATOR: unsupported schema uri="+ validationSchema.schemaURI + " of type: " + validationSchema.schemaType);
             valid = false;
         }
     }
@@ -352,18 +349,16 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
         var schemaType = validationSchema.schemaType;
         Document doc = getDocument(filePath);
         if (schemaType == ValidationSchemaType.dtd) {
-            SLUBValidateDTD validator = new SLUBValidateDTD( validationCatalogResolver );
+            SLUBValidateDTD validator = new SLUBValidateDTD( validationCatalogResolver, validationErrorHandler );
             valid = validator.validateAgainst(filePath);
-            errors.addAll( validator.get_errors() );
         }
         else if (schemaType == ValidationSchemaType.relaxng) {
             SLUBValidateRelaxNG validator = new SLUBValidateRelaxNG( );
             valid = validator.validateAgainst(doc, validationSchema.schemaURI);
-            errors.addAll( validator.get_errors() );
+
         } else if (schemaType == ValidationSchemaType.schematron) {
             SLUBValidateSchematron validator = new SLUBValidateSchematron(  );
             valid = validator.validateAgainst(doc, validationSchema.schemaURI);
-            errors.addAll( validator.get_errors() );
             reportError("unsupported schematron schema uri="+ validationSchema.schemaURI + " of type: " + validationSchema.schemaType);
             valid = false;
             /*  */
@@ -413,12 +408,13 @@ public class SLUBXmlFormatValidationPlugin implements FormatValidationPlugin {
         dbf.setSchema(null);
         //dbf.setXIncludeAware(true);
         dbf.setNamespaceAware(true);
-
         DocumentBuilder db = dbf.newDocumentBuilder();
+
+        db.setErrorHandler( validationErrorHandler );
         //db.setEntityResolver(validationCatalogResolver);
-        //db.setErrorHandler(validationErrorHandler);
+
         if (debug) System.out.println(
-                "# ns aware=" + db.isNamespaceAware()
+                "DOCUMENT LOADER: ns aware=" + db.isNamespaceAware()
                 + " include aware=" + db.isXIncludeAware()
                 + " is validating=" + db.isValidating()
         );
diff --git a/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java b/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java
index 49d5f97f3b71de1f7eca205f65a22a08bb39c98d..3ed47bdb42874ce9bea97f136cf2d422942dc904 100644
--- a/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java
+++ b/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java
@@ -26,12 +26,12 @@ public class ValidationCatalogResolver implements CatalogResolver {
     @Override
     public InputSource resolveEntity(String publicId, String systemId)  {
         if (debug) {
-            System.out.println("======");
-            System.out.println("resolveEntity publicId=" + publicId + " systemId=" + systemId);
-            System.out.println("catalogs:" + Arrays.stream(catalogs).toList());
+            System.out.println("CATALOG RESOLVER: ======");
+            System.out.println("CATALOG RESOLVER: resolveEntity publicId=" + publicId + " systemId=" + systemId);
+            System.out.println("CATALOG RESOLVER: catalogs:" + Arrays.stream(catalogs).toList());
         }
         if (catalogs.length == 0) {
-            System.out.println("No catalog given!");
+            System.out.println("CATALOG RESOLVER: No catalog given!");
             errors.add("No catalog given!");
             return new InputSource(Reader.nullReader() ); // disabled further catalog checking to enable whitelist behaviour, see https://docs.oracle.com/en/java/javase/17/docs/api/java.xml/javax/xml/catalog/CatalogResolver.html
         }
@@ -42,13 +42,13 @@ public class ValidationCatalogResolver implements CatalogResolver {
             cr.setCatalogList(catalogs);
             cr.setUseLiteralSystemId(true); // TODO: Prüfen, ob wenn auf false, sytemid analog zu dem in Datei aussieht (file:/// statt file:/)
             if (debug) {
-                System.out.println("try to resolve for publicId=" + publicId + ", systemId=" + systemId + ", ");
+                System.out.println("CATALOG RESOLVER: try to resolve for publicId=" + publicId + ", systemId=" + systemId + ", ");
             }
             result = cr.resolveEntity(publicId, systemId);
 
         } catch (IOException | CatalogException | SAXException e) {
             if (debug) {
-                System.out.println("No mapping found for publicId=" + publicId + ", systemId=" + systemId + ", " + e.getMessage());
+                System.out.println("CATALOG RESOLVER: No mapping found for publicId=" + publicId + ", systemId=" + systemId + ", " + e.getMessage());
             }
             errors.add("No mapping found for publicId=" + publicId + ", systemId=" + systemId + ", " + e.getMessage());
             return new InputSource(Reader.nullReader() ); // disabled further catalog checking to enable whitelist behaviour, see https://docs.oracle.com/en/java/javase/17/docs/api/java.xml/javax/xml/catalog/CatalogResolver.html
@@ -61,7 +61,7 @@ public class ValidationCatalogResolver implements CatalogResolver {
             return new InputSource(Reader.nullReader() ); // disabled further catalog checking to enable whitelist behaviour, see https://docs.oracle.com/en/java/javase/17/docs/api/java.xml/javax/xml/catalog/CatalogResolver.html
         } else {
             if (debug) {
-                System.out.println(" ---> result: systemid=" + result.getSystemId() + " publicid=" + result.getPublicId() );
+                System.out.println("CATALOG RESOLVER:  ---> result: systemid=" + result.getSystemId() + " publicid=" + result.getPublicId() );
             }
         }
         return result;
@@ -70,8 +70,8 @@ public class ValidationCatalogResolver implements CatalogResolver {
     @Override
     public Source resolve(String href, String base) {
         if (debug) {
-            System.out.println("======");
-            System.out.println("resolve href=" + href + " base=" + base);
+            System.out.println("CATALOG RESOLVER: ======");
+            System.out.println("CATALOG RESOLVER: resolve href=" + href + " base=" + base);
         }
         return null;
     }
@@ -79,8 +79,8 @@ public class ValidationCatalogResolver implements CatalogResolver {
     @Override
     public InputStream resolveEntity(String publicId, String systemId, String baseUri, String nameSpace) {
         if (debug) {
-            System.out.println("======");
-            System.out.println("resolveEntity2 publicId=" + publicId + " systemId=" + systemId);
+            System.out.println("CATALOG RESOLVER: ======");
+            System.out.println("CATALOG RESOLVER: resolveEntity2 publicId=" + publicId + " systemId=" + systemId);
         }
         return null;
     }
@@ -88,8 +88,8 @@ public class ValidationCatalogResolver implements CatalogResolver {
     @Override
     public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseUri) {
         if (debug) {
-            System.out.println("======");
-            System.out.println("resolveResource publicId=" + publicId + " systemId=" + systemId);
+            System.out.println("CATALOG RESOLVER: ======");
+            System.out.println("CATALOG RESOLVER: resolveResource publicId=" + publicId + " systemId=" + systemId);
         }
         return null;
     }
diff --git a/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java b/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java
index 20ba65fe6f09853353003db995ce70b4c549c17c..ca111f9f5507c9098032ed6568e8c3b4bb418899 100644
--- a/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java
+++ b/java/org/slub/rosetta/dps/repository/plugin/ValidationResourceResolver.java
@@ -4,18 +4,15 @@ import org.apache.xerces.dom.DOMInputImpl;
 import org.w3c.dom.ls.LSInput;
 import org.w3c.dom.ls.LSResourceResolver;
 
-import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 
 public class ValidationResourceResolver implements LSResourceResolver {
-    private Set<ValidationSchema> namespaceSchemaMap ;
-    private List<String> errors;
-    private boolean debug;
+    private final Set<ValidationSchema> namespaceSchemaMap ;
+    private final boolean debug;
 
-    public ValidationResourceResolver(Set<ValidationSchema> namespaceSchemaMap, List<String> errors, boolean debug) {
+    public ValidationResourceResolver(Set<ValidationSchema> namespaceSchemaMap, boolean debug) {
         this.namespaceSchemaMap = namespaceSchemaMap;
-        this.errors = errors;
         this.debug = debug;
     }
 
@@ -29,7 +26,7 @@ public class ValidationResourceResolver implements LSResourceResolver {
     public Optional<ValidationSchema> find_by_systemid(String SystemId) {
         return namespaceSchemaMap.stream()
                 .filter(
-                        entry ->  (entry.schemaURI.equals(SystemId))
+                        entry ->  (entry.schemaURI.toString().equals(SystemId))
                 )
                 .findAny();
     }
@@ -38,7 +35,8 @@ public class ValidationResourceResolver implements LSResourceResolver {
     public LSInput resolveResource(String type, String nameSpaceUri, String publicId, String systemId, String baseURI) {
         if (debug) {
             System.out.println(
-                "RESOURCE_RESOLVER: type=" + type
+                "RESOURCE_RESOLVER:"
+                //        + type=" + type
                 + " namespaceuri=" + nameSpaceUri
                 + " publicId=" + publicId
                 + " SystemId=" + systemId
@@ -46,22 +44,21 @@ public class ValidationResourceResolver implements LSResourceResolver {
             );
         }
         if (namespaceSchemaMap.isEmpty()) {
-            System.out.println("No schemacatalog given!");
-            errors.add("No schemacatalog given!");
+            System.out.println("RESOURCE_RESOLVER: No schemacatalog given!");
+
             return new DOMInputImpl(null, null, null); // disabled
         }
-        LSInput result;
         /* TODO: check if uri in namespaceSchemaMap */
         Optional<ValidationSchema> validationSchemaOptional = find_by_ns(nameSpaceUri);
         if (validationSchemaOptional.isEmpty()) { // not found
             if (debug) {
-                System.out.println("--> No entry in schemacatalog found for "+ nameSpaceUri + "!");
+                System.out.println("RESOURCE_RESOLVER: --> No entry in schemacatalog found for "+ nameSpaceUri + "!");
             }
             return new DOMInputImpl(null, null, null); // disabled
         }
         DOMInputImpl domInput = new DOMInputImpl();
         if (debug) {
-            System.out.println("--> Found entry in schemacatalog for " + nameSpaceUri + ", mapping to " + validationSchemaOptional.get().schemaURI + " !");
+            System.out.println("RESOURCE_RESOLVER: --> Found entry in schemacatalog for " + nameSpaceUri + ", mapping to " + validationSchemaOptional.get().schemaURI + " !");
         }
         domInput.setSystemId( validationSchemaOptional.get().schemaURI.toString());
         return domInput;