diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidator.java b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..eafbad0b39346f495d20d52f05b770d214a983c5
--- /dev/null
+++ b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidator.java
@@ -0,0 +1,75 @@
+package de.ozgcloud.xta.client.xdomea;
+
+import static de.ozgcloud.xta.client.xdomea.mapper.MetadataMapper.*;
+
+import java.util.List;
+import java.util.Set;
+
+import de.ozgcloud.xta.client.exception.ClientException;
+import de.ozgcloud.xta.client.model.XtaFile;
+import de.ozgcloud.xta.client.model.XtaMessageMetaData;
+import de.ozgcloud.xta.client.xdomea.reader.XdomeaXmlValues;
+import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader;
+import lombok.Builder;
+import lombok.RequiredArgsConstructor;
+
+@Builder
+@RequiredArgsConstructor
+public class XdomeaMetaDataValidator {
+
+	private final ZipFileEntryReader zipFileEntryReader;
+
+	static final String AUTHOR_ID_PREFIX_NAME = "author";
+	static final String READER_ID_PREFIX_NAME = "reader";
+
+	public void validate(
+			XtaFile xdomeaZipFile,
+			XdomeaXmlValues xdomeaXmlValues,
+			XtaMessageMetaData messageMetadataData
+	) throws ClientException {
+		validateIdentifierPrefixes(
+				xdomeaXmlValues.authorIdPrefix(),
+				xdomeaXmlValues.readerIdPrefix()
+		);
+		validateZipFileName(
+				xdomeaZipFile.name(),
+				xdomeaXmlValues.processId(),
+				messageMetadataData.messageTypeCode()
+		);
+		validatePrimaryDocumentReferences(xdomeaZipFile, xdomeaXmlValues.primaryDocumentNames());
+	}
+
+	void validateIdentifierPrefixes(String authorIdPrefix, String readerIdPrefix) throws ClientException {
+		validateIdentifierPrefix(authorIdPrefix, AUTHOR_ID_PREFIX, AUTHOR_ID_PREFIX_NAME);
+		validateIdentifierPrefix(readerIdPrefix, READER_ID_PREFIX, READER_ID_PREFIX_NAME);
+	}
+
+	void validateIdentifierPrefix(String prefix, String expectedPrefix, String prefixName) throws ClientException {
+		if (!expectedPrefix.equals(normalizePrefix(prefix))) {
+			throw new ClientException("Expect prefix of %s identifier to be '%s'! (actual: %s)".formatted(prefixName, expectedPrefix, prefix));
+		}
+	}
+
+	private String normalizePrefix(String prefix) {
+		return prefix.endsWith(":") ? prefix.substring(0, prefix.length() - 1) : prefix;
+	}
+
+	void validatePrimaryDocumentReferences(XtaFile xdomeaZipFile, List<String> primaryDocumentNames) throws ClientException {
+		var entryNames = Set.copyOf(zipFileEntryReader.getEntryNames(xdomeaZipFile.content()));
+		for (var primaryDocumentName : primaryDocumentNames) {
+			if (!entryNames.contains(primaryDocumentName)) {
+				throw new ClientException("Primary document reference '%s' not found in xdomea zip file!".formatted(primaryDocumentName));
+			}
+		}
+	}
+
+	void validateZipFileName(String xdomeaZipFileName, String processId, String messageTypeCode) throws ClientException {
+		var expectedXdomeaZipFileName = "%s_%s.zip".formatted(processId, messageTypeCode);
+		if (!expectedXdomeaZipFileName.equals(xdomeaZipFileName)) {
+			throw new ClientException(
+					"Expect xdomea zip file name to equal '%s'! (actual: '%s')".formatted(expectedXdomeaZipFileName, xdomeaZipFileName)
+			);
+		}
+	}
+
+}
diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactory.java b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..7dbf72ffea697299ac5bfe69b419f41e50469fd4
--- /dev/null
+++ b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactory.java
@@ -0,0 +1,19 @@
+package de.ozgcloud.xta.client.xdomea;
+
+import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader;
+import lombok.Builder;
+import lombok.RequiredArgsConstructor;
+
+@Builder
+@RequiredArgsConstructor
+public class XdomeaMetaDataValidatorFactory {
+
+	private final ZipFileEntryReader zipFileEntryReader;
+
+	public XdomeaMetaDataValidator create() {
+		return XdomeaMetaDataValidator.builder()
+				.zipFileEntryReader(zipFileEntryReader)
+				.build();
+	}
+
+}
diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreator.java b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreator.java
index 2ed5f8cb707922f99dd1557a9276ccb7f7d36b5f..2bd66d76bee063031959336990e92acea12daeb2 100644
--- a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreator.java
+++ b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreator.java
@@ -4,8 +4,6 @@ import static java.util.Collections.*;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.List;
-import java.util.Set;
 
 import javax.xml.parsers.DocumentBuilder;
 
@@ -32,6 +30,7 @@ public class XdomeaXtaMessageCreator {
 	private final DocumentBuilder documentBuilder;
 	private final MetadataMapper metadataMapper;
 	private final ZipFileEntryReader zipFileEntryReader;
+	private final XdomeaMetaDataValidator metaDataValidator;
 
 	public XtaMessage createMessage(XtaFile xdomeaZipFile) throws ClientException {
 		return XtaMessage.builder()
@@ -45,36 +44,13 @@ public class XdomeaXtaMessageCreator {
 		try {
 			var xdomeaXmlValues = readXdomeaXmlValues(xdomeaZipFile);
 			var messageMetadataData = metadataMapper.mapXtaMessageMetadata(xdomeaXmlValues);
-			validateZipFileName(
-					xdomeaZipFile.name(),
-					xdomeaXmlValues.processId(),
-					messageMetadataData.messageTypeCode()
-			);
-			validatePrimaryDocumentReferences(xdomeaZipFile, xdomeaXmlValues.primaryDocumentNames());
+			metaDataValidator.validate(xdomeaZipFile, xdomeaXmlValues, messageMetadataData);
 			return messageMetadataData;
 		} catch (TechnicalException e) {
 			throw new ClientException("Failed to derive valid message metadata from xdomea document!", e);
 		}
 	}
 
-	void validatePrimaryDocumentReferences(XtaFile xdomeaZipFile, List<String> primaryDocumentNames) throws ClientException {
-		var entryNames = Set.copyOf(zipFileEntryReader.getEntryNames(xdomeaZipFile.content()));
-		for (var primaryDocumentName : primaryDocumentNames) {
-			if (!entryNames.contains(primaryDocumentName)) {
-				throw new ClientException("Primary document reference '%s' not found in xdomea zip file!".formatted(primaryDocumentName));
-			}
-		}
-	}
-
-	void validateZipFileName(String xdomeaZipFileName, String processId, String messageTypeCode) throws ClientException {
-		var expectedXdomeaZipFileName = "%s_%s.zip".formatted(processId, messageTypeCode);
-		if (!expectedXdomeaZipFileName.equals(xdomeaZipFileName)) {
-			throw new ClientException(
-					"Expect xdomea zip file name to equal '%s'! (actual: '%s')".formatted(expectedXdomeaZipFileName, xdomeaZipFileName)
-			);
-		}
-	}
-
 	XdomeaXmlValues readXdomeaXmlValues(XtaFile xdomeaZipFile) throws ClientException {
 		var document = readXdomeaXmlDocument(xdomeaZipFile);
 		return xdomeaValueReader.readValues(document);
diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactory.java b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactory.java
index b3141a7e3fd099dca2911a9d35ad2ce6305219c1..3b6ff6aba506a706aa6c09cc66c6d9a87e1f66bb 100644
--- a/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactory.java
+++ b/src/main/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactory.java
@@ -25,6 +25,7 @@ import org.xml.sax.SAXParseException;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.xta.client.xdomea.mapper.MetadataMapper;
 import de.ozgcloud.xta.client.xdomea.reader.XdomeaValueReaderFactory;
+import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader;
 import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReaderFactory;
 import lombok.Builder;
 import lombok.RequiredArgsConstructor;
@@ -48,21 +49,27 @@ public class XdomeaXtaMessageCreatorFactory {
 	);
 
 	private final XdomeaValueReaderFactory xdomeaValueReaderFactory;
-	private final ZipFileEntryReaderFactory zipFileEntryReaderFactory;
+	private final ZipFileEntryReader zipFileEntryReader;
 	private final DocumentBuilderFactory documentBuilderFactory;
 	private final MetadataMapper metadataMapper;
+	private final XdomeaMetaDataValidatorFactory xdomeaMetaDataValidatorFactory;
 	private final SchemaFactory schemaFactory;
 	private final ClassLoader classLoader;
 	private final ErrorHandler errorHandler;
 
 	public static XdomeaXtaMessageCreatorFactory createInstance() {
+		var zipEntryReaderFactory = ZipFileEntryReaderFactory.builder().build();
+		var zipEntryReader = zipEntryReaderFactory.create();
 		return XdomeaXtaMessageCreatorFactory.builder()
 				.xdomeaValueReaderFactory(XdomeaValueReaderFactory.builder()
 						.xPathFactory(createXPathFactory())
 						.build())
-				.zipFileEntryReaderFactory(ZipFileEntryReaderFactory.builder().build())
+				.zipFileEntryReader(zipEntryReader)
 				.documentBuilderFactory(DocumentBuilderFactory.newInstance())
 				.metadataMapper(Mappers.getMapper(MetadataMapper.class))
+				.xdomeaMetaDataValidatorFactory(XdomeaMetaDataValidatorFactory.builder()
+						.zipFileEntryReader(zipEntryReader)
+						.build())
 				.schemaFactory(SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI))
 				.classLoader(XdomeaXtaMessageCreatorFactory.class.getClassLoader())
 				.errorHandler(new CustomErrorHandler())
@@ -141,8 +148,9 @@ public class XdomeaXtaMessageCreatorFactory {
 		return XdomeaXtaMessageCreator.builder()
 				.documentBuilder(createDocumentBuilder())
 				.xdomeaValueReader(xdomeaValueReaderFactory.create())
-				.zipFileEntryReader(zipFileEntryReaderFactory.create())
+				.zipFileEntryReader(zipFileEntryReader)
 				.metadataMapper(metadataMapper)
+				.metaDataValidator(xdomeaMetaDataValidatorFactory.create())
 				.build();
 	}
 }
diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java
index 45adea934b21aeec30fdb28f5055ed2887f0ddac..8ffa13166a14607379702c97927167f5693ee287 100644
--- a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java
+++ b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReader.java
@@ -17,7 +17,9 @@ public class XdomeaValueReader {
 
 	static final String PROCESS_ID_XPATH = getXpath("Kopf", "ProzessID");
 	static final String AUTHOR_ID_SUFFIX_XPATH = getXpath("Kopf", "Absender", "code");
+	static final String AUTHOR_ID_PREFIX_XPATH = getXpath("Kopf", "Absender", "Praefix", "code");
 	static final String READER_ID_SUFFIX_XPATH = getXpath("Kopf", "Empfaenger", "code");
+	static final String READER_ID_PREFIX_XPATH = getXpath("Kopf", "Empfaenger", "Praefix", "code");
 	static final String MESSAGE_TYPE_ID_SUFFIX_XPATH = getXpath("Kopf", "Nachrichtentyp", "code");
 	static final String PRIMARY_DOCUMENT_NAME_XPATH = getXpath("Primaerdokument", "Dateiname");
 
@@ -34,7 +36,9 @@ public class XdomeaValueReader {
 				.processId(readRequiredValue(xdomeaXmlDocument, PROCESS_ID_XPATH))
 				.messageTypeCode(readRequiredValue(xdomeaXmlDocument, MESSAGE_TYPE_ID_SUFFIX_XPATH))
 				.authorIdSuffix(readRequiredValue(xdomeaXmlDocument, AUTHOR_ID_SUFFIX_XPATH))
+				.authorIdPrefix(readRequiredValue(xdomeaXmlDocument, AUTHOR_ID_PREFIX_XPATH))
 				.readerIdSuffix(readRequiredValue(xdomeaXmlDocument, READER_ID_SUFFIX_XPATH))
+				.readerIdPrefix(readRequiredValue(xdomeaXmlDocument, READER_ID_PREFIX_XPATH))
 				.primaryDocumentNames(readPrimaryDocumentNames(xdomeaXmlDocument))
 				.build();
 	}
diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactory.java b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactory.java
index 9dbcf5e1c3b6d317870ffd93e4c062bea1976af7..74c0c97680258b1c0e6e2fd1df3aaf8ca878af3c 100644
--- a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactory.java
+++ b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactory.java
@@ -33,7 +33,9 @@ public class XdomeaValueReaderFactory {
 						PROCESS_ID_XPATH,
 						MESSAGE_TYPE_ID_SUFFIX_XPATH,
 						AUTHOR_ID_SUFFIX_XPATH,
+						AUTHOR_ID_PREFIX_XPATH,
 						READER_ID_SUFFIX_XPATH,
+						READER_ID_PREFIX_XPATH,
 						PRIMARY_DOCUMENT_NAME_XPATH
 				).collect(Collectors.toMap(
 						xpath -> xpath,
diff --git a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaXmlValues.java b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaXmlValues.java
index 7783474d380204b3ea6b9c9d168db9c847440318..1410fdc5347ecdc109604a56989ced63b703a549 100644
--- a/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaXmlValues.java
+++ b/src/main/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaXmlValues.java
@@ -12,7 +12,9 @@ public record XdomeaXmlValues(
 		@NotBlank String processId,
 		@NotBlank String messageTypeCode,
 		@NotBlank String authorIdSuffix,
+		@NotBlank String authorIdPrefix,
 		@NotBlank String readerIdSuffix,
+		@NotBlank String readerIdPrefix,
 		@Valid List<@NotBlank String> primaryDocumentNames
 ) {
 }
diff --git a/src/test/java/de/ozgcloud/xta/client/factory/XdomeaXmlValuesTestFactory.java b/src/test/java/de/ozgcloud/xta/client/factory/XdomeaXmlValuesTestFactory.java
index ca099c7446385e4efee53a903dd6b922e2cd6fe7..a4f402b6f47e37e46f40b7bf533f10519611258e 100644
--- a/src/test/java/de/ozgcloud/xta/client/factory/XdomeaXmlValuesTestFactory.java
+++ b/src/test/java/de/ozgcloud/xta/client/factory/XdomeaXmlValuesTestFactory.java
@@ -9,7 +9,9 @@ public class XdomeaXmlValuesTestFactory {
 	public static final String PROCESS_ID = "000ProcessId-111";
 	public static final String SHORT_MESSAGE_TYPE_CODE = "messageTypeCode";
 	public static final String AUTHOR_ID_SUFFIX = "authorIdSuffix";
+	public static final String AUTHOR_ID_PREFIX = "authorIdPrefix";
 	public static final String READER_ID_SUFFIX = "readerIdSuffix";
+	public static final String READER_ID_PREFIX = "readerIdPrefix";
 
 	public static final List<String> PRIMARY_DOCUMENT_NAMES = List.of("doc.pdf", "doc.xml");
 
@@ -22,7 +24,9 @@ public class XdomeaXmlValuesTestFactory {
 				.processId(PROCESS_ID)
 				.messageTypeCode(SHORT_MESSAGE_TYPE_CODE)
 				.authorIdSuffix(AUTHOR_ID_SUFFIX)
+				.authorIdPrefix(AUTHOR_ID_PREFIX)
 				.readerIdSuffix(READER_ID_SUFFIX)
+				.readerIdPrefix(READER_ID_PREFIX)
 				.primaryDocumentNames(PRIMARY_DOCUMENT_NAMES);
 	}
 }
diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactoryTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactoryTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..60b10771660b97fb3e29796df425f6a26ebf4872
--- /dev/null
+++ b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorFactoryTest.java
@@ -0,0 +1,35 @@
+package de.ozgcloud.xta.client.xdomea;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader;
+
+class XdomeaMetaDataValidatorFactoryTest {
+
+	@InjectMocks
+	private XdomeaMetaDataValidatorFactory factory;
+
+	@Mock
+	private ZipFileEntryReader zipFileEntryReader;
+
+	@DisplayName("create")
+	@Nested
+	class TestCreate {
+
+		@DisplayName("should return")
+		@Test
+		void shouldReturn() {
+			var result = factory.create();
+
+			assertThat(result).usingRecursiveComparison().isEqualTo(XdomeaMetaDataValidator.builder()
+					.zipFileEntryReader(zipFileEntryReader)
+					.build());
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3251bedc7fb829bd22a35a6d6c6f648c678626c
--- /dev/null
+++ b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaMetaDataValidatorTest.java
@@ -0,0 +1,248 @@
+package de.ozgcloud.xta.client.xdomea;
+
+import static de.ozgcloud.xta.client.factory.MessageMetaDataTestFactory.*;
+import static de.ozgcloud.xta.client.factory.XdomeaXmlValuesTestFactory.*;
+import static de.ozgcloud.xta.client.factory.XtaFileTestFactory.*;
+import static de.ozgcloud.xta.client.xdomea.XdomeaMetaDataValidator.*;
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.List;
+
+import jakarta.activation.DataHandler;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import de.ozgcloud.xta.client.exception.ClientException;
+import de.ozgcloud.xta.client.factory.XdomeaXmlValuesTestFactory;
+import de.ozgcloud.xta.client.factory.XtaFileTestFactory;
+import de.ozgcloud.xta.client.factory.XtaMessageMetaDataTestFactory;
+import de.ozgcloud.xta.client.model.XtaFile;
+import de.ozgcloud.xta.client.model.XtaMessageMetaData;
+import de.ozgcloud.xta.client.xdomea.mapper.MetadataMapper;
+import de.ozgcloud.xta.client.xdomea.reader.XdomeaXmlValues;
+import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader;
+import lombok.SneakyThrows;
+
+class XdomeaMetaDataValidatorTest {
+
+	@Spy
+	@InjectMocks
+	private XdomeaMetaDataValidator validator;
+
+	@Mock
+	private ZipFileEntryReader zipFileEntryReader;
+
+	@DisplayName("validate")
+	@Nested
+	class TestValidate {
+
+		private XtaFile xdomeaZipFile;
+
+		private XdomeaXmlValues xdomeaXmlValues;
+
+		private XtaMessageMetaData messageMetadataData;
+
+		@BeforeEach
+		@SneakyThrows
+		void mock() {
+			xdomeaZipFile = XtaFileTestFactory.create();
+			xdomeaXmlValues = XdomeaXmlValuesTestFactory.create();
+			messageMetadataData = XtaMessageMetaDataTestFactory.create();
+			doNothing().when(validator).validateIdentifierPrefixes(any(), any());
+			doNothing().when(validator).validateZipFileName(any(), any(), any());
+			doNothing().when(validator).validatePrimaryDocumentReferences(any(), any());
+		}
+
+		@DisplayName("should verify identifier prefixes")
+		@Test
+		@SneakyThrows
+		void shouldVerifyIdentifierPrefixes() {
+			validate();
+
+			verify(validator).validateIdentifierPrefixes(
+					AUTHOR_ID_PREFIX,
+					READER_ID_PREFIX
+			);
+		}
+
+		@DisplayName("should verify zip file name")
+		@Test
+		@SneakyThrows
+		void shouldVerifyZipFileName() {
+			validate();
+
+			verify(validator).validateZipFileName(
+					XTA_FILE_NAME,
+					PROCESS_ID,
+					MESSAGE_TYPE_CODE
+			);
+		}
+
+		@DisplayName("should verify primary document references")
+		@Test
+		@SneakyThrows
+		void shouldVerifyPrimaryDocumentReferences() {
+			validate();
+
+			verify(validator).validatePrimaryDocumentReferences(
+					xdomeaZipFile,
+					PRIMARY_DOCUMENT_NAMES
+			);
+		}
+
+		@SneakyThrows
+		private void validate() {
+			validator.validate(xdomeaZipFile, xdomeaXmlValues, messageMetadataData);
+		}
+	}
+
+	@DisplayName("validate identifier prefixes")
+	@Nested
+	class TestValidateIdentifierPrefixes {
+
+		@BeforeEach
+		@SneakyThrows
+		void mock() {
+			doNothing().when(validator).validateIdentifierPrefix(any(), any(), any());
+		}
+
+		@DisplayName("should validate author identifier prefix")
+		@Test
+		@SneakyThrows
+		void shouldValidateAuthorIdentifierPrefix() {
+			validator.validateIdentifierPrefixes(AUTHOR_ID_PREFIX, READER_ID_PREFIX);
+
+			verify(validator).validateIdentifierPrefix(
+					AUTHOR_ID_PREFIX,
+					MetadataMapper.AUTHOR_ID_PREFIX,
+					AUTHOR_ID_PREFIX_NAME
+			);
+		}
+
+		@DisplayName("should validate reader identifier prefix")
+		@Test
+		@SneakyThrows
+		void shouldValidateReaderIdentifierPrefix() {
+			validator.validateIdentifierPrefixes(AUTHOR_ID_PREFIX, READER_ID_PREFIX);
+
+			verify(validator).validateIdentifierPrefix(
+					READER_ID_PREFIX,
+					MetadataMapper.READER_ID_PREFIX,
+					READER_ID_PREFIX_NAME
+			);
+		}
+	}
+
+	@DisplayName("validate identifier prefix")
+	@Nested
+	class TestValidateIdentifierPrefix {
+
+		private static final String EXPECTED_PREFIX = "prefix";
+		private static final String PREFIX_NAME = "prefixName";
+
+		@DisplayName("should normalize prefix")
+		@ParameterizedTest
+		@ValueSource(strings = {
+				"prefix:",
+				"prefix",
+		})
+		@SneakyThrows
+		void shouldNormalizePrefix(String prefix) {
+			validator.validateIdentifierPrefix(prefix, EXPECTED_PREFIX, PREFIX_NAME);
+		}
+
+		@DisplayName("should throw client exception for wrong prefix")
+		@ParameterizedTest
+		@ValueSource(strings = {
+				"prefi",
+				"prefix::",
+				"prefix$:",
+				"prefix$",
+		})
+		void shouldThrowClientExceptionForWrongPrefix(String prefix) {
+			assertThatThrownBy(() -> validator.validateIdentifierPrefix(prefix, EXPECTED_PREFIX, PREFIX_NAME))
+					.isInstanceOf(ClientException.class)
+					.hasMessageContaining(PREFIX_NAME);
+		}
+
+	}
+
+	@DisplayName("validate zip file name")
+	@Nested
+	class TestValidateZipFileName {
+
+		private static final String PROCESS_ID = "processId";
+		private static final String MESSAGE_TYPE_CODE = "messageTypeCode";
+		private static final String VALID_ZIP_FILE_NAME = "processId_messageTypeCode.zip";
+
+		@DisplayName("should not throw exception for valid zip file name")
+		@Test
+		void shouldNotThrowExceptionForValidZipFileName() {
+			assertThatCode(() -> validator.validateZipFileName(VALID_ZIP_FILE_NAME, PROCESS_ID, MESSAGE_TYPE_CODE))
+					.doesNotThrowAnyException();
+		}
+
+		@DisplayName("should throw client exception for wrong zip file name")
+		@ParameterizedTest
+		@ValueSource(strings = {
+				"$processId_messageTypeCode.zip",
+				"processId_me$ssageTypeCode.zip",
+				"processId_messageTypeCode.zip$",
+		})
+		void shouldThrowClientExceptionForWrongZipFileName(String wrongZipFileName) {
+			assertThatThrownBy(() -> validator.validateZipFileName(wrongZipFileName, PROCESS_ID, MESSAGE_TYPE_CODE))
+					.isInstanceOf(ClientException.class);
+		}
+
+	}
+
+	@DisplayName("validate primary document references")
+	@Nested
+	class TestValidatePrimaryDocumentReferences {
+
+		private static final List<String> VALID_ZIP_ENTRY_NAMES = List.of("doc.pdf", "doc.xml", "other.doc");
+		private static final List<String> INVALID_ZIP_ENTRY_NAMES = List.of("doc.pdf");
+
+		@Mock
+		private XtaFile xdomeaZipFile;
+
+		@Mock
+		private DataHandler contentDataHandler;
+
+		@BeforeEach
+		@SneakyThrows
+		void mock() {
+			when(xdomeaZipFile.content()).thenReturn(contentDataHandler);
+
+		}
+
+		@DisplayName("should not throw exception for valid primary document references")
+		@Test
+		@SneakyThrows
+		void shouldNotThrowExceptionForValidPrimaryDocumentReferences() {
+			when(zipFileEntryReader.getEntryNames(contentDataHandler)).thenReturn(VALID_ZIP_ENTRY_NAMES);
+
+			validator.validatePrimaryDocumentReferences(xdomeaZipFile, PRIMARY_DOCUMENT_NAMES);
+		}
+
+		@DisplayName("should throw client exception for missing primary document references")
+		@Test
+		@SneakyThrows
+		void shouldThrowClientExceptionForMissingPrimaryDocumentReferences() {
+			when(zipFileEntryReader.getEntryNames(contentDataHandler)).thenReturn(INVALID_ZIP_ENTRY_NAMES);
+
+			assertThatThrownBy(() -> validator.validatePrimaryDocumentReferences(xdomeaZipFile, PRIMARY_DOCUMENT_NAMES))
+					.isInstanceOf(ClientException.class);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactoryTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactoryTest.java
index 578ea24b61a8b077455ee9693ca0ba805e870bce..f8cf3fff6982ae1170b4ace41edb6cb193c43f52 100644
--- a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactoryTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorFactoryTest.java
@@ -38,7 +38,6 @@ import de.ozgcloud.xta.client.xdomea.mapper.MetadataMapper;
 import de.ozgcloud.xta.client.xdomea.reader.XdomeaValueReader;
 import de.ozgcloud.xta.client.xdomea.reader.XdomeaValueReaderFactory;
 import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReader;
-import de.ozgcloud.xta.client.xdomea.reader.ZipFileEntryReaderFactory;
 import lombok.SneakyThrows;
 
 class XdomeaXtaMessageCreatorFactoryTest {
@@ -51,7 +50,7 @@ class XdomeaXtaMessageCreatorFactoryTest {
 	private XdomeaValueReaderFactory xdomeaValueReaderFactory;
 
 	@Mock
-	private ZipFileEntryReaderFactory zipFileEntryReaderFactory;
+	private ZipFileEntryReader zipFileEntryReader;
 
 	@Mock
 	private DocumentBuilderFactory documentBuilderFactory;
@@ -59,6 +58,9 @@ class XdomeaXtaMessageCreatorFactoryTest {
 	@Mock
 	private MetadataMapper metadataMapper;
 
+	@Mock
+	private XdomeaMetaDataValidatorFactory xdomeaMetaDataValidatorFactory;
+
 	@Mock
 	private SchemaFactory schemaFactory;
 
@@ -79,10 +81,10 @@ class XdomeaXtaMessageCreatorFactoryTest {
 		private DocumentBuilder documentBuilder;
 
 		@Mock
-		private ZipFileEntryReader zipFileEntryReader;
+		private ParserConfigurationException parserConfigurationException;
 
 		@Mock
-		private ParserConfigurationException parserConfigurationException;
+		private XdomeaMetaDataValidator metaDataValidator;
 
 		@Mock
 		private Schema schema;
@@ -92,7 +94,7 @@ class XdomeaXtaMessageCreatorFactoryTest {
 			when(documentBuilderFactory.newDocumentBuilder()).thenReturn(documentBuilder);
 			doReturn(schema).when(factory).createSchema();
 			when(xdomeaValueReaderFactory.create()).thenReturn(xdomeaValueReader);
-			when(zipFileEntryReaderFactory.create()).thenReturn(zipFileEntryReader);
+			when(xdomeaMetaDataValidatorFactory.create()).thenReturn(metaDataValidator);
 		}
 
 		@DisplayName("should return")
@@ -107,6 +109,7 @@ class XdomeaXtaMessageCreatorFactoryTest {
 					.xdomeaValueReader(xdomeaValueReader)
 					.zipFileEntryReader(zipFileEntryReader)
 					.metadataMapper(metadataMapper)
+					.metaDataValidator(metaDataValidator)
 					.build());
 		}
 
diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorITCase.java b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorITCase.java
index 732c1ac40144339671fe5a8bd2ac9246e5e925ff..7edc2d0d55e829da831947dbc4a73e7793c2c17d 100644
--- a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorITCase.java
+++ b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorITCase.java
@@ -1,6 +1,6 @@
 package de.ozgcloud.xta.client.xdomea;
 
-import static de.ozgcloud.xta.client.factory.MessageMetaDataTestFactory.*;
+import static de.ozgcloud.xta.client.extension.XtaServerSetupExtensionTestUtil.*;
 import static de.ozgcloud.xta.client.xdomea.mapper.MetadataMapper.*;
 import static org.assertj.core.api.Assertions.*;
 
@@ -38,8 +38,7 @@ class XdomeaXtaMessageCreatorITCase {
 
 			var xtaMessage = creator.createMessage(xdomeaZipFile);
 
-			var readerIdentifierSuffix = getIdentifierValueSuffix(xtaMessage.metaData().readerIdentifier().value());
-			assertThat(readerIdentifierSuffix).isEqualTo(getIdentifierValueSuffix(READER_IDENTIFIER.value()));
+			assertThat(xtaMessage.metaData().readerIdentifier().value()).isEqualTo(READER_CLIENT_IDENTIFIER1.value());
 		}
 
 		@DisplayName("should use author")
@@ -51,12 +50,7 @@ class XdomeaXtaMessageCreatorITCase {
 
 			var xtaMessage = creator.createMessage(xdomeaZipFile);
 
-			var authorIdentifierSuffix = getIdentifierValueSuffix(xtaMessage.metaData().authorIdentifier().value());
-			assertThat(authorIdentifierSuffix).isEqualTo(getIdentifierValueSuffix(AUTHOR_IDENTIFIER.value()));
-		}
-
-		private String getIdentifierValueSuffix(String identifierValue) {
-			return identifierValue.substring(identifierValue.indexOf(":") + 1);
+			assertThat(xtaMessage.metaData().authorIdentifier().value()).isEqualTo(AUTHOR_CLIENT_IDENTIFIER.value());
 		}
 
 		@DisplayName("should use message type code for 0201")
@@ -127,8 +121,8 @@ class XdomeaXtaMessageCreatorITCase {
 
 	private XtaMessageExampleLoader.MessageExampleConfig.MessageExampleConfigBuilder createExampleConfigBuilder() {
 		return XtaMessageExampleLoader.MessageExampleConfig.builder()
-				.author(AUTHOR_IDENTIFIER)
-				.reader(READER_IDENTIFIER);
+				.author(AUTHOR_CLIENT_IDENTIFIER)
+				.reader(READER_CLIENT_IDENTIFIER1);
 	}
 
 	private XtaFile loadMessageFileWithPatch(String messageLabel, String patchLabel) {
diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorTest.java
index 134454daa3c437f6180b664e6b416598ee8ce594..6ffa37b6177f2022c068f847707a02c5d8e36d3f 100644
--- a/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/xdomea/XdomeaXtaMessageCreatorTest.java
@@ -1,13 +1,9 @@
 package de.ozgcloud.xta.client.xdomea;
 
-import static de.ozgcloud.xta.client.factory.MessageMetaDataTestFactory.*;
-import static de.ozgcloud.xta.client.factory.XdomeaXmlValuesTestFactory.*;
-import static de.ozgcloud.xta.client.factory.XtaFileTestFactory.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
 import java.io.InputStream;
-import java.util.List;
 import java.util.function.Function;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -18,8 +14,6 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.ValueSource;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
@@ -57,6 +51,9 @@ class XdomeaXtaMessageCreatorTest {
 	@Mock
 	private ZipFileEntryReader zipFileEntryReader;
 
+	@Mock
+	private XdomeaMetaDataValidator metaDataValidator;
+
 	@DisplayName("create message")
 	@Nested
 	class TestCreateMessage {
@@ -136,40 +133,21 @@ class XdomeaXtaMessageCreatorTest {
 			assertThat(result).isEqualTo(metaData);
 		}
 
-		@DisplayName("should verify zip file name")
-		@Test
-		@SneakyThrows
-		void shouldVerifyZipFileName() {
-			mockValidMetadata();
-
-			creator.deriveValidMetaData(xdomeaZipFile);
-
-			verify(creator).validateZipFileName(
-					XTA_FILE_NAME,
-					PROCESS_ID,
-					MESSAGE_TYPE_CODE
-			);
-		}
-
-		@DisplayName("should verify primary document references")
+		@DisplayName("should validate")
 		@Test
 		@SneakyThrows
-		void shouldVerifyPrimaryDocumentReferences() {
+		void shouldValidate() {
 			mockValidMetadata();
 
 			creator.deriveValidMetaData(xdomeaZipFile);
 
-			verify(creator).validatePrimaryDocumentReferences(
-					xdomeaZipFile,
-					PRIMARY_DOCUMENT_NAMES
-			);
+			verify(metaDataValidator).validate(xdomeaZipFile, xdomeaXmlValues, metaData);
 		}
 
 		@SneakyThrows
 		private void mockValidMetadata() {
 			doReturn(metaData).when(metadataMapper).mapXtaMessageMetadata(xdomeaXmlValues);
-			doNothing().when(creator).validateZipFileName(any(), any(), any());
-			doNothing().when(creator).validatePrimaryDocumentReferences(any(), any());
+			doNothing().when(metaDataValidator).validate(xdomeaZipFile, xdomeaXmlValues, metaData);
 		}
 
 		@DisplayName("should throw client exception")
@@ -264,73 +242,4 @@ class XdomeaXtaMessageCreatorTest {
 		}
 	}
 
-	@DisplayName("validate zip file name")
-	@Nested
-	class TestValidateZipFileName {
-
-		private static final String PROCESS_ID = "processId";
-		private static final String MESSAGE_TYPE_CODE = "messageTypeCode";
-		private static final String VALID_ZIP_FILE_NAME = "processId_messageTypeCode.zip";
-
-		@DisplayName("should not throw exception for valid zip file name")
-		@Test
-		void shouldNotThrowExceptionForValidZipFileName() {
-			assertThatCode(() -> creator.validateZipFileName(VALID_ZIP_FILE_NAME, PROCESS_ID, MESSAGE_TYPE_CODE))
-					.doesNotThrowAnyException();
-		}
-
-		@DisplayName("should throw client exception for wrong zip file name")
-		@ParameterizedTest
-		@ValueSource(strings = {
-				"$processId_messageTypeCode.zip",
-				"processId_me$ssageTypeCode.zip",
-				"processId_messageTypeCode.zip$",
-		})
-		void shouldThrowClientExceptionForWrongZipFileName(String wrongZipFileName) {
-			assertThatThrownBy(() -> creator.validateZipFileName(wrongZipFileName, PROCESS_ID, MESSAGE_TYPE_CODE))
-					.isInstanceOf(ClientException.class);
-		}
-
-	}
-
-	@DisplayName("validate primary document references")
-	@Nested
-	class TestValidatePrimaryDocumentReferences {
-
-		private static final List<String> VALID_ZIP_ENTRY_NAMES = List.of("doc.pdf", "doc.xml", "other.doc");
-		private static final List<String> INVALID_ZIP_ENTRY_NAMES = List.of("doc.pdf");
-
-		@Mock
-		private XtaFile xdomeaZipFile;
-
-		@Mock
-		private DataHandler contentDataHandler;
-
-		@BeforeEach
-		@SneakyThrows
-		void mock() {
-			when(xdomeaZipFile.content()).thenReturn(contentDataHandler);
-
-		}
-
-		@DisplayName("should not throw exception for valid primary document references")
-		@Test
-		@SneakyThrows
-		void shouldNotThrowExceptionForValidPrimaryDocumentReferences() {
-			when(zipFileEntryReader.getEntryNames(contentDataHandler)).thenReturn(VALID_ZIP_ENTRY_NAMES);
-
-			creator.validatePrimaryDocumentReferences(xdomeaZipFile, PRIMARY_DOCUMENT_NAMES);
-		}
-
-		@DisplayName("should throw client exception for missing primary document references")
-		@Test
-		@SneakyThrows
-		void shouldThrowClientExceptionForMissingPrimaryDocumentReferences() {
-			when(zipFileEntryReader.getEntryNames(contentDataHandler)).thenReturn(INVALID_ZIP_ENTRY_NAMES);
-
-			assertThatThrownBy(() -> creator.validatePrimaryDocumentReferences(xdomeaZipFile, PRIMARY_DOCUMENT_NAMES))
-					.isInstanceOf(ClientException.class);
-		}
-	}
-
 }
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/mapper/MetadataMapperTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/mapper/MetadataMapperTest.java
index 25e7a8faa0af6c9591e61d346aaa08c550435092..46ed9f9fbfd4c6e95439562023ea9c723dc7e1d5 100644
--- a/src/test/java/de/ozgcloud/xta/client/xdomea/mapper/MetadataMapperTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/xdomea/mapper/MetadataMapperTest.java
@@ -14,7 +14,6 @@ import org.mapstruct.factory.Mappers;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.xta.client.factory.XdomeaXmlValuesTestFactory;
 import de.ozgcloud.xta.client.model.XtaMessageMetaData;
-import de.ozgcloud.xta.client.xdomea.reader.XdomeaXmlValues;
 
 class MetadataMapperTest {
 
@@ -105,7 +104,7 @@ class MetadataMapperTest {
 		void shouldMapAuthorIdentifierValue(String code) {
 			var metadata = doMapping(code);
 
-			assertThat(metadata.authorIdentifier().value()).isEqualTo(AUTHOR_ID_PREFIX + ":" + AUTHOR_ID_SUFFIX);
+			assertThat(metadata.authorIdentifier().value()).isEqualTo(MetadataMapper.AUTHOR_ID_PREFIX + ":" + AUTHOR_ID_SUFFIX);
 		}
 
 		@DisplayName("should map author identifier category")
@@ -123,7 +122,7 @@ class MetadataMapperTest {
 		void shouldMapReaderIdentifierValue(String code) {
 			var metadata = doMapping(code);
 
-			assertThat(metadata.readerIdentifier().value()).isEqualTo(READER_ID_PREFIX + ":" + READER_ID_SUFFIX);
+			assertThat(metadata.readerIdentifier().value()).isEqualTo(MetadataMapper.READER_ID_PREFIX + ":" + READER_ID_SUFFIX);
 		}
 
 		@DisplayName("should map reader identifier category")
@@ -135,8 +134,6 @@ class MetadataMapperTest {
 			assertThat(metadata.readerIdentifier().category()).isEqualTo(READER_ID_CATEGORY);
 		}
 
-		private final XdomeaXmlValues xdomeaXmlValues = XdomeaXmlValuesTestFactory.create();
-
 		@DisplayName("should throw technical exception with unknown message type code")
 		@Test
 		void shouldThrowTechnicalExceptionWithUnknownMessageTypeCode() {
@@ -150,10 +147,6 @@ class MetadataMapperTest {
 					.build());
 		}
 
-
-
-
-
 	}
 
 }
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactoryTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactoryTest.java
index e2fd3afd7e8daf8e5c006b135741a9f77515b190..4acd368a45533018285fee40eed16cba77dd36f9 100644
--- a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactoryTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderFactoryTest.java
@@ -41,9 +41,15 @@ class XdomeaValueReaderFactoryTest {
 		@Mock
 		XmlValueReader authorIdReader;
 
+		@Mock
+		XmlValueReader authorIdPrefixReader;
+
 		@Mock
 		XmlValueReader readerIdReader;
 
+		@Mock
+		XmlValueReader readerIdPrefixReader;
+
 		@Mock
 		XmlValueReader primaryDocumentNameReader;
 
@@ -54,7 +60,9 @@ class XdomeaValueReaderFactoryTest {
 			doReturn(procesIdReader).when(factory).createXmlValueReader(PROCESS_ID_XPATH);
 			doReturn(messageTypeReader).when(factory).createXmlValueReader(MESSAGE_TYPE_ID_SUFFIX_XPATH);
 			doReturn(authorIdReader).when(factory).createXmlValueReader(AUTHOR_ID_SUFFIX_XPATH);
+			doReturn(authorIdPrefixReader).when(factory).createXmlValueReader(AUTHOR_ID_PREFIX_XPATH);
 			doReturn(readerIdReader).when(factory).createXmlValueReader(READER_ID_SUFFIX_XPATH);
+			doReturn(readerIdPrefixReader).when(factory).createXmlValueReader(READER_ID_PREFIX_XPATH);
 			doReturn(primaryDocumentNameReader).when(factory).createXmlValueReader(PRIMARY_DOCUMENT_NAME_XPATH);
 
 			var reader = factory.create();
@@ -64,7 +72,9 @@ class XdomeaValueReaderFactoryTest {
 							PROCESS_ID_XPATH, procesIdReader,
 							MESSAGE_TYPE_ID_SUFFIX_XPATH, messageTypeReader,
 							AUTHOR_ID_SUFFIX_XPATH, authorIdReader,
+							AUTHOR_ID_PREFIX_XPATH, authorIdPrefixReader,
 							READER_ID_SUFFIX_XPATH, readerIdReader,
+							READER_ID_PREFIX_XPATH, readerIdPrefixReader,
 							PRIMARY_DOCUMENT_NAME_XPATH, primaryDocumentNameReader
 					)).build());
 		}
diff --git a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderTest.java b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderTest.java
index 5b47cc40f94490514007355bef9e10c618a38840..9c72e7ab2ab52438c42b923abbc78b4b519d335e 100644
--- a/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/xdomea/reader/XdomeaValueReaderTest.java
@@ -37,7 +37,9 @@ class XdomeaValueReaderTest {
 		private static final String PROCESS_ID = "process id";
 		private static final String MESSAGE_TYPE_CODE = "message type code";
 		private static final String AUTHOR_ID_SUFFIX = "author id suffix";
+		private static final String AUTHOR_ID_PREFIX = "author id prefix";
 		private static final String READER_ID_SUFFIX = "reader id suffix";
+		private static final String READER_ID_PREFIX = "reader id prefix";
 		private static final List<String> PRIMARY_DOCUMENT_NAMES = List.of("primary document name");
 
 		@Mock
@@ -49,7 +51,9 @@ class XdomeaValueReaderTest {
 			doReturn(PROCESS_ID).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.PROCESS_ID_XPATH);
 			doReturn(MESSAGE_TYPE_CODE).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.MESSAGE_TYPE_ID_SUFFIX_XPATH);
 			doReturn(AUTHOR_ID_SUFFIX).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.AUTHOR_ID_SUFFIX_XPATH);
+			doReturn(AUTHOR_ID_PREFIX).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.AUTHOR_ID_PREFIX_XPATH);
 			doReturn(READER_ID_SUFFIX).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.READER_ID_SUFFIX_XPATH);
+			doReturn(READER_ID_PREFIX).when(xdomeaValueReader).readRequiredValue(xdomeaXmlDocument, XdomeaValueReader.READER_ID_PREFIX_XPATH);
 			doReturn(PRIMARY_DOCUMENT_NAMES).when(xdomeaValueReader).readPrimaryDocumentNames(xdomeaXmlDocument);
 		}
 
@@ -77,6 +81,14 @@ class XdomeaValueReaderTest {
 			assertThat(result.authorIdSuffix()).isEqualTo(AUTHOR_ID_SUFFIX);
 		}
 
+		@DisplayName("should return author id prefix")
+		@Test
+		void shouldReturnAuthorIdPrefix() {
+			var result = readValues();
+
+			assertThat(result.authorIdPrefix()).isEqualTo(AUTHOR_ID_PREFIX);
+		}
+
 		@DisplayName("should return reader id suffix")
 		@Test
 		void shouldReturnReaderIdSuffix() {
@@ -85,6 +97,14 @@ class XdomeaValueReaderTest {
 			assertThat(result.readerIdSuffix()).isEqualTo(READER_ID_SUFFIX);
 		}
 
+		@DisplayName("should return reader id prefix")
+		@Test
+		void shouldReturnReaderIdPrefix() {
+			var result = readValues();
+
+			assertThat(result.readerIdPrefix()).isEqualTo(READER_ID_PREFIX);
+		}
+
 		@DisplayName("should return primary document names")
 		@Test
 		void shouldReturnPrimaryDocumentNames() {