diff --git a/src/main/java/de/ozgcloud/xta/client/XtaClient.java b/src/main/java/de/ozgcloud/xta/client/XtaClient.java
index f259383d0672427547f8f3ed01871c74bd97922b..369597a7ba494599e604e4d116c3ad49541d798e 100644
--- a/src/main/java/de/ozgcloud/xta/client/XtaClient.java
+++ b/src/main/java/de/ozgcloud/xta/client/XtaClient.java
@@ -1,5 +1,7 @@
 package de.ozgcloud.xta.client;
 
+import jakarta.validation.constraints.NotBlank;
+
 import org.apache.commons.lang3.NotImplementedException;
 
 import de.ozgcloud.xta.client.config.XtaClientConfig;
@@ -22,14 +24,14 @@ public class XtaClient {
 	private final WrappedXtaService service;
 	private final XtaClientConfig config;
 
-	public XtaMessageMetaDataListing getMessagesMetadata(String xtaIdentifier)
+	public XtaMessageMetaDataListing getMessagesMetadata(@NotBlank String xtaIdentifier)
 			throws XTAWSTechnicalProblemException, PermissionDeniedException {
 		var clientIdentifier = deriveIdentifier(xtaIdentifier);
 		service.checkAccountActive(clientIdentifier);
 		return getStatusList(clientIdentifier);
 	}
 
-	public XtaMessageMetaDataListing getNextMessagesMetadata(String xtaIdentifier)
+	public XtaMessageMetaDataListing getNextMessagesMetadata(@NotBlank String xtaIdentifier)
 			throws XTAWSTechnicalProblemException, PermissionDeniedException {
 		return getStatusList(deriveIdentifier(xtaIdentifier));
 	}
@@ -46,7 +48,7 @@ public class XtaClient {
 		throw new NotImplementedException("");
 	}
 
-	public void close(String messageId) {
+	public void close(@NotBlank String messageId) {
 		throw new NotImplementedException("");
 	}
 }
diff --git a/src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java b/src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java
index c00e8b1dcfe60c3ec1952cf1a201b8aecca26061..5678d5dd2c387c5e7e66e41fe2e23a3f7a9e020f 100644
--- a/src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java
+++ b/src/main/java/de/ozgcloud/xta/client/core/WebServiceTypeMapper.java
@@ -5,8 +5,12 @@ import org.mapstruct.Mapping;
 import org.mapstruct.ReportingPolicy;
 
 import de.ozgcloud.xta.client.model.Identifier;
+import de.ozgcloud.xta.client.model.XtaFile;
+import de.ozgcloud.xta.client.model.XtaMessage;
 import de.ozgcloud.xta.client.model.XtaMessageMetaData;
 import de.ozgcloud.xta.client.model.XtaMessageMetaDataListing;
+import genv3.de.xoev.transport.xta.x211.ContentType;
+import genv3.de.xoev.transport.xta.x211.GenericContentContainer;
 import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxResponseType;
 import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxStatusListRequestType;
 import genv3.eu.osci.ws.x2008.x05.transport.MsgStatusListType;
@@ -52,4 +56,27 @@ public interface WebServiceTypeMapper {
 	@Mapping(target = "messageSize", source = "msgSize")
 	XtaMessageMetaData mapXtaMessageMetaData(MessageMetaData messageMetaData);
 
+	@Mapping(target = "qualifier.service", source = "service")
+	@Mapping(target = "qualifier.businessScenario.defined.code", source = "businessScenarioCode")
+	@Mapping(target = "qualifier.messageType.code", source = "messageTypeCode")
+	@Mapping(target = "qualifier.messageType.payloadSchema", source = "messageTypePayloadSchema")
+	@Mapping(target = "msgIdentification.messageID.value", source = "messageId")
+	@Mapping(target = "originators.author.identifier", source = "authorIdentifier")
+	@Mapping(target = "destinations.reader.identifier", source = "readerIdentifier")
+	@Mapping(target = "msgSize", source = "messageSize")
+	@Mapping(target = "testMsg", constant = "false")
+	@Mapping(target = "deliveryAttributes", ignore = true)
+	@Mapping(target = "messageProperties", ignore = true)
+	MessageMetaData mapMessageMetaDataFromXtaMessageMetaData(XtaMessageMetaData xtaMessageMetaData);
+
+	@Mapping(target = "encryptedData", ignore = true)
+	@Mapping(target = "contentContainer.message", source = "messageFile")
+	@Mapping(target = "contentContainer.attachment", source = "attachmentFiles")
+	GenericContentContainer mapGenericContentContainerFromXtaFile(XtaMessage xtaMessage);
+
+	@Mapping(target = "value", source = "content")
+	@Mapping(target = "filename", source = "name")
+	@Mapping(target = "lang", source = "language")
+	ContentType mapContentTypeFromXtaFile(XtaFile xtaFile);
+
 }
diff --git a/src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java b/src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java
index 35fdd86f67b12c71b99c3944dd144bb42360337b..556e9062c76b991bebeed9846fdac510ab59971a 100644
--- a/src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java
+++ b/src/main/java/de/ozgcloud/xta/client/core/WrappedXtaService.java
@@ -5,7 +5,11 @@ import jakarta.xml.ws.Holder;
 import de.ozgcloud.xta.client.model.Identifier;
 import de.ozgcloud.xta.client.model.XtaMessage;
 import de.ozgcloud.xta.client.model.XtaMessageMetaDataListing;
+import genv3.de.xoev.transport.xta.x211.MessageSchemaViolationException;
+import genv3.de.xoev.transport.xta.x211.MessageVirusDetectionException;
+import genv3.de.xoev.transport.xta.x211.ParameterIsNotValidException;
 import genv3.de.xoev.transport.xta.x211.PermissionDeniedException;
+import genv3.de.xoev.transport.xta.x211.SyncAsyncException;
 import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
 import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxResponseType;
 import lombok.Builder;
@@ -35,8 +39,18 @@ public class WrappedXtaService {
 		return typeMapper.mapXtaMessageMetaDataAndHeader(msgStatusListType, fetchResponseHeader.value);
 	}
 
-	public void sendMessage(XtaMessage message) {
-		// ports.sendPort().sendMessage()
+	public void sendMessage(XtaMessage message)
+			throws SyncAsyncException, XTAWSTechnicalProblemException, MessageVirusDetectionException, MessageSchemaViolationException,
+			PermissionDeniedException, ParameterIsNotValidException {
+		ports.sendPort().sendMessage(
+				typeMapper.mapGenericContentContainerFromXtaFile(message),
+				typeMapper.mapMessageMetaDataFromXtaMessageMetaData(message.metaData()),
+				null
+		);
+	}
+
+	public void close(String messageId) {
+		throw new UnsupportedOperationException("Not implemented yet");
 	}
 
 }
diff --git a/src/main/java/de/ozgcloud/xta/client/model/Identifier.java b/src/main/java/de/ozgcloud/xta/client/model/Identifier.java
index 3f7ac425df1182e248454093f6735548934f01be..831ea82f5684efad5627d6412d37731db7d3e5f1 100644
--- a/src/main/java/de/ozgcloud/xta/client/model/Identifier.java
+++ b/src/main/java/de/ozgcloud/xta/client/model/Identifier.java
@@ -1,7 +1,7 @@
 package de.ozgcloud.xta.client.model;
 
 import jakarta.annotation.Nullable;
-import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotBlank;
 
 import lombok.Builder;
 
@@ -9,6 +9,6 @@ import lombok.Builder;
 public record Identifier(
 		@Nullable String name,
 		@Nullable String category,
-		@NotEmpty String value
+		@NotBlank String value
 ) {
 }
diff --git a/src/main/java/de/ozgcloud/xta/client/model/XtaFile.java b/src/main/java/de/ozgcloud/xta/client/model/XtaFile.java
index 16396f66b38b1f9e839f6e998fb5eccaa708b906..89b2d1e6d1d02da3b75c5ac44b209bf5552894f2 100644
--- a/src/main/java/de/ozgcloud/xta/client/model/XtaFile.java
+++ b/src/main/java/de/ozgcloud/xta/client/model/XtaFile.java
@@ -2,6 +2,8 @@ package de.ozgcloud.xta.client.model;
 
 import java.math.BigInteger;
 
+import jakarta.activation.DataHandler;
+import jakarta.annotation.Nullable;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.PositiveOrZero;
@@ -10,9 +12,13 @@ import lombok.Builder;
 
 @Builder
 public record XtaFile(
-		@NotNull byte[] content,
+		@NotNull DataHandler content,
 		@NotBlank String contentType,
+		@Nullable String contentDescription,
+		@Nullable String encoding,
 		@NotBlank String name,
+		@Nullable String id,
+		@Nullable String language,
 		@PositiveOrZero BigInteger size
 ) {
 }
diff --git a/src/main/java/de/ozgcloud/xta/client/model/XtaMessage.java b/src/main/java/de/ozgcloud/xta/client/model/XtaMessage.java
index 01b2c684b55069ddf44759ebacc21816abfc22eb..39f333a24d76af9071651b323d8ce9077eb145a1 100644
--- a/src/main/java/de/ozgcloud/xta/client/model/XtaMessage.java
+++ b/src/main/java/de/ozgcloud/xta/client/model/XtaMessage.java
@@ -11,6 +11,6 @@ import lombok.Builder;
 public record XtaMessage(
 		@NotNull @Valid XtaMessageMetaData metaData,
 		@NotNull @Valid XtaFile messageFile,
-		@NotNull List<@Valid XtaFile> attachments
+		@NotNull List<@Valid XtaFile> attachmentFiles
 ) {
 }
diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java b/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java
index 1a9e69254eb08ecb70007692c00c43d13ac410dd..e63cbc8c5e1dbf5d411fa4b6ccd67a622f8108b4 100644
--- a/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java
+++ b/src/test/java/de/ozgcloud/xta/client/XtaClientConfigTestFactory.java
@@ -24,7 +24,7 @@ public class XtaClientConfigTestFactory {
 	public static final String SELF_IDENTIFIER_VALUE = "selfIdentifier";
 	public static final Identifier SELF_IDENTIFIER = Identifier.builder()
 			.value(SELF_IDENTIFIER_VALUE)
-			.category("xoev")
+			.category("Generic category")
 			.name("Generic Name")
 			.build();
 	public static final int MAX_LIST_ITEMS = 10;
diff --git a/src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java b/src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java
index 0a69915c2ec6f5c50f93e92dc341c6cdd9371284..79b4ec013246a589612ef29705797f282184c905 100644
--- a/src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/core/WebServiceTypeMapperTest.java
@@ -4,28 +4,36 @@ import static de.ozgcloud.xta.client.XtaClientConfigTestFactory.*;
 import static de.ozgcloud.xta.client.core.MessageMetaDataTestFactory.*;
 import static de.ozgcloud.xta.client.core.MsgBoxResponseTypeTestFactory.*;
 import static de.ozgcloud.xta.client.core.WebServiceTypeMapper.*;
+import static de.ozgcloud.xta.client.model.XtaFileTestFactory.*;
 import static org.assertj.core.api.Assertions.*;
 
 import java.math.BigInteger;
 
+import org.apache.cxf.helpers.IOUtils;
 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.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.junit.jupiter.MockitoExtension;
+import org.mapstruct.factory.Mappers;
 
+import de.ozgcloud.xta.client.model.XtaMessage;
 import de.ozgcloud.xta.client.model.XtaMessageMetaData;
+import de.ozgcloud.xta.client.model.XtaMessageMetaDataTestFactory;
+import de.ozgcloud.xta.client.model.XtaMessageTestFactory;
+import genv3.de.xoev.transport.xta.x211.ContentType;
 import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxResponseType;
 import genv3.eu.osci.ws.x2008.x05.transport.MsgStatusListType;
 import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType;
+import lombok.SneakyThrows;
 
-@ExtendWith(MockitoExtension.class)
 class WebServiceTypeMapperTest {
 
-	@InjectMocks
-	private WebServiceTypeMapperImpl mapper;
+	private WebServiceTypeMapper mapper;
+
+	@BeforeEach
+	void setup() {
+		mapper = Mappers.getMapper(WebServiceTypeMapper.class);
+	}
 
 	@DisplayName("map party type from identifier")
 	@Nested
@@ -199,4 +207,111 @@ class WebServiceTypeMapperTest {
 		}
 	}
 
+	@DisplayName("map message meta data from xta message meta data")
+	@Nested
+	class TestMapMessageMetaDataFromXtaMessageMetaData {
+
+		private XtaMessageMetaData xtaMessageMetaData;
+
+		@BeforeEach
+		void setup() {
+			xtaMessageMetaData = XtaMessageMetaDataTestFactory.create();
+		}
+
+		@DisplayName("should map service")
+		@Test
+		void shouldMapService() {
+			var result = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData);
+
+			assertThat(result.getQualifier().getService()).isEqualTo(MESSAGE_SERVICE);
+		}
+
+		@DisplayName("should map business scenario code")
+		@Test
+		void shouldMapBusinessScenarioCode() {
+			var result = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData);
+
+			assertThat(result.getQualifier().getBusinessScenario().getDefined().getCode())
+					.isEqualTo(BUSINESS_SCENARIO_CODE);
+		}
+
+		@DisplayName("should map message type code")
+		@Test
+		void shouldMapMessageTypeCode() {
+			var result = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData);
+
+			assertThat(result.getQualifier().getMessageType().getCode()).isEqualTo(MESSAGE_TYPE_CODE);
+		}
+
+		@DisplayName("should map message type payload schema")
+		@Test
+		void shouldMapMessageTypePayloadSchema() {
+			var result = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData);
+
+			assertThat(result.getQualifier().getMessageType().getPayloadSchema())
+					.isEqualTo(MESSAGE_TYPE_PAYLOAD_SCHEMA);
+		}
+
+		@DisplayName("should map message id")
+		@Test
+		void shouldMapMessageId() {
+			var result = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData);
+
+			assertThat(result.getMsgIdentification().getMessageID().getValue()).isEqualTo(MESSAGE_ID);
+		}
+
+		@DisplayName("should map author identifier")
+		@Test
+		void shouldMapAuthorIdentifier() {
+			var result = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData);
+
+			assertThat(result.getOriginators().getAuthor().getIdentifier()).usingRecursiveComparison().isEqualTo(
+					mapper.mapPartyIdentifierTypeFromIdentifier(AUTHOR_IDENTIFIER));
+		}
+
+		@DisplayName("should map reader identifier")
+		@Test
+		void shouldMapReaderIdentifier() {
+			var result = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData);
+
+			assertThat(result.getDestinations().getReader().getIdentifier()).usingRecursiveComparison().isEqualTo(
+					mapper.mapPartyIdentifierTypeFromIdentifier(READER_IDENTIFIER));
+		}
+	}
+
+	@DisplayName("map generic content container from xta file")
+	@Nested
+	class TestMapGenericContentContainerFromXtaFile {
+		private XtaMessage xtaMessage;
+
+		@BeforeEach
+		void setup() {
+			xtaMessage = XtaMessageTestFactory.create();
+		}
+
+		@DisplayName("should map message value")
+		@Test
+		@SneakyThrows
+		void shouldMapMessageValue() {
+			var result = mapper.mapGenericContentContainerFromXtaFile(xtaMessage);
+
+			assertThat(getContent(result.getContentContainer().getMessage())).isEqualTo(XTA_FILE_CONTENT);
+		}
+
+		@DisplayName("should map attachment value")
+		@Test
+		@SneakyThrows
+		void shouldMapAttachmentValue() {
+			var result = mapper.mapGenericContentContainerFromXtaFile(xtaMessage);
+
+			assertThat(getContent(result.getContentContainer().getAttachment().getFirst())).isEqualTo(XTA_FILE_CONTENT);
+		}
+
+		@SneakyThrows
+		private byte[] getContent(ContentType contentType) {
+			var dataHandler = contentType.getValue();
+			return IOUtils.readBytesFromStream(dataHandler.getInputStream());
+		}
+	}
+
 }
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java b/src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java
index 8c01dcd8e04cd3321741beb844db43365149638b..f9e6f7434c61cd4fbe84481340847f918cecd9f2 100644
--- a/src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/core/WrappedXtaServiceTest.java
@@ -15,13 +15,17 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import de.ozgcloud.xta.client.model.XtaMessage;
 import de.ozgcloud.xta.client.model.XtaMessageMetaDataListing;
+import de.ozgcloud.xta.client.model.XtaMessageTestFactory;
+import genv3.de.xoev.transport.xta.x211.GenericContentContainer;
 import genv3.de.xoev.transport.xta.x211.ManagementPortType;
 import genv3.de.xoev.transport.xta.x211.MsgBoxPortType;
-import genv3.de.xoev.transport.xta.x211.XTAService;
+import genv3.de.xoev.transport.xta.x211.SendPortType;
 import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxResponseType;
 import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxStatusListRequestType;
 import genv3.eu.osci.ws.x2008.x05.transport.MsgStatusListType;
+import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData;
 import genv3.eu.osci.ws.x2014.x10.transport.PartyType;
 import lombok.SneakyThrows;
 
@@ -29,7 +33,7 @@ import lombok.SneakyThrows;
 class WrappedXtaServiceTest {
 
 	@Mock
-	private XTAService rawService;
+	private XtaPortTriple xtaPortTriple;
 
 	@Mock
 	private WebServiceTypeMapper typeMapper;
@@ -49,7 +53,7 @@ class WrappedXtaServiceTest {
 
 		@BeforeEach
 		void mock() {
-			when(rawService.getManagementPort()).thenReturn(managementPortType);
+			when(xtaPortTriple.managementPort()).thenReturn(managementPortType);
 			when(typeMapper.mapPartyTypeFromIdentifier(SELF_IDENTIFIER)).thenReturn(partyType);
 		}
 
@@ -87,7 +91,7 @@ class WrappedXtaServiceTest {
 		@BeforeEach
 		@SneakyThrows
 		void mock() {
-			when(rawService.getMsgBoxPort()).thenReturn(msgBoxPortType);
+			when(xtaPortTriple.msgBoxPort()).thenReturn(msgBoxPortType);
 			when(typeMapper.mapPartyTypeFromIdentifier(SELF_IDENTIFIER)).thenReturn(partyType);
 			when(typeMapper.mapMsgBoxStatusListRequestTypeFromMaxListItems(MAX_LIST_ITEMS))
 					.thenReturn(msgBoxStatusListRequestType);
@@ -112,4 +116,37 @@ class WrappedXtaServiceTest {
 		}
 	}
 
+	@DisplayName("send message")
+	@Nested
+	class TestSendMessage {
+
+		@Mock
+		private SendPortType sendPortType;
+
+		@Mock
+		private GenericContentContainer genericContentContainer;
+
+		@Mock
+		private MessageMetaData messageMetaData;
+
+		private XtaMessage xtaMessage;
+
+		@BeforeEach
+		void mock() {
+			xtaMessage = XtaMessageTestFactory.create();
+			when(xtaPortTriple.sendPort()).thenReturn(sendPortType);
+			when(typeMapper.mapGenericContentContainerFromXtaFile(xtaMessage)).thenReturn(genericContentContainer);
+			when(typeMapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessage.metaData())).thenReturn(messageMetaData);
+		}
+
+		@DisplayName("should call port method")
+		@Test
+		@SneakyThrows
+		void shouldPortMethod() {
+			service.sendMessage(xtaMessage);
+
+			verify(sendPortType).sendMessage(genericContentContainer, messageMetaData, null);
+		}
+	}
+
 }
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/xta/client/model/XtaFileTestFactory.java b/src/test/java/de/ozgcloud/xta/client/model/XtaFileTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..d458ab9a231462719bcd9202b0967652b8cb6a7f
--- /dev/null
+++ b/src/test/java/de/ozgcloud/xta/client/model/XtaFileTestFactory.java
@@ -0,0 +1,40 @@
+package de.ozgcloud.xta.client.model;
+
+import java.math.BigInteger;
+
+import jakarta.activation.DataHandler;
+import jakarta.mail.util.ByteArrayDataSource;
+
+public class XtaFileTestFactory {
+
+	public static byte[] XTA_FILE_CONTENT = "Testinhalt".getBytes();
+	public static String XTA_FILE_CONTENT_TYPE = "text/plain";
+	public static String XTA_FILE_CONTENT_DESCRIPTION = "test description";
+	public static String XTA_FILE_ENCODING = "UTF-8";
+	public static String XTA_FILE_NAME = "test.txt";
+	public static String XTA_FILE_ID = "test-file-id";
+	public static String XTA_FILE_LANGUAGE = "de";
+
+	public static BigInteger XTA_FILE_SIZE = BigInteger.valueOf(XTA_FILE_CONTENT.length);
+
+	public static XtaFile create() {
+		return createBuilder().build();
+	}
+
+	public static XtaFile.XtaFileBuilder createBuilder() {
+		return XtaFile.builder()
+				.content(createOctetStream(XTA_FILE_CONTENT))
+				.contentType(XTA_FILE_CONTENT_TYPE)
+				.contentDescription(XTA_FILE_CONTENT_DESCRIPTION)
+				.encoding(XTA_FILE_ENCODING)
+				.name(XTA_FILE_NAME)
+				.id(XTA_FILE_ID)
+				.language(XTA_FILE_LANGUAGE)
+				.size(XTA_FILE_SIZE);
+	}
+
+	private static DataHandler createOctetStream(byte[] xtaFileContent) {
+		var dataSource = new ByteArrayDataSource(xtaFileContent, "application/octet-stream");
+		return new DataHandler(dataSource);
+	}
+}
diff --git a/src/test/java/de/ozgcloud/xta/client/model/XtaMessageMetaDataTestFactory.java b/src/test/java/de/ozgcloud/xta/client/model/XtaMessageMetaDataTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b58908ef3daa3769341691bad0db1f961a9b0fa
--- /dev/null
+++ b/src/test/java/de/ozgcloud/xta/client/model/XtaMessageMetaDataTestFactory.java
@@ -0,0 +1,22 @@
+package de.ozgcloud.xta.client.model;
+
+import static de.ozgcloud.xta.client.core.MessageMetaDataTestFactory.*;
+
+public class XtaMessageMetaDataTestFactory {
+
+	public static XtaMessageMetaData create() {
+		return createBuilder().build();
+	}
+
+	public static XtaMessageMetaData.XtaMessageMetaDataBuilder createBuilder() {
+		return XtaMessageMetaData.builder()
+				.service(MESSAGE_SERVICE)
+				.businessScenarioCode(BUSINESS_SCENARIO_CODE)
+				.messageTypeCode(MESSAGE_TYPE_CODE)
+				.messageTypePayloadSchema(MESSAGE_TYPE_PAYLOAD_SCHEMA)
+				.messageId(MESSAGE_ID)
+				.authorIdentifier(AUTHOR_IDENTIFIER)
+				.readerIdentifier(READER_IDENTIFIER)
+				.messageSize(MESSAGE_SIZE);
+	}
+}
diff --git a/src/test/java/de/ozgcloud/xta/client/model/XtaMessageTestFactory.java b/src/test/java/de/ozgcloud/xta/client/model/XtaMessageTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..e047ff0b4c4173df998b87c768c8922370d35b93
--- /dev/null
+++ b/src/test/java/de/ozgcloud/xta/client/model/XtaMessageTestFactory.java
@@ -0,0 +1,17 @@
+package de.ozgcloud.xta.client.model;
+
+import java.util.List;
+
+public class XtaMessageTestFactory {
+
+	public static XtaMessage create() {
+		return createBuilder().build();
+	}
+
+	public static XtaMessage.XtaMessageBuilder createBuilder() {
+		return XtaMessage.builder()
+				.metaData(XtaMessageMetaDataTestFactory.create())
+				.messageFile(XtaFileTestFactory.create())
+				.attachmentFiles(List.of(XtaFileTestFactory.create()));
+	}
+}