diff --git a/src/main/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepository.java b/src/main/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepository.java
index 6f67093387f7da3b03953af445443fa875144686..39aac3396b11a2fb9ad29b6d03bd167b7b74071d 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepository.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepository.java
@@ -1,7 +1,7 @@
 package de.ozgcloud.xta.test.app.data;
 
 import java.time.Clock;
-import java.time.LocalDateTime;
+import java.time.ZonedDateTime;
 import java.util.HashMap;
 import java.util.Optional;
 
@@ -42,7 +42,7 @@ public class XtaTransportReportRepository {
 			return Optional.of(XtaTransportReport.builder()
 					.messageMetaData(messageIdTomessageMetaData.get(messageId))
 					.status(messageIdToStatus.get(messageId))
-					.reportTime(LocalDateTime.now(clock))
+					.reportTime(ZonedDateTime.now(clock))
 					.build());
 		}
 		return Optional.empty();
diff --git a/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java b/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java
index 86ef8153f60008df2201c6a098dc85df72fcb425..34f1fb2b318e8d40bfbd6bb34b3f31c90ac77105 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java
@@ -26,19 +26,14 @@ public interface ExceptionMapper {
 	String ERROR_CODE_MESSAGE_ID_UNKNOWN = "9070";
 	String ERROR_CODE_MESSAGE_ID_UNKNOWN_DESCRIPTION = "MessageID für den Account nicht bekannt";
 
-	default InvalidMessageIDException createInvalidMessageIDException(String message) {
+	default InvalidMessageIDException createInvalidMessageIDException(String messageId, String clientIdentifierValue) {
 		return new InvalidMessageIDException(
-				message,
+				"No message with messageID \"%s\" available for identifier \"%s\"."
+						.formatted(messageId, clientIdentifierValue),
 				mapInvalidMessageIDExceptionType(ERROR_CODE_MESSAGE_ID_UNKNOWN, ERROR_CODE_MESSAGE_ID_UNKNOWN_DESCRIPTION)
 		);
 	}
 
-	default InvalidMessageIDException createInvalidMessageIDException(String messageId, String clientIdentifierValue) {
-		return createInvalidMessageIDException(
-				"No message with messageID \"%s\" available for identifier \"%s\"."
-						.formatted(messageId, clientIdentifierValue));
-	}
-
 	@Mapping(target = "errorCode", expression = "java( mapCodeFehlernummer(code, name) )")
 	InvalidMessageIDExceptionType mapInvalidMessageIDExceptionType(String code, String name);
 
diff --git a/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java b/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java
index e070ac27ad8f41b7acfe0f38f32223634a562942..d3456fc16bdcc21ccb9de892a712266bb919efd2 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java
@@ -2,8 +2,8 @@ package de.ozgcloud.xta.test.app.mapper;
 
 import java.io.File;
 import java.math.BigInteger;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
+import java.time.ZonedDateTime;
+import java.util.GregorianCalendar;
 import java.util.List;
 import javax.xml.datatype.DatatypeFactory;
 import javax.xml.datatype.XMLGregorianCalendar;
@@ -116,13 +116,13 @@ public interface ResponseMapper {
 
 	@SneakyThrows
 	default XMLGregorianCalendar createNowXmlGregorianCalendar() {
-		return mapXmlGregorianCalendarFromLocalDateTime(LocalDateTime.now());
+		return mapXmlGregorianCalendarFromZonedDateTime(ZonedDateTime.now());
 	}
 
 	@SneakyThrows
-	default XMLGregorianCalendar mapXmlGregorianCalendarFromLocalDateTime(LocalDateTime localDateTime) {
-		var isoTimeString = DateTimeFormatter.ISO_DATE_TIME.format(localDateTime);
-		return DatatypeFactory.newInstance().newXMLGregorianCalendar(isoTimeString);
+	default XMLGregorianCalendar mapXmlGregorianCalendarFromZonedDateTime(ZonedDateTime zonedDateTime) {
+		GregorianCalendar gregorianCalendar = GregorianCalendar.from(zonedDateTime);
+		return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
 	}
 
 	@Mapping(target = "itemsPending", expression = "java( BigInteger.ZERO )")
diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaTransportReport.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaTransportReport.java
index 2c5fe2b5d5e96e1ea256199a83e7b09ad35f61e0..af9d76a2be7a71baa43241117f563c7adcc82a98 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaTransportReport.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaTransportReport.java
@@ -1,6 +1,6 @@
 package de.ozgcloud.xta.test.app.model;
 
-import java.time.LocalDateTime;
+import java.time.ZonedDateTime;
 
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotNull;
@@ -9,7 +9,7 @@ import lombok.Builder;
 @Builder
 public record XtaTransportReport(
 		@Valid XtaMessageMetaData messageMetaData,
-		@NotNull LocalDateTime reportTime,
+		@NotNull ZonedDateTime reportTime,
 		@NotNull MessageStatus status) {
 
 	public enum MessageStatus {
diff --git a/src/test/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepositoryTest.java b/src/test/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepositoryTest.java
index cc20e5c0c8c5b99f21598ee5019155d84333a7df..0805e0c98c532be89484fbcd26fc20fcecedf2ce 100644
--- a/src/test/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepositoryTest.java
+++ b/src/test/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepositoryTest.java
@@ -1,43 +1,32 @@
 package de.ozgcloud.xta.test.app.data;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.when;
 
 import java.time.Clock;
 import java.time.Instant;
-import java.time.LocalDateTime;
+import java.time.ZonedDateTime;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
 
 import de.ozgcloud.xta.test.app.factory.XtaMessageMetaDataTestFactory;
 import de.ozgcloud.xta.test.app.model.XtaMessageMetaData;
 import de.ozgcloud.xta.test.app.model.XtaTransportReport;
 
 public class XtaTransportReportRepositoryTest {
+	@InjectMocks
 	private XtaTransportReportRepository repository;
+	@Mock
 	private Clock clock;
 
 	private final XtaMessageMetaData messageMetaData = XtaMessageMetaDataTestFactory.create();
 
-	@BeforeEach
-	void beforeEach() {
-		clock = Clock.fixed(Instant.now(), Clock.systemDefaultZone().getZone());
-		repository = new XtaTransportReportRepository(clock);
-	}
-
 	@Nested
 	class Add{
-		@Test
-		void shouldAddTransportReport() {
-			repository.add(messageMetaData);
-
-			var result = repository.get(messageMetaData.messageId());
-
-			assertThat(result).isPresent();
-			assertThat(result.get().messageMetaData()).isEqualTo(messageMetaData);
-		}
-
 		@Test
 		void shouldReturnTrue() {
 			var result = repository.add(messageMetaData);
@@ -57,39 +46,62 @@ public class XtaTransportReportRepositoryTest {
 
 	@Nested
 	class Get {
+		@Nested
+		class WithExistingMessageId {
+			@BeforeEach
+			void beforeEach() {
+				mockClock();
+			}
 
-		@Test
-		void shouldReturnEmpty() {
-			var result = repository.get(messageMetaData.messageId());
+			@Test
+			void shouldReturnReport() {
+				repository.add(messageMetaData);
 
-			assertThat(result).isEmpty();
-		}
+				var result = repository.get(messageMetaData.messageId());
 
-		@Test
-		void shouldSetStatusOffen() {
-			repository.add(messageMetaData);
+				assertThat(result).isPresent();
+				assertThat(result.get().messageMetaData()).isEqualTo(messageMetaData);
+			}
 
-			var result = repository.get(messageMetaData.messageId());
+			@Test
+			void shouldSetReportTimeNow() {
+				repository.add(messageMetaData);
 
-			assertThat(result).isPresent();
-			assertThat(result.get().status()).isEqualTo(XtaTransportReport.MessageStatus.OFFEN);
-		}
+				var result = repository.get(messageMetaData.messageId());
 
-		@Test
-		void shouldSetReportTimeNow() {
-			repository.add(messageMetaData);
+				assertThat(result).isPresent();
+				assertThat(result.get().reportTime()).isEqualTo(ZonedDateTime.now(clock));
+			}
 
-			var result = repository.get(messageMetaData.messageId());
 
-			assertThat(result).isPresent();
-			assertThat(result.get().reportTime()).isEqualTo(LocalDateTime.now(clock));
+			@Test
+			void shouldSetStatusOffen() {
+				repository.add(messageMetaData);
+
+				var result = repository.get(messageMetaData.messageId());
+
+				assertThat(result).isPresent();
+				assertThat(result.get().status()).isEqualTo(XtaTransportReport.MessageStatus.OFFEN);
+			}
 		}
+
+		@Nested
+		class WithMissingMessageId {
+			@Test
+			void shouldReturnEmpty() {
+				var result = repository.get(messageMetaData.messageId());
+
+				assertThat(result).isEmpty();
+			}
+		}
+
 	}
 
 	@Nested
 	class SetClosedStatus {
 		@Test
 		void shouldSetClosedStatus() {
+			mockClock();
 			repository.add(messageMetaData);
 
 			repository.setClosedStatus(messageMetaData.messageId());
@@ -115,4 +127,9 @@ public class XtaTransportReportRepositoryTest {
 			assertThat(result).isFalse();
 		}
 	}
+
+	private void mockClock() {
+		when(clock.instant()).thenReturn(Instant.now());
+		when(clock.getZone()).thenReturn(Clock.systemDefaultZone().getZone());
+	}
 }
diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java
index e032487ea01b288c8dbcfc5d3b6000091476ad7b..8155892407ee3e270170ca020b48b52adcb04031 100644
--- a/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java
+++ b/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java
@@ -19,14 +19,15 @@ class ExceptionMapperTest {
 	@DisplayName("create invalid message id exception")
 	@Nested
 	class TestCreateInvalidMessageIdException {
-		private final String exceptionMessage = "test message";
+		private static final String MESSAGE_ID = "messageid:test";
+		private static final String IDENTIFIER = "Author";
 
-		@DisplayName("should map message")
+		@DisplayName("should map message id and identifier to message")
 		@Test
 		void shouldMapMessage() {
 			var result = createException();
 
-			assertThat(result.getMessage()).isEqualTo(exceptionMessage);
+			assertThat(result.getMessage()).isEqualTo("No message with messageID \"messageid:test\" available for identifier \"Author\".");
 		}
 
 		@DisplayName("should map error code")
@@ -39,15 +40,7 @@ class ExceptionMapperTest {
 		}
 
 		private InvalidMessageIDException createException() {
-			return mapper.createInvalidMessageIDException(exceptionMessage);
-		}
-
-		@DisplayName("should map message id and identifier to message")
-		@Test
-		void shouldMapMessageIdAndIdentifier() {
-			var result = mapper.createInvalidMessageIDException("id-1234", "identifier-5678");
-
-			assertThat(result.getMessage()).isEqualTo("No message with messageID \"id-1234\" available for identifier \"identifier-5678\".");
+			return mapper.createInvalidMessageIDException(MESSAGE_ID, IDENTIFIER);
 		}
 	}
 
diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java
index 59595411fe9674228f2f4b167bed53f0d573b0a5..4a2a5709f3ede5baa3d9a6d3fdae46d1c4887fae 100644
--- a/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java
+++ b/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java
@@ -9,9 +9,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.math.BigInteger;
 import java.nio.charset.StandardCharsets;
-import java.time.LocalDateTime;
+import java.time.ZonedDateTime;
 import java.util.List;
-import javax.xml.datatype.DatatypeConstants;
 
 import genv3.de.xoev.transport.xta.x211.ContentType;
 import genv3.de.xoev.transport.xta.x211.LookupServiceResponse;
@@ -492,12 +491,12 @@ public class ResponseMapperTest {
 	@Nested
 	class TestMapTransportReport {
 		private XtaMessageMetaData xtaMessageMetaData;
-		private LocalDateTime reportTime;
+		private ZonedDateTime reportTime;
 
 		@BeforeEach
 		void beforeEach() {
 			xtaMessageMetaData = XtaMessageMetaDataTestFactory.create();
-			reportTime = LocalDateTime.now();
+			reportTime = ZonedDateTime.now();
 		}
 
 		@DisplayName("should map message meta data")
@@ -522,7 +521,7 @@ public class ResponseMapperTest {
 		void shouldMapReportTime() {
 			var result = doMapping();
 
-			assertThat(result.getReportTime()).isEqualTo(mapper.mapXmlGregorianCalendarFromLocalDateTime(reportTime));
+			assertThat(result.getReportTime()).isEqualTo(mapper.mapXmlGregorianCalendarFromZonedDateTime(reportTime));
 		}
 
 		@DisplayName("should set server identity")
@@ -549,26 +548,20 @@ public class ResponseMapperTest {
 	@DisplayName("map XmlGregorianCalendar from LocalDateTime")
 	@Nested
 	class TestMapXmlGregorianCalendarFromLocalDateTime {
-		private LocalDateTime localDateTime;
+		private ZonedDateTime zonedDateTime;
+		private static final String ISO_TIME_STRING = "2007-12-03T10:15:30.000Z";
 
 		@BeforeEach
 		void beforeEach() {
-			localDateTime = LocalDateTime.parse("2007-12-03T10:15:30");
+			zonedDateTime = ZonedDateTime.parse(ISO_TIME_STRING);
 		}
 
-		@DisplayName("should map xml gregorian calendar from local date time")
+		@DisplayName("should map xml gregorian calendar from zoned date time")
 		@Test
 		void shouldMapXmlGregorianCalendarFromLocalDateTime() {
-			var result = mapper.mapXmlGregorianCalendarFromLocalDateTime(localDateTime);
-
-			assertThat(result.getDay()).isEqualTo(3);
-			assertThat(result.getMonth()).isEqualTo(12);
-			assertThat(result.getYear()).isEqualTo(2007);
-			assertThat(result.getEon() == null || result.getEon().equals(BigInteger.ZERO)).isTrue();
-			assertThat(result.getHour()).isEqualTo(10);
-			assertThat(result.getMinute()).isEqualTo(15);
-			assertThat(result.getSecond()).isEqualTo(30);
-			assertThat(result.getTimezone()).isEqualTo(DatatypeConstants.FIELD_UNDEFINED);
+			var result = mapper.mapXmlGregorianCalendarFromZonedDateTime(zonedDateTime);
+
+			assertThat(result.toXMLFormat()).isEqualTo(ISO_TIME_STRING);
 		}
 	}
 }
diff --git a/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java b/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java
index e4daf69633fd66f8588772d1c95897d7804dda92..ff75022fd71553d543e318141972ab35824ba3a6 100644
--- a/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java
+++ b/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java
@@ -164,7 +164,34 @@ public class XtaMessageServiceTest {
 	@DisplayName("is author or reader of message")
 	@Nested
 	class TestIsAuthorOrReaderOfMessage {
+		@Test
+		void shouldUseIsAuthorOrReaderOfMessageMetaData() {
+			var message = XtaMessageTestFactory.create(MESSAGE_ID_1);
+
+			service.isAuthorOrReaderOfMessage(READER_IDENTIFIER.value()).test(message);
 
+			verify(service).isAuthorOrReaderOfMessageMetadata(READER_IDENTIFIER.value());
+		}
+	}
+
+	@DisplayName("is author or reader of transport report")
+	@Nested
+	class TestIsAuthorOrReaderOfTransportReport {
+		@Test
+		void shouldUseIsAuthorOrReaderOfMessageMetaData() {
+			var transportReport = XtaTransportReport.builder()
+					.messageMetaData(XtaMessageMetaDataTestFactory.create(MESSAGE_ID_1))
+					.build();
+
+			service.isAuthorOrReaderOfTransportReport(READER_IDENTIFIER.value()).test(transportReport);
+
+			verify(service).isAuthorOrReaderOfMessageMetadata(READER_IDENTIFIER.value());
+		}
+	}
+
+	@DisplayName("is author or reader of message metadata")
+	@Nested
+	class TestIsAuthorOrReaderOfMessageMetaData {
 		@DisplayName("should return true if reader identifier value matches")
 		@Test
 		void shouldReturnTrueIfReaderIdentifierValueMatches() {
@@ -215,6 +242,7 @@ public class XtaMessageServiceTest {
 			assertThat(result).isEqualTo(deleted);
 		}
 
+		@DisplayName("should set transport status to closed")
 		@Test
 		void shouldSetTransportReportClosedStatus() {
 			var request = XtaCloseRequestTestFactory.create();