diff --git a/common/src/main/java/de/itvsh/kop/eingangsadapter/common/file/TempFileUtils.java b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/file/TempFileUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3ce49a7b15ed125c4a3ab14e303e0fd73fe1754
--- /dev/null
+++ b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/file/TempFileUtils.java
@@ -0,0 +1,72 @@
+package de.itvsh.kop.eingangsadapter.common.file;
+
+import static de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile.*;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+
+import org.apache.commons.io.FileUtils;
+
+import de.itvsh.kop.common.errorhandling.TechnicalException;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class TempFileUtils {
+
+	public static File writeTmpFile(InputStream contentStream) {
+		try {
+			var tmpFile = createTmpFile();
+
+			Files.copy(contentStream, tmpFile, StandardCopyOption.REPLACE_EXISTING);
+			contentStream.close();
+			return tmpFile.toFile();
+		} catch (IOException e) {
+			throw new TechnicalException("Error writing file to temp file.", e);
+		}
+	}
+
+	public static File writeTmpFile(String stringData) {
+		try {
+			Path tmpFile = createTmpFile();
+
+			try (var writer = new FileWriter(tmpFile.toFile())) {
+				writer.write(stringData);
+				writer.flush();
+			}
+
+			return tmpFile.toFile();
+		} catch (IOException e) {
+			throw new TechnicalException("Error writing file to temp file.", e);
+		}
+	}
+
+	public static File writeTmpFile(byte[] data) {
+		try {
+			Path tmpFile = createTmpFile();
+
+			FileUtils.writeByteArrayToFile(tmpFile.toFile(), data);
+
+			return tmpFile.toFile();
+		} catch (IOException e) {
+			throw new TechnicalException("Error writing file to temp file.", e);
+		}
+
+	}
+
+	public static Path createTmpFile() {
+		try {
+			var tmpFile = Files.createTempFile(TMP_FILE_PREFIX, TMP_FILE_SUFFIX);
+			tmpFile.toFile().deleteOnExit();
+			return tmpFile;
+		} catch (IOException e) {
+			throw new TechnicalException("Error creating temporary file.", e);
+		}
+
+	}
+}
diff --git a/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFile.java b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFile.java
index 97c3308d87326b22f659367135c758fe787122a3..00734f365d2ce8deb8621998aad7706759dd1fb2 100644
--- a/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFile.java
+++ b/common/src/main/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFile.java
@@ -26,12 +26,7 @@ package de.itvsh.kop.eingangsadapter.common.formdata;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardCopyOption;
-import java.util.Objects;
 
 import de.itvsh.kop.common.errorhandling.TechnicalException;
 import lombok.Builder;
@@ -54,13 +49,7 @@ public class IncomingFile {
 
 	private File file;
 
-	@ToString.Exclude
-	private InputStream contentStream;
-
 	public InputStream getContentStream() {
-		if (Objects.isNull(file)) {
-			file = writeToFile();
-		}
 		try {
 			return new FileInputStream(file);
 		} catch (FileNotFoundException e) {
@@ -69,24 +58,7 @@ public class IncomingFile {
 	}
 
 	public InputStream getContentStreamForFinalRead() {
-		if (Objects.isNull(contentStream)) {
-			return DeleteOnCloseInputStream.from(file);
-		}
-		return contentStream;
+		return DeleteOnCloseInputStream.from(file);
 	}
 
-	File writeToFile() {
-		Path tmpFile;
-		try {
-			tmpFile = Files.createTempFile(TMP_FILE_PREFIX, TMP_FILE_SUFFIX);
-			tmpFile.toFile().deleteOnExit();
-
-			Files.copy(contentStream, tmpFile, StandardCopyOption.REPLACE_EXISTING);
-			contentStream.close();
-			contentStream = null;
-			return tmpFile.toFile();
-		} catch (IOException e) {
-			throw new TechnicalException("Error writing incoming file to temp file.", e);
-		}
-	}
 }
diff --git a/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTest.java b/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTest.java
index aa73c1abac24a857f878cce2977f624bd2b9720e..0526ce6e1106d083c1b905b33c74d3b293c30893 100644
--- a/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTest.java
+++ b/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTest.java
@@ -1,14 +1,10 @@
 package de.itvsh.kop.eingangsadapter.common.formdata;
 
+import static de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory.*;
 import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
 
-import java.io.ByteArrayInputStream;
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.function.Predicate;
@@ -17,15 +13,12 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
-import de.itvsh.kop.common.errorhandling.TechnicalException;
 import lombok.SneakyThrows;
 
 class IncomingFileTest {
 
 	private static final String TMP_DIRECTORY_PATH = System.getProperty("java.io.tmpdir");
 
-	private static final String TEST_CONTENT = "test123";
-
 	private static final Predicate<Path> hasNameSuffix = path -> path.getFileName().toString().endsWith(IncomingFile.TMP_FILE_SUFFIX);
 
 	@Nested
@@ -38,14 +31,14 @@ class IncomingFileTest {
 
 		@Test
 		void shouldCreateTmpFile() {
-			createTestIncomingFile().getContentStream();
+			IncomingFileTestFactory.create().getContentStream();
 
 			assertThat(noFilesWithSuffixInTempDirectory()).isFalse();
 		}
 
 		@Test
 		void shouldCreateDeleteOnCloseInputStream() {
-			var file = createTestIncomingFile();
+			var file = IncomingFileTestFactory.create();
 			file.getContentStream();
 			InputStream newStream = file.getContentStreamForFinalRead();
 
@@ -54,16 +47,16 @@ class IncomingFileTest {
 
 		@Test
 		void validateInputStreamContent() {
-			InputStream newStream = createTestIncomingFile().getContentStream();
+			InputStream newStream = IncomingFileTestFactory.create().getContentStream();
 
-			String text = convertResultToString(newStream);
+			byte[] text = read(newStream);
 
-			assertThat(text).isEqualTo(TEST_CONTENT);
+			assertThat(text).isEqualTo(CONTENT);
 		}
 
 		@Test
 		void shouldReturnNewInputStreamOnEveryRequest() {
-			IncomingFile incomingFile = createTestIncomingFile();
+			IncomingFile incomingFile = IncomingFileTestFactory.create();
 
 			InputStream stream1 = incomingFile.getContentStream();
 			InputStream stream2 = incomingFile.getContentStream();
@@ -73,25 +66,21 @@ class IncomingFileTest {
 
 		@Test
 		void contentStreamShouldBeMultipleReadable() {
-			IncomingFile incomingFile = createTestIncomingFile();
+			IncomingFile incomingFile = IncomingFileTestFactory.create();
 
 			InputStream stream1 = incomingFile.getContentStream();
 			InputStream stream2 = incomingFile.getContentStream();
 
-			assertThat(convertResultToString(stream1)).isEqualTo(TEST_CONTENT);
-			assertThat(convertResultToString(stream2)).isEqualTo(TEST_CONTENT);
+			assertThat(read(stream1)).isEqualTo(CONTENT);
+			assertThat(read(stream2)).isEqualTo(CONTENT);
 
 			InputStream stream3 = incomingFile.getContentStream();
-			assertThat(convertResultToString(stream3)).isEqualTo(TEST_CONTENT);
+			assertThat(read(stream3)).isEqualTo(CONTENT);
 		}
 
 		@SneakyThrows
-		private String convertResultToString(InputStream newStream) {
-			return new String(newStream.readAllBytes(), StandardCharsets.UTF_8);
-		}
-
-		IncomingFile createTestIncomingFile() {
-			return IncomingFile.builder().contentStream(new ByteArrayInputStream(TEST_CONTENT.getBytes())).build();
+		private byte[] read(InputStream stream) {
+			return stream.readAllBytes();
 		}
 	}
 
@@ -105,17 +94,4 @@ class IncomingFileTest {
 		return Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).noneMatch(hasNameSuffix);
 	}
 
-	@Nested
-	class TestWriteToFile {
-		@Test
-		@SneakyThrows
-		void shouldThrowTechnicalException() {
-			InputStream closedStream = mock(InputStream.class);
-			when(closedStream.transferTo(any())).thenThrow(IOException.class);
-			var file = IncomingFileTestFactory.createBuilder().contentStream(closedStream).build();
-
-			assertThatThrownBy(() -> file.writeToFile()).isInstanceOf(TechnicalException.class);
-
-		}
-	}
 }
diff --git a/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTestFactory.java b/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTestFactory.java
index 4cc9e18993faf7e6cea281cfa5a1d28f6c0d5596..22ab835d30059a5880f6c19d1f6af380301904da 100644
--- a/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTestFactory.java
+++ b/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/IncomingFileTestFactory.java
@@ -23,12 +23,12 @@
  */
 package de.itvsh.kop.eingangsadapter.common.formdata;
 
-import java.io.ByteArrayInputStream;
 import java.util.UUID;
 
 import org.springframework.http.MediaType;
 import org.springframework.mock.web.MockMultipartFile;
 
+import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils;
 import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile.IncomingFileBuilder;
 import lombok.SneakyThrows;
 
@@ -53,7 +53,7 @@ public class IncomingFileTestFactory {
 				.vendorId(VENDOR_ID)
 				.name(NAME)
 				.contentType(CONTENT_TYPE)
-				.contentStream(new ByteArrayInputStream(CONTENT))
+				.file(TempFileUtils.writeTmpFile(CONTENT))
 				.size(SIZE);
 	}
 
diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java
index 1702267a0ca19cf37ef769e1d6c2a41394bbe643..2462250618ed2967d8722067fa1fac675aacce54 100644
--- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java
+++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/FormDataController.java
@@ -40,6 +40,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.multipart.MultipartFile;
 
 import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException;
+import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils;
 import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
 import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
 import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroup;
@@ -110,7 +111,7 @@ class FormDataController {
 					.name(multipartFile.getOriginalFilename())
 					.size(multipartFile.getSize())
 					.contentType(multipartFile.getContentType())
-					.contentStream(multipartFile.getInputStream())
+					.file(TempFileUtils.writeTmpFile(multipartFile.getInputStream()))
 					.build();
 		} catch (IOException e) {
 			throw new TechnicalException("Error reading incoming file", e);
diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java
index 91c647211d5e3d4c390cabf8bf0ee6426e8816bd..8b1cec63b3749e014bb49f84a1b3f0afdc16f678 100644
--- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java
+++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java
@@ -23,8 +23,6 @@
  */
 package de.itvsh.kop.eingangsadapter.formsolutions;
 
-import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsFileMapperUtils.*;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -46,7 +44,9 @@ class FormSolutionsAttachmentsMapper {
 	public static final String FILE_GROUP_ZIP_NAME = "gezippte Anhänge";
 
 	List<IncomingFileGroup> mapAttachments(Map<String, Object> data) {
-		return mapZipRepresentation(Optional.ofNullable((String) data.get(ZIP)));
+		var result = mapZipRepresentation(Optional.ofNullable((String) data.get(ZIP)));
+		data.remove(ZIP);
+		return result;
 	}
 
 	List<IncomingFileGroup> mapZipRepresentation(Optional<String> encodedZip) {
@@ -67,7 +67,7 @@ class FormSolutionsAttachmentsMapper {
 	private IncomingFile buildZipFile(String content) {
 		return IncomingFile.builder()
 				.id(UUID.randomUUID().toString())
-				.contentStream(decodeFile(content))
+				.file(FormSolutionsFileMapperUtils.decodeBase64Content(content))
 				.contentType(ZIP_CONTENT_TYPE)
 				.name(FILE_NAME_ZIP_ATTACHMENT)
 				.build();
diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java
index 54562447257da8fbf25cd295bdb33422d2c39906..02dad87a32c47da80d5322c7454bce5ec92dc44d 100644
--- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java
+++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFileMapperUtils.java
@@ -24,9 +24,17 @@
 package de.itvsh.kop.eingangsadapter.formsolutions;
 
 import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.Base64;
 
+import org.apache.commons.io.IOUtils;
+
+import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException;
+import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 
@@ -39,4 +47,20 @@ class FormSolutionsFileMapperUtils {
 		return Base64.getDecoder().wrap(base64ContentStream);
 	}
 
+	static InputStream decode(InputStream b64InputStream) {
+		return Base64.getDecoder().wrap(b64InputStream);
+	}
+
+	static File decodeBase64Content(String content) {
+		var b64File = TempFileUtils.writeTmpFile(content);
+		var tempFile = TempFileUtils.createTmpFile();
+
+		try (var in = new FileInputStream(b64File); var out = new FileOutputStream(tempFile.toFile())) {
+			IOUtils.copy(FormSolutionsFileMapperUtils.decode(in), out);
+			out.flush();
+			return tempFile.toFile();
+		} catch (IOException e) {
+			throw new TechnicalException("Error decoding and saving b64 file.", e);
+		}
+	}
 }
\ No newline at end of file
diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java
index f6e4e1599d36d38727a6f3727ef9b83aaeea872e..fc61ce304635f52190fc79b1e2f850795a7c300f 100644
--- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java
+++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java
@@ -23,12 +23,9 @@
  */
 package de.itvsh.kop.eingangsadapter.formsolutions;
 
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardCopyOption;
+import static de.itvsh.kop.eingangsadapter.common.file.TempFileUtils.*;
+
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -38,7 +35,6 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Component;
 
-import de.itvsh.kop.common.errorhandling.TechnicalException;
 import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
 
 @Component
@@ -68,82 +64,25 @@ class FormSolutionsRepresentationsMapper {
 	}
 
 	private IncomingFile buildJsonFile(String jsonData) {
-		var jsonFile = writeFile(jsonData);
+		var jsonFile = writeTmpFile(jsonData);
 
 		return IncomingFile.builder()
-				.file(jsonFile.toFile())
+				.file(jsonFile)
 				.contentType(JSON_CONTENT_TYPE)
 				.name(FILE_NAME_JSON_REP)
-				.size(getFileSize(jsonFile))
+				.size(jsonFile.length())
 				.build();
 	}
 
 	private IncomingFile buildPdfFile(String data) {
-		var zipFile = writeFile(FormSolutionsFileMapperUtils.decodeFile(data));
+		File file = FormSolutionsFileMapperUtils.decodeBase64Content(data);
 
 		return IncomingFile.builder()
-				.file(zipFile.toFile())
-				.contentStream(FormSolutionsFileMapperUtils.decodeFile(data))
+				.file(file)
 				.contentType(PDF_CONTENT_TYPE)
 				.name(FILE_NAME_PDF_REP)
-				.size(getFileSize(zipFile))
+				.size(file.length())
 				.build();
 	}
 
-	long getSize(InputStream contentStream) {
-		var path = writeFile(contentStream);
-		var size = getFileSize(path);
-		deleteTmpFile(path);
-
-		return size;
-	}
-
-	Path writeFile(String stringData) {
-		try {
-			Path tmpFile = createTmpFile();
-
-			try (var writer = new FileWriter(tmpFile.toFile())) {
-				writer.write(stringData);
-				writer.flush();
-			}
-
-			return tmpFile;
-		} catch (IOException e) {
-			throw new TechnicalException("Error writing file to temp file.", e);
-		}
-	}
-
-	Path writeFile(InputStream contentStream) {
-		try {
-			var tmpFile = createTmpFile();
-
-			Files.copy(contentStream, tmpFile, StandardCopyOption.REPLACE_EXISTING);
-			contentStream.close();
-			return tmpFile;
-		} catch (IOException e) {
-			throw new TechnicalException("Error writing file to temp file.", e);
-		}
-	}
-
-	private Path createTmpFile() throws IOException {
-		var tmpFile = Files.createTempFile(TMP_FILE_PREFIX, TMP_FILE_SUFFIX);
-		tmpFile.toFile().deleteOnExit();
-		return tmpFile;
-	}
-
-	long getFileSize(Path path) {
-		try {
-			return Files.size(path);
-		} catch (IOException e) {
-			throw new TechnicalException("Error calculate size of tmp file.", e);
-		}
-	}
-
-	void deleteTmpFile(Path path) {
-		try {
-			Files.deleteIfExists(path);
-		} catch (IOException e) {
-			throw new TechnicalException("Error delete tmp file.", e);
-		}
-	}
 }
\ No newline at end of file
diff --git a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java
index 96033bf41979ee4a9c1e6a892380784f4b0ad676..bc88f739b6302c289de38aab59c77ce25c511581 100644
--- a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java
+++ b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java
@@ -27,11 +27,7 @@ import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFact
 import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsFilesTestFactory.*;
 import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsRepresentationsMapper.*;
 import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
 
-import java.io.IOException;
-import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -41,7 +37,6 @@ import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.Spy;
 
-import de.itvsh.kop.common.errorhandling.TechnicalException;
 import de.itvsh.kop.common.test.TestUtils;
 import de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory;
 import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
@@ -156,16 +151,4 @@ class FormSolutionsRepresentationsMapperTest {
 		}
 	}
 
-	@Nested
-	class TestWriteFile {
-
-		@Test
-		@SneakyThrows
-		void shouldThrowTechnicalException() {
-			InputStream closedStream = mock(InputStream.class);
-			when(closedStream.transferTo(any())).thenThrow(IOException.class);
-
-			assertThatThrownBy(() -> mapper.writeFile(closedStream)).isInstanceOf(TechnicalException.class);
-		}
-	}
 }
diff --git a/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdder.java b/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdder.java
index 362928686d7aba6b7d7309bf58acfab618abb231..d126559dc1916ae4ba0f7b8742087281b77bfa7b 100644
--- a/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdder.java
+++ b/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdder.java
@@ -23,7 +23,7 @@
  */
 package de.itvsh.kop.eingangsadapter.intelliform;
 
-import java.io.InputStream;
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -36,24 +36,24 @@ import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroup;
 @Component
 public class AttachmentsContentAdder {
 
-	List<IncomingFileGroup> addContentToAttachments(List<IncomingFileGroup> formDataFileGroups, List<IncomingFile> depositRequestFiles) {
+	public List<IncomingFileGroup> addContentToAttachments(List<IncomingFileGroup> formDataFileGroups, List<IncomingFile> depositRequestFiles) {
 		var fileGroups = new ArrayList<IncomingFileGroup>(formDataFileGroups.size());
 		for (IncomingFileGroup fileGroup : formDataFileGroups) {
 			var files = fileGroup.getFiles().stream()
-					.map(file -> file.toBuilder().contentStream(getContentStreamFromDepositRequest(file.getVendorId(), depositRequestFiles)).build())
+					.map(file -> file.toBuilder().file(getContentStreamFromDepositRequest(file.getVendorId(), depositRequestFiles)).build())
 					.toList();
 			fileGroups.add(fileGroup.toBuilder().clearFiles().files(files).build());
 		}
 		return Collections.unmodifiableList(fileGroups);
 	}
 
-	private InputStream getContentStreamFromDepositRequest(String attachmentVendorId, List<IncomingFile> depositRequestFiles) {
+	private File getContentStreamFromDepositRequest(String attachmentVendorId, List<IncomingFile> depositRequestFiles) {
 
 		return depositRequestFiles.stream()
 				.filter(depositFile -> depositFile.getVendorId().equals(attachmentVendorId))
-				.map(IncomingFile::getContentStream)
+				.map(IncomingFile::getFile)
 				.findFirst()
 				.orElseThrow(() -> new RuntimeException(
-						"DepositFiles does not contain content for (XML-Daten-)attachment with vendorId: " + attachmentVendorId));
+						"DepositFiles does not contain content for attachment with vendorId: " + attachmentVendorId));
 	}
 }
diff --git a/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/DepositRequestIncomingFileMapper.java b/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/DepositRequestIncomingFileMapper.java
index 1207c0c3719f8ec3733b981ed0fce57295796b6f..102e4fae4b97d712c74c2da4ae1c3293580ea385 100644
--- a/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/DepositRequestIncomingFileMapper.java
+++ b/intelliform-adapter/src/main/java/de/itvsh/kop/eingangsadapter/intelliform/DepositRequestIncomingFileMapper.java
@@ -23,12 +23,12 @@
  */
 package de.itvsh.kop.eingangsadapter.intelliform;
 
-import java.io.ByteArrayInputStream;
 import java.util.List;
 import java.util.UUID;
 
 import org.springframework.stereotype.Component;
 
+import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils;
 import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
 
 @Component
@@ -36,17 +36,19 @@ class DepositRequestIncomingFileMapper {
 
 	List<IncomingFile> mapFiles(Deposit depositData) {
 		return depositData.getData().getAttachments().stream()
-				.map(this::map).toList();
+				.map(this::buildIncomingFile).toList();
 	}
 
-	private IncomingFile map(Attachment xa) {
+	private IncomingFile buildIncomingFile(Attachment attachment) {
+		var file = TempFileUtils.writeTmpFile(attachment.content);
+
 		return IncomingFile.builder()
 				.id(UUID.randomUUID().toString())
-				.vendorId(xa.getId())
-				.name(xa.getName())
-				.contentType(xa.getContentType())
-				.contentStream(new ByteArrayInputStream(xa.content))
-				.size(xa.getContent().length)
+				.vendorId(attachment.getId())
+				.name(attachment.getName())
+				.file(file)
+				.contentType(attachment.getContentType())
+				.size(attachment.getContent().length)
 				.build();
 	}
 }
diff --git a/intelliform-adapter/src/test/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdderTest.java b/intelliform-adapter/src/test/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdderTest.java
index 040a00dd39f95ba5528e72f8091787919418ecdf..c8ea8bb58088c605a66768ac15461c0aef385bd7 100644
--- a/intelliform-adapter/src/test/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdderTest.java
+++ b/intelliform-adapter/src/test/java/de/itvsh/kop/eingangsadapter/intelliform/AttachmentsContentAdderTest.java
@@ -25,7 +25,6 @@ package de.itvsh.kop.eingangsadapter.intelliform;
 
 import static org.assertj.core.api.Assertions.*;
 
-import java.io.ByteArrayInputStream;
 import java.util.List;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -39,8 +38,6 @@ import lombok.SneakyThrows;
 
 class AttachmentsContentAdderTest {
 
-	private final static byte[] TESTCONTENT1 = "TestBytes".getBytes();
-
 	AttachmentsContentAdder service;
 
 	private List<IncomingFileGroup> attachments;
@@ -53,9 +50,9 @@ class AttachmentsContentAdderTest {
 		service = new AttachmentsContentAdder();
 
 		attachments = List.of(IncomingFileGroupTestFactory.createBuilder().clearFiles()
-				.files(List.of(IncomingFileTestFactory.createBuilder().contentStream(null).build())).build());
+				.files(List.of(IncomingFileTestFactory.createBuilder().file(null).build())).build());
 
-		depositRequestFiles = List.of(IncomingFileTestFactory.createBuilder().contentStream(new ByteArrayInputStream(TESTCONTENT1)).build());
+		depositRequestFiles = List.of(IncomingFileTestFactory.create());
 	}
 
 	@SneakyThrows
@@ -63,6 +60,6 @@ class AttachmentsContentAdderTest {
 	void testAddContentToAttachments() {
 		List<IncomingFileGroup> attachmentsWithContent = service.addContentToAttachments(attachments, depositRequestFiles);
 
-		assertThat(attachmentsWithContent.get(0).getFiles().get(0).getContentStream()).hasBinaryContent(TESTCONTENT1);
+		assertThat(attachmentsWithContent.get(0).getFiles().get(0).getContentStream()).hasBinaryContent(IncomingFileTestFactory.CONTENT);
 	}
 }
diff --git a/router/src/test/java/de/itvsh/kop/eingangsadapter/router/IncomingFileTestFactory.java b/router/src/test/java/de/itvsh/kop/eingangsadapter/router/IncomingFileTestFactory.java
deleted file mode 100644
index adca159776887be504d48e0326b3bd3b02a4c32c..0000000000000000000000000000000000000000
--- a/router/src/test/java/de/itvsh/kop/eingangsadapter/router/IncomingFileTestFactory.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-package de.itvsh.kop.eingangsadapter.router;
-
-import java.io.ByteArrayInputStream;
-import java.util.UUID;
-
-import de.itvsh.kop.common.binaryfile.FileId;
-import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public class IncomingFileTestFactory {
-
-	public static final FileId ID = FileId.createNew();
-	public static final String VENDOR_ID = UUID.randomUUID().toString();
-	public static final String NAME = "XML-Daten.xml";
-	public static final String CONTENT_TYPE_STR = "application/xml";
-	public static final byte[] CONTENT = "Da ziehe ich meinen virtuellen Hut!".getBytes();
-	public static final long SIZE = CONTENT.length;
-
-	public static IncomingFile create() {
-		return createBuilder().build();
-	}
-
-	public static IncomingFile.IncomingFileBuilder createBuilder() {
-		return IncomingFile.builder()
-				.id(ID.toString())
-				.vendorId(VENDOR_ID)
-				.name(NAME)
-				.contentType(CONTENT_TYPE_STR)
-				.size(SIZE)
-				.contentStream(new ByteArrayInputStream(CONTENT));
-	}
-}
diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReader.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReader.java
index ba36758d2e4a7efbf2f3c0bdd0a95f0bffd50170..1c0b1d2adb4375ebb623baa264db867dca5bbc06 100644
--- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReader.java
+++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/common/ZipAttachmentReader.java
@@ -197,18 +197,15 @@ public class ZipAttachmentReader {
 	}
 
 	IncomingFile createContentEntry(File file, ZipEntry zipEntry) {
-		try {
-			return IncomingFile.builder()
-					.name(zipEntry.getName())
-					.size(zipEntry.getSize())
-					.contentType(getContentType(zipEntry.getName()))
-					.contentStream(new DeleteOnCloseInputStream(file))
-					.build();
-		} catch (FileNotFoundException e) {
-			throw new TechnicalException("Original ZIP was deleted before it was processed", e);
-		}
+		return IncomingFile.builder()
+				.name(zipEntry.getName())
+				.size(zipEntry.getSize())
+				.contentType(getContentType(zipEntry.getName()))
+				.file(file)
+				.build();
 	}
 
+	@Deprecated
 	public InputStream getSourceZipAsStream() {
 		try {
 			return new DeleteOnCloseInputStream(sourceZipFile);
@@ -217,6 +214,10 @@ public class ZipAttachmentReader {
 		}
 	}
 
+	public File getSourceZip() {
+		return sourceZipFile;
+	}
+
 	public long getSourceFileSize() {
 		try {
 			return Files.size(sourceZipFile.toPath());
diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java
index bc88c2473afdf5fa77a67224f5e1061a58098e9a..e9cefb935f05c54d14b8384d065d8038cfa88974 100644
--- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java
+++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java
@@ -46,7 +46,8 @@ class FormSolutionsFilesMapper implements FormSolutionsEngineBasedMapper {
 	public FormData parseFormData(FormData srcFormData) {
 		var formDataBuilder = FilesMapperHelper.getAttachedFileGroups(srcFormData)
 				.map(this::collectAttachmentContent)
-				.map(fileGroups -> srcFormData.toBuilder().attachments(fileGroups).numberOfAttachments(FilesMapperHelper.countAttachedFiles(fileGroups)))
+				.map(fileGroups -> srcFormData.toBuilder().attachments(fileGroups)
+						.numberOfAttachments(FilesMapperHelper.countAttachedFiles(fileGroups)))
 				.orElseGet(srcFormData::toBuilder);
 
 		FilesMapperHelper.getRepresentations(srcFormData)
@@ -78,7 +79,7 @@ class FormSolutionsFilesMapper implements FormSolutionsEngineBasedMapper {
 		return IncomingFile.builder()
 				.name(zipAttachment.getSourceFileName())
 				.size(zipAttachment.getSourceFileSize())
-				.contentStream(zipAttachment.getSourceZipAsStream())
+				.file(zipAttachment.getSourceZip())
 				.contentType(ZIP_CONTENT_TYPE)
 				.build();
 	}
diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsEngineBasedAdapterITCase.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsEngineBasedAdapterITCase.java
index c4ca4ef958174919e48d9ceea438bc8314142b4e..1449e6279dc4b77fd53ad7cf6a5f9ca0912c3365 100644
--- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsEngineBasedAdapterITCase.java
+++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsEngineBasedAdapterITCase.java
@@ -25,22 +25,17 @@ package de.itvsh.kop.eingangsadapter.semantik.enginebased;
 
 import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory.*;
 import static de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory.*;
-import static de.itvsh.kop.eingangsadapter.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*;
 import static de.itvsh.kop.eingangsadapter.semantik.enginebased.FilesMapperHelper.*;
+import static de.itvsh.kop.eingangsadapter.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*;
 import static org.assertj.core.api.Assertions.*;
 
-import java.nio.charset.Charset;
+import java.io.File;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
-import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
-import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroupTestFactory;
-import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory;
-import de.itvsh.kop.eingangsadapter.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter;
-import lombok.SneakyThrows;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -54,9 +49,14 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 
 import de.itvsh.kop.common.test.TestUtils;
 import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException;
+import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils;
 import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
+import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
+import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroupTestFactory;
+import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory;
 import de.itvsh.kop.eingangsadapter.semantik.SemantikAdapter;
-import org.testcontainers.shaded.org.apache.commons.io.IOUtils;
+import de.itvsh.kop.eingangsadapter.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter;
+import lombok.SneakyThrows;
 
 @SpringBootTest
 @ActiveProfiles({ "local", "itcase" })
@@ -273,7 +273,7 @@ public class FormSolutionsEngineBasedAdapterITCase {
 						.clearFiles()
 						.file(IncomingFileTestFactory.createBuilder()
 								.name(FILE_NAME_ZIP_ATTACHMENT)
-								.contentStream(TestUtils.loadFile(FILE_NAME_ZIP_ATTACHMENT))
+								.file(asFile(FILE_NAME_ZIP_ATTACHMENT))
 								.size(getFileSize(FILE_NAME_ZIP_ATTACHMENT))
 								.contentType(ZIP_CONTENT_TYPE)
 								.build())
@@ -290,12 +290,12 @@ public class FormSolutionsEngineBasedAdapterITCase {
 		return List.of(
 				IncomingFileTestFactory.createBuilder()
 						.name(FILE_NAME_PDF_REP)
-						.contentStream(TestUtils.loadFile(FILE_NAME_PDF_REP))
+						.file(asFile(FILE_NAME_PDF_REP))
 						.size(getFileSize(FILE_NAME_PDF_REP))
 						.contentType(PDF_CONTENT_TYPE).build(),
 				IncomingFileTestFactory.createBuilder()
 						.name(FILE_NAME_JSON_REP)
-						.contentStream(IOUtils.toInputStream(SIMPLE_JSON_DATA, Charset.defaultCharset()))
+						.file(TempFileUtils.writeTmpFile(SIMPLE_JSON_DATA))
 						.size(SIMPLE_JSON_DATA.length())
 						.contentType(JSON_CONTENT_TYPE).build());
 	}
@@ -316,4 +316,8 @@ public class FormSolutionsEngineBasedAdapterITCase {
 			throw new TechnicalException("Error parsing test JSON " + msg, e);
 		}
 	}
+
+	private File asFile(String path) {
+		return TempFileUtils.writeTmpFile(TestUtils.loadFile(path));
+	}
 }
diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java
index ee2f48122124b14ea5535ffe7eafed9aa748cacd..e28bd3292374d64b4bd73f40f41b6836fa91b35b 100644
--- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java
+++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/formbased/DFoerdermittelFormBasedMapperTest.java
@@ -18,6 +18,7 @@ import org.mockito.Mock;
 import org.mockito.Spy;
 
 import de.itvsh.kop.common.test.TestUtils;
+import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils;
 import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
 import de.itvsh.kop.eingangsadapter.common.formdata.FormDataTestFactory;
 import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
@@ -123,8 +124,10 @@ class DFoerdermittelFormBasedMapperTest {
 	}
 
 	IncomingFile createFachnachrichtFile() {
+		var tmpFile = TempFileUtils.writeTmpFile(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml"));
+
 		return IncomingFile.builder()
-				.contentStream(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml"))
+				.file(tmpFile)
 				.contentType("application/xml")
 				.size(1283)
 				.name("Beispieldatensatz_Fachnachricht.xml")