diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReader.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..770f2257667bfa88aaf74787e6fc005cac7fbb49
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReader.java
@@ -0,0 +1,33 @@
+package de.ozgcloud.archive.common.xta;
+
+import java.io.IOException;
+
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.JAXBException;
+import jakarta.xml.bind.Unmarshaller;
+
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.xta.client.model.XtaFile;
+
+class XtaFileReader<T> {
+
+	private final Unmarshaller unmarshaller;
+
+	XtaFileReader(Class<T> clazz) {
+		try {
+			unmarshaller = JAXBContext.newInstance(clazz).createUnmarshaller();
+		} catch (JAXBException e) {
+			throw new TechnicalException("Error reading xta file content", e);
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	public T read(XtaFile xtaFile) {
+		try {
+			return (T) unmarshaller.unmarshal(xtaFile.content().getInputStream());
+		} catch (JAXBException | IOException e) {
+			throw new TechnicalException("Error on reading file %s.".formatted(xtaFile.name()), e);
+		}
+	}
+
+}
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReaderTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReaderTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..8cd4ed861b7fa8cd821d2f56f29733847c273a27
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReaderTest.java
@@ -0,0 +1,55 @@
+package de.ozgcloud.archive.common.xta;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.Unmarshaller;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.common.test.ReflectionTestUtils;
+import de.ozgcloud.xta.client.model.XtaFile;
+import de.xoev.xdomea.AbgabeImportBestaetigen0402;
+import lombok.SneakyThrows;
+
+class XtaFileReaderTest {
+
+	@Nested
+	class TestConstruction {
+
+		@Test
+		@SneakyThrows
+		void shouldSetUnmarshaller() {
+			var reader = new XtaFileReader<AbgabeImportBestaetigen0402>(AbgabeImportBestaetigen0402.class);
+
+			assertThat(ReflectionTestUtils.getField(reader, "unmarshaller", Unmarshaller.class)).usingRecursiveComparison()
+					.isEqualTo(JAXBContext.newInstance(AbgabeImportBestaetigen0402.class).createUnmarshaller());
+		}
+	}
+
+	@Nested
+	class TestRead {
+
+		@Test
+		@SneakyThrows
+		void shouldReadContent() {
+			var reader = new XtaFileReader<AbgabeImportBestaetigen0402>(AbgabeImportBestaetigen0402.class);
+
+			var abgabe = reader.read(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH));
+
+			assertThat(abgabe).usingRecursiveComparison().isEqualTo(AbgabeImportBestaetigen0402TestFactory.create());
+		}
+
+		@Test
+		@SneakyThrows
+		void shouldThrowTechnicalException() {
+			var reader = new XtaFileReader<AbgabeImportBestaetigen0402>(AbgabeImportBestaetigen0402.class);
+			XtaFile unknownFile = XtaFileTestFactory.create();
+
+			assertThrows(TechnicalException.class, () -> reader.read(unknownFile));
+		}
+	}
+}