diff --git a/src/main/java/de/ozgcloud/xta/client/XtaClient.java b/src/main/java/de/ozgcloud/xta/client/XtaClient.java
index afe601dfa9dc4b6c13c65048d9bf823d6b819ba3..38a4161c1ae6bcc23441110495031267f0e9acc5 100644
--- a/src/main/java/de/ozgcloud/xta/client/XtaClient.java
+++ b/src/main/java/de/ozgcloud/xta/client/XtaClient.java
@@ -13,7 +13,7 @@ import jakarta.validation.constraints.NotNull;
 import de.ozgcloud.xta.client.config.XtaClientConfig;
 import de.ozgcloud.xta.client.core.XtaClientService;
 import de.ozgcloud.xta.client.core.XtaExceptionHandler;
-import de.ozgcloud.xta.client.exception.ClientRuntimeException;
+import de.ozgcloud.xta.client.exception.XtaClientRuntimeException;
 import de.ozgcloud.xta.client.exception.XtaClientException;
 import de.ozgcloud.xta.client.exception.XtaClientInitializationException;
 import de.ozgcloud.xta.client.model.XtaIdentifier;
@@ -130,12 +130,12 @@ public class XtaClient {
 	}
 
 	boolean checkSomeMessageHasBeenClosed(List<XtaTransportReport> transportReports) {
-		var someTransportReportHasGreenStatus = transportReports.stream()
-				.anyMatch(t -> t.status().equals(XtaMessageStatus.GREEN));
-		if (!someTransportReportHasGreenStatus) {
+		var someTransportReportHasClosedStatus = transportReports.stream()
+				.anyMatch(t -> !t.status().equals(XtaMessageStatus.OPEN));
+		if (!someTransportReportHasClosedStatus) {
 			logWarnForNoMessageClosed();
 		}
-		return someTransportReportHasGreenStatus;
+		return someTransportReportHasClosedStatus;
 	}
 
 	void logWarnForNoMessageClosed() {
@@ -226,13 +226,13 @@ public class XtaClient {
 
 	void throwExceptionIfServiceNotAvailable(XtaMessageMetaData metaData) {
 		if (!service.lookupService(metaData)) {
-			throw new ClientRuntimeException("Service %s is not available!".formatted(metaData.service()));
+			throw new XtaClientRuntimeException("Service %s is not available!".formatted(metaData.service()));
 		}
 	}
 
 	void throwExceptionIfAccountInactive(XtaIdentifier clientIdentifier) {
 		if (!service.checkAccountActive(clientIdentifier)) {
-			throw new ClientRuntimeException("Account %s is not active!".formatted(clientIdentifier.value()));
+			throw new XtaClientRuntimeException("Account %s is not active!".formatted(clientIdentifier.value()));
 		}
 	}
 
diff --git a/src/main/java/de/ozgcloud/xta/client/core/XtaClientService.java b/src/main/java/de/ozgcloud/xta/client/core/XtaClientService.java
index 6dc98c8357aee69a5bc5311ae5d42b9c43d61e28..d61028941a5ed2ec58f05e29deb9f0f0050ce9e6 100644
--- a/src/main/java/de/ozgcloud/xta/client/core/XtaClientService.java
+++ b/src/main/java/de/ozgcloud/xta/client/core/XtaClientService.java
@@ -3,7 +3,7 @@ package de.ozgcloud.xta.client.core;
 import java.util.Optional;
 
 import de.ozgcloud.xta.client.config.XtaClientConfig;
-import de.ozgcloud.xta.client.exception.ClientRuntimeException;
+import de.ozgcloud.xta.client.exception.XtaClientRuntimeException;
 import de.ozgcloud.xta.client.model.XtaIdentifier;
 import de.ozgcloud.xta.client.model.XtaMessage;
 import de.ozgcloud.xta.client.model.XtaMessageMetaData;
@@ -33,7 +33,7 @@ public class XtaClientService {
 	public Optional<XtaTransportReport> getTransportReport(XtaMessageMetaData messageMetaData) {
 		try {
 			return Optional.of(getTransportReportOrThrowException(messageMetaData));
-		} catch (ClientRuntimeException e) {
+		} catch (XtaClientRuntimeException e) {
 			logError(TRANSPORT_REPORT_FAILED_ERROR, e);
 			return Optional.empty();
 		}
@@ -78,7 +78,7 @@ public class XtaClientService {
 			service.checkAccountActive(clientIdentifier);
 			return true;
 		} catch (XTAWSTechnicalProblemException | RuntimeException e) {
-			throw new ClientRuntimeException("Failed to check account active!", e);
+			throw new XtaClientRuntimeException("Failed to check account active!", e);
 		} catch (PermissionDeniedException e) {
 			return false;
 		}
@@ -91,7 +91,7 @@ public class XtaClientService {
 			return getTransportReportOrThrowException(message.metaData());
 		} catch (XTAWSTechnicalProblemException | PermissionDeniedException | SyncAsyncException | ParameterIsNotValidException |
 				MessageVirusDetectionException | MessageSchemaViolationException | RuntimeException e) {
-			throw new ClientRuntimeException("Failed to send message!", e);
+			throw new XtaClientRuntimeException("Failed to send message!", e);
 		}
 	}
 
@@ -101,7 +101,7 @@ public class XtaClientService {
 			var messageId = service.createMessageId(authorIdentifier);
 			return createXtaMessageWithMessageId(messageWithoutMessageId, messageId);
 		} catch (XTAWSTechnicalProblemException | PermissionDeniedException | RuntimeException e) {
-			throw new ClientRuntimeException("Failed to create message id!", e);
+			throw new XtaClientRuntimeException("Failed to create message id!", e);
 		}
 	}
 
@@ -119,7 +119,7 @@ public class XtaClientService {
 		try {
 			return service.getTransportReport(messageId, authorId);
 		} catch (XTAWSTechnicalProblemException | PermissionDeniedException | InvalidMessageIDException | RuntimeException e) {
-			throw new ClientRuntimeException(
+			throw new XtaClientRuntimeException(
 					"Failed to get transport report! (messageId: %s, reader: %s)".formatted(messageId, authorId.value()), e);
 		}
 	}
diff --git a/src/main/java/de/ozgcloud/xta/client/core/XtaExceptionHandler.java b/src/main/java/de/ozgcloud/xta/client/core/XtaExceptionHandler.java
index 1fe3570bbf546b71cba86cfe62dce73cd84d3033..a31641c1ada3c3743ec3500a731703948469f59c 100644
--- a/src/main/java/de/ozgcloud/xta/client/core/XtaExceptionHandler.java
+++ b/src/main/java/de/ozgcloud/xta/client/core/XtaExceptionHandler.java
@@ -4,7 +4,7 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import de.ozgcloud.xta.client.exception.ClientRuntimeException;
+import de.ozgcloud.xta.client.exception.XtaClientRuntimeException;
 import de.ozgcloud.xta.client.exception.XtaClientException;
 import genv3.de.xoev.transport.xta.x211.ExceptionType;
 import lombok.Builder;
@@ -17,13 +17,13 @@ public class XtaExceptionHandler {
 	static final String UNEXPECTED_ERROR_MESSAGE = "An unexpected error occurred. Please report this to the xta-client maintainers.";
 
 	public XtaClientException deriveXtaClientException(RuntimeException exception) {
-		if (exception instanceof ClientRuntimeException) {
-			return deriveXtaClientExceptionFromClientRuntimeException((ClientRuntimeException) exception);
+		if (exception instanceof XtaClientRuntimeException xtaClientRuntimeException) {
+			return deriveXtaClientExceptionFromClientRuntimeException(xtaClientRuntimeException);
 		}
 		return new XtaClientException(UNEXPECTED_ERROR_MESSAGE, exception);
 	}
 
-	XtaClientException deriveXtaClientExceptionFromClientRuntimeException(ClientRuntimeException exception) {
+	XtaClientException deriveXtaClientExceptionFromClientRuntimeException(XtaClientRuntimeException exception) {
 		var cause = exception.getCause();
 		var detailMessageLines = getDetailLines(cause);
 		var message = Stream.concat(
diff --git a/src/main/java/de/ozgcloud/xta/client/exception/ClientRuntimeException.java b/src/main/java/de/ozgcloud/xta/client/exception/ClientRuntimeException.java
deleted file mode 100644
index d2e32e5d824986c9cfc1f6a66221e7cb88c491b4..0000000000000000000000000000000000000000
--- a/src/main/java/de/ozgcloud/xta/client/exception/ClientRuntimeException.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package de.ozgcloud.xta.client.exception;
-
-public class ClientRuntimeException extends RuntimeException {
-
-	public ClientRuntimeException(String message) {
-		super(message);
-	}
-
-	public ClientRuntimeException(String message, Throwable cause) {
-		super(message, cause);
-	}
-}
diff --git a/src/main/java/de/ozgcloud/xta/client/exception/XtaClientRuntimeException.java b/src/main/java/de/ozgcloud/xta/client/exception/XtaClientRuntimeException.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c7d4b89b154d0d76a18d9a00044413fa911f816
--- /dev/null
+++ b/src/main/java/de/ozgcloud/xta/client/exception/XtaClientRuntimeException.java
@@ -0,0 +1,12 @@
+package de.ozgcloud.xta.client.exception;
+
+public class XtaClientRuntimeException extends RuntimeException {
+
+	public XtaClientRuntimeException(String message) {
+		super(message);
+	}
+
+	public XtaClientRuntimeException(String message, Throwable cause) {
+		super(message, cause);
+	}
+}
diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java b/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java
index aedd99a4886ae932f5549f4b75158d254bcb87e7..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,54 +215,12 @@ class XtaClientITCase {
 			);
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(
+					.haveExactlyClosedStatusFor(
 							messageIdBySendIndex(0),
 							messageIdBySendIndex(1), messageIdBySendIndex(2)
 					);
 		}
 
-		@DisplayName("should close messages only if no exception occurs during processing, with no exception for author2")
-		@Test
-		void shouldCloseMessagesOnlyIfNoExceptionOccursDuringProcessingWithNoExceptionForAuthor2() {
-			setupClientWithIdentifiers(List.of(READER_CLIENT_IDENTIFIER1, READER_CLIENT_IDENTIFIER2, READER_CLIENT_IDENTIFIER3));
-			processMessageDummy = message -> throwRuntimeExceptionExceptForAuthorIdentifier(message, AUTHOR_CLIENT_IDENTIFIER2);
-
-			var transportReports = fetchMessages();
-
-			if (hasLogLineContaining(NO_MESSAGE_CLOSED_WARNING)) {
-				// The first listing for reader2 contained sendMessages.get(1) and sendMessages.get(2).
-				// Since no messages have been closed for this listing, no second listing for reader2 is attempted.
-				// Therefore, sendMessages.get(3) was not fetched.
-
-				assertThat(supportCheckedMetadataItems).hasSize(1 + 2 + 2);
-				assertThatMessages(processedMessages).containExactlyInAnyOrder(
-						sendMessages.get(0),
-						sendMessages.get(1), sendMessages.get(2),
-						sendMessages.get(4), sendMessages.get(5)
-				);
-				assertThatTransportReports(transportReports)
-						.reportExactlyFor(processedMessages)
-						.haveExactlyGreenStatusFor(
-								messageIdBySendIndex(4)
-						);
-			} else {
-				// The first listing for reader2 contained sendMessages.get(3).
-
-				assertThat(supportCheckedMetadataItems).hasSize(1 + 3 + 2);
-				assertThatMessages(processedMessages).containExactlyInAnyOrder(
-						sendMessages.get(0),
-						sendMessages.get(1), sendMessages.get(2), sendMessages.get(3),
-						sendMessages.get(4), sendMessages.get(5)
-				);
-				assertThatTransportReports(transportReports)
-						.reportExactlyFor(processedMessages)
-						.haveExactlyGreenStatusFor(
-								messageIdBySendIndex(3),
-								messageIdBySendIndex(4)
-						);
-			}
-		}
-
 		@DisplayName("should close messages only if no exception occurs during processing, with no exception for author3")
 		@Test
 		void shouldCloseMessagesOnlyIfNoExceptionOccursDuringProcessingWithNoExceptionForAuthor3() {
@@ -279,7 +238,7 @@ class XtaClientITCase {
 			);
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(
+					.haveExactlyClosedStatusFor(
 							messageIdBySendIndex(5)
 					);
 		}
@@ -305,33 +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));
-		}
-
-		@DisplayName("should process messages only if supported, with support for author2")
-		@Test
-		void shouldProcessMessagesOnlyIfSupportedWithSupportForAuthor2() {
-			setupClientWithIdentifiers(List.of(READER_CLIENT_IDENTIFIER1, READER_CLIENT_IDENTIFIER2, READER_CLIENT_IDENTIFIER3));
-			isSupportedDummy = metaData -> metaData.authorIdentifier().value().equals(AUTHOR_CLIENT_IDENTIFIER2.value());
-
-			var transportReports = fetchMessages();
-
-			if (hasLogLineContaining(NO_MESSAGE_CLOSED_WARNING)) {
-				// Case: sendMessages.get(3) was not fetched.
-				assertThat(supportCheckedMetadataItems).hasSize(1 + 2 + 2);
-				assertThatMessages(processedMessages).containExactlyInAnyOrder(sendMessages.get(4));
-				assertThatTransportReports(transportReports)
-						.reportExactlyFor(processedMessages)
-						.haveExactlyGreenStatusFor(messageIdBySendIndex(4));
-			} else {
-				// Case: sendMessages.get(3) was fetched.
-				assertThat(supportCheckedMetadataItems).hasSize(1 + 3 + 2);
-				assertThatMessages(processedMessages).containExactlyInAnyOrder(sendMessages.get(3), sendMessages.get(4));
-				assertThatTransportReports(transportReports)
-						.reportExactlyFor(processedMessages)
-						.haveExactlyGreenStatusFor(messageIdBySendIndex(3), messageIdBySendIndex(4));
-			}
-
+					.haveExactlyClosedStatusFor(messageIdBySendIndex(0), messageIdBySendIndex(1), messageIdBySendIndex(2));
 		}
 
 		@DisplayName("should process messages only if supported, with support for author3")
@@ -347,7 +280,7 @@ class XtaClientITCase {
 			assertThatMessages(processedMessages).containExactlyInAnyOrder(sendMessages.get(5));
 			assertThatTransportReports(transportReports)
 					.reportExactlyFor(processedMessages)
-					.haveExactlyGreenStatusFor(messageIdBySendIndex(5));
+					.haveExactlyClosedStatusFor(messageIdBySendIndex(5));
 		}
 
 		@SneakyThrows
@@ -407,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/XtaClientTest.java b/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
index 6b4cba4aae4b457d21fbb58f380c053a9a0408ca..d5a5d38085709d72f8b82e36e7ee71dcfb495040 100644
--- a/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
@@ -27,8 +27,7 @@ import org.mockito.Spy;
 import de.ozgcloud.xta.client.config.XtaClientConfig;
 import de.ozgcloud.xta.client.core.XtaClientService;
 import de.ozgcloud.xta.client.core.XtaExceptionHandler;
-import de.ozgcloud.xta.client.exception.ClientRuntimeException;
-import de.ozgcloud.xta.client.exception.XtaClientException;
+import de.ozgcloud.xta.client.exception.XtaClientRuntimeException;
 import de.ozgcloud.xta.client.factory.ClientRuntimeExceptionTestFactory;
 import de.ozgcloud.xta.client.factory.XtaClientExceptionTestFactory;
 import de.ozgcloud.xta.client.factory.XtaMessageMetaDataListingTestFactory;
@@ -677,7 +676,6 @@ class XtaClientTest {
 			assertThat(result).isEqualTo(transportReport);
 		}
 
-
 		@DisplayName("should throw checked exception on runtime exception")
 		@Test
 		@SneakyThrows
@@ -755,10 +753,11 @@ class XtaClientTest {
 		@DisplayName("should throw exception if service not available")
 		@Test
 		void shouldThrowExceptionIfServiceNotAvailable() {
+			var metaData = message.metaData();
 			doReturn(false).when(service).lookupService(message.metaData());
 
-			assertThatThrownBy(() -> client.throwExceptionIfServiceNotAvailable(message.metaData()))
-					.isInstanceOf(ClientRuntimeException.class);
+			assertThatThrownBy(() -> client.throwExceptionIfServiceNotAvailable(metaData))
+					.isInstanceOf(XtaClientRuntimeException.class);
 		}
 	}
 
@@ -782,7 +781,7 @@ class XtaClientTest {
 			doReturn(false).when(service).checkAccountActive(AUTHOR_IDENTIFIER);
 
 			assertThatThrownBy(() -> client.throwExceptionIfAccountInactive(AUTHOR_IDENTIFIER))
-					.isInstanceOf(ClientRuntimeException.class);
+					.isInstanceOf(XtaClientRuntimeException.class);
 		}
 	}
 
diff --git a/src/test/java/de/ozgcloud/xta/client/core/XtaClientServiceTest.java b/src/test/java/de/ozgcloud/xta/client/core/XtaClientServiceTest.java
index 9ef4b29191c8bff65505dd2f4edbe4d824b42dbb..44f5255784cdd6308a28dc908641fdefa0790d94 100644
--- a/src/test/java/de/ozgcloud/xta/client/core/XtaClientServiceTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/core/XtaClientServiceTest.java
@@ -19,7 +19,7 @@ import org.mockito.Mock;
 import org.mockito.Spy;
 
 import de.ozgcloud.xta.client.config.XtaClientConfig;
-import de.ozgcloud.xta.client.exception.ClientRuntimeException;
+import de.ozgcloud.xta.client.exception.XtaClientRuntimeException;
 import de.ozgcloud.xta.client.factory.XtaMessageMetaDataListingTestFactory;
 import de.ozgcloud.xta.client.factory.XtaMessageMetaDataTestFactory;
 import de.ozgcloud.xta.client.factory.XtaMessageTestFactory;
@@ -53,7 +53,7 @@ class XtaClientServiceTest {
 	class TestGetTransportReport {
 
 		@Mock
-		private ClientRuntimeException exception;
+		private XtaClientRuntimeException exception;
 
 		@DisplayName("should return")
 		@Test
@@ -243,7 +243,7 @@ class XtaClientServiceTest {
 			doThrow(technicalException).when(wrapper).checkAccountActive(any());
 
 			assertThatThrownBy(this::checkAccountActive)
-					.isInstanceOf(ClientRuntimeException.class)
+					.isInstanceOf(XtaClientRuntimeException.class)
 					.hasCause(technicalException);
 		}
 
@@ -295,7 +295,7 @@ class XtaClientServiceTest {
 			doThrow(exception).when(wrapper).sendMessage(message);
 
 			assertThatThrownBy(this::sendMessage)
-					.isInstanceOf(ClientRuntimeException.class)
+					.isInstanceOf(XtaClientRuntimeException.class)
 					.hasCause(exception);
 		}
 
@@ -333,7 +333,7 @@ class XtaClientServiceTest {
 			doThrow(exception).when(wrapper).createMessageId(AUTHOR_IDENTIFIER);
 
 			assertThatThrownBy(() -> service.getXtaMessageWithMessageId(message))
-					.isInstanceOf(ClientRuntimeException.class)
+					.isInstanceOf(XtaClientRuntimeException.class)
 					.hasCause(exception);
 		}
 	}
@@ -362,7 +362,7 @@ class XtaClientServiceTest {
 			when(wrapper.getTransportReport(MESSAGE_ID, AUTHOR_IDENTIFIER)).thenThrow(exception);
 
 			assertThatThrownBy(() -> service.getTransportReportOrThrowException(messageMetaData))
-					.isInstanceOf(ClientRuntimeException.class)
+					.isInstanceOf(XtaClientRuntimeException.class)
 					.hasCause(exception);
 		}
 	}
diff --git a/src/test/java/de/ozgcloud/xta/client/core/XtaExceptionHandlerTest.java b/src/test/java/de/ozgcloud/xta/client/core/XtaExceptionHandlerTest.java
index df6b0a203b80cb29ea12bd4f8613b7c831def4e1..be02999134d1f2003672d7e256a04fe35be9af8b 100644
--- a/src/test/java/de/ozgcloud/xta/client/core/XtaExceptionHandlerTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/core/XtaExceptionHandlerTest.java
@@ -15,7 +15,7 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
-import de.ozgcloud.xta.client.exception.ClientRuntimeException;
+import de.ozgcloud.xta.client.exception.XtaClientRuntimeException;
 import de.ozgcloud.xta.client.exception.XtaClientException;
 import de.ozgcloud.xta.client.factory.ClientRuntimeExceptionTestFactory;
 import genv3.de.xoev.transport.xta.x211.PermissionDeniedException;
@@ -26,7 +26,7 @@ class XtaExceptionHandlerTest {
 	@Spy
 	XtaExceptionHandler exceptionHandler;
 
-	private ClientRuntimeException exception;
+	private XtaClientRuntimeException exception;
 
 	@BeforeEach
 	void setUp() {
@@ -40,9 +40,9 @@ class XtaExceptionHandlerTest {
 		@Mock
 		private XtaClientException derivedClientException;
 
-		@DisplayName("should derive xta client exception from client runtime exception")
+		@DisplayName("should derive xta client exception from xta client runtime exception")
 		@Test
-		void shouldDeriveXtaClientExceptionFromClientRuntimeException() {
+		void shouldDeriveXtaClientExceptionFromXtaClientRuntimeException() {
 			doReturn(derivedClientException).when(exceptionHandler).deriveXtaClientExceptionFromClientRuntimeException(exception);
 
 			var result = exceptionHandler.deriveXtaClientException(exception);
@@ -50,9 +50,9 @@ class XtaExceptionHandlerTest {
 			assertThat(result).isEqualTo(derivedClientException);
 		}
 
-		@DisplayName("without client runtime exception instance")
+		@DisplayName("without xta client runtime exception instance")
 		@Nested
-		class TestWithoutClientRuntimeExceptionInstance {
+		class TestWithoutXtaClientRuntimeExceptionInstance {
 
 			@Mock
 			private RuntimeException runtimeException;
@@ -75,16 +75,16 @@ class XtaExceptionHandlerTest {
 		}
 	}
 
-	@DisplayName("derive xta client exception from client runtime exception")
+	@DisplayName("derive xta client exception from xta client runtime exception")
 	@Nested
-	class TestDeriveXtaClientExceptionFromClientRuntimeException {
+	class TestDeriveXtaClientExceptionFromXtaClientRuntimeException {
 
 		@DisplayName("should keep message if no cause")
 		@Test
 		void shouldKeepMessageIfNoCause() {
-			var exception = new ClientRuntimeException(MESSAGE);
+			var exceptionWithoutCause = new XtaClientRuntimeException(MESSAGE);
 
-			var result = exceptionHandler.deriveXtaClientExceptionFromClientRuntimeException(exception);
+			var result = exceptionHandler.deriveXtaClientExceptionFromClientRuntimeException(exceptionWithoutCause);
 
 			assertThat(result.getMessage()).isEqualTo(MESSAGE);
 		}
@@ -93,9 +93,9 @@ class XtaExceptionHandlerTest {
 		@Test
 		void shouldKeepMessageIfCauseIsNotAnXtaException() {
 			var cause = new Exception();
-			var exception = new ClientRuntimeException(MESSAGE, cause);
+			var exceptionWithNoXtaCause = new XtaClientRuntimeException(MESSAGE, cause);
 
-			var result = exceptionHandler.deriveXtaClientExceptionFromClientRuntimeException(exception);
+			var result = exceptionHandler.deriveXtaClientExceptionFromClientRuntimeException(exceptionWithNoXtaCause);
 
 			assertThat(result.getMessage()).isEqualTo(MESSAGE);
 
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 9ecd3fbcbd073a011707d78f12c931a48933b873..0432d3445846171a7908c47377e0d1b32baa48be 100644
--- a/src/test/java/de/ozgcloud/xta/client/extension/XtaServerSetupExtensionTestUtil.java
+++ b/src/test/java/de/ozgcloud/xta/client/extension/XtaServerSetupExtensionTestUtil.java
@@ -5,16 +5,16 @@ 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.exception.ClientRuntimeException;
+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;
 import de.ozgcloud.xta.client.model.XtaMessage;
@@ -76,19 +76,13 @@ 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 {
 			log.info("Sending from author {} to reader {}.", message.metaData().authorIdentifier(), message.metaData().readerIdentifier());
 			var transportReport = client.sendMessage(message);
 			return transportReport.metaData().messageId();
-		} catch (ClientRuntimeException e) {
+		} catch (XtaClientRuntimeException e) {
 			var cause = e.getCause();
 			if (cause instanceof ParameterIsNotValidException) {
 				logCodeFehlerNummer(((ParameterIsNotValidException) cause).getFaultInfo().getErrorCode());
@@ -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!");
+				log.error("TransportReports do not have excepted closed 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() {
diff --git a/src/test/java/de/ozgcloud/xta/client/factory/ClientRuntimeExceptionTestFactory.java b/src/test/java/de/ozgcloud/xta/client/factory/ClientRuntimeExceptionTestFactory.java
index bfa3c0f97bda2ecb5b68821c425571a5f8809f81..7b2d14bd1bad08067e1b6a1212d05717c08ab754 100644
--- a/src/test/java/de/ozgcloud/xta/client/factory/ClientRuntimeExceptionTestFactory.java
+++ b/src/test/java/de/ozgcloud/xta/client/factory/ClientRuntimeExceptionTestFactory.java
@@ -1,6 +1,6 @@
 package de.ozgcloud.xta.client.factory;
 
-import de.ozgcloud.xta.client.exception.ClientRuntimeException;
+import de.ozgcloud.xta.client.exception.XtaClientRuntimeException;
 import genv3.de.xoev.transport.xta.x211.CodeFehlernummer;
 import genv3.de.xoev.transport.xta.x211.PermissionDeniedException;
 import genv3.de.xoev.transport.xta.x211.PermissionDeniedExceptionType;
@@ -12,8 +12,8 @@ public class ClientRuntimeExceptionTestFactory {
 	public static final String CAUSE_CODE = "cause code";
 	public static final String CAUSE_NAME = "cause name";
 
-	public static ClientRuntimeException create() {
-		return new ClientRuntimeException(MESSAGE, createPermissionDeniedException());
+	public static XtaClientRuntimeException create() {
+		return new XtaClientRuntimeException(MESSAGE, createPermissionDeniedException());
 	}
 
 	private static PermissionDeniedException createPermissionDeniedException() {