diff --git a/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java b/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java
index 1ac1c15a36f99edf5009197dc4ddd67a6bf0040b..3e27c8987016584c4cf0c540bbe596f9d5e00388 100644
--- a/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java
+++ b/java/org/slub/rosetta/dps/repository/plugin/SLUBXmlFormatValidationPlugin.java
@@ -19,29 +19,17 @@ package org.slub.rosetta.dps.repository.plugin;
 import com.exlibris.core.infra.common.exceptions.logging.ExLogger;
 import com.exlibris.dps.sdk.techmd.FormatValidationPlugin;
 import org.w3c.dom.Document;
-import org.w3c.dom.ls.LSInput;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
 
 import javax.xml.XMLConstants;
-import javax.xml.catalog.CatalogFeatures;
-import javax.xml.catalog.CatalogManager;
-import javax.xml.catalog.CatalogResolver;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Source;
 import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.URI;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
@@ -51,120 +39,6 @@ import static org.slub.rosetta.dps.repository.plugin.validationSchemaType.schema
 enum validationSchemaType {
     schema, dtd, relaxng, schematron, nothing
 }
-class validationSchema {
-    public final String nameSpace;
-    public final validationSchemaType schemaType;
-    public final String schemaURL;
-    public Schema schemaInst;
-    public InputStream schemaInputStream;
-    public String schemaLocalURL;
-    public validationSchema(String nameSpace, validationSchemaType schemaType, String schemaURL) {
-        this.nameSpace = nameSpace;
-        this.schemaURL = schemaURL;
-        this.schemaType = schemaType;
-    }
-}
-
-class xmlInfoRecord {
-    public final String nameSpaceUri;
-    public final String documentUri;
-    public final String xmlVersion;
-    public final String systemID;
-    public final String publicID;
-    public xmlInfoRecord(String nameSpaceUri, String documentUri, String xmlVersion, String systemID, String publicID) {
-        this.documentUri = documentUri;
-        this.nameSpaceUri = nameSpaceUri;
-        this.xmlVersion = xmlVersion;
-        this.systemID = systemID;
-        this.publicID = publicID;
-    }
-}
-
-class ValidationCatalogResolver implements CatalogResolver {
-    private final HashMap<String,String> public2res = new HashMap<>() {
-        // TODO: add support for catalog.xml files.
-        {
-            put("-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.1 20151215//EN", "/resources/dtd/JATS-journalpublishing1.dtd");
-            put("-//Recordare//DTD MusicXML 4.0 Partwise//EN", "http://www.musicxml.org/dtds/partwise.dtd");
-            put("-//OASIS//DTD DocBook XML V4.2//EN" , "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd");
-            put("-//OASIS//DTD DocBook XML V4.3//EN" , "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd");
-            put("-//OASIS//DTD DocBook XML V4.4//EN" , "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd");
-
-        }
-    };
-    private final HashSet<String> allowedDtds = new HashSet<>(Arrays.asList("-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.1 20151215//EN"));
-
-    @Override
-    public InputSource resolveEntity(String publicId, String systemId) {
-        System.out.println("======");
-        System.out.println("resolveEntity\n\tpublicId=" + publicId + "\n\tsystemId=" + systemId );
-        /* TODO: only allow catalog calls to defined ressources */
-        if (allowedDtds.contains(publicId)) {
-            System.out.println("fallback to CatalogResolver");
-            //CatalogFeatures f = CatalogFeatures.builder().with(CatalogFeatures.Feature.RESOLVE, "continue").build();
-            var strippedSystemId = systemId;
-            if (!systemId.startsWith("http://")) {
-                strippedSystemId = "file:/etc/xml/" + systemId.substring(systemId.lastIndexOf("/") + 1);
-            }
-            System.out.println("\tusing URI=" + strippedSystemId);
-            CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), URI.create(strippedSystemId));
-            return cr.resolveEntity(publicId, systemId);
-        }
-        if (public2res.containsKey(publicId)) {
-            System.out.println("\tressource=" + public2res.get(publicId));
-            InputSource is = new InputSource();
-            is.setByteStream(SLUBXmlFormatValidationPlugin.class.getResourceAsStream(public2res.get(publicId)));
-            is.setPublicId(publicId);
-            is.setSystemId(systemId);
-            return is;
-        }
-        System.out.println("\tnot implemented (no fallback, no mapping)");
-        if (systemId.startsWith("http://")) {
-            CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), URI.create(systemId));
-            return cr.resolveEntity(publicId, systemId);
-        }
-        return null;
-    }
-
-    @Override
-    public Source resolve(String href, String base) {
-        System.out.println("======");
-        System.out.println("resolve href=" + href + " base=" + base);
-
-        return null;
-    }
-
-    @Override
-    public InputStream resolveEntity(String publicId, String systemId, String baseUri, String nameSpace) {
-        System.out.println("======");
-        System.out.println("resolveEntity2 publicId=" + publicId + " systemId=" + systemId);
-        return null;
-    }
-
-    @Override
-    public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseUri) {
-        System.out.println("======");
-        System.out.println("resolveResource publicId=" + publicId + " systemId=" + systemId);
-        return null;
-    }
-}
-
-class ValidationErrorHandler implements ErrorHandler {
-    @Override
-    public void warning(SAXParseException e) {
-        //System.out.println("WARN: " + e.getMessage());
-    }
-
-    @Override
-    public void error(SAXParseException e) {
-        //System.out.println("ERROR: " + e.getMessage());
-    }
-
-    @Override
-    public void fatalError(SAXParseException e) {
-        System.out.println("FATAL: " + e.getMessage());
-    }
-}
 
 /**
  * SLUBXmlFormatValidationPlugin
diff --git a/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java b/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..98be53e5e9bed4e11a536d88e25758c16595c95d
--- /dev/null
+++ b/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java
@@ -0,0 +1,93 @@
+package org.slub.rosetta.dps.repository.plugin;
+
+import org.w3c.dom.ls.LSInput;
+import org.xml.sax.InputSource;
+
+import javax.xml.catalog.CatalogException;
+import javax.xml.catalog.CatalogFeatures;
+import javax.xml.catalog.CatalogResolver;
+import javax.xml.transform.Source;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+
+import static javax.xml.catalog.CatalogManager.catalogResolver;
+
+class ValidationCatalogResolver implements CatalogResolver {
+    private final HashMap<String, String> public2res = new HashMap<>() {
+        // TODO: add support for catalog.xml files.
+        {
+            put("-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.1 20151215//EN", "/resources/dtd/JATS-journalpublishing1.dtd");
+            put("-//Recordare//DTD MusicXML 4.0 Partwise//EN", "http://www.musicxml.org/dtds/partwise.dtd");
+            put("-//OASIS//DTD DocBook XML V4.2//EN", "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd");
+            put("-//OASIS//DTD DocBook XML V4.3//EN", "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd");
+            put("-//OASIS//DTD DocBook XML V4.4//EN", "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd");
+
+        }
+    };
+    private final HashSet<String> allowedDtds = new HashSet<>(Arrays.asList("-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.1 20151215//EN"));
+
+    @Override
+    public InputSource resolveEntity(String publicId, String systemId) {
+        System.out.println("======");
+        System.out.println("resolveEntity\n\tpublicId=" + publicId + "\n\tsystemId=" + systemId);
+        /* TODO: only allow catalog calls to defined ressources */
+        if (allowedDtds.contains(publicId)) {
+            System.out.println("fallback to CatalogResolver");
+            //CatalogFeatures f = CatalogFeatures.builder().with(CatalogFeatures.Feature.RESOLVE, "continue").build();
+            var strippedSystemId = systemId;
+            if (!systemId.startsWith("http://")) {
+                strippedSystemId = "file:/etc/xml/" + systemId.substring(systemId.lastIndexOf("/") + 1);
+            }
+            System.out.println("\tusing URI=" + strippedSystemId);
+            try {
+                CatalogResolver cr = catalogResolver(CatalogFeatures.defaults(), URI.create(strippedSystemId));
+                return cr.resolveEntity(publicId, systemId);
+            } catch (CatalogException e) {
+                System.out.println("No local mapping found for publicId=" + publicId + ", systemId=" + systemId + ", " + e.getMessage());
+            }
+        }
+        if (public2res.containsKey(publicId)) {
+            System.out.println("\tressource=" + public2res.get(publicId));
+            InputSource is = new InputSource();
+            is.setByteStream(SLUBXmlFormatValidationPlugin.class.getResourceAsStream(public2res.get(publicId)));
+            is.setPublicId(publicId);
+            is.setSystemId(systemId);
+            return is;
+        }
+        System.out.println("\tnot implemented (no fallback, no mapping)");
+        if (systemId.startsWith("http://")) {
+            try {
+                CatalogResolver cr = catalogResolver(CatalogFeatures.defaults(), URI.create(systemId));
+                return cr.resolveEntity(publicId, systemId);
+            } catch (CatalogException e) {
+                System.out.println("No mapping found for publicId=" + publicId + ", systemId=" + systemId + ", " + e.getMessage());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Source resolve(String href, String base) {
+        System.out.println("======");
+        System.out.println("resolve href=" + href + " base=" + base);
+
+        return null;
+    }
+
+    @Override
+    public InputStream resolveEntity(String publicId, String systemId, String baseUri, String nameSpace) {
+        System.out.println("======");
+        System.out.println("resolveEntity2 publicId=" + publicId + " systemId=" + systemId);
+        return null;
+    }
+
+    @Override
+    public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseUri) {
+        System.out.println("======");
+        System.out.println("resolveResource publicId=" + publicId + " systemId=" + systemId);
+        return null;
+    }
+}
diff --git a/java/org/slub/rosetta/dps/repository/plugin/ValidationErrorHandler.java b/java/org/slub/rosetta/dps/repository/plugin/ValidationErrorHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..f6952e6b1900092571e7d838a87e450d5922393d
--- /dev/null
+++ b/java/org/slub/rosetta/dps/repository/plugin/ValidationErrorHandler.java
@@ -0,0 +1,21 @@
+package org.slub.rosetta.dps.repository.plugin;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXParseException;
+
+class ValidationErrorHandler implements ErrorHandler {
+    @Override
+    public void warning(SAXParseException e) {
+        //System.out.println("WARN: " + e.getMessage());
+    }
+
+    @Override
+    public void error(SAXParseException e) {
+        //System.out.println("ERROR: " + e.getMessage());
+    }
+
+    @Override
+    public void fatalError(SAXParseException e) {
+        System.out.println("FATAL: " + e.getMessage());
+    }
+}
diff --git a/java/org/slub/rosetta/dps/repository/plugin/validationSchema.java b/java/org/slub/rosetta/dps/repository/plugin/validationSchema.java
new file mode 100644
index 0000000000000000000000000000000000000000..8ecd9f5caef19acfb4065ed3b7dee23d316964b3
--- /dev/null
+++ b/java/org/slub/rosetta/dps/repository/plugin/validationSchema.java
@@ -0,0 +1,19 @@
+package org.slub.rosetta.dps.repository.plugin;
+
+import javax.xml.validation.Schema;
+import java.io.InputStream;
+
+class validationSchema {
+    public final String nameSpace;
+    public final validationSchemaType schemaType;
+    public final String schemaURL;
+    public Schema schemaInst;
+    public InputStream schemaInputStream;
+    public String schemaLocalURL;
+
+    public validationSchema(String nameSpace, validationSchemaType schemaType, String schemaURL) {
+        this.nameSpace = nameSpace;
+        this.schemaURL = schemaURL;
+        this.schemaType = schemaType;
+    }
+}
diff --git a/java/org/slub/rosetta/dps/repository/plugin/xmlInfoRecord.java b/java/org/slub/rosetta/dps/repository/plugin/xmlInfoRecord.java
new file mode 100644
index 0000000000000000000000000000000000000000..0ee478b4fd5a0a1348d7183501dd44b3bb855d45
--- /dev/null
+++ b/java/org/slub/rosetta/dps/repository/plugin/xmlInfoRecord.java
@@ -0,0 +1,17 @@
+package org.slub.rosetta.dps.repository.plugin;
+
+class xmlInfoRecord {
+    public final String nameSpaceUri;
+    public final String documentUri;
+    public final String xmlVersion;
+    public final String systemID;
+    public final String publicID;
+
+    public xmlInfoRecord(String nameSpaceUri, String documentUri, String xmlVersion, String systemID, String publicID) {
+        this.documentUri = documentUri;
+        this.nameSpaceUri = nameSpaceUri;
+        this.xmlVersion = xmlVersion;
+        this.systemID = systemID;
+        this.publicID = publicID;
+    }
+}