diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java b/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java
index f89780a3f527aa8becfa0f84f766ce41a0159b0c..64681cfe9abead1d25b6f0d8626241b0f90244a7 100644
--- a/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java
+++ b/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java
@@ -33,7 +33,7 @@ class XtaClientITCase {
 	static final XtaTestServerSetupExtension XTA_TEST_SERVER_SETUP_EXTENSION = new XtaTestServerSetupExtension();
 	static final int TWO_MAX_LIST_ITEMS = 2;
 
-	private XtaClient setupClient;
+	private XtaClient silentTestClient;
 	private XtaClient testClient;
 
 	private List<XtaMessageMetaData> supportCheckedMetadataItems;
@@ -49,16 +49,17 @@ class XtaClientITCase {
 		supportCheckedMetadataItems = new ArrayList<>();
 		isSupportedDummy = (metaData) -> true;
 		processedMessages = new ArrayList<>();
-		setupClient = XTA_TEST_SERVER_SETUP_EXTENSION.getSetupClient();
+		silentTestClient = XTA_TEST_SERVER_SETUP_EXTENSION.getSilentTestClient();
 
 		StaticStringListAppender.clearLogLines();
 		closeMessagesForAllReaders();
 	}
 
 	private void closeMessagesForAllReaders() {
-		closeAllMessages(setupClient, READER_CLIENT_IDENTIFIER1);
-		closeAllMessages(setupClient, READER_CLIENT_IDENTIFIER2);
-		closeAllMessages(setupClient, READER_CLIENT_IDENTIFIER3);
+		var silentTestClientConfig = XTA_TEST_SERVER_SETUP_EXTENSION.getSilentTestClientConfig();
+		closeAllMessages(silentTestClientConfig, READER_CLIENT_IDENTIFIER1);
+		closeAllMessages(silentTestClientConfig, READER_CLIENT_IDENTIFIER2);
+		closeAllMessages(silentTestClientConfig, READER_CLIENT_IDENTIFIER3);
 	}
 
 	@DisplayName("fetch messages")
@@ -79,7 +80,7 @@ class XtaClientITCase {
 					createMessage("versammlungsanzeige", AUTHOR_CLIENT_IDENTIFIER3, READER_CLIENT_IDENTIFIER3)
 			);
 			sendMessageIds = sendMessages.stream()
-					.map(message -> sendTestMessage(setupClient, message))
+					.map(message -> sendTestMessage(silentTestClient, message))
 					.toList();
 		}
 
@@ -138,7 +139,7 @@ class XtaClientITCase {
 			assertThatMessages(processedMessages).containExactlyInAnyOrder(sendMessages.getFirst());
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(messageIdBySendIndex(0));
+					.haveExactlyClosedStatusFor(messageIdBySendIndex(0));
 		}
 
 		@DisplayName("should fetch messages from second reader")
@@ -152,7 +153,7 @@ class XtaClientITCase {
 			assertThatMessages(processedMessages).containExactlyInAnyOrder(sendMessages.get(1), sendMessages.get(2), sendMessages.get(3));
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(messageIdBySendIndex(1), messageIdBySendIndex(2), messageIdBySendIndex(3));
+					.haveExactlyClosedStatusFor(messageIdBySendIndex(1), messageIdBySendIndex(2), messageIdBySendIndex(3));
 		}
 
 		@DisplayName("should fetch messages from first and second reader")
@@ -169,7 +170,7 @@ class XtaClientITCase {
 			);
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(
+					.haveExactlyClosedStatusFor(
 							messageIdBySendIndex(0),
 							messageIdBySendIndex(1), messageIdBySendIndex(2), messageIdBySendIndex(3)
 					);
@@ -190,7 +191,7 @@ class XtaClientITCase {
 			);
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(
+					.haveExactlyClosedStatusFor(
 							messageIdBySendIndex(0),
 							messageIdBySendIndex(1), messageIdBySendIndex(2), messageIdBySendIndex(3),
 							messageIdBySendIndex(4), messageIdBySendIndex(5)
@@ -214,7 +215,7 @@ class XtaClientITCase {
 			);
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(
+					.haveExactlyClosedStatusFor(
 							messageIdBySendIndex(0),
 							messageIdBySendIndex(1), messageIdBySendIndex(2)
 					);
@@ -237,7 +238,7 @@ class XtaClientITCase {
 			);
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(
+					.haveExactlyClosedStatusFor(
 							messageIdBySendIndex(5)
 					);
 		}
@@ -263,7 +264,7 @@ class XtaClientITCase {
 			assertThatMessages(processedMessages).containExactlyInAnyOrder(sendMessages.get(0), sendMessages.get(1), sendMessages.get(2));
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(messageIdBySendIndex(0), messageIdBySendIndex(1), messageIdBySendIndex(2));
+					.haveExactlyClosedStatusFor(messageIdBySendIndex(0), messageIdBySendIndex(1), messageIdBySendIndex(2));
 		}
 
 		@DisplayName("should process messages only if supported, with support for author3")
@@ -279,7 +280,7 @@ class XtaClientITCase {
 			assertThatMessages(processedMessages).containExactlyInAnyOrder(sendMessages.get(5));
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(messageIdBySendIndex(5));
+					.haveExactlyClosedStatusFor(messageIdBySendIndex(5));
 		}
 
 		@SneakyThrows
@@ -339,7 +340,7 @@ class XtaClientITCase {
 		@Test
 		@SneakyThrows
 		void shouldReturnTransportReportWithOpenStatus() {
-			var transportReport = setupClient.sendMessage(message);
+			var transportReport = silentTestClient.sendMessage(message);
 
 			assertThat(transportReport.status()).isEqualTo(XtaMessageStatus.OPEN);
 		}
diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientRemoteITCase.java b/src/test/java/de/ozgcloud/xta/client/XtaClientRemoteITCase.java
index 72384e7b843bf3414d0d5aeee77e2e1af58bf3ae..0ceac4857e86725204502ed1d2828a864c891ce7 100644
--- a/src/test/java/de/ozgcloud/xta/client/XtaClientRemoteITCase.java
+++ b/src/test/java/de/ozgcloud/xta/client/XtaClientRemoteITCase.java
@@ -77,8 +77,8 @@ class XtaClientRemoteITCase {
 		silentDevClient = XTA_REMOTE_SERVER_SETUP_EXTENSION.getSilentDevClient();
 
 		// Fail if any message pending, to ensure that we do not clear existing messages in the DEV environment
-		failIfAnyMessagePending(silentDevClient, DEV_READER_CLIENT_IDENTIFIER);
-		failIfAnyMessagePending(silentTestClient, TEST_READER_CLIENT_IDENTIFIER);
+		failIfAnyMessagePending(XTA_REMOTE_SERVER_SETUP_EXTENSION.getSilentDevClientConfig(), DEV_READER_CLIENT_IDENTIFIER);
+		failIfAnyMessagePending(XTA_REMOTE_SERVER_SETUP_EXTENSION.getSilentTestClientConfig(), TEST_READER_CLIENT_IDENTIFIER);
 
 		StaticStringListAppender.clearLogLines();
 	}
@@ -89,8 +89,8 @@ class XtaClientRemoteITCase {
 	}
 
 	private void closeMessagesForAllReaders() {
-		closeAllMessages(silentDevClient, DEV_READER_CLIENT_IDENTIFIER);
-		closeAllMessages(silentTestClient, TEST_READER_CLIENT_IDENTIFIER);
+		closeAllMessages(XTA_REMOTE_SERVER_SETUP_EXTENSION.getSilentDevClientConfig(), DEV_READER_CLIENT_IDENTIFIER);
+		closeAllMessages(XTA_REMOTE_SERVER_SETUP_EXTENSION.getSilentTestClientConfig(), TEST_READER_CLIENT_IDENTIFIER);
 	}
 
 	@DisplayName("fetch messages")
@@ -153,7 +153,7 @@ class XtaClientRemoteITCase {
 			assertThatMessages(processedMessages).containExactlyInAnyOrder(sendMessages.getFirst());
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(messageIdBySendIndex(0));
+					.haveExactlyClosedStatusFor(messageIdBySendIndex(0));
 		}
 
 		@DisplayName("should fetch messages from second reader")
@@ -167,7 +167,7 @@ class XtaClientRemoteITCase {
 			assertThatMessages(processedMessages).containExactlyInAnyOrder(sendMessages.get(1), sendMessages.get(2), sendMessages.get(3));
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(messageIdBySendIndex(1), messageIdBySendIndex(2), messageIdBySendIndex(3));
+					.haveExactlyClosedStatusFor(messageIdBySendIndex(1), messageIdBySendIndex(2), messageIdBySendIndex(3));
 		}
 
 		@DisplayName("should fetch messages from first and second reader")
@@ -184,7 +184,7 @@ class XtaClientRemoteITCase {
 			);
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(
+					.haveExactlyClosedStatusFor(
 							messageIdBySendIndex(0),
 							messageIdBySendIndex(1), messageIdBySendIndex(2), messageIdBySendIndex(3)
 					);
@@ -194,11 +194,11 @@ class XtaClientRemoteITCase {
 		private void setupClientsWithIdentifiers(List<XtaIdentifier> identifiers) {
 			devClient = createClientWithIdentifiersAndClientCert(
 					identifiers,
-					XTA_REMOTE_SERVER_SETUP_EXTENSION.getDevClientCertKeyStore()
+					XTA_REMOTE_SERVER_SETUP_EXTENSION.getDevClientConfig().getClientCertKeystore()
 			);
 			testClient = createClientWithIdentifiersAndClientCert(
 					identifiers,
-					XTA_REMOTE_SERVER_SETUP_EXTENSION.getTestClientCertKeyStore()
+					XTA_REMOTE_SERVER_SETUP_EXTENSION.getTestClientConfig().getClientCertKeystore()
 			);
 		}
 
diff --git a/src/test/java/de/ozgcloud/xta/client/extension/XtaRemoteServerSetupExtension.java b/src/test/java/de/ozgcloud/xta/client/extension/XtaRemoteServerSetupExtension.java
index 34d8b06d5e996b491b0fb742baa0408c6b072803..cf59130cf1751c7160074766f8741f3055d4c8a7 100644
--- a/src/test/java/de/ozgcloud/xta/client/extension/XtaRemoteServerSetupExtension.java
+++ b/src/test/java/de/ozgcloud/xta/client/extension/XtaRemoteServerSetupExtension.java
@@ -14,7 +14,6 @@ import de.ozgcloud.xta.client.XtaClient;
 import de.ozgcloud.xta.client.XtaClientFactory;
 import de.ozgcloud.xta.client.config.XtaClientConfig;
 import de.ozgcloud.xta.client.core.WrappedXtaService;
-
 import lombok.Getter;
 import lombok.Setter;
 import lombok.SneakyThrows;
@@ -26,11 +25,13 @@ import lombok.extern.slf4j.Slf4j;
 public class XtaRemoteServerSetupExtension implements BeforeAllCallback {
 
 	private XtaClient testClient;
+	private XtaClientConfig testClientConfig;
 	private XtaClient silentTestClient;
-	private XtaClientConfig.KeyStore testClientCertKeyStore;
+	private XtaClientConfig silentTestClientConfig;
 	private XtaClient devClient;
+	private XtaClientConfig devClientConfig;
 	private XtaClient silentDevClient;
-	private XtaClientConfig.KeyStore devClientCertKeyStore;
+	private XtaClientConfig silentDevClientConfig;
 
 	private WrappedXtaService service;
 	private XtaClientFactory clientFactory;
@@ -40,12 +41,23 @@ public class XtaRemoteServerSetupExtension implements BeforeAllCallback {
 	@Override
 	@SneakyThrows
 	public void beforeAll(ExtensionContext context) {
-		testClientCertKeyStore = createClientCertKeyStore(getEnvVar("KOP_SH_KIEL_TEST_PATH"), getEnvVar("KOP_SH_KIEL_TEST_PASSWORD"));
-		testClient = setupClient(testClientCertKeyStore, true);
-		silentTestClient = setupClient(testClientCertKeyStore, false);
-		devClientCertKeyStore = createClientCertKeyStore(getEnvVar("KOP_SH_KIEL_DEV_PATH"), getEnvVar("KOP_SH_KIEL_DEV_PASSWORD"));
-		devClient = setupClient(devClientCertKeyStore, true);
-		silentDevClient = setupClient(devClientCertKeyStore, false);
+		testClientConfig = createClientConfig(
+				createClientCertKeyStore(getEnvVar("KOP_SH_KIEL_TEST_PATH"), getEnvVar("KOP_SH_KIEL_TEST_PASSWORD")),
+				true);
+		testClient = XtaClient.from(testClientConfig);
+		silentTestClientConfig = createClientConfig(
+				testClientConfig.getClientCertKeystore(),
+				false);
+		silentTestClient = XtaClient.from(silentTestClientConfig);
+
+		devClientConfig = createClientConfig(
+				createClientCertKeyStore(getEnvVar("KOP_SH_KIEL_DEV_PATH"), getEnvVar("KOP_SH_KIEL_DEV_PASSWORD")),
+				true);
+		silentDevClientConfig = createClientConfig(
+				devClientConfig.getClientCertKeystore(),
+				false);
+		devClient = XtaClient.from(devClientConfig);
+		silentDevClient = XtaClient.from(silentDevClientConfig);
 	}
 
 	private XtaClientConfig.KeyStore createClientCertKeyStore(String clientCertKeystorePath, String clientCertKeystorePassword) {
@@ -57,19 +69,18 @@ public class XtaRemoteServerSetupExtension implements BeforeAllCallback {
 	}
 
 	@SneakyThrows
-	XtaClient setupClient(XtaClientConfig.KeyStore clientCertKeyStore, boolean verbose) {
-		return XtaClient.from(createSpecificClientConfigBuilder()
+	XtaClientConfig createClientConfig(XtaClientConfig.KeyStore clientCertKeyStore, boolean verbose) {
+		return createSpecificClientConfigBuilder()
 				.logSoapRequests(verbose)
 				.logSoapResponses(verbose)
 				.clientCertKeystore(clientCertKeyStore)
-				.build());
+				.build();
 	}
 
 	private String getEnvVar(String name) {
 		return Objects.requireNonNull(System.getenv(name), "Environment variable " + name + " is required!");
 	}
 
-
 	@SneakyThrows
 	private static byte[] readBytesFromFile(String path) {
 		return Files.toByteArray(new File(path));
diff --git a/src/test/java/de/ozgcloud/xta/client/extension/XtaServerSetupExtensionTestUtil.java b/src/test/java/de/ozgcloud/xta/client/extension/XtaServerSetupExtensionTestUtil.java
index 18197005703eb1230cf668f961f0a5fbd2bbf02d..221bf4961c21aa3a5eadd37ead8e92024ee33ac1 100644
--- a/src/test/java/de/ozgcloud/xta/client/extension/XtaServerSetupExtensionTestUtil.java
+++ b/src/test/java/de/ozgcloud/xta/client/extension/XtaServerSetupExtensionTestUtil.java
@@ -5,15 +5,15 @@ import static org.assertj.core.api.Assertions.*;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
 import java.util.function.Function;
-import java.util.function.UnaryOperator;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
 import de.ozgcloud.xta.client.XtaClient;
 import de.ozgcloud.xta.client.config.XtaClientConfig;
 import de.ozgcloud.xta.client.core.WrappedXtaService;
-import de.ozgcloud.xta.client.core.XtaClientService;
+import de.ozgcloud.xta.client.core.WrappedXtaServiceFactory;
 import de.ozgcloud.xta.client.exception.XtaClientRuntimeException;
 import de.ozgcloud.xta.client.model.XtaFile;
 import de.ozgcloud.xta.client.model.XtaIdentifier;
@@ -76,12 +76,6 @@ public class XtaServerSetupExtensionTestUtil {
 				.logSoapResponses(true);
 	}
 
-	@SneakyThrows
-	public static String sendTestMessage(XtaClient client, XtaMessageExampleLoader.MessageExampleConfig messageExampleConfig) {
-		var message = XtaMessageExampleLoader.load(messageExampleConfig);
-		return sendTestMessage(client, message);
-	}
-
 	@SneakyThrows
 	public static String sendTestMessage(XtaClient client, XtaMessage message) {
 		try {
@@ -108,8 +102,8 @@ public class XtaServerSetupExtensionTestUtil {
 	}
 
 	@SneakyThrows
-	public static void failIfAnyMessagePending(XtaClient client, XtaIdentifier clientId) {
-		var wrappedService = getWrappedService(client);
+	public static void failIfAnyMessagePending(XtaClientConfig config, XtaIdentifier clientId) {
+		var wrappedService = createWrappedService(config);
 		var result = wrappedService.getStatusList(clientId, 1);
 		if (!result.messages().isEmpty()) {
 			fail("Expect no pending xta-messages for reader %s! Ensure that the mailbox is empty before running this test.".formatted(
@@ -118,8 +112,8 @@ public class XtaServerSetupExtensionTestUtil {
 	}
 
 	@SneakyThrows
-	public static void closeAllMessages(XtaClient client, XtaIdentifier clientId) {
-		var wrappedService = getWrappedService(client);
+	public static void closeAllMessages(XtaClientConfig config, XtaIdentifier clientId) {
+		var wrappedService = createWrappedService(config);
 
 		var result = wrappedService.getStatusList(clientId, 100);
 		var messageIds = result.messages().stream()
@@ -130,17 +124,9 @@ public class XtaServerSetupExtensionTestUtil {
 		}
 	}
 
-	private static WrappedXtaService getWrappedService(XtaClient client) {
-		XtaClientService clientService = getPrivateFieldValue(client, "service");
-		return getPrivateFieldValue(clientService, "service");
-	}
-
-	@SuppressWarnings("unchecked")
 	@SneakyThrows
-	private static <T> T getPrivateFieldValue(Object object, String fieldName) {
-		var field = object.getClass().getDeclaredField(fieldName);
-		field.setAccessible(true);
-		return (T) field.get(object);
+	private static WrappedXtaService createWrappedService(XtaClientConfig config) {
+		return WrappedXtaServiceFactory.from(config).create();
 	}
 
 	public static XtaMessageMetaData withoutMessageIdAndSize(XtaMessageMetaData metaData) {
@@ -157,76 +143,10 @@ public class XtaServerSetupExtensionTestUtil {
 	}
 
 	public record MessagesAssert(List<XtaMessage> processedMessages) {
+
 		public MessagesAssert containExactlyInAnyOrder(XtaMessage... messages) {
 			try {
-				containMetaDataExactlyInAnyOrder(Arrays.stream(messages)
-						.map(XtaMessage::metaData)
-						.toArray(XtaMessageMetaData[]::new)
-				);
-
-				// Assert equal message file and attachment files without content (ignoring size since it may be null before sending)
-				UnaryOperator<XtaFile> withoutContentAndSize = xtaFile -> xtaFile.toBuilder()
-						.content(null)
-						.size(null)
-						.build();
-				assertThat(processedMessages)
-						.extracting(XtaMessage::messageFile)
-						.extracting(withoutContentAndSize)
-						.containsExactlyInAnyOrderElementsOf(Arrays.stream(messages)
-								.map(XtaMessage::messageFile)
-								.map(withoutContentAndSize)
-								.toList());
-				UnaryOperator<List<XtaFile>> filesWithoutContentAndSize = fileList -> fileList.stream().map(withoutContentAndSize).toList();
-				assertThat(processedMessages)
-						.extracting(XtaMessage::attachmentFiles)
-						.extracting(filesWithoutContentAndSize)
-						.containsExactlyInAnyOrderElementsOf(Arrays.stream(messages)
-								.map(XtaMessage::attachmentFiles)
-								.map(filesWithoutContentAndSize)
-								.toList());
-
-				// Assert equal content of message file
-				var listOfMessageFileContents = processedMessages.stream()
-						.map(XtaMessage::messageFile)
-						.map(XtaServerSetupExtensionTestUtil::readBytesOfXtaFile)
-						.toList();
-				var exceptedListOfMessageFileContents = Arrays.stream(messages)
-						.map(XtaMessage::messageFile)
-						.map(XtaServerSetupExtensionTestUtil::readBytesOfXtaFile)
-						.toList();
-				Function<byte[], Integer> contentLength = b -> b.length;
-				assertThat(listOfMessageFileContents)
-						.extracting(contentLength)
-						.containsExactlyInAnyOrderElementsOf(exceptedListOfMessageFileContents.stream().map(contentLength).toList());
-				assertThat(listOfMessageFileContents).containsExactlyInAnyOrderElementsOf(exceptedListOfMessageFileContents);
-
-				// Assert equal content of attachment files
-				var attachmentFileContents = processedMessages.stream()
-						.map(XtaMessage::attachmentFiles)
-						.map(XtaServerSetupExtensionTestUtil::readBytesOfXtaFiles)
-						.toList();
-				var exceptedAttachmentFileContents = Arrays.stream(messages)
-						.map(XtaMessage::attachmentFiles)
-						.map(XtaServerSetupExtensionTestUtil::readBytesOfXtaFiles)
-						.toList();
-				Function<List<byte[]>, List<Integer>> contentLengths = contentList -> contentList.stream().map(contentLength).toList();
-				assertThat(attachmentFileContents)
-						.extracting(contentLengths)
-						.containsExactlyInAnyOrderElementsOf(exceptedAttachmentFileContents.stream().map(contentLengths).toList());
-
-				assertThat(attachmentFileContents)
-						.usingElementComparator((a, b) -> {
-							var sizeComparison = Integer.compare(a.size(), b.size());
-							return sizeComparison != 0
-									? sizeComparison
-									: IntStream.range(0, a.size())
-											.map(i -> Arrays.compare(a.get(i), b.get(i)))
-											.filter(i -> i != 0)
-											.findFirst()
-											.orElse(0);
-						})
-						.containsExactlyInAnyOrderElementsOf(exceptedAttachmentFileContents);
-
+				containExactlyInAnyOrderRaw(messages);
 			} catch (AssertionError | RuntimeException e) {
 				log.error("Messages do not exactly contain excepted messages!");
 				throw e;
@@ -234,6 +154,106 @@ public class XtaServerSetupExtensionTestUtil {
 			return this;
 		}
 
+		private void containExactlyInAnyOrderRaw(XtaMessage... messages) {
+			var messageMetaData = Arrays.stream(messages)
+					.map(XtaMessage::metaData)
+					.toArray(XtaMessageMetaData[]::new);
+			containMetaDataExactlyInAnyOrder(messageMetaData);
+
+			assertEqualMessageFileWithoutContent(messages);
+			assertEqualAttachmentFilesWithoutContent(messages);
+
+			assertEqualContentOfMessageFile(messages);
+			assertEqualContentOfAttachmentFiles(messages);
+		}
+
+		private void assertEqualMessageFileWithoutContent(XtaMessage... messages) {
+			// ignoring size since it may be null before sending
+			assertThat(processedMessages)
+					.extracting(XtaMessage::messageFile)
+					.extracting(this::withoutContentAndSize)
+					.containsExactlyInAnyOrderElementsOf(Arrays.stream(messages)
+							.map(XtaMessage::messageFile)
+							.map(this::withoutContentAndSize)
+							.toList());
+		}
+
+		private void assertEqualAttachmentFilesWithoutContent(XtaMessage... messages) {
+			// ignoring size since it may be null before sending
+			assertThat(processedMessages)
+					.extracting(XtaMessage::attachmentFiles)
+					.extracting(this::filesWithoutContentAndSize)
+					.containsExactlyInAnyOrderElementsOf(Arrays.stream(messages)
+							.map(XtaMessage::attachmentFiles)
+							.map(this::filesWithoutContentAndSize)
+							.toList());
+		}
+
+		private List<XtaFile> filesWithoutContentAndSize(List<XtaFile> fileList) {
+			return fileList.stream().map(this::withoutContentAndSize).toList();
+		}
+
+		private XtaFile withoutContentAndSize(XtaFile xtaFile) {
+			return xtaFile.toBuilder()
+					.content(null)
+					.size(null)
+					.build();
+		}
+
+		private void assertEqualContentOfMessageFile(XtaMessage... messages) {
+			var listOfMessageFileContents = processedMessages.stream()
+					.map(XtaMessage::messageFile)
+					.map(XtaServerSetupExtensionTestUtil::readBytesOfXtaFile)
+					.toList();
+			var exceptedListOfMessageFileContents = Arrays.stream(messages)
+					.map(XtaMessage::messageFile)
+					.map(XtaServerSetupExtensionTestUtil::readBytesOfXtaFile)
+					.toList();
+			assertThat(listOfMessageFileContents)
+					.extracting(b -> b.length)
+					.containsExactlyInAnyOrderElementsOf(exceptedListOfMessageFileContents.stream().map(b -> b.length).toList());
+			assertThat(listOfMessageFileContents).containsExactlyInAnyOrderElementsOf(exceptedListOfMessageFileContents);
+		}
+
+		private void assertEqualContentOfAttachmentFiles(XtaMessage... messages) {
+			var attachmentFileContents = processedMessages.stream()
+					.map(XtaMessage::attachmentFiles)
+					.map(XtaServerSetupExtensionTestUtil::readBytesOfXtaFiles)
+					.toList();
+			var exceptedAttachmentFileContents = Arrays.stream(messages)
+					.map(XtaMessage::attachmentFiles)
+					.map(XtaServerSetupExtensionTestUtil::readBytesOfXtaFiles)
+					.toList();
+			assertEqualLengthOfAttachmentFiles(attachmentFileContents, exceptedAttachmentFileContents);
+			assertEqualRawContentOfAttachmentFiles(attachmentFileContents, exceptedAttachmentFileContents);
+		}
+
+		private void assertEqualLengthOfAttachmentFiles(List<List<byte[]>> attachmentFileContents,
+				List<List<byte[]>> exceptedAttachmentFileContents) {
+			Function<List<byte[]>, List<Integer>> contentLengths = contentList -> contentList.stream().map(b -> b.length).toList();
+			assertThat(attachmentFileContents)
+					.extracting(contentLengths)
+					.containsExactlyInAnyOrderElementsOf(exceptedAttachmentFileContents.stream().map(contentLengths).toList());
+		}
+
+		private void assertEqualRawContentOfAttachmentFiles(List<List<byte[]>> attachmentFileContents,
+				List<List<byte[]>> exceptedAttachmentFileContents) {
+			assertThat(attachmentFileContents)
+					.usingElementComparator(this::compareAttachmentFiles)
+					.containsExactlyInAnyOrderElementsOf(exceptedAttachmentFileContents);
+		}
+
+		private int compareAttachmentFiles(List<byte[]> a, List<byte[]> b) {
+			var sizeComparison = Integer.compare(a.size(), b.size());
+			return sizeComparison != 0
+					? sizeComparison
+					: IntStream.range(0, a.size())
+							.map(i -> Arrays.compare(a.get(i), b.get(i)))
+							.filter(i -> i != 0)
+							.findFirst()
+							.orElse(0);
+		}
+
 		public void containMetaDataExactlyInAnyOrder(XtaMessageMetaData... messageMetaDataItems) {
 			try {
 				// Assert equal message counts
@@ -260,23 +280,7 @@ public class XtaServerSetupExtensionTestUtil {
 	public record TransportReportsAssert(List<XtaTransportReport> transportReports) {
 		public TransportReportsAssert reportExactlyFor(List<XtaMessage> processedMessages) {
 			try {
-				assertThat(transportReports).hasSize(processedMessages.size());
-				// Compare message ids
-				assertThat(transportReports)
-						.extracting(XtaTransportReport::metaData)
-						.extracting(XtaMessageMetaData::messageId)
-						.containsExactlyElementsOf(processedMessages.stream()
-								.map(XtaMessage::metaData)
-								.map(XtaMessageMetaData::messageId)
-								.toList());
-				// Compare message metadata (ignoring size since it may be null for transport report (due to message closed?))
-				assertThat(transportReports)
-						.extracting(XtaTransportReport::metaData)
-						.extracting(XtaServerSetupExtensionTestUtil::withoutMessageSize)
-						.containsExactlyElementsOf(processedMessages.stream()
-								.map(XtaMessage::metaData)
-								.map(XtaServerSetupExtensionTestUtil::withoutMessageSize)
-								.toList());
+				reportExactlyForRaw(processedMessages);
 			} catch (AssertionError | RuntimeException e) {
 				log.error("TransportReports do not exactly match messages metadata!");
 				throw e;
@@ -284,21 +288,60 @@ public class XtaServerSetupExtensionTestUtil {
 			return this;
 		}
 
-		public TransportReportsAssert haveExactlyGreenStatusFor(String... messageIds) {
-			try {
-				var setOfMessageIds = Arrays.stream(messageIds).collect(Collectors.toSet());
+		private void reportExactlyForRaw(List<XtaMessage> processedMessages) {
+			assertThat(transportReports).hasSize(processedMessages.size());
+			assertEqualMessageId(processedMessages);
+			assertEqualMessageMetadata(processedMessages);
+		}
 
-				assertThat(transportReports)
-						.allMatch(transportReport ->
-								transportReport.status().equals(XtaMessageStatus.GREEN) == setOfMessageIds
-										.contains(transportReport.metaData().messageId())
-						);
+		private void assertEqualMessageId(List<XtaMessage> processedMessages) {
+			assertThat(transportReports)
+					.extracting(XtaTransportReport::metaData)
+					.extracting(XtaMessageMetaData::messageId)
+					.containsExactlyElementsOf(processedMessages.stream()
+							.map(XtaMessage::metaData)
+							.map(XtaMessageMetaData::messageId)
+							.toList());
+		}
+
+		private void assertEqualMessageMetadata(List<XtaMessage> processedMessages) {
+			// ignoring size since it may be null for transport report (due to message closed?)
+			assertThat(transportReports)
+					.extracting(XtaTransportReport::metaData)
+					.extracting(XtaServerSetupExtensionTestUtil::withoutMessageSize)
+					.containsExactlyElementsOf(processedMessages.stream()
+							.map(XtaMessage::metaData)
+							.map(XtaServerSetupExtensionTestUtil::withoutMessageSize)
+							.toList());
+		}
+
+		public TransportReportsAssert haveExactlyClosedStatusFor(String... messageIds) {
+			try {
+				haveExactlyClosedStatusForRaw(messageIds);
 			} catch (AssertionError | RuntimeException e) {
 				log.error("TransportReports do not have excepted green status for messageIds!");
 				throw e;
 			}
 			return this;
 		}
+
+		private void haveExactlyClosedStatusForRaw(String... messageIds) {
+			var setOfMessageIds = Arrays.stream(messageIds).collect(Collectors.toSet());
+
+			assertThat(transportReports)
+					.allMatch(transportReport ->
+							isClosed(transportReport) == expectIsClosed(transportReport, setOfMessageIds)
+
+					);
+		}
+
+		private boolean expectIsClosed(XtaTransportReport transportReport, Set<String> messageIds) {
+			return messageIds.contains(transportReport.metaData().messageId());
+		}
+
+		private boolean isClosed(XtaTransportReport transportReport) {
+			return !transportReport.status().equals(XtaMessageStatus.OPEN);
+		}
 	}
 
 	public static TransportReportsAssert assertThatTransportReports(List<XtaTransportReport> transportReports) {
diff --git a/src/test/java/de/ozgcloud/xta/client/extension/XtaTestServerSetupExtension.java b/src/test/java/de/ozgcloud/xta/client/extension/XtaTestServerSetupExtension.java
index f5e29c42d92cde5206a7fcafe9126a1766b2f40e..9001ba631dc7387f7f1d2af6fe76399307c8650d 100644
--- a/src/test/java/de/ozgcloud/xta/client/extension/XtaTestServerSetupExtension.java
+++ b/src/test/java/de/ozgcloud/xta/client/extension/XtaTestServerSetupExtension.java
@@ -32,7 +32,8 @@ public class XtaTestServerSetupExtension implements BeforeAllCallback, AfterAllC
 	private static final String XTA_TEST_SERVER_TRUSTSTORE_PATH = "store/xta-test-server-truststore.jks";
 	private static final String XTA_TEST_SERVER_TRUSTSTORE_PASSWORD = "password";
 
-	private XtaClient setupClient;
+	private XtaClient silentTestClient;
+	private XtaClientConfig silentTestClientConfig;
 	private XtaClientFactory clientFactory;
 	private XtaTestServerContainer xtaServerContainer;
 	private XtaClientConfig.KeyStore clientCertKeyStore;
@@ -60,10 +61,11 @@ public class XtaTestServerSetupExtension implements BeforeAllCallback, AfterAllC
 				.type("JKS")
 				.password(XTA_TEST_SERVER_TRUSTSTORE_PASSWORD.toCharArray())
 				.build();
-		setupClient = XtaClient.from(createSpecificClientConfigBuilder()
+		silentTestClientConfig = createSpecificClientConfigBuilder()
 				.logSoapRequests(false)
 				.logSoapResponses(false)
-				.build());
+				.build();
+		silentTestClient = XtaClient.from(silentTestClientConfig);
 	}
 
 	private void setupServer() {