diff --git a/mail-service/pom.xml b/mail-service/pom.xml
index 9a9d14a54e9af3fca679f7d7ce608ef94a14538e..5877a4ee4450e481ae24047124db4c2cb7282bf9 100644
--- a/mail-service/pom.xml
+++ b/mail-service/pom.xml
@@ -8,7 +8,7 @@
 		<version>2.4.5</version>
 		<relativePath /> <!-- lookup parent from repository -->
 	</parent>
-	
+
 	<groupId>de.itvsh.ozg.mail</groupId>
 	<artifactId>mail-service</artifactId>
 	<version>0.6.0-SNAPSHOT</version>
@@ -43,7 +43,7 @@
 			<scope>test</scope>
 		</dependency>
 	</dependencies>
-	
+
 	<build>
 		<plugins>
 			<plugin>
@@ -59,9 +59,20 @@
 					<skip>true</skip>
 				</configuration>
 			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<executions>
+					<execution>
+						<goals>
+							<goal>test-jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
 		</plugins>
 	</build>
-	
+
 	<repositories>
 		<repository>
 			<id>ozg-nexus</id>
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/MailSendRequest.java b/mail-service/src/main/java/de/itvsh/ozg/mail/MailSendRequest.java
index 03ba87ca9d5e650405a9f0afc81dfec9554be265..a255b1e986f933647a06a38f004e386307469896 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/MailSendRequest.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/MailSendRequest.java
@@ -22,5 +22,5 @@ public class MailSendRequest {
 	@Singular
 	private Map<String, InputStreamSource> attachments;
 
-	private String requestReference;
+	private Object requestReference;
 }
diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/MailSentEvent.java b/mail-service/src/main/java/de/itvsh/ozg/mail/MailSentEvent.java
index eddaf1d76225676ab96c2393b49febc1f11e1eb9..c343eefab01e27e68c8383bdd06fbce482718614 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/MailSentEvent.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/MailSentEvent.java
@@ -6,7 +6,7 @@ public class MailSentEvent extends ApplicationEvent {
 
 	private static final long serialVersionUID = 1L;
 
-	public MailSentEvent(MailSendRequest source) {
+	MailSentEvent(MailSendRequest source) {
 		super(source);
 	}
 
diff --git a/mail-service/src/test/java/de/itvsh/ozg/mail/MailSentEventTestFactory.java b/mail-service/src/test/java/de/itvsh/ozg/mail/MailSentEventTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..68acc0d73a966bcd3caf222c4377035364fd944f
--- /dev/null
+++ b/mail-service/src/test/java/de/itvsh/ozg/mail/MailSentEventTestFactory.java
@@ -0,0 +1,10 @@
+package de.itvsh.ozg.mail;
+
+public class MailSentEventTestFactory {
+
+	public static MailSentEvent create(Object reference) {
+
+		return new MailSentEvent(MailSendRequestTestFactory.createBuilder().requestReference(reference).build());
+	}
+
+}
diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml
index 14df102b31a1f160cb8ed82f660388fdd883e2b6..35779f02f3678f7a5523fb500a3804f6ba1d158a 100644
--- a/pluto-server/pom.xml
+++ b/pluto-server/pom.xml
@@ -115,6 +115,14 @@
 		</dependency>
 
 		<!-- Test -->
+		<dependency>
+			<groupId>de.itvsh.ozg.mail</groupId>
+			<artifactId>mail-service</artifactId>
+			<version>${project.version}</version>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+		
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/PlutoServerApplication.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/PlutoServerApplication.java
index 7cc0386bba508f2fa9925e5cfdb9a389889e6268..c84033620f6c9a3b346bc6175a6e97b1cbc3ec04 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/PlutoServerApplication.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/PlutoServerApplication.java
@@ -6,7 +6,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableAsync;
 
-@SpringBootApplication
+@SpringBootApplication(scanBasePackages = "de.itvsh.ozg")
 @EnableAsync
 public class PlutoServerApplication {
 
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListener.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc3c77e5080519dab4e4e07a7c7b93690884bc7f
--- /dev/null
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListener.java
@@ -0,0 +1,29 @@
+package de.itvsh.ozg.pluto.vorgang.redirect;
+
+import java.util.function.Predicate;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import de.itvsh.ozg.mail.MailSendRequest;
+import de.itvsh.ozg.mail.MailSentEvent;
+import de.itvsh.ozg.pluto.command.Command;
+import de.itvsh.ozg.pluto.command.Order;
+
+@Component
+public class RedirectListener {
+
+	public static final Predicate<MailSendRequest> IS_REDIRECT_MAIL_REQ = req -> req.getRequestReference() instanceof Command
+			&& ((Command) req.getRequestReference()).getOrder() == Order.REDIRECT_VORGANG;
+
+	@Autowired
+	private RedirectService service;
+
+	@EventListener(condition = "{T(de.itvsh.ozg.pluto.vorgang.redirect.RedirectListener).IS_REDIRECT_MAIL_REQ.test(event.getSource())}")
+	public void publishCommandExecutedEvent(MailSentEvent event) {
+		Command command = (Command) event.getSource().getRequestReference();
+
+		service.onRedirectMailSent(command);
+	}
+}
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectService.java
index ecb2a5703dd30628e0151d845f2b7cea04e63d7e..a8e1eabe37eb0e787e6f97b0113d8811ae5980db 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectService.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectService.java
@@ -8,9 +8,12 @@ import java.util.Map;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 
 import de.itvsh.ozg.mail.MailSendRequest;
+import de.itvsh.ozg.mail.MailService;
+import de.itvsh.ozg.pluto.command.Command;
 import de.itvsh.ozg.pluto.common.errorhandling.TechnicalException;
 import de.itvsh.ozg.pluto.vorgang.Vorgang;
 import freemarker.template.Configuration;
@@ -27,17 +30,28 @@ public class RedirectService {
 
 	@Autowired
 	private Configuration freemarkerCfg;
+	@Autowired
+	private MailService emailService;
+
+	@Autowired
+	private ApplicationEventPublisher publisher;
 
 	@Value("${pluto.redirect.mail-from}")
 	private String mailFrom;
 
-	MailSendRequest createRedirectMail(Vorgang vorgang, RedirectRequest request) {
-		// FIXME set command id
+	public void redirectVorgang(Vorgang vorgang, Command command) {
+		var mailRequest = createRedirectMail(vorgang, command);
+
+		emailService.sendMail(mailRequest);
+	}
+
+	MailSendRequest createRedirectMail(Vorgang vorgang, Command command) {
 		// TODO add attachments
 		return MailSendRequest.builder()
 				.fromAddress(mailFrom)
-				.toAddress(request.getEmail())
+				.toAddress(command.getRedirectRequest().getEmail())
 				.body(fillMailTemplate(vorgang))
+				.requestReference(command)
 				.build();
 	}
 
@@ -71,4 +85,7 @@ public class RedirectService {
 		}
 	}
 
+	public void onRedirectMailSent(Command command) {
+		publisher.publishEvent(new VorgangRedirectedEvent(command));
+	}
 }
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/VorgangRedirectedEvent.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/VorgangRedirectedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..93a0be55b6d9cc5228b278703513cd7dca9d56c2
--- /dev/null
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/VorgangRedirectedEvent.java
@@ -0,0 +1,13 @@
+package de.itvsh.ozg.pluto.vorgang.redirect;
+
+import de.itvsh.ozg.pluto.command.Command;
+import de.itvsh.ozg.pluto.command.CommandExecutedEvent;
+
+public class VorgangRedirectedEvent extends CommandExecutedEvent {
+
+	private static final long serialVersionUID = 1L;
+
+	VorgangRedirectedEvent(Command source) {
+		super(source);
+	}
+}
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/TestConfiguration.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/TestConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..c89c480d7c5df70b610d1b178a492a56c2b34060
--- /dev/null
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/TestConfiguration.java
@@ -0,0 +1,16 @@
+package de.itvsh.ozg.pluto;
+
+import static org.mockito.Mockito.*;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.mail.javamail.JavaMailSender;
+
+@Configuration
+public class TestConfiguration {
+
+	@Bean
+	public JavaMailSender mockMailSender() {
+		return mock(JavaMailSender.class);
+	}
+}
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListenerTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListenerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6dc0cf8358cdaab47d1808102c110db2884ce8ad
--- /dev/null
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectListenerTest.java
@@ -0,0 +1,32 @@
+package de.itvsh.ozg.pluto.vorgang.redirect;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.itvsh.ozg.mail.MailSentEventTestFactory;
+import de.itvsh.ozg.pluto.command.Command;
+import de.itvsh.ozg.pluto.command.CommandTestFactory;
+
+class RedirectListenerTest {
+
+	@InjectMocks
+	private RedirectListener listener;
+
+	@Mock
+	private RedirectService redirectService;
+
+	@Nested
+	class onMailSentEvent {
+
+		private Command command = CommandTestFactory.create();
+
+		@Test
+		void shouldCallRedirectService() {
+			listener.publishCommandExecutedEvent(MailSentEventTestFactory.create(command));
+
+			redirectService.onRedirectMailSent(command);
+		}
+	}
+}
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectServiceTest.java
index 95182d5a8f7df8d77baba93acc25479e8593ec94..eb929d2dab58d9282405e83f64ba61b51026f0d3 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectServiceTest.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/RedirectServiceTest.java
@@ -9,20 +9,29 @@ import java.util.Map;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.InjectMocks;
+import org.mockito.Mock;
 import org.mockito.Spy;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.test.util.ReflectionTestUtils;
 
+import de.itvsh.ozg.pluto.command.Command;
+import de.itvsh.ozg.pluto.command.CommandTestFactory;
 import de.itvsh.ozg.pluto.vorgang.EingangHeaderTestFactory;
 import de.itvsh.ozg.pluto.vorgang.Vorgang;
 import de.itvsh.ozg.pluto.vorgang.VorgangTestFactory;
 
 class RedirectServiceTest {
 
-	@Spy
+	@Spy // NOSONAR
 	@InjectMocks
 	private RedirectService service;
 
+	@Mock
+	private ApplicationEventPublisher publisher;
+
 	@Nested
 	class TestFillingTemplate {
 
@@ -62,6 +71,7 @@ class RedirectServiceTest {
 
 		private Vorgang vorgang = VorgangTestFactory.create();
 		private RedirectRequest request = RedirectRequestTestFactory.create();
+		private Command command = CommandTestFactory.createBuilder().redirectRequest(request).build();;
 
 		@BeforeEach
 		void initTest() {
@@ -72,25 +82,42 @@ class RedirectServiceTest {
 
 		@Test
 		void shouldSetFromAddress() {
-			var mailSendRequest = service.createRedirectMail(vorgang, request);
+			var mailSendRequest = service.createRedirectMail(vorgang, command);
 
 			assertThat(mailSendRequest.getFromAddress()).isEqualTo(MAIL_FROM);
 		}
 
 		@Test
 		void shouldSetToAddress() {
-			var mailSendRequest = service.createRedirectMail(vorgang, request);
+			var mailSendRequest = service.createRedirectMail(vorgang, command);
 
 			assertThat(mailSendRequest.getToAddresses()).containsExactly(RedirectRequestTestFactory.E_MAIL);
 		}
 
 		@Test
 		void shouldSetBody() {
-			var mailSendRequest = service.createRedirectMail(vorgang, request);
+			var mailSendRequest = service.createRedirectMail(vorgang, command);
 
 			verify(service).fillMailTemplate(vorgang);
 			assertThat(mailSendRequest.getBody()).isEqualTo(BODY);
 		}
 	}
 
+	@Nested
+	class TestOnRedirectMailSent {
+
+		@Captor // NOSONAR
+		private ArgumentCaptor<VorgangRedirectedEvent> eventCaptor;
+
+		private Command command = CommandTestFactory.create();
+
+		@Test
+		void shouldPublishEvent() {
+			service.onRedirectMailSent(command);
+
+			verify(publisher).publishEvent(eventCaptor.capture());
+			assertThat(eventCaptor.getValue()).isInstanceOf(VorgangRedirectedEvent.class)
+					.extracting(VorgangRedirectedEvent::getSource).isSameAs(command);
+		}
+	}
 }