diff --git a/.gitignore b/.gitignore
index 3fc1d884b983db7cd48581b4198239e70ebc5119..4c1a41b2c5665e76dae6bd753ebdbe7fdfe74337 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,4 @@ target/
 .idea
 *.iml
 *.orig
+.vscode/settings.json
diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java
index 80496bb8b53b809302bfb7d426be4dafcff80bda..331b155a60b7e4ca3fbd112ab4ad99e487d69e5f 100644
--- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java
+++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java
@@ -64,6 +64,7 @@ public class CollaborationManagerConfiguration {
 	public static final String TEMPLATE_HANDLER_NAME = "collaboration_TemplateHandler";
 	public static final String VORGANG_ATTACHED_ITEM_REMOTE_SERVICE_NAME = "collaboration_VorgangAttachedItemRemoteService";
 	public static final String VORGANG_ATTACHED_ITEM_SERVICE_NAME = "collaboration_VorgangAttachedItemService";
+	public static final String VORGANG_MANAGER_PROPERTIES_NAME = "collaboration_vorgangManagerProperties";
 
 	public static final String CALL_CONTEXT_INTERCEPTOR_NAME = "collaboration_CallContextInterceptor";
 	public static final String CALL_CONTEXT_PROVIDER_NAME = "collaboration_CallContextProvider";
diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java
index 73e9da9cc2b1f19747150131cc73e71591495734..ba4460a230898252854fdf2a6087c36ad999bf1d 100644
--- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java
+++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java
@@ -23,9 +23,9 @@
  */
 package de.ozgcloud.collaboration;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import jakarta.validation.Valid;
 
@@ -42,6 +42,7 @@ import de.ozgcloud.collaboration.common.freemarker.TemplateHandler;
 import de.ozgcloud.collaboration.common.user.UserProfileService;
 import de.ozgcloud.collaboration.vorgang.ServiceKonto;
 import de.ozgcloud.collaboration.vorgang.VorgangService;
+import de.ozgcloud.common.errorhandling.TechnicalException;
 import lombok.RequiredArgsConstructor;
 
 @Service(CollaborationManagerConfiguration.COLLABORATION_SERVICE_NAME) // NOSONAR
@@ -51,7 +52,7 @@ public class CollaborationService {
 
 	static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM";
 	static final String SUBCOMMANDS_EXECUTION_MODE = "PARALLEL";
-	public static final String KEY_TEMPLATE_URL = "url";
+	public static final String KEY_VORGANG_LINK = "linkToVorgang";
 
 	public static final String COLLABORATION_NACHRICHT_TEMPLATE = "collaboration.nachrichtTemplate.txt.ftlh";
 	static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT";
@@ -81,6 +82,7 @@ public class CollaborationService {
 	private final CommandMapper commandMapper;
 	@Qualifier(CollaborationManagerConfiguration.TEMPLATE_HANDLER_NAME) // NOSONAR
 	private final TemplateHandler templateHandler;
+	private final Optional<FachstelleVorgangUrlProvider> urlProvider;
 
 	public void createCollaborationRequest(@Valid CollaborationRequest collaborationRequest) {
 		var enrichedRequest = enrichCollaborationRequest(collaborationRequest, vorgangService.createCollaborationVorgang(collaborationRequest));
@@ -101,6 +103,9 @@ public class CollaborationService {
 	}
 
 	public void createFachstellenBeteiligungRequest(@Valid CollaborationRequest collaborationRequest) {
+		if (urlProvider.isEmpty()) {
+			throw new TechnicalException("Fachstelle not configured.");
+		}
 		var vorgang = vorgangService.getVorgang(collaborationRequest.getVorgangId());
 		var enrichedRequest = enrichCollaborationRequest(collaborationRequest, vorgang.getId().toString());
 		var addSubCommandsRequest = buildCreateSubCommandsRequest(enrichedRequest, buildSubCommands(enrichedRequest));
@@ -127,7 +132,8 @@ public class CollaborationService {
 	}
 
 	OzgCloudCommand buildSendPostfachNachrichtCommand(CollaborationRequest collaborationRequest) {
-		var bodyObject = buildPostfachSendNachrichtCommandBody(buildMukPostfachAddress(collaborationRequest.getZustaendigeStelle()));
+		var bodyObject = buildPostfachSendNachrichtCommandBody(buildMukPostfachAddress(collaborationRequest.getZustaendigeStelle()),
+				collaborationRequest.getVorgangId());
 		return OzgCloudCommand.builder()
 				.vorgangId(commandMapper.toOzgCloudVorgangId(collaborationRequest.getVorgangId()))
 				.relationId(commandMapper.mapRelationId(collaborationRequest.getVorgangId()))
@@ -149,19 +155,19 @@ public class CollaborationService {
 		return Map.of(ServiceKonto.PostfachAddress.FIELD_IDENTIFIER_POSTFACH_ID, postfachId);
 	}
 
-	Map<String, Object> buildPostfachSendNachrichtCommandBody(Map<String, Object> postfachAddress) {
+	Map<String, Object> buildPostfachSendNachrichtCommandBody(Map<String, Object> postfachAddress, String vorgangId) {
 		return Map.of(
 				FIELD_REPLY_OPTION, REPLY_OPTION,
 				FIELD_SUBJECT, SUBJECT,
-				FIELD_MAIL_BODY, getAnfrageText(),
+				FIELD_MAIL_BODY, getAnfrageText(vorgangId),
 				ServiceKonto.FIELD_POSTFACH_ADDRESS, postfachAddress);
 	}
 
-	String getAnfrageText() {
-		return templateHandler.fillTemplate(COLLABORATION_NACHRICHT_TEMPLATE, getTemplateParameters());
+	String getAnfrageText(String vorgangId) {
+		return templateHandler.fillTemplate(COLLABORATION_NACHRICHT_TEMPLATE, getTemplateParameters(vorgangId));
 	}
 
-	Map<String, Object> getTemplateParameters() {
-		return Collections.emptyMap();
+	Map<String, Object> getTemplateParameters(String vorgangId) {
+		return Map.of(KEY_VORGANG_LINK, urlProvider.get().getUrl(vorgangId));
 	}
 }
\ No newline at end of file
diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleProperties.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2c4127dc1c7c1b367d2f1b08cff22736dacb712
--- /dev/null
+++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleProperties.java
@@ -0,0 +1,20 @@
+package de.ozgcloud.collaboration;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Configuration
+@ConfigurationProperties(prefix = FachstelleProperties.PREFIX)
+@ConditionalOnProperty(prefix = FachstelleProperties.PREFIX, name = { "host" })
+@Getter
+@Setter
+class FachstelleProperties {
+
+	static final String PREFIX = "ozgcloud.fachstelle";
+
+	private String host;
+}
diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProvider.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4f624b13c37912889e932c5e359205a1368565a
--- /dev/null
+++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProvider.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.collaboration;
+
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConditionalOnProperty(prefix = FachstelleProperties.PREFIX, name = { "host" })
+class FachstelleVorgangUrlProvider {
+
+	static final String URL_PATH_RESOURCES = "/resources?"; // NOSONAR
+	static final String QUERY_PARAM_URI = "uri=";
+	static final String URI_PATH_TEMPLATE = "%s/vorgangs/";
+
+	private final String vorgangUrlPrefix;
+
+	FachstelleVorgangUrlProvider(FachstelleProperties fachstelleProperties,
+			@Qualifier(CollaborationManagerConfiguration.VORGANG_MANAGER_PROPERTIES_NAME) VorgangManagerProperties vorgangManagerProperties) {
+		this.vorgangUrlPrefix = getFachstelleHost(fachstelleProperties) + URL_PATH_RESOURCES + buildUriQuery(vorgangManagerProperties);
+	}
+
+	String getFachstelleHost(FachstelleProperties fachstelleProperties) {
+		return fachstelleProperties.getHost().startsWith("http") ? fachstelleProperties.getHost() : "https://" + fachstelleProperties.getHost();
+	}
+
+	private String buildUriQuery(VorgangManagerProperties vorgangManagerProperties) {
+		var uriPath = URI_PATH_TEMPLATE.formatted(getServiceName(vorgangManagerProperties));
+		return QUERY_PARAM_URI + URLEncoder.encode(uriPath, StandardCharsets.UTF_8);
+	}
+
+	String getServiceName(VorgangManagerProperties vorgangManagerProperties) {
+		return getDomainWithoutPort(getDomainWithoutProtocol(vorgangManagerProperties.getServiceAddress()));
+	}
+
+	private String getDomainWithoutProtocol(String serviceAddress) {
+		var protocolEnd = serviceAddress.lastIndexOf("/");
+		return protocolEnd == -1 ? serviceAddress : serviceAddress.substring(protocolEnd + 1);
+	}
+
+	private String getDomainWithoutPort(String serviceAddress) {
+		var portStart = serviceAddress.lastIndexOf(":");
+		return portStart == -1 ? serviceAddress : serviceAddress.substring(0, portStart);
+	}
+
+	public String getUrl(String vorgangId) {
+		return vorgangUrlPrefix + vorgangId;
+	}
+}
diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/VorgangManagerProperties.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/VorgangManagerProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..0057e9185929d7b765eddcc4dd1853683dc54e3e
--- /dev/null
+++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/VorgangManagerProperties.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.collaboration;
+
+import jakarta.validation.constraints.NotEmpty;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.validation.annotation.Validated;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Configuration(CollaborationManagerConfiguration.VORGANG_MANAGER_PROPERTIES_NAME) // NOSONAR
+@ConfigurationProperties(prefix = VorgangManagerProperties.PREFIX)
+@Getter
+@Setter
+@Validated
+class VorgangManagerProperties {
+
+	static final String PREFIX = "ozgcloud.vorgang-manager";
+
+	@NotEmpty
+	private String serviceAddress;
+}
diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandler.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandler.java
index cf2b56405377ea25bdadceb6124a62e71decfef7..6647808d2fb29a15e0ecdaf5d9ad271cacf29675 100644
--- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandler.java
+++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandler.java
@@ -41,10 +41,6 @@ public class TemplateHandler {
 
 	private final Configuration freemarkerConfig;
 
-	public String getRawTemplate(String templateName) {
-		return getTemplate(templateName).toString();
-	}
-
 	public String fillTemplate(String templateName, Object dataModel) {
 		try {
 			var template = getTemplate(templateName);
diff --git a/collaboration-manager-server/src/main/resources/templates/collaboration.nachrichtTemplate.txt.ftlh b/collaboration-manager-server/src/main/resources/templates/collaboration.nachrichtTemplate.txt.ftlh
index 5874936fb45fd176e05cef6a7e888b4b6fb0379c..22a60d5b3a4ced7dfbe8771025a64e8ffc6c43cc 100644
--- a/collaboration-manager-server/src/main/resources/templates/collaboration.nachrichtTemplate.txt.ftlh
+++ b/collaboration-manager-server/src/main/resources/templates/collaboration.nachrichtTemplate.txt.ftlh
@@ -1,7 +1,7 @@
-Hallo Fachstelle,
+Guten Tag,
+Sie haben eine Zuarbeitsanfrage erhalten. Bitte klicken Sie auf folgenden Link, um zum Vorgang zu gelangen:
 
-bitte bearbeiten:
-${url!"http://www.host.local"}
+${linkToVorgang}
 
-Danke,
-Verwaltung
\ No newline at end of file
+Mit freundlichen Grüßen
+Ihre Verwaltung
\ No newline at end of file
diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java
index b5c9c52e92d34ba535e9563c7891d4a7d5c0a2b8..1d0867baad9d780b636d5421070b7f824fe0f11f 100644
--- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java
+++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java
@@ -34,7 +34,6 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.NullAndEmptySource;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.test.annotation.DirtiesContext;
 
 import de.ozgcloud.common.test.ITCase;
diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java
index 763ca620ebfd814b7e784a768f40436b20922d9e..7b65d713753f128862cde95d7529c4bc5ddfc243 100644
--- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java
+++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java
@@ -24,11 +24,13 @@
 package de.ozgcloud.collaboration;
 
 import static org.assertj.core.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
@@ -37,6 +39,8 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
+import com.thedeanda.lorem.LoremIpsum;
+
 import de.ozgcloud.apilib.common.command.OzgCloudCommand;
 import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
 import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest;
@@ -57,6 +61,7 @@ import de.ozgcloud.collaboration.vorgang.VorgangService;
 import de.ozgcloud.collaboration.vorgang.VorgangTestFactory;
 import de.ozgcloud.command.CommandTestFactory;
 import de.ozgcloud.common.datatype.StringBasedValue;
+import de.ozgcloud.common.errorhandling.TechnicalException;
 
 class CollaborationServiceTest {
 
@@ -76,6 +81,10 @@ class CollaborationServiceTest {
 	private CommandMapper commandMapper;
 	@Mock
 	private TemplateHandler templateHandler;
+	@Mock
+	private FachstelleVorgangUrlProvider provider;
+	@Mock
+	private Optional<FachstelleVorgangUrlProvider> urlProvider;
 
 	@Nested
 	class TestCreateCollaborationRequest {
@@ -248,57 +257,71 @@ class CollaborationServiceTest {
 	@Nested
 	class TestCreateFachstellenBeteiligungRequest {
 
-		private static final Vorgang VORGANG = VorgangTestFactory.create();
-		private static final CollaborationRequest ENRICHED_REQUEST = CollaborationRequestTestFactory.create();
+		@Nested
+		class TestCreateRequest {
+			private static final Vorgang VORGANG = VorgangTestFactory.create();
+			private static final CollaborationRequest ENRICHED_REQUEST = CollaborationRequestTestFactory.create();
 
-		@Mock
-		private OzgCloudCommand subCommand;
+			@Mock
+			private OzgCloudCommand subCommand;
 
-		@BeforeEach
-		void init() {
-			doReturn(List.of(subCommand)).when(service).buildSubCommands(any());
-			when(vorgangService.getVorgang(any())).thenReturn(VORGANG);
-			doReturn(ENRICHED_REQUEST).when(service).enrichCollaborationRequest(any(), any());
-		}
+			@BeforeEach
+			void init() {
+				doReturn(List.of(subCommand)).when(service).buildSubCommands(any());
+				when(vorgangService.getVorgang(any())).thenReturn(VORGANG);
+				doReturn(ENRICHED_REQUEST).when(service).enrichCollaborationRequest(any(), any());
+			}
 
-		@Test
-		void shouldCallGetVorgang() {
-			service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create());
+			@Test
+			void shouldCallGetVorgang() {
+				createFachstellenBeteiligungRequest();
 
-			verify(vorgangService).getVorgang(VorgangTestFactory.ID_STR);
-		}
+				verify(vorgangService).getVorgang(VorgangTestFactory.ID_STR);
+			}
 
-		@Test
-		void shouldCallEnrichCollaborationRequest() {
-			var collaborationRequest = CollaborationRequestTestFactory.create();
+			@Test
+			void shouldCallEnrichCollaborationRequest() {
+				var collaborationRequest = CollaborationRequestTestFactory.create();
 
-			service.createFachstellenBeteiligungRequest(collaborationRequest);
+				service.createFachstellenBeteiligungRequest(collaborationRequest);
 
-			verify(service).enrichCollaborationRequest(collaborationRequest, VorgangTestFactory.ID.toString());
-		}
+				verify(service).enrichCollaborationRequest(collaborationRequest, VorgangTestFactory.ID.toString());
+			}
 
-		@Test
-		void shouldCallBuildSubCommands() {
-			service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create());
+			@Test
+			void shouldCallBuildSubCommands() {
+				createFachstellenBeteiligungRequest();
 
-			verify(service).buildSubCommands(ENRICHED_REQUEST);
-		}
+				verify(service).buildSubCommands(ENRICHED_REQUEST);
+			}
 
-		@Test
-		void shouldCallBuildCreateSubCommandsRequest() {
-			service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create());
+			@Test
+			void shouldCallBuildCreateSubCommandsRequest() {
+				createFachstellenBeteiligungRequest();
+
+				verify(service).buildCreateSubCommandsRequest(ENRICHED_REQUEST, List.of(subCommand));
+			}
+
+			@Test
+			void shouldCallAddSubCommands() {
+				var addSubCommandsRequest = OzgCloudCreateSubCommandsRequestTestFactory.create();
+				doReturn(addSubCommandsRequest).when(service).buildCreateSubCommandsRequest(any(), any());
 
-			verify(service).buildCreateSubCommandsRequest(ENRICHED_REQUEST, List.of(subCommand));
+				createFachstellenBeteiligungRequest();
+
+				verify(commandService).addSubCommands(addSubCommandsRequest);
+			}
 		}
 
 		@Test
-		void shouldCallAddSubCommands() {
-			var addSubCommandsRequest = OzgCloudCreateSubCommandsRequestTestFactory.create();
-			doReturn(addSubCommandsRequest).when(service).buildCreateSubCommandsRequest(any(), any());
+		void shouldThrowExceptionIfFachstelleNotConfigured() {
+			when(urlProvider.isEmpty()).thenReturn(true);
 
-			service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create());
+			assertThrows(TechnicalException.class, this::createFachstellenBeteiligungRequest);
+		}
 
-			verify(commandService).addSubCommands(addSubCommandsRequest);
+		private void createFachstellenBeteiligungRequest() {
+			service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create());
 		}
 	}
 
@@ -399,7 +422,7 @@ class CollaborationServiceTest {
 			when(commandMapper.toOzgCloudVorgangId(anyString())).thenReturn(VORGANG_ID);
 			when(commandMapper.mapRelationId(anyString())).thenReturn(RELATION_ID);
 			when(commandMapper.toOzgCloudUserId(anyString())).thenReturn(OZG_CLOUD_ID);
-			doReturn(OBJECT_MAP).when(service).buildPostfachSendNachrichtCommandBody(any());
+			doReturn(OBJECT_MAP).when(service).buildPostfachSendNachrichtCommandBody(any(), any());
 		}
 
 		@Test
@@ -416,7 +439,7 @@ class CollaborationServiceTest {
 
 			buildSendPostfachNachrichtCommand();
 
-			verify(service).buildPostfachSendNachrichtCommandBody(postfachAddressMap);
+			verify(service).buildPostfachSendNachrichtCommandBody(postfachAddressMap, VorgangTestFactory.ID_STR);
 		}
 
 		@Test
@@ -524,7 +547,7 @@ class CollaborationServiceTest {
 
 		@BeforeEach
 		void init() {
-			doReturn(CollaborationRequestTestFactory.BESCHREIBUNG).when(service).getAnfrageText();
+			doReturn(CollaborationRequestTestFactory.BESCHREIBUNG).when(service).getAnfrageText(any());
 		}
 
 		@Test
@@ -549,53 +572,79 @@ class CollaborationServiceTest {
 		}
 
 		private Map<String, Object> buildSendNachrichtCommandBody() {
-			return service.buildPostfachSendNachrichtCommandBody(POSTFACH_ADDRESS);
+			return service.buildPostfachSendNachrichtCommandBody(POSTFACH_ADDRESS, VorgangTestFactory.ID_STR);
 		}
 	}
 
 	@Nested
-	class TestGetDefaultAnfrageText {
+	class TestGetAnfrageText {
 
 		private static final String DEFAULT_MAIL_TEXT = "default mail text";
 
+		private static final Map<String, Object> TEMPLATE_PARAMETERS = Map.of("key", "value ");
+
 		@BeforeEach
 		void init() {
 			when(templateHandler.fillTemplate(anyString(), any())).thenReturn(DEFAULT_MAIL_TEXT);
+			doReturn(TEMPLATE_PARAMETERS).when(service).getTemplateParameters(any());
 		}
 
 		@Test
 		void shouldCallGetTemplateParameters() {
-			service.getAnfrageText();
+			getAnfrageText();
 
-			verify(service).getTemplateParameters();
+			verify(service).getTemplateParameters(VorgangTestFactory.ID_STR);
 		}
 
 		@Test
 		void shouldCallTemplateHandler() {
-			var templateParameters = Map.<String, Object>of("key", "value ");
-			doReturn(templateParameters).when(service).getTemplateParameters();
+			getAnfrageText();
 
-			service.getAnfrageText();
-
-			verify(templateHandler).fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, templateParameters);
+			verify(templateHandler).fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, TEMPLATE_PARAMETERS);
 		}
 
 		@Test
 		void shouldReturnDefaultMailText() {
-			var result = service.getAnfrageText();
+			var result = getAnfrageText();
 
 			assertThat(result).isEqualTo(DEFAULT_MAIL_TEXT);
 		}
+
+		private String getAnfrageText() {
+			return service.getAnfrageText(VorgangTestFactory.ID_STR);
+		}
 	}
 
 	@Nested
 	class TestGetTemplateParameters {
 
+		private final String linkToVorgang = LoremIpsum.getInstance().getUrl();
+
+		@BeforeEach
+		void init() {
+			when(urlProvider.get()).thenReturn(provider);
+		}
+
+		@Test
+		void shouldCallUrlProvider() {
+			when(provider.getUrl(any())).thenReturn(linkToVorgang);
+
+			getTemplateParameters();
+
+			verify(provider).getUrl(VorgangTestFactory.ID_STR);
+		}
+
 		@Test
 		void shouldReturnTemplateParameters() {
-			var result = service.getTemplateParameters();
+			when(provider.getUrl(any())).thenReturn(linkToVorgang);
+
+			var result = getTemplateParameters();
+
+			assertThat(result).containsExactly(Map.entry(CollaborationService.KEY_VORGANG_LINK, linkToVorgang));
+		}
 
-			assertThat(result).isEmpty();
+		private Map<String, Object> getTemplateParameters() {
+			return service.getTemplateParameters(VorgangTestFactory.ID_STR);
 		}
 	}
 }
\ No newline at end of file
diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProviderTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProviderTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..99537c02b7e229c077f49ef6ec22034a4028e2d1
--- /dev/null
+++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProviderTest.java
@@ -0,0 +1,117 @@
+package de.ozgcloud.collaboration;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.UUID;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.mockito.Mock;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import com.thedeanda.lorem.LoremIpsum;
+
+class FachstelleVorgangUrlProviderTest {
+
+	private static final String FACHSTELLE_HOST = "https://" + LoremIpsum.getInstance().getWords(1);
+	private static final String VORGANG_MANAGER_SERVICE_ADDRESS = "vorgang-manager.test-namespace";
+
+	private FachstelleVorgangUrlProvider provider;
+
+	@Mock
+	private FachstelleProperties fachstelleProperties;
+	@Mock
+	private VorgangManagerProperties vorgangManagerProperties;
+
+	@BeforeEach
+	void init() {
+		when(fachstelleProperties.getHost()).thenReturn(FACHSTELLE_HOST);
+		when(vorgangManagerProperties.getServiceAddress()).thenReturn(VORGANG_MANAGER_SERVICE_ADDRESS);
+		provider = spy(new FachstelleVorgangUrlProvider(fachstelleProperties, vorgangManagerProperties));
+	}
+
+	@Nested
+	class TestSetVorgangUrlPrefix {
+
+		@Test
+		void shouldBuildVorgangUrlPrefix() {
+			var encodedResourceUri = FachstelleVorgangUrlProvider.QUERY_PARAM_URI + VORGANG_MANAGER_SERVICE_ADDRESS + "%2Fvorgangs%2F";
+			var vorgagUrlPrefix = FACHSTELLE_HOST + FachstelleVorgangUrlProvider.URL_PATH_RESOURCES + encodedResourceUri;
+
+			var provider = createProvider();
+
+			assertThat(provider).extracting("vorgangUrlPrefix").isEqualTo(vorgagUrlPrefix);
+		}
+
+		private FachstelleVorgangUrlProvider createProvider() {
+			return spy(new FachstelleVorgangUrlProvider(fachstelleProperties, vorgangManagerProperties));
+		}
+	}
+
+	@Nested
+	class TestGetFachstelleHost {
+
+		@ParameterizedTest
+		@ValueSource(strings = { "http://localhost", "https://localhost" })
+		void shouldReturnUnchanged(String fachstelleHost) {
+			when(fachstelleProperties.getHost()).thenReturn(fachstelleHost);
+
+			var result = provider.getFachstelleHost(fachstelleProperties);
+
+			assertThat(result).isEqualTo(fachstelleHost);
+		}
+
+		@Test
+		void shouldAddHttps() {
+			when(fachstelleProperties.getHost()).thenReturn("localhost");
+
+			var result = provider.getFachstelleHost(fachstelleProperties);
+
+			assertThat(result).isEqualTo("https://localhost");
+		}
+	}
+
+	@Nested
+	class TestExtractServiceDomainName {
+
+		@ParameterizedTest
+		@ValueSource(strings = {
+				"dns:///vorgang-manager.by-kiel-dev:9090",
+				"dns:///vorgang-manager.by-kiel-dev",
+				"vorgang-manager.by-kiel-dev:9090",
+				"vorgang-manager.by-kiel-dev",
+				"dns://vorgang-manager.by-kiel-dev:9090",
+				"dns:/vorgang-manager.by-kiel-dev:9090",
+				"dns:/vorgang-manager.by-kiel-dev:",
+				"dns:/vorgang-manager.by-kiel-dev:1",
+				"abc:/vorgang-manager.by-kiel-dev:9090" })
+		void shouldReturnDomainName(String serviceAddress) {
+			when(vorgangManagerProperties.getServiceAddress()).thenReturn(serviceAddress);
+
+			var address = provider.getServiceName(vorgangManagerProperties);
+
+			assertThat(address).isEqualTo("vorgang-manager.by-kiel-dev");
+		}
+	}
+
+	@Nested
+	class TestGetUrl {
+
+		private static final String VORGANG_URL_PREFIX = LoremIpsum.getInstance().getUrl();
+
+		@Test
+		void shouldReturnUrl() {
+			ReflectionTestUtils.setField(provider, "vorgangUrlPrefix", VORGANG_URL_PREFIX);
+			var vorgangId = UUID.randomUUID().toString();
+
+			var url = provider.getUrl(vorgangId);
+
+			assertThat(url).isEqualTo(VORGANG_URL_PREFIX + vorgangId);
+		}
+	}
+
+}
diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandlerITCase.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandlerITCase.java
index faac634359143e548636ed8bf0503c5719555ea3..c6490582c731313b487360957682c94664038215 100644
--- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandlerITCase.java
+++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandlerITCase.java
@@ -28,12 +28,14 @@ import static org.assertj.core.api.Assertions.*;
 import java.util.Collections;
 import java.util.Map;
 
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import de.ozgcloud.collaboration.CollaborationService;
+import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.common.test.ITCase;
 
 @ITCase
@@ -42,23 +44,6 @@ class TemplateHandlerITCase {
 	@Autowired
 	private TemplateHandler handler;
 
-	@DisplayName("Get raw template")
-	@Nested
-	class TestGetRawTemplate {
-
-		@Test
-		void shouldReturnTemplateAsString() {
-			var content = handler.getRawTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE);
-
-			assertThat(content)
-					.contains("Hallo Fachstelle,")
-					.contains("bitte bearbeiten:")
-					.contains("${url!\"http://www.host.local\"}")
-					.contains("Danke")
-					.contains("Verwaltung");
-		}
-	}
-
 	@DisplayName("Fill template")
 	@Nested
 	class TestFillTemplate {
@@ -67,26 +52,20 @@ class TemplateHandlerITCase {
 		void shouldReturnFilledTemplate() {
 			var value = "http://test.url";
 			var content = handler.fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE,
-					Map.of(CollaborationService.KEY_TEMPLATE_URL, value));
+					Map.of(CollaborationService.KEY_VORGANG_LINK, value));
 
 			assertThat(content)
-					.contains("Hallo Fachstelle,")
-					.contains("bitte bearbeiten:")
-					.contains(value)
-					.contains("Danke")
-					.contains("Verwaltung");
+					.contains("Guten Tag,")
+					.contains("Sie haben eine Zuarbeitsanfrage erhalten. Bitte klicken Sie auf folgenden Link, um zum Vorgang zu gelangen:")
+					.contains(value);
 		}
 
 		@Test
-		void shouldReturnWithDefaultValue() {
-			var content = handler.fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, Collections.emptyMap());
+		void shouldThrowException() {
+			var templateArguments = Collections.emptyMap();
 
-			assertThat(content)
-					.contains("Hallo Fachstelle,")
-					.contains("bitte bearbeiten:")
-					.contains("http://www.host.local")
-					.contains("Danke")
-					.contains("Verwaltung");
+			Assertions.assertThrows(TechnicalException.class,
+					() -> handler.fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, templateArguments));
 		}
 	}
 }
diff --git a/collaboration-manager-server/src/test/resources/application-itcase.yml b/collaboration-manager-server/src/test/resources/application-itcase.yml
index e8da334d49bb7daa2a6bb6f128c60ea187e09d5e..dbfa482da1647ade6cc46051cd43478a2b542c21 100644
--- a/collaboration-manager-server/src/test/resources/application-itcase.yml
+++ b/collaboration-manager-server/src/test/resources/application-itcase.yml
@@ -9,3 +9,6 @@ logging:
 grpc:
   server:
     port: -1
+ozgcloud:
+  vorgang-manager:
+    service-address: vorgang-manager