diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml
index 9bdd80d5d6a1749f627807505abc469da945daed..42231e157c9cacd03e2808a63a14a8257218be2e 100644
--- a/pluto-server/pom.xml
+++ b/pluto-server/pom.xml
@@ -48,6 +48,7 @@
 		<spring-boot.build-image.imageName>docker.ozg-sh.de/pluto:build-latest</spring-boot.build-image.imageName>
 
 		<kop.license.version>1.3.0</kop.license.version>
+		<kop.zufi.version>0.1.0-SNAPSHOT</kop.zufi.version>
 
 		<zip.version>2.11.1</zip.version>
 		<jsoup.version>1.15.3</jsoup.version>
@@ -81,6 +82,12 @@
 			<version>${project.version}</version>
 			<scope>runtime</scope>
 		</dependency>
+		
+		<dependency>
+			<groupId>de.itvsh.kop.zufi</groupId>
+			<artifactId>kop-zufi-api</artifactId>
+			<version>${kop.zufi.version}</version>
+		</dependency>
 
 		<!-- Spring -->
 		<dependency>
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryScheduler.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryScheduler.java
new file mode 100644
index 0000000000000000000000000000000000000000..06ca63659b853cfe74216635d385ab634e313aec
--- /dev/null
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryScheduler.java
@@ -0,0 +1,18 @@
+package de.itvsh.ozg.pluto.registry;
+
+import java.util.concurrent.TimeUnit;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+class RegistryScheduler {
+	@Autowired
+	private RegistryService registryService;
+
+	@Scheduled(fixedDelayString = "${kop.vorgangmanager.registry.intervall}", initialDelay = 5, timeUnit = TimeUnit.MINUTES)
+	void register() {
+		registryService.registerVorgangManager();
+	}
+}
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryService.java
new file mode 100644
index 0000000000000000000000000000000000000000..e683f37e3af93fa64b85c52fcccdb87f6837bc7b
--- /dev/null
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/RegistryService.java
@@ -0,0 +1,35 @@
+package de.itvsh.ozg.pluto.registry;
+
+import java.util.List;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import lombok.extern.log4j.Log4j2;
+
+@Service
+@Log4j2
+class RegistryService {
+	@Autowired
+	private UserOrganisationsEinheitenRemoteService userOrganisationsEinheitenRemoteService;
+
+	@Autowired
+	private ZufiRemoteService zufiRemoteService;
+
+	void registerVorgangManager() {
+		try {
+			register(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten());
+		} catch (Exception e) {
+			LOG.error("Error registering this VorgangsManager.", e);
+		}
+	}
+
+	private void register(List<String> supportedOrganisationsEinheiten) {
+		if (CollectionUtils.isNotEmpty(supportedOrganisationsEinheiten)) {
+			zufiRemoteService.registerVorgangManager(supportedOrganisationsEinheiten);
+		} else {
+			LOG.info("No OrganistationsEinheitenIds provided. Not registering this VorgangsManager");
+		}
+	}
+}
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/UserOrganisationsEinheitenRemoteService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/UserOrganisationsEinheitenRemoteService.java
new file mode 100644
index 0000000000000000000000000000000000000000..9babe2cd3ea28246857fcc287cd4baab4a2f2cc7
--- /dev/null
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/UserOrganisationsEinheitenRemoteService.java
@@ -0,0 +1,14 @@
+package de.itvsh.ozg.pluto.registry;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
+@Service
+class UserOrganisationsEinheitenRemoteService {
+
+	List<String> getSupportedOrganisationsEinheiten() {
+		return null;
+	}
+
+}
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/ZufiRemoteService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/ZufiRemoteService.java
new file mode 100644
index 0000000000000000000000000000000000000000..569f6d36deeada0d4d6eb358b4ee4aa056dc7276
--- /dev/null
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/registry/ZufiRemoteService.java
@@ -0,0 +1,42 @@
+package de.itvsh.ozg.pluto.registry;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import de.itvsh.kop.zufi.grpc.registration.GrpcRegistrationRequest;
+import de.itvsh.kop.zufi.grpc.registration.RegistrationServiceGrpc;
+import lombok.NonNull;
+import lombok.extern.log4j.Log4j2;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+
+@Log4j2
+@Service
+class ZufiRemoteService {
+	@Value(value = "${kop.vorgangmanager.register.external.address:}")
+	private String externalVorgangManagerAddress;
+
+	@GrpcClient("zufi-manager")
+	private RegistrationServiceGrpc.RegistrationServiceBlockingStub registryGrpcService;
+
+	void registerVorgangManager(@NonNull List<String> organistationsEinheitenIds) {
+		var proceed = checkPreconditions();
+
+		if (proceed) {
+			var request = GrpcRegistrationRequest.newBuilder().addAllOrganisationseinheitenId(organistationsEinheitenIds)
+					.setAddress(externalVorgangManagerAddress).build();
+			registryGrpcService.register(request);
+		}
+	}
+
+	boolean checkPreconditions() {
+		if (StringUtils.isEmpty(externalVorgangManagerAddress)) {
+			LOG.warn("Property kop.vorgangmanager.register.external.address not set. Not registering this VorgangsManager");
+			return false;
+		}
+
+		return true;
+	}
+}
diff --git a/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json
index 8eff43ef35a026d11421528306fa3084a84fcd50..b87f57218bf216a3d40f77d5c29882a3aed0af79 100644
--- a/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ b/pluto-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -33,5 +33,15 @@
     "name": "kop.usermanager.url",
     "type": "java.lang.String",
     "description": "Url of the user manager migration endpoint"
+  },
+  {
+    "name": "kop.notification.mail-from",
+    "type": "java.lang.String",
+    "description": "The sender email address used in notification emails"
+  },
+  {
+    "name": "kop.vorgangmanager.registry.intervall",
+    "type": "java.lang.String",
+    "description": "The update intervall of the VorgangManager OrgansisationsEinheiten Ids in minutes"
   }
 ]}
\ No newline at end of file
diff --git a/pluto-server/src/main/resources/application.yml b/pluto-server/src/main/resources/application.yml
index 3864230aee4ada47c4e04c62de9af908d132e27c..f37dba65d928655467e6ba8a7c18b4e14470b38a 100644
--- a/pluto-server/src/main/resources/application.yml
+++ b/pluto-server/src/main/resources/application.yml
@@ -29,7 +29,11 @@ grpc:
       negotiationType: PLAINTEXT  
     email:
       address: self:self
-      negotiationType: PLAINTEXT    
+      negotiationType: PLAINTEXT
+    zufi-manager:
+      address: static://127.0.0.1:9010
+      negotiationType: PLAINTEXT
+
 pluto:
   redirect:
     mail-from: EA-Poststelle@itvsh.de
@@ -65,3 +69,6 @@ kop:
         enabled: true
   notification:
     mail-from: hilfe@kop.support
+  vorgangmanager:
+    registry:
+      intervall: 360
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistrySchedulerTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistrySchedulerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4dc3915acfe4a5fe42796ae4321167769a8dcd9
--- /dev/null
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistrySchedulerTest.java
@@ -0,0 +1,31 @@
+package de.itvsh.ozg.pluto.registry;
+
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+class RegistrySchedulerTest {
+
+	@DisplayName("Test the registry scheduler")
+	@Nested
+	class TestScheduler {
+		@Spy
+		@InjectMocks
+		private RegistryScheduler registryScheduler;
+
+		@Mock
+		private RegistryService registryService;
+
+		@Test
+		void shouldCallService() {
+			registryScheduler.register();
+
+			verify(registryService).registerVorgangManager();
+		}
+	}
+}
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistryServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistryServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..54be62dd2e89148fcf82e605d2657345a9dc14c6
--- /dev/null
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/RegistryServiceTest.java
@@ -0,0 +1,68 @@
+package de.itvsh.ozg.pluto.registry;
+
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import org.elasticsearch.core.List;
+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.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+class RegistryServiceTest {
+
+	@DisplayName("Test registry service")
+	@Nested
+	class TestService {
+		@Spy
+		@InjectMocks
+		private RegistryService registryService;
+
+		@Mock
+		private UserOrganisationsEinheitenRemoteService userOrganisationsEinheitenRemoteService;
+
+		@Mock
+		private ZufiRemoteService zufiRemoteService;
+
+		@BeforeEach
+		void init() {
+			when(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten()).thenReturn(List.of("123456", "987654"));
+		}
+
+		@Test
+		void shouldCallUserRemoteService() {
+			registryService.registerVorgangManager();
+
+			verify(userOrganisationsEinheitenRemoteService).getSupportedOrganisationsEinheiten();
+		}
+
+		@Test
+		void shouldCallZuFiRemoteService() {
+			registryService.registerVorgangManager();
+
+			verify(zufiRemoteService).registerVorgangManager(any());
+		}
+
+		@Test
+		void shouldNotCallZuFiRemoteServiceOnEmptyOrganisationsEinheitenIds() {
+			when(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten()).thenReturn(List.of());
+
+			registryService.registerVorgangManager();
+
+			verify(zufiRemoteService, never()).registerVorgangManager(any());
+		}
+
+		@Test
+		void shouldNotCallZuFiRemoteServiceOnException() {
+			when(userOrganisationsEinheitenRemoteService.getSupportedOrganisationsEinheiten()).thenThrow(Exception.class);
+
+			registryService.registerVorgangManager();
+
+			verify(zufiRemoteService, never()).registerVorgangManager(any());
+		}
+	}
+
+}
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/ZufiManagerRemoteServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/ZufiManagerRemoteServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..7cca9cb85d6ddce805fe2d512500a9cb2f27b58f
--- /dev/null
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/registry/ZufiManagerRemoteServiceTest.java
@@ -0,0 +1,37 @@
+package de.itvsh.ozg.pluto.registry;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+import org.springframework.test.util.ReflectionTestUtils;
+
+class ZufiManagerRemoteServiceTest {
+	@DisplayName("Test ZuFiRemoteService")
+	@Nested
+	class TestZufiManagerRemoteService {
+
+		@Spy
+		@InjectMocks
+		private ZufiRemoteService zufiRemoteService;
+
+		@Test
+		void shouldProceed() {
+			ReflectionTestUtils.setField(zufiRemoteService, "externalVorgangManagerAddress", "value");
+
+			var proceed = zufiRemoteService.checkPreconditions();
+
+			assertThat(proceed).isTrue();
+		}
+
+		@Test
+		void shouldNotProceed() {
+			var proceed = zufiRemoteService.checkPreconditions();
+
+			assertThat(proceed).isFalse();
+		}
+	}
+}