diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/ProtocolMetadata.java b/src/main/java/de/ozgcloud/xta/test/app/model/ProtocolMetadata.java
deleted file mode 100644
index 9fd11cd7bc515e222e1c2df9887fce39383d9ab5..0000000000000000000000000000000000000000
--- a/src/main/java/de/ozgcloud/xta/test/app/model/ProtocolMetadata.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * @formatter:off
- *
- * Copyright 2021-2022  Koordinierungsstelle für IT-Standards (KoSIT)
- *
- * Licensed under the European Public License, Version 1.2 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     https://opensource.org/licenses/EUPL-1.2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * @formatter:on
- */
-package de.ozgcloud.xta.test.app.model;
-
-import java.util.Collections;
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@NoArgsConstructor
-public class ProtocolMetadata {
-
-	private String softwareManufacturer = "Nortal AG";
-	private String softwareName = "Dummy Produkt";
-	private String softwareVersion = "1.0.0";
-
-	private String street = "Knesebeckstraße";
-	private String streetNo = "1";
-	private String zipCode = "10623";
-	private String city = "Berlin";
-	private String addressAddition;
-
-	@JsonIgnore
-	public List<String> getAddressAdditionAsList() {
-		if (addressAddition != null) {
-			String[] split = addressAddition.split("\r\n|\n|\r");
-			return List.of(split);
-		}
-		return Collections.emptyList();
-	}
-}
diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaCloseRequest.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaCloseRequest.java
index 3c1d4c6810e62a672d2f4151986790078fad8c9c..a08804dd283b60d4e3905590c38992bde7375a31 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaCloseRequest.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaCloseRequest.java
@@ -1,12 +1,14 @@
 package de.ozgcloud.xta.test.app.model;
 
 import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 
+import de.ozgcloud.xta.test.app.validation.ValidXtaMessageId;
 import lombok.Builder;
 
 @Builder
 public record XtaCloseRequest(
-		@NotBlank String messageId,
-		@NotBlank String clientIdentifierValue
+		@ValidXtaMessageId String messageId,
+		@NotNull @NotBlank String clientIdentifierValue
 ) {
 }
diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConfigDto.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaConfigDto.java
deleted file mode 100644
index c74cdcc4c81870abe4e12787eaa2f68adbf9c717..0000000000000000000000000000000000000000
--- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConfigDto.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Created 2022-12-14
- */
-package de.ozgcloud.xta.test.app.model;
-
-import de.ozgcloud.xta.test.app.config.ClientProperties;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@NoArgsConstructor
-
-public class XtaConfigDto {
-
-	private ProtocolMetadata protocolMetadata;
-
-	private ClientProperties clientProperties;
-}
diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java
index 5ca37d7c8fc35f8d38d2882e7e637e1fa6dd2667..7aa512d70ee89ce4cddfe2f379c4c7b85d63c1dd 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java
@@ -77,6 +77,8 @@ public class XtaConstants {
 	public static final String ERROR_CODE_MESSAGE_ID_UNKNOWN = "9070";
 	public static final String ERROR_CODE_MESSAGE_ID_UNKNOWN_DESCRIPTION = "MessageID für den Account nicht bekannt";
 
+	public static final String MESSAGE_ID_PATTERN = "(\\w+):(.+):([^:]+):([^:]+)";
+
 	public enum ConnectionPortType {
 		SEND, MSGBOX, MANAGEMENT
 	}
diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaGetMessageRequest.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaGetMessageRequest.java
index 6941833de98e232b323c595395284bf11bf7f5f0..41ad56b586791fcdfbd3386190d09ef552b6f547 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaGetMessageRequest.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaGetMessageRequest.java
@@ -2,11 +2,12 @@ package de.ozgcloud.xta.test.app.model;
 
 import jakarta.validation.constraints.NotBlank;
 
+import de.ozgcloud.xta.test.app.validation.ValidXtaMessageId;
 import lombok.Builder;
 
 @Builder
 public record XtaGetMessageRequest(
-		@NotBlank String messageId,
+		@ValidXtaMessageId String messageId,
 		@NotBlank String clientIdentifierValue
 ) {
 }
diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaIdentifierConfig.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaIdentifierConfig.java
deleted file mode 100644
index d8c4c8a4dbf83c86e66b85c1a008094a47713b9a..0000000000000000000000000000000000000000
--- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaIdentifierConfig.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package de.ozgcloud.xta.test.app.model;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class XtaIdentifierConfig {
-
-	private String identifierScheme;
-
-	private String name;
-
-	private String value;
-
-	private String organizationCategory;
-
-}
diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaLookupServiceRequest.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaLookupServiceRequest.java
index 64e124809cc3702cb45281575046e30b69381a87..3ed26844a4771f2a760458fe864c840c5889f904 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaLookupServiceRequest.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaLookupServiceRequest.java
@@ -1,11 +1,14 @@
 package de.ozgcloud.xta.test.app.model;
 
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
 import lombok.Builder;
 
 @Builder
 public record XtaLookupServiceRequest(
-		String service,
-		String readerIdentifierValue,
-		String authorIdentifierValue
+		@NotNull @NotBlank String service,
+		@NotNull @NotBlank String readerIdentifierValue,
+		@NotNull @NotBlank String authorIdentifierValue
 ) {
 }
diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java
index e48bf9962d1303af0170afcd07cf40cd62bb4349..1ad6668d9a0e317a07f607955bc6e550fd215bc2 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java
@@ -8,20 +8,21 @@ import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.PositiveOrZero;
 
+import de.ozgcloud.xta.test.app.validation.ValidXtaMessageId;
 import lombok.Builder;
 
 @Builder(toBuilder = true)
 public record XtaMessageMetaData(
-		@NotBlank String service,
+		@NotNull @NotBlank String service,
 		@NotNull @NotBlank String businessScenarioCode,
 		@Nullable String businessScenarioName,
 		@Nullable String businessScenarioListUri,
 		@Nullable String businessScenarioListVersionId,
 		@NotBlank String messageTypeCode,
 		@NotBlank String messageTypePayloadSchema,
-		@NotBlank String messageId,
+		@ValidXtaMessageId String messageId,
 		@NotNull @Valid Identifier authorIdentifier,
 		@NotNull @Valid Identifier readerIdentifier,
-		@PositiveOrZero BigInteger messageSize
+		@NotNull @PositiveOrZero BigInteger messageSize
 ) {
 }
diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListingRequest.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListingRequest.java
index 279014fb4fe85325d03b34115d211f87eebadc8a..a5c011121b4f57e5f67168bbb8f63c229ed6413c 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListingRequest.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListingRequest.java
@@ -1,13 +1,14 @@
 package de.ozgcloud.xta.test.app.model;
 
 import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Positive;
 
 import lombok.Builder;
 
 @Builder
 public record XtaMessageMetaDataListingRequest(
-		@NotBlank String clientIdentifierValue,
-		@Positive int maxListItems
+		@NotNull @NotBlank String clientIdentifierValue,
+		@NotNull @Positive int maxListItems
 ) {
 }
diff --git a/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java b/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java
index b06f871e676bf74f90d129f4a3b4e0a905d401c6..7b1425446fa176af04cdd1d12dcf2c26f6541fef 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java
@@ -8,9 +8,9 @@ import org.springframework.stereotype.Component;
 import de.ozgcloud.xta.test.app.mapper.ExceptionMapper;
 import de.ozgcloud.xta.test.app.mapper.RequestMapper;
 import de.ozgcloud.xta.test.app.mapper.ResponseMapper;
-import de.ozgcloud.xta.test.app.service.RequestValidator;
 import de.ozgcloud.xta.test.app.service.XtaMessageService;
 import de.ozgcloud.xta.test.app.util.XtaIdGenerator;
+import de.ozgcloud.xta.test.app.validation.RequestValidator;
 import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException;
 import genv3.de.xoev.transport.xta.x211.MsgBoxPortType;
 import genv3.de.xoev.transport.xta.x211.PermissionDeniedException;
diff --git a/src/main/java/de/ozgcloud/xta/test/app/service/RequestValidator.java b/src/main/java/de/ozgcloud/xta/test/app/validation/RequestValidator.java
similarity index 97%
rename from src/main/java/de/ozgcloud/xta/test/app/service/RequestValidator.java
rename to src/main/java/de/ozgcloud/xta/test/app/validation/RequestValidator.java
index 031980d0156ba5a033f269702079fe2992c4fffd..7d1b71ff8c9faf3a072b566789e10039047a26f5 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/service/RequestValidator.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/validation/RequestValidator.java
@@ -1,4 +1,4 @@
-package de.ozgcloud.xta.test.app.service;
+package de.ozgcloud.xta.test.app.validation;
 
 import java.util.Collection;
 import java.util.function.Function;
diff --git a/src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaMessageId.java b/src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaMessageId.java
new file mode 100644
index 0000000000000000000000000000000000000000..72ee404cb14c2e55df32c9c292459b8aa6927922
--- /dev/null
+++ b/src/main/java/de/ozgcloud/xta/test/app/validation/ValidXtaMessageId.java
@@ -0,0 +1,20 @@
+package de.ozgcloud.xta.test.app.validation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
+
+@Constraint(validatedBy = XtaMessageIdValidator.class)
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER }) // Specify where the annotation can be applied
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ValidXtaMessageId {
+	String message() default "Invalid message id"; // Default error message
+
+	Class<?>[] groups() default {};
+
+	Class<? extends Payload>[] payload() default {};
+}
diff --git a/src/main/java/de/ozgcloud/xta/test/app/validation/XtaMessageIdValidator.java b/src/main/java/de/ozgcloud/xta/test/app/validation/XtaMessageIdValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b6a2e96098169466eda9dbd891aae17d1fbb596
--- /dev/null
+++ b/src/main/java/de/ozgcloud/xta/test/app/validation/XtaMessageIdValidator.java
@@ -0,0 +1,17 @@
+package de.ozgcloud.xta.test.app.validation;
+
+import static de.ozgcloud.xta.test.app.model.XtaConstants.*;
+
+import java.util.regex.Pattern;
+
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
+
+public class XtaMessageIdValidator implements ConstraintValidator<ValidXtaMessageId, String> {
+	public Pattern PATTERN = Pattern.compile(MESSAGE_ID_PATTERN);
+
+	@Override
+	public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
+		return value != null && PATTERN.matcher(value).matches();
+	}
+}
diff --git a/src/test/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImplTest.java b/src/test/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImplTest.java
index 3f47332ee59660a42e0b5958595fdd8e36a857c6..12d49137a94ffb93536ff7117159e1fe4dd7dba3 100644
--- a/src/test/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImplTest.java
+++ b/src/test/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImplTest.java
@@ -24,9 +24,9 @@ import de.ozgcloud.xta.test.app.model.XtaGetMessageRequest;
 import de.ozgcloud.xta.test.app.model.XtaMessage;
 import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListing;
 import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListingRequest;
-import de.ozgcloud.xta.test.app.service.RequestValidator;
 import de.ozgcloud.xta.test.app.service.XtaMessageService;
 import de.ozgcloud.xta.test.app.util.XtaIdGenerator;
+import de.ozgcloud.xta.test.app.validation.RequestValidator;
 import genv3.de.xoev.transport.xta.x211.GenericContentContainer;
 import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException;
 import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
diff --git a/src/test/java/de/ozgcloud/xta/test/app/validation/RequestValidatorTest.java b/src/test/java/de/ozgcloud/xta/test/app/validation/RequestValidatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a49bf94b4e1b8b0db26e28659b0d7265874f203
--- /dev/null
+++ b/src/test/java/de/ozgcloud/xta/test/app/validation/RequestValidatorTest.java
@@ -0,0 +1,71 @@
+package de.ozgcloud.xta.test.app.validation;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+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.mapper.ExceptionMapper;
+import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
+import lombok.SneakyThrows;
+
+class RequestValidatorTest {
+
+	@InjectMocks
+	private RequestValidator validator;
+
+	@Mock
+	private ExceptionMapper exceptionMapper;
+
+	@Mock
+	private XTAWSTechnicalProblemException exception;
+
+	@DisplayName("validate xta get message request")
+	@Nested
+	class TestValidateXtaGetMessageRequest {
+
+		@DisplayName("should return")
+		@Test
+		@SneakyThrows
+		void shouldReturn() {
+			validator.validate(XtaGetMessageRequestTestFactory.create());
+		}
+
+		@DisplayName("with invalid request")
+		@Nested
+		class TestWithInvalidRequest {
+
+			@BeforeEach
+			void mock() {
+				when(exceptionMapper.createTechnicalProblemException(any())).thenReturn(exception);
+			}
+
+			@DisplayName("should throw if message id is null")
+			@Test
+			void shouldThrowIfMessageIdIsNull() {
+				var request = XtaGetMessageRequestTestFactory.createBuilder()
+						.messageId(null)
+						.build();
+
+				assertThatThrownBy(() -> validator.validate(request)).isEqualTo(exception);
+			}
+
+			@DisplayName("should throw if message id does not match pattern")
+			@Test
+			void shouldThrowIfMessageIdDoesNotMatchPattern() {
+				var request = XtaGetMessageRequestTestFactory.createBuilder()
+						.messageId("urn:some-invalid-format")
+						.build();
+
+				assertThatThrownBy(() -> validator.validate(request)).isEqualTo(exception);
+			}
+		}
+
+	}
+
+}
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/xta/test/app/validation/XtaGetMessageRequestTestFactory.java b/src/test/java/de/ozgcloud/xta/test/app/validation/XtaGetMessageRequestTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..7ec8f61169b244646b5604915e8ef0de51e06b9c
--- /dev/null
+++ b/src/test/java/de/ozgcloud/xta/test/app/validation/XtaGetMessageRequestTestFactory.java
@@ -0,0 +1,18 @@
+package de.ozgcloud.xta.test.app.validation;
+
+import de.ozgcloud.xta.test.app.model.XtaGetMessageRequest;
+
+public class XtaGetMessageRequestTestFactory {
+	public static String VALID_MESSAGE_ID = "urn:de:xta:messageid:application:000ca2fe-f4e1-45c2-8233-3a0eb760bd16";
+	public static String VALID_CLIENT_IDENTIFIER_VALUE = "prefix:someValue";
+
+	public static XtaGetMessageRequest.XtaGetMessageRequestBuilder createBuilder() {
+		return XtaGetMessageRequest.builder()
+				.messageId(VALID_MESSAGE_ID)
+				.clientIdentifierValue(VALID_CLIENT_IDENTIFIER_VALUE);
+	}
+
+	public static XtaGetMessageRequest create() {
+		return createBuilder().build();
+	}
+}