diff --git a/src/main/java/de/ozgcloud/processor/processor/ProcessorService.java b/src/main/java/de/ozgcloud/processor/processor/ProcessorService.java
index a48971999cef954f616bfef82adadbe4cbd60889..c421d139c747d99c1163c47e4d0d59c0332f8c3a 100644
--- a/src/main/java/de/ozgcloud/processor/processor/ProcessorService.java
+++ b/src/main/java/de/ozgcloud/processor/processor/ProcessorService.java
@@ -45,6 +45,14 @@ public class ProcessorService {
 		return forms.stream().filter(form -> StringUtils.equals(form.getFormEngineName(), vorgang.getFormEngineName()))
 				.anyMatch(form -> StringUtils.equals(form.getFormId(), vorgang.getFormId()));
 	}
+	
+	public Stream<Mono<ProcessorResult>> processVorgang(Vorgang vorgang, Collection<String> processorNames) {
+		return getProcessors(processorNames).map(processor -> callProcessor(processor, vorgang));
+	}
+	
+	Stream<Processor> getProcessors(Collection<String> processorNames) {
+		return properties.getProcessors().stream().filter(processor -> processorNames.contains(processor.getName()));
+	}
 
 	Mono<ProcessorResult> callProcessor(Processor processor, Vorgang vorgang) {
 		LOG.info("Sending Vorgang {} to processors.", vorgang.getId());
@@ -68,9 +76,4 @@ public class ProcessorService {
 	Mono<Throwable> buildRedirectError(ClientResponse clientResponse) {
 		return Mono.error(new TechnicalException("Resource was moved (%s) ".formatted(clientResponse.statusCode())));
 	}
-	
-	public Stream<Mono<ProcessorResult>> processVorgang(Vorgang vorgang, Collection<String> processorName) {
-		//TODO Implement OZG-4513
-		return null;
-	}
-}
+}
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java b/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java
index 7d102a97d3a21e54cc360f119f27c6e7be73ff86..eeb80baf544448f9d79a461a168db6a578516083 100644
--- a/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java
+++ b/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceITCase.java
@@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.*;
 import static org.junit.jupiter.api.Assertions.*;
 
 import java.time.Duration;
+import java.util.Collections;
 import java.util.concurrent.TimeUnit;
 
 import org.junit.jupiter.api.AfterEach;
@@ -54,10 +55,13 @@ class ProcessorServiceITCase {
 		@BeforeEach
 		void setup() {
 			processor = ProcessorTestFactory.createBuilder().address(mockWebServer.url("/").toString()).build();
-			MockResponse response = new MockResponse()
+			mockWebServer.enqueue(createMockResponse());
+		}
+		
+		private MockResponse createMockResponse() {
+			return new MockResponse()
 					.addHeader("Content-Type", "application/json")
 					.setBody("{\"%s\": \"%s\"}".formatted(ProcessorResultTestFactory.KEY_RESULT_ACTION, ProcessorResultTestFactory.RESULT_ACTION));
-			mockWebServer.enqueue(response);
 		}
 
 		@AfterEach
@@ -203,6 +207,40 @@ class ProcessorServiceITCase {
 
 			assertThrows(ProcessorTechnicalException.class, () -> results.forEach(Mono::block));
 		}
+	}
+	
+	@DisplayName("Process vorgang")
+	@Nested
+	class TestProcessVorgang {
+		
+		private MockWebServer mockWebServer = new MockWebServer();
+		private Vorgang vorgang = VorgangTestFactory.create();
+		private Processor processor = ProcessorTestFactory.createBuilder().address(mockWebServer.url("/").toString()).build();
+		private ProcessorProperties properties = ProcessorProperties.builder().processor(processor).build();
+
+		@BeforeEach
+		void setup() {
+			ReflectionTestUtils.setField(service, "properties", properties);
+		}
 
+		@SneakyThrows
+		@AfterEach
+		void cleanup() {
+			mockWebServer.shutdown();
+		}
+		
+		@Test
+		void shouldReturnProcessor() {
+			var result = service.processVorgang(vorgang, Collections.singleton(ProcessorTestFactory.PROCESSOR_NAME));
+			
+			assertThat(result).isNotEmpty();
+		}
+		
+		@Test
+		void shouldReturnEmptyStream() {
+			var result = service.processVorgang(vorgang, Collections.singleton("notMatchingProcessorName"));
+			
+			assertThat(result).isEmpty();
+		}
 	}
 }
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceTest.java b/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceTest.java
index 11d4532c37cf9f0f9d69ca2ea4c577f8c2ee255e..8321bcf543dd84f10c1f117f597f130f398e60fb 100644
--- a/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceTest.java
+++ b/src/test/java/de/ozgcloud/processor/processor/ProcessorServiceTest.java
@@ -1,8 +1,13 @@
 package de.ozgcloud.processor.processor;
 
 import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
+import java.util.stream.Stream;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -14,11 +19,12 @@ import org.mockito.Mockito;
 import org.mockito.Spy;
 
 import de.ozgcloud.processor.processor.ProcessorProperties.Processor;
+import de.ozgcloud.processor.vorgang.Vorgang;
 import de.ozgcloud.processor.vorgang.VorgangTestFactory;
+import reactor.core.publisher.Mono;
 
 class ProcessorServiceTest {
 
-
 	@Spy
 	@InjectMocks
 	private ProcessorService service;
@@ -28,7 +34,6 @@ class ProcessorServiceTest {
 	@Mock
 	private ProcessorConfiguration processorConfiguration;
 
-
 	@Nested
 	class TestProcessVorgang {
 
@@ -70,5 +75,79 @@ class ProcessorServiceTest {
 			}
 		}
 	}
-
+	
+	@DisplayName("Process vorgang by given processorNames")
+	@Nested
+	class TestProcessVorgangByGivenProcessorNames {
+		
+		private final Vorgang vorgang = VorgangTestFactory.create();
+		private final Collection<String> processorNames = Collections.singleton(ProcessorTestFactory.PROCESSOR_NAME);
+		private final Processor processor = ProcessorTestFactory.create();
+		private final Mono<ProcessorResult> processorMonoResponse = Mono.just(ProcessorResultTestFactory.create());
+		
+		@Test
+		void shouldGetProcessorByNames() {
+			doReturn(Stream.of(processor)).when(service).getProcessors(anyCollection());
+			
+			service.processVorgang(vorgang, processorNames);
+			
+			verify(service).getProcessors(processorNames);
+		}
+		
+		@Test
+		void shouldCallProcessor() {
+			doReturn(processorMonoResponse).when(service).callProcessor(any(), any());
+			doReturn(Stream.of(processor)).when(service).getProcessors(anyCollection());
+			
+			service.processVorgang(vorgang, processorNames).toList();
+			
+			verify(service).callProcessor(any(), any());
+		}
+		
+		@Test
+		void shouldReturnProcessorResult() {
+			doReturn(processorMonoResponse).when(service).callProcessor(any(), any());
+			doReturn(Stream.of(processor)).when(service).getProcessors(anyCollection());
+			
+			var result = service.processVorgang(vorgang, processorNames).toList();
+			
+			assertThat(result).containsExactly(processorMonoResponse);
+		}
+		
+		@DisplayName("get processors")
+		@Nested
+		class TestGetProcessors {
+			
+			private final Processor processor = ProcessorTestFactory.create();
+			
+			@Test
+			void shouldGetConfiguredProcessor() {
+				when(properties.getProcessors()).thenReturn(List.of(processor));
+				
+				service.getProcessors(processorNames);
+				
+				verify(properties).getProcessors();
+			}
+			
+			@DisplayName("should return processors matching processor name")
+			@Test
+			void shouldReturnProcessor() {
+				when(properties.getProcessors()).thenReturn(List.of(processor));
+				
+				var processorResult = service.getProcessors(processorNames).toList();
+				
+				assertThat(processorResult).containsExactly(processor);
+			}
+			
+			@DisplayName("should return empty stream on non matching processor name")
+			@Test
+			void shouldReturnEmpty() {
+				when(properties.getProcessors()).thenReturn(List.of(ProcessorTestFactory.createBuilder().name("notMatchin").build()));
+				
+				var processorResult = service.getProcessors(processorNames).toList();
+				
+				assertThat(processorResult).isEmpty();
+			}
+		}
+	}
 }