diff --git a/src/main/java/de/ozgcloud/formcycle/OzgPluginExecutor.java b/src/main/java/de/ozgcloud/formcycle/OzgPluginExecutor.java
index f65cb73a0d2e1aecb983a48f9e7f5a79a4c31308..d3c47d1512242c40d7aa496c774867c8a3348522 100644
--- a/src/main/java/de/ozgcloud/formcycle/OzgPluginExecutor.java
+++ b/src/main/java/de/ozgcloud/formcycle/OzgPluginExecutor.java
@@ -58,23 +58,19 @@ public final class OzgPluginExecutor {
 
 	public ExecutionResult execute() {
 		LOG.debug("Executing plugin WorkflowElementNodePlugin");
-		var formData = pluginFormDataAdapter.readFormData();
-		return buildExecutionResult(sendFormData(addAttachedFiles(formData)), formData);
-	}
-
-	FormCycleConfirmationResponse sendFormData(FormData formData) {
-		return ozgHttpClient.send(ozgCloudFormDataMapper.map(formData), formData.getAttachments(), formData.getRepresentations());
+		var formData = addAttachedFiles(pluginFormDataAdapter.readFormData());
+		return buildExecutionResult(sendFormData(formData), formData);
 	}
 
 	FormData addAttachedFiles(FormData formData) {
 		var formDataBuilder = formData.toBuilder();
 		var attachedFiles = getAttachedFiles(formData.getAttachmentUuids());
 		Optional.ofNullable(attachedFiles.get(AttachmentType.REPRESENTATION)).ifPresentOrElse(formDataBuilder::representations,
-				() -> formDataBuilder.warning(buildWarning(OzgPluginSoftError.MISSING_REPRESENTATION,
-						"Representation is missing. Ensure workflow is configured to attach form view to form data.")));
-		Optional.ofNullable(attachedFiles.get(AttachmentType.ATTACHMENT)).ifPresentOrElse(formDataBuilder::attachments,
-				() -> formDataBuilder.warning(
-						buildWarning(OzgPluginSoftError.MISSING_ATTACHMENTS, "Attachments were found in form data, but files are missing.")));
+				() -> formDataBuilder.warning(buildMissingRepresentationsWarning(formData.getRequestId())));
+		if (!formData.getAttachmentUuids().isEmpty()) {
+			Optional.ofNullable(attachedFiles.get(AttachmentType.ATTACHMENT)).ifPresentOrElse(formDataBuilder::attachments,
+					() -> formDataBuilder.warning(buildMissingAttachmentsWarning(formData.getRequestId())));
+		}
 		return formDataBuilder.build();
 	}
 
@@ -90,10 +86,25 @@ public final class OzgPluginExecutor {
 		return resultMap;
 	}
 
-	Warning buildWarning(OzgPluginSoftError warningCode, String message) {
+	Warning buildMissingRepresentationsWarning(String requestId) {
+		return buildWarning(OzgPluginSoftError.MISSING_REPRESENTATION,
+				String.format("Representation is missing. Ensure workflow is configured to attach form view to form data. (Request ID: %s)",
+						requestId));
+	}
+
+	Warning buildMissingAttachmentsWarning(String requestId) {
+		return buildWarning(OzgPluginSoftError.MISSING_ATTACHMENTS,
+				String.format("Attachments uploaded in the form were not included in the form data. (RequestId: %s)", requestId));
+	}
+
+	private Warning buildWarning(OzgPluginSoftError warningCode, String message) {
 		return Warning.builder().errorCode(warningCode).message(message).build();
 	}
 
+	FormCycleConfirmationResponse sendFormData(FormData formData) {
+		return ozgHttpClient.send(ozgCloudFormDataMapper.map(formData), formData.getAttachments(), formData.getRepresentations());
+	}
+
 	ExecutionResult buildExecutionResult(FormCycleConfirmationResponse response, FormData formData) {
 		LOG.debug("Formcycle adapter response: {}", response);
 		return ExecutionResult.builder().vorgangnummer(response.getVorgangNummer()).warnings(formData.getWarnings()).build();
diff --git a/src/test/java/de/ozgcloud/formcycle/OzgPluginExecutorTest.java b/src/test/java/de/ozgcloud/formcycle/OzgPluginExecutorTest.java
index 8fbca55bbb5152829ee2f387ddce5b81af54f9b6..14541d27b86ca97190257a779a1cdffc99bc78e3 100644
--- a/src/test/java/de/ozgcloud/formcycle/OzgPluginExecutorTest.java
+++ b/src/test/java/de/ozgcloud/formcycle/OzgPluginExecutorTest.java
@@ -134,66 +134,6 @@ class OzgPluginExecutorTest {
 		}
 	}
 
-	@Nested
-	@DisplayName("Send data")
-	class TestSendData {
-
-		@Mock
-		private FormCycleFormData formcycleFormData;
-		@Mock
-		private FormCycleConfirmationResponse response;
-
-		@Captor
-		private ArgumentCaptor<List<FormcycleAttachment>> attachmentsCapture;
-		@Captor
-		private ArgumentCaptor<List<FormcycleAttachment>> representationsCapture;
-
-		@Test
-		void shouldCallMapper() {
-			sendFormData();
-
-			verify(ozgCloudFormDataMapper).map(FORM_DATA);
-		}
-
-		@Test
-		void shouldSendFormData() {
-			when(ozgCloudFormDataMapper.map(any())).thenReturn(formcycleFormData);
-
-			sendFormData();
-
-			verify(ozgHttpClient).send(eq(formcycleFormData), any(), any());
-		}
-
-		@Test
-		void shouldSendAttachments() {
-			sendFormData();
-
-			verify(ozgHttpClient).send(any(), attachmentsCapture.capture(), any());
-			assertThat(attachmentsCapture.getValue()).hasSize(1).first().extracting("uuid").isEqualTo(FormDataTestFactory.ATTACHMENT_UUID);
-		}
-
-		@Test
-		void shouldSendRepresentations() {
-			sendFormData();
-
-			verify(ozgHttpClient).send(any(), any(), representationsCapture.capture());
-			assertThat(representationsCapture.getValue()).hasSize(1).first().extracting("uuid").isEqualTo(FormDataTestFactory.REPRESENTATION_UUID);
-		}
-
-		@Test
-		void shouldReturnResponse() {
-			when(ozgHttpClient.send(any(), any(), any())).thenReturn(response);
-
-			var result = sendFormData();
-
-			assertThat(result).isSameAs(response);
-		}
-
-		private FormCycleConfirmationResponse sendFormData() {
-			return executor.sendFormData(FORM_DATA);
-		}
-	}
-
 	@Nested
 	class TestAddAttachedFiles {
 
@@ -239,6 +179,18 @@ class OzgPluginExecutorTest {
 			assertThat(result.getWarnings()).isEmpty();
 		}
 
+		@Test
+		void shouldNotAddMissingAttachmentWarning() {
+			var attachedFiles = Map.of(
+					AttachmentType.REPRESENTATION,
+					List.of(FormcycleAttachmentTestFactory.createBuilder().uuid(FormDataTestFactory.REPRESENTATION_UUID).build()));
+			doReturn(attachedFiles).when(executor).getAttachedFiles(any());
+
+			var result = executor.addAttachedFiles(formData.toBuilder().clearAttachmentUuids().build());
+
+			assertThat(result.getWarnings()).isEmpty();
+		}
+
 		private void mockGetAttachedFiles() {
 			var attachedFiles = Map.of(
 					AttachmentType.ATTACHMENT,
@@ -251,18 +203,26 @@ class OzgPluginExecutorTest {
 		@Nested
 		class TestAddWarnings {
 
-			@BeforeEach
-			void setup() {
+			@Mock
+			private Warning warning;
+
+			@Test
+			void shouldCallBuildMissingRepresentationsWarning() {
+				doReturn(Map.of(AttachmentType.ATTACHMENT, List.of(FormcycleAttachmentTestFactory.create()))).when(executor).getAttachedFiles(any());
+
+				executor.addAttachedFiles(formData);
+
+				verify(executor).buildMissingRepresentationsWarning(formData.getRequestId());
 			}
 
 			@Test
 			void shouldAddWhenMissingRepresentations() {
 				doReturn(Map.of(AttachmentType.ATTACHMENT, List.of(FormcycleAttachmentTestFactory.create()))).when(executor).getAttachedFiles(any());
+				doReturn(warning).when(executor).buildMissingRepresentationsWarning(any());
 
 				var result = executor.addAttachedFiles(formData);
 
-				assertThat(result.getWarnings()).hasSize(1).first().extracting(Warning::getErrorCode)
-						.isEqualTo(OzgPluginSoftError.MISSING_REPRESENTATION.name());
+				assertThat(result.getWarnings()).hasSize(1).first().isSameAs(warning);
 			}
 
 			@Test
@@ -274,15 +234,25 @@ class OzgPluginExecutorTest {
 				assertThat(result.getRepresentations()).isEmpty();
 			}
 
+			@Test
+			void shouldCallBuildMissingAttachmentsWarning() {
+				doReturn(Map.of(AttachmentType.REPRESENTATION, List.of(FormcycleAttachmentTestFactory.create()))).when(executor)
+						.getAttachedFiles(any());
+
+				executor.addAttachedFiles(formData);
+
+				verify(executor).buildMissingAttachmentsWarning(formData.getRequestId());
+			}
+
 			@Test
 			void shouldAddWhenMissingAttachments() {
 				doReturn(Map.of(AttachmentType.REPRESENTATION, List.of(FormcycleAttachmentTestFactory.create()))).when(executor)
 						.getAttachedFiles(any());
+				doReturn(warning).when(executor).buildMissingAttachmentsWarning(any());
 
 				var result = executor.addAttachedFiles(formData);
 
-				assertThat(result.getWarnings()).hasSize(1).first().extracting(Warning::getErrorCode)
-						.isEqualTo(OzgPluginSoftError.MISSING_ATTACHMENTS.name());
+				assertThat(result.getWarnings()).hasSize(1).first().isSameAs(warning);
 			}
 
 			@Test
@@ -362,22 +332,48 @@ class OzgPluginExecutorTest {
 	}
 
 	@Nested
-	class TestBuildWarning {
+	class TestBuildMissingRepresentationsWarning {
 
-		private final String MESSAGE = "message";
+		private final String REQUEST_ID = "REQUEST_ID";
 
 		@Test
 		void shouldSetErrorCode() {
-			var warning = executor.buildWarning(OzgPluginSoftError.MISSING_REPRESENTATION, MESSAGE);
+			var warning = executor.buildMissingRepresentationsWarning(REQUEST_ID);
 
-			assertThat(warning.getErrorCode()).isEqualTo(OzgPluginSoftError.MISSING_REPRESENTATION.toString());
+			assertThat(warning.getErrorCode()).isEqualTo(OzgPluginSoftError.MISSING_REPRESENTATION.name());
 		}
 
 		@Test
 		void shouldSetMessage() {
 			var warning = executor.buildWarning(OzgPluginSoftError.MISSING_REPRESENTATION, MESSAGE);
 
-			assertThat(warning.getMessage()).isEqualTo(MESSAGE);
+		@Test
+		void shouldSendAttachments() {
+			sendFormData();
+
+			verify(ozgHttpClient).send(any(), attachmentsCapture.capture(), any());
+			assertThat(attachmentsCapture.getValue()).hasSize(1).first().extracting("uuid").isEqualTo(FormDataTestFactory.ATTACHMENT_UUID);
+		}
+
+		@Test
+		void shouldSendRepresentations() {
+			sendFormData();
+
+			verify(ozgHttpClient).send(any(), any(), representationsCapture.capture());
+			assertThat(representationsCapture.getValue()).hasSize(1).first().extracting("uuid").isEqualTo(FormDataTestFactory.REPRESENTATION_UUID);
+		}
+
+		@Test
+		void shouldReturnResponse() {
+			when(ozgHttpClient.send(any(), any(), any())).thenReturn(response);
+
+			var result = sendFormData();
+
+			assertThat(result).isSameAs(response);
+		}
+
+		private FormCycleConfirmationResponse sendFormData() {
+			return executor.sendFormData(FORM_DATA);
 		}
 	}