diff --git a/src/main/java/de/ozgcloud/xta/client/XtaClient.java b/src/main/java/de/ozgcloud/xta/client/XtaClient.java
index 03ca7b83dee7c8a16fdf3d01cf31cd3215335477..ea8447521b9eabc7aa9559315f01f0d755d6f4cd 100644
--- a/src/main/java/de/ozgcloud/xta/client/XtaClient.java
+++ b/src/main/java/de/ozgcloud/xta/client/XtaClient.java
@@ -5,8 +5,8 @@ import jakarta.validation.constraints.NotBlank;
 import de.ozgcloud.xta.client.config.XtaClientConfig;
 import de.ozgcloud.xta.client.core.WrappedXtaService;
 import de.ozgcloud.xta.client.model.XtaIdentifier;
-import de.ozgcloud.xta.client.model.XtaMessage;
 import de.ozgcloud.xta.client.model.XtaMessageMetaDataListing;
+import de.ozgcloud.xta.client.model.XtaMessageAndTransportReport;
 import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException;
 import genv3.de.xoev.transport.xta.x211.PermissionDeniedException;
 import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
@@ -53,9 +53,18 @@ public class XtaClient {
 		return service.getStatusList(clientIdentifier, config.getMaxListItems());
 	}
 
-	public XtaMessage getMessage(@NotBlank String clientIdentifier, @NotBlank String messageId)
+	public XtaMessageAndTransportReport getMessage(@NotBlank String clientIdentifier, @NotBlank String messageId)
 			throws XTAWSTechnicalProblemException, PermissionDeniedException, InvalidMessageIDException {
-		return service.getMessage(messageId, deriveIdentifier(clientIdentifier));
+		var identifier = deriveIdentifier(clientIdentifier);
+
+		var message = service.getMessage(messageId, identifier);
+		service.close(messageId, identifier);
+
+		var transportReport = service.getTransportReport(messageId, identifier);
+		return XtaMessageAndTransportReport.builder()
+				.message(message)
+				.transportReport(transportReport)
+				.build();
 	}
 
 	public void close(@NotBlank String clientIdentifier, @NotBlank String messageId)
diff --git a/src/main/java/de/ozgcloud/xta/client/model/XtaMessageAndTransportReport.java b/src/main/java/de/ozgcloud/xta/client/model/XtaMessageAndTransportReport.java
new file mode 100644
index 0000000000000000000000000000000000000000..6fed361806962dbb1f57c2a747ce65839cd79d4d
--- /dev/null
+++ b/src/main/java/de/ozgcloud/xta/client/model/XtaMessageAndTransportReport.java
@@ -0,0 +1,13 @@
+package de.ozgcloud.xta.client.model;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+import lombok.Builder;
+
+@Builder
+public record XtaMessageAndTransportReport(
+		@NotNull @Valid XtaMessage message,
+		@NotNull @Valid XtaTransportReport transportReport
+) {
+}
diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java b/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java
index da95fabc0366ea4d30288bc984564e4d780c9af3..acbad8cb7d0f2d0017038e30e1bef1e1f67c1cae 100644
--- a/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java
+++ b/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java
@@ -92,7 +92,27 @@ class XtaClientITCase {
 		void shouldReturnMessage() {
 			var result = client.getMessage(CLIENT_IDENTIFIER1.value(), messageId);
 
-			assertThat(result.metaData().messageId()).isEqualTo(messageId);
+			assertThat(result.message().metaData().messageId()).isEqualTo(messageId);
+		}
+
+		@DisplayName("should return transport report")
+		@Test
+		@SneakyThrows
+		void shouldReturnTransportReport() {
+			var result = client.getMessage(CLIENT_IDENTIFIER1.value(), messageId);
+
+			assertThat(result.transportReport().metaData().messageId()).isEqualTo(messageId);
+		}
+
+
+		@DisplayName("should throw invalid message id exception on second call due to closed message")
+		@Test
+		@SneakyThrows
+		void shouldThrowInvalidMessageIdExceptionOnSecondCallDueToClosedMessage() {
+			client.getMessage(CLIENT_IDENTIFIER1.value(), messageId);
+
+			assertThatThrownBy(() -> client.getMessage(CLIENT_IDENTIFIER1.value(), messageId))
+					.isInstanceOf(InvalidMessageIDException.class);
 		}
 
 		@DisplayName("should throw invalid message id exception for modified message id")
diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java b/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
index 45e6a1ffd56d409b891e14555a3bb0f9fa7d586f..6105b1ee6a5636c877964a815c17931b12fe9a9e 100644
--- a/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
@@ -21,6 +21,7 @@ import de.ozgcloud.xta.client.config.XtaClientConfig;
 import de.ozgcloud.xta.client.core.WrappedXtaService;
 import de.ozgcloud.xta.client.model.XtaMessage;
 import de.ozgcloud.xta.client.model.XtaMessageMetaDataListing;
+import de.ozgcloud.xta.client.model.XtaTransportReport;
 import lombok.SneakyThrows;
 
 @ExtendWith(MockitoExtension.class)
@@ -128,16 +129,42 @@ class XtaClientTest {
 		@Mock
 		XtaMessage xtaMessage;
 
-		@DisplayName("should return")
-		@Test
+		@Mock
+		XtaTransportReport xtaTransportReport;
+
+		@BeforeEach
 		@SneakyThrows
-		void shouldReturn() {
+		void mock() {
 			doReturn(SELF_IDENTIFIER).when(client).deriveIdentifier(SELF_IDENTIFIER_VALUE);
 			when(service.getMessage(MESSAGE_ID, SELF_IDENTIFIER)).thenReturn(xtaMessage);
+			when(service.getTransportReport(MESSAGE_ID, SELF_IDENTIFIER)).thenReturn(xtaTransportReport);
+		}
+
+		@DisplayName("should call close")
+		@Test
+		@SneakyThrows
+		void shouldCallClose() {
+			client.getMessage(SELF_IDENTIFIER_VALUE, MESSAGE_ID);
 
+			verify(service).close(MESSAGE_ID, SELF_IDENTIFIER);
+		}
+
+		@DisplayName("should return with message")
+		@Test
+		@SneakyThrows
+		void shouldReturn() {
+			var result = client.getMessage(SELF_IDENTIFIER_VALUE, MESSAGE_ID);
+
+			assertThat(result.message()).isEqualTo(xtaMessage);
+		}
+
+		@DisplayName("should return with transport report")
+		@Test
+		@SneakyThrows
+		void shouldReturnWithTransportReport() {
 			var result = client.getMessage(SELF_IDENTIFIER_VALUE, MESSAGE_ID);
 
-			assertThat(result).isEqualTo(xtaMessage);
+			assertThat(result.transportReport()).isEqualTo(xtaTransportReport);
 		}
 	}