diff --git a/README.md b/README.md
index 175344f3b642d4c3d57b3aa0a8a0a2bfed473654..b17d52f11e874186d5afe3aa4d6474e5105b22b4 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ For further reference, please consider the following sections:
 
 * [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/)
 * [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.1.3/maven-plugin/reference/html/#build-image)
-* [gRPC](https://grpc.io/)
+* [Spring RestClient](https://docs.spring.io/spring-framework/reference/integration/rest-clients.html)
 * [Spring Boot Actuator](https://docs.spring.io/spring-boot/docs/3.1.3/reference/htmlsingle/index.html#actuator)
 * [Spring Data MongoDB](https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/)
 * [Spring Boot DevTools](https://docs.spring.io/spring-boot/docs/3.1.3/reference/htmlsingle/index.html#using.devtools)
@@ -38,4 +38,8 @@ Run it from commandline use:
 ./mvnw spring-boot:run -Dspring-boot.run.profiles=local -pl info-manager-server
 ```
 
-at the info-manager root directory
\ No newline at end of file
+at the info-manager root directory
+
+### Releasing
+
+See [Release Antragsraum](https://git.ozg-sh.de/ozgcloud-doc/dokumentation/src/branch/master/Operations/Release-Antragsraum.md)
\ No newline at end of file
diff --git a/info-manager-server/pom.xml b/info-manager-server/pom.xml
index 0794db3687061c5c4099a005d3718827eeab68a5..2505613f459a3cd3cb22f2f97404c3c41a0401c4 100644
--- a/info-manager-server/pom.xml
+++ b/info-manager-server/pom.xml
@@ -65,12 +65,6 @@
 			<version>${info-manager-interface.version}</version>
 		</dependency>
 
-		<dependency>
-			<groupId>net.devh</groupId>
-			<artifactId>grpc-client-spring-boot-starter</artifactId>
-			<version>${net-devh-grpc.version}</version>
-		</dependency>
-
 		<dependency>
 			<groupId>net.devh</groupId>
 			<artifactId>grpc-server-spring-boot-starter</artifactId>
@@ -156,6 +150,13 @@
 			<version>${ozgcloud-starter.version}</version>
 		</dependency>
 
+		<dependency>
+			<groupId>net.devh</groupId>
+			<artifactId>grpc-client-spring-boot-starter</artifactId>
+			<version>${net-devh-grpc.version}</version>
+			<scope>test</scope>
+		</dependency>
+
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/InfoManagerApplication.java b/info-manager-server/src/main/java/de/ozgcloud/info/InfoManagerApplication.java
index 5639bb476e207eb1073a946373e2b1a653ee330e..a32f144ac4f86d83911492ea7ade258959e83f42 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/InfoManagerApplication.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/InfoManagerApplication.java
@@ -23,27 +23,12 @@
 
 package de.ozgcloud.info;
 
-import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.Bean;
-
-import de.ozgcloud.info.common.CallBeanFactoryPostProcessor;
-import de.ozgcloud.info.common.CallScope;
 
 @SpringBootApplication
 public class InfoManagerApplication {
 	public static void main(String[] args) {
 		SpringApplication.run(InfoManagerApplication.class, args);
 	}
-
-	@Bean
-	public CallScope callScope() {
-		return new CallScope();
-	}
-
-	@Bean
-	public static BeanFactoryPostProcessor beanFactoryPostProcessor(CallScope callScope) {
-		return new CallBeanFactoryPostProcessor(callScope);
-	}
 }
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/SecurityConfiguration.java b/info-manager-server/src/main/java/de/ozgcloud/info/SecurityConfiguration.java
deleted file mode 100644
index 51640355fae79d4f6f6540558b2b7b6daff623df..0000000000000000000000000000000000000000
--- a/info-manager-server/src/main/java/de/ozgcloud/info/SecurityConfiguration.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * 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.info;
-
-import org.springframework.context.annotation.Configuration;
-
-import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
-
-@Configuration
-@Log4j2
-@RequiredArgsConstructor
-public class SecurityConfiguration {
-}
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessor.java b/info-manager-server/src/main/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessor.java
deleted file mode 100644
index c302d99204ce360787e65ca30ef813ceea12eac7..0000000000000000000000000000000000000000
--- a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessor.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2023-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.info.common;
-
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
-import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
-public class CallBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
-	private final CallScope callScope;
-
-	@Override
-	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
-		beanFactory.registerScope(CallScope.SCOPE_NAME, callScope);
-	}
-}
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallContextAttachingInterceptor.java b/info-manager-server/src/main/java/de/ozgcloud/info/common/CallContextAttachingInterceptor.java
deleted file mode 100644
index 88c6ca7676fffc172ab4ccc11328634beb408fc5..0000000000000000000000000000000000000000
--- a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallContextAttachingInterceptor.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2023-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.info.common;
-
-import io.grpc.Metadata;
-import io.grpc.ServerCall;
-import io.grpc.ServerCallHandler;
-import io.grpc.ServerInterceptor;
-import lombok.NonNull;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
-import net.devh.boot.grpc.server.interceptor.GrpcGlobalServerInterceptor;
-
-@Log4j2
-@GrpcGlobalServerInterceptor
-@RequiredArgsConstructor
-public class CallContextAttachingInterceptor implements ServerInterceptor {
-	private final @NonNull ContextService contextService;
-
-	@Override
-	public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers,
-	  ServerCallHandler<ReqT, RespT> next) {
-		contextService.readMetadata(headers);
-
-		LOG.debug("Got metadata: {}", headers);
-
-		return next.startCall(call, headers);
-	}
-}
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallScope.java b/info-manager-server/src/main/java/de/ozgcloud/info/common/CallScope.java
deleted file mode 100644
index 7f6c474fc8f49a747382ba1891c4b854704fefb5..0000000000000000000000000000000000000000
--- a/info-manager-server/src/main/java/de/ozgcloud/info/common/CallScope.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2023-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.info.common;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.springframework.beans.factory.ObjectFactory;
-import org.springframework.beans.factory.config.Scope;
-import org.springframework.core.NamedInheritableThreadLocal;
-
-import lombok.NonNull;
-import lombok.extern.log4j.Log4j2;
-
-@Log4j2
-public class CallScope implements Scope {
-	public static final String SCOPE_NAME = "call";
-
-	static final ThreadLocal<Map<String, Object>> scopedObjectsHolder = new NamedInheritableThreadLocal<>("Call Context");
-	static final ThreadLocal<Map<String, Runnable>> destructionCallbacksHolder = new NamedInheritableThreadLocal<>(
-	  "Call Context Destruction Callbacks");
-
-	public void startScope() {
-		LOG.debug("START Call-Scope");
-		scopedObjectsHolder.set(new ConcurrentHashMap<>());
-		destructionCallbacksHolder.set(new ConcurrentHashMap<>());
-	}
-
-	public void endScope() {
-		scopedObjectsHolder.remove();
-		callAllDestructionCallbacks();
-		destructionCallbacksHolder.remove();
-		LOG.debug("END Call-Scope");
-	}
-
-	void callAllDestructionCallbacks() {
-		destructionCallbacksHolder.get().values().forEach(Runnable::run);
-	}
-
-	@Override
-	public @NonNull Object get(@NonNull String name, @NonNull ObjectFactory<?> objectFactory) {
-		if (!scopedObjectsHolder.get().containsKey(name)) {
-			scopedObjectsHolder.get().put(name, objectFactory.getObject());
-		}
-
-		return scopedObjectsHolder.get().get(name);
-	}
-
-	@Override
-	public Object remove(@NonNull String name) {
-		destructionCallbacksHolder.get().remove(name);
-		return scopedObjectsHolder.get().remove(name);
-	}
-
-	@Override
-	public void registerDestructionCallback(@NonNull String name, @NonNull Runnable callback) {
-		destructionCallbacksHolder.get().put(name, callback);
-
-	}
-
-	@Override
-	public Object resolveContextualObject(@NonNull String key) {
-		return scopedObjectsHolder.get().get(key);
-	}
-
-	@Override
-	public String getConversationId() {
-		return Thread.currentThread().getName();
-	}
-}
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/common/ContextService.java b/info-manager-server/src/main/java/de/ozgcloud/info/common/ContextService.java
deleted file mode 100644
index a82d1e4681a2f2fd6a3e8fe4923471341052c822..0000000000000000000000000000000000000000
--- a/info-manager-server/src/main/java/de/ozgcloud/info/common/ContextService.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * 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.info.common;
-
-import java.util.Optional;
-
-import org.springframework.stereotype.Service;
-
-import io.grpc.Metadata;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.log4j.Log4j2;
-
-@Getter
-@Log4j2
-@Service
-@RequiredArgsConstructor
-public class ContextService {
-	public static final String KEY_CLIENT_NAME = "CLIENT_NAME-bin";
-	public static final String KEY_REQUEST_ID = "REQUEST_ID-bin";
-	public static final String KEY_AUTHENTICATION_ID = "AUTHENTICATION-bin";
-	public static final String KEY_JWT_TOKEN = "JWT_TOKEN-bin";
-	private RequestAttributes requestAttributes;
-
-	void readMetadata(Metadata headers) {
-		var requestAttributesBuilder = RequestAttributes.builder();
-
-		getRequestId(headers).ifPresent(id -> requestAttributesBuilder.requestId(new String(id)));
-		getClientName(headers).ifPresent(name -> requestAttributesBuilder.clientName(new String(name)));
-		getJwtToken(headers).ifPresent(token -> requestAttributesBuilder.jwtToken(new String(token)));
-		getAuthentication(headers).ifPresent(saml -> requestAttributesBuilder.samlToken(new String(saml)));
-
-		requestAttributes = requestAttributesBuilder.build();
-	}
-
-	Optional<byte[]> getRequestId(Metadata headers) {
-		return Optional.ofNullable(headers.get(ContextService.createKeyOf(ContextService.KEY_REQUEST_ID)));
-	}
-
-	Optional<byte[]> getClientName(Metadata headers) {
-		return Optional.ofNullable(headers.get(ContextService.createKeyOf(ContextService.KEY_CLIENT_NAME)));
-	}
-
-	Optional<byte[]> getAuthentication(Metadata headers) {
-		return Optional.ofNullable(headers.get(ContextService.createKeyOf(ContextService.KEY_AUTHENTICATION_ID)));
-	}
-
-	Optional<byte[]> getJwtToken(Metadata headers) {
-		return Optional.ofNullable(headers.get(ContextService.createKeyOf(ContextService.KEY_JWT_TOKEN)));
-	}
-
-	static Metadata.Key<byte[]> createKeyOf(String key) {
-		return Metadata.Key.of(key, Metadata.BINARY_BYTE_MARSHALLER);
-	}
-}
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtEvent.java b/info-manager-server/src/main/java/de/ozgcloud/info/common/NachrichtEvent.java
similarity index 94%
rename from info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtEvent.java
rename to info-manager-server/src/main/java/de/ozgcloud/info/common/NachrichtEvent.java
index 1db047dec0fa327768ac909b62ab550382a6528d..8bcd639d03aad5e897f790058da94bab562570a4 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtEvent.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/common/NachrichtEvent.java
@@ -18,12 +18,11 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.nachricht;
+package de.ozgcloud.info.common;
 
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.Size;
 
-import org.bson.types.ObjectId;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.index.CompoundIndex;
 import org.springframework.data.mongodb.core.mapping.Document;
@@ -39,7 +38,7 @@ import lombok.Setter;
 @Setter
 public class NachrichtEvent {
 	@Id
-	private ObjectId id;
+	private String id;
 
 	@NotBlank(message = "Postfach id is missing")
 	@Size(max = 128, message = "Invalid PostfachId")
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InfoManagerProperties.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/InfoManagerProperties.java
similarity index 91%
rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InfoManagerProperties.java
rename to info-manager-server/src/main/java/de/ozgcloud/info/information/InfoManagerProperties.java
index 2f4e908d66ddfa32eda28a246a82c3d116d4529a..1cd0f36ff7c553b0a52ea3f3020cedb2b5617a9a 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InfoManagerProperties.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/InfoManagerProperties.java
@@ -18,7 +18,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
@@ -30,5 +30,5 @@ import lombok.Getter;
 @ConfigurationProperties(prefix = InfoManagerProperties.PREFIX)
 public class InfoManagerProperties {
 	static final String PREFIX = "ozgcloud.infomanager";
-	private String postfachIdKeyName = "postkorbhandle";
+	private final String postfachIdKeyName = "postkorbhandle";
 }
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationGrpcService.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationGrpcService.java
similarity index 98%
rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationGrpcService.java
rename to info-manager-server/src/main/java/de/ozgcloud/info/information/InformationGrpcService.java
index 8062453cac36a9380c789602de632d129d3901e8..4b4e664a9b907bfca8a77d7a98e7653097ae03ab 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationGrpcService.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationGrpcService.java
@@ -18,7 +18,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import java.util.NoSuchElementException;
 
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationMapper.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationMapper.java
similarity index 89%
rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationMapper.java
rename to info-manager-server/src/main/java/de/ozgcloud/info/information/InformationMapper.java
index 3c3bbac80a1f7ca197b8c5b34173a95d78aa0342..dd7f3b7121cc641505e6928c0662de8991a227dc 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationMapper.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationMapper.java
@@ -18,10 +18,10 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import de.ozgcloud.info.GrpcInformationNachricht;
-import de.ozgcloud.info.nachricht.NachrichtEvent;
+import de.ozgcloud.info.common.NachrichtEvent;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 
@@ -29,7 +29,7 @@ import lombok.NoArgsConstructor;
 class InformationMapper {
 	static GrpcInformationNachricht fromNachrichtEvent(NachrichtEvent nachrichtEvent) {
 		return GrpcInformationNachricht.newBuilder()
-		  .setId(nachrichtEvent.getId().toHexString())
+		  .setId(nachrichtEvent.getId())
 		  .setPostfachId(nachrichtEvent.getPostfachId())
 		  .setOzgCloudAddress(nachrichtEvent.getNachrichtenListUrl())
 		  .build();
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationRepository.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationRepository.java
similarity index 85%
rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationRepository.java
rename to info-manager-server/src/main/java/de/ozgcloud/info/information/InformationRepository.java
index cc94d21fd08ff6b1d4cb5f2fdaa0c9fc6307422c..a5eb66186174be22058c6dee93e5fea12dfdbf9b 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationRepository.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationRepository.java
@@ -18,11 +18,9 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
+package de.ozgcloud.info.information;
 
-package de.ozgcloud.info.infomanager;
+import de.ozgcloud.info.common.NachrichtEvent;
 
-import de.ozgcloud.info.nachricht.NachrichtEvent;
-import org.bson.types.ObjectId;
-
-interface InformationRepository extends ReadOnlyRepository<NachrichtEvent, ObjectId> {
+interface InformationRepository extends ReadOnlyRepository<NachrichtEvent, String> {
 }
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationService.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationService.java
similarity index 86%
rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationService.java
rename to info-manager-server/src/main/java/de/ozgcloud/info/information/InformationService.java
index 02596fa99133a5e355ff7f6a80a963726e1278f3..d70e7056522110429f837d54a08e8938dd13851a 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/InformationService.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/InformationService.java
@@ -18,14 +18,13 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import java.util.List;
 
-import org.bson.types.ObjectId;
 import org.springframework.stereotype.Service;
 
-import de.ozgcloud.info.nachricht.NachrichtEvent;
+import de.ozgcloud.info.common.NachrichtEvent;
 import lombok.RequiredArgsConstructor;
 
 @Service
@@ -34,7 +33,7 @@ class InformationService {
 	private final InformationRepository repository;
 
 	NachrichtEvent getInformationById(String id) {
-		return repository.findById(new ObjectId(id)).orElseThrow();
+		return repository.findById(id).orElseThrow();
 	}
 
 	List<NachrichtEvent> getInformationOfPostfach(String postfachId) {
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/ReadOnlyRepository.java b/info-manager-server/src/main/java/de/ozgcloud/info/information/ReadOnlyRepository.java
similarity index 92%
rename from info-manager-server/src/main/java/de/ozgcloud/info/infomanager/ReadOnlyRepository.java
rename to info-manager-server/src/main/java/de/ozgcloud/info/information/ReadOnlyRepository.java
index bae0f76bba23709920350be1ec0ca4ab7c32f25e..bccf8e0ba99a9284230f3832b24b0f25e737f955 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/infomanager/ReadOnlyRepository.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/information/ReadOnlyRepository.java
@@ -18,14 +18,14 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import java.util.List;
+
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.NoRepositoryBean;
 
 @NoRepositoryBean
 interface ReadOnlyRepository<T, ID> extends CrudRepository<T, ID> {
-    List<T> findByPostfachId(String postfachId);
+	List<T> findByPostfachId(String postfachId);
 }
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenGrpcService.java b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java
similarity index 72%
rename from info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenGrpcService.java
rename to info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java
index 7c2a4108df2b9b80858a8e66e55aa4bb68e1fe26..4bae8077690e8f41248ec23576e321846cdeb574 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenGrpcService.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtGrpcService.java
@@ -20,9 +20,14 @@
 
 package de.ozgcloud.info.nachricht;
 
+import java.util.Set;
+
+import jakarta.validation.ConstraintViolation;
 import jakarta.validation.ConstraintViolationException;
+import jakarta.validation.Validator;
 
 import de.ozgcloud.info.common.InvalidNachrichtenListUrlException;
+import de.ozgcloud.info.common.NachrichtEvent;
 import io.grpc.Status;
 import io.grpc.stub.StreamObserver;
 import lombok.RequiredArgsConstructor;
@@ -30,11 +35,12 @@ import net.devh.boot.grpc.server.service.GrpcService;
 
 @GrpcService
 @RequiredArgsConstructor
-public class NachrichtenGrpcService extends NachrichtServiceGrpc.NachrichtServiceImplBase {
+public class NachrichtGrpcService extends NachrichtServiceGrpc.NachrichtServiceImplBase {
 	static final String STATUS_OK = "ok";
 
-	private final NachrichtenService nachrichtService;
-	private final NachrichtenMapper nachrichtenMapper;
+	private final NachrichtService nachrichtService;
+	private final NachrichtMapper nachrichtenMapper;
+	private final Validator validator;
 
 	@Override
 	public void saveNewNachricht(GrpcNewNachrichtRequest request, StreamObserver<GrpcNewNachrichtReply> responseObserver) {
@@ -49,7 +55,20 @@ public class NachrichtenGrpcService extends NachrichtServiceGrpc.NachrichtServic
 	}
 
 	private void saveNachricht(GrpcNewNachrichtRequest request) {
-		nachrichtService.save(nachrichtenMapper.fromGrpcNachricht(request.getNachricht()));
+		var nachricht = nachrichtenMapper.fromGrpcNachricht(request.getNachricht());
+
+		if (isValid(nachricht)) {
+			nachrichtService.save(nachricht);
+		}
+	}
+
+	private boolean isValid(NachrichtEvent nachrichtEvent) {
+		Set<ConstraintViolation<NachrichtEvent>> violations = validator.validate(nachrichtEvent);
+		if (!violations.isEmpty()) {
+			throw new ConstraintViolationException(violations);
+		}
+
+		return true;
 	}
 
 	@Override
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenMapper.java b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtMapper.java
similarity index 96%
rename from info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenMapper.java
rename to info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtMapper.java
index c70da9a76dc62be2ecddb6e513fbd4493fc7dcca..9c818ed736440b54d1abf8ea015c18b761c87497 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenMapper.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtMapper.java
@@ -25,11 +25,12 @@ import org.springframework.core.env.Profiles;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.info.common.InvalidNachrichtenListUrlException;
+import de.ozgcloud.info.common.NachrichtEvent;
 import lombok.RequiredArgsConstructor;
 
 @Component
 @RequiredArgsConstructor
-class NachrichtenMapper {
+class NachrichtMapper {
 	static final String LOCAL_PROFILE = "local";
 	private static final String NACHRICHTEN_LIST_URL_REGEX = "^[A-Za-z\\d-]+(\\.[A-Za-z\\d-]+){0,512}:\\d{1,5}$";
 	static final String NACHRICHTEN_LIST_URL_FORMAT = "dns:///%s";
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenRepository.java b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtRepository.java
similarity index 89%
rename from info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenRepository.java
rename to info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtRepository.java
index 5a12932d3ea18f5d99f3b9aeba6c3c9733a982d1..2129f230425da31e3c34b8848de80aaffb7da647 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenRepository.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtRepository.java
@@ -25,7 +25,9 @@ import java.util.Optional;
 import org.bson.types.ObjectId;
 import org.springframework.data.mongodb.repository.MongoRepository;
 
-interface NachrichtenRepository extends MongoRepository<NachrichtEvent, ObjectId> {
+import de.ozgcloud.info.common.NachrichtEvent;
+
+interface NachrichtRepository extends MongoRepository<NachrichtEvent, ObjectId> {
 	Optional<NachrichtEvent> findByPostfachIdAndNachrichtenListUrl(String postfachId, String nachrichtenListUrl);
 
 	void deleteByPostfachIdAndNachrichtenListUrl(String postfachId, String nachrichtenListUrl);
diff --git a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenService.java b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtService.java
similarity index 92%
rename from info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenService.java
rename to info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtService.java
index 65c47ae1b9c271c91e72bd6eb433eef6986e2203..6fbf72e3a6031e3d9cad68224a39b4adbd028a64 100644
--- a/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtenService.java
+++ b/info-manager-server/src/main/java/de/ozgcloud/info/nachricht/NachrichtService.java
@@ -22,12 +22,13 @@ package de.ozgcloud.info.nachricht;
 
 import org.springframework.stereotype.Service;
 
+import de.ozgcloud.info.common.NachrichtEvent;
 import lombok.RequiredArgsConstructor;
 
 @Service
 @RequiredArgsConstructor
-class NachrichtenService {
-	private final NachrichtenRepository repository;
+class NachrichtService {
+	private final NachrichtRepository repository;
 
 	void save(NachrichtEvent nachrichtEvent) {
 		if (!nachrichtEventPresent(nachrichtEvent)) {
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java
index 89e87d9fe8bf6b472da6c4db389be8c4d5182396..bece6d4ca6823e7e9fc882c82e6451ee81e13f00 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/InfoManagerApplicationTest.java
@@ -22,33 +22,11 @@
  */
 package de.ozgcloud.info;
 
-import static org.assertj.core.api.Assertions.*;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
 import org.mockito.Spy;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import de.ozgcloud.info.common.CallScope;
 
-@ExtendWith(MockitoExtension.class)
 class InfoManagerApplicationTest {
 	@Spy
 	@InjectMocks
 	private InfoManagerApplication application;
-
-	@Test
-	void shouldCreateCallScope() {
-		var callScope = application.callScope();
-
-		assertThat(callScope).isNotNull();
-	}
-
-	@Test
-	void shouldCreateBeanFactoryPostProcessor() {
-		var beanProcessor = InfoManagerApplication.beanFactoryPostProcessor(new CallScope());
-
-		assertThat(beanProcessor).isNotNull();
-	}
 }
\ No newline at end of file
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java b/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java
index a8d644cb02b3a682f51eeb4bf03aa6b6ec159063..e263d684a09aa7448b811b99e27b239214052c86 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/NachrichtEventTestFactory.java
@@ -22,13 +22,14 @@ package de.ozgcloud.info;
 
 import org.bson.types.ObjectId;
 
+import de.ozgcloud.info.common.NachrichtEvent;
 import de.ozgcloud.info.nachricht.GrpcFinishedNachrichtRequest;
 import de.ozgcloud.info.nachricht.GrpcNachricht;
 import de.ozgcloud.info.nachricht.GrpcNewNachrichtRequest;
-import de.ozgcloud.info.nachricht.NachrichtEvent;
 
 public class NachrichtEventTestFactory {
 	public static final ObjectId ID = new ObjectId();
+	public static final String ID_STRING = new ObjectId().toHexString();
 	public static final ObjectId EMPTY_ID = new ObjectId();
 	public static final String POSTKORB_HANDLE = UserTestFactory.POSTKORB_HANDLE;
 	public static final String EMPTY_POSTFACH_HANDLE = "73228744-a28a-4485-845b-d8cc02422760";
@@ -40,7 +41,7 @@ public class NachrichtEventTestFactory {
 
 	public static NachrichtEvent.NachrichtEventBuilder createNachrichtEventBuilder() {
 		return NachrichtEvent.builder()
-		  .id(ID)
+		  .id(ID_STRING)
 		  .postfachId(POSTKORB_HANDLE)
 		  .nachrichtenListUrl(URL);
 	}
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessorTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessorTest.java
deleted file mode 100644
index 48b4390eb3ca4842857514494b11d62e671a6ae5..0000000000000000000000000000000000000000
--- a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallBeanFactoryPostProcessorTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2023-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.info.common;
-
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Spy;
-import org.mockito.junit.jupiter.MockitoExtension;
-import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-
-@ExtendWith(MockitoExtension.class)
-class CallBeanFactoryPostProcessorTest {
-	@Spy
-	private ConfigurableListableBeanFactory configurableListableBeanFactory;
-
-	@Test
-	void shouldRegisterPostProcessBeanFactory() {
-		var processor = new CallBeanFactoryPostProcessor(new CallScope());
-
-		processor.postProcessBeanFactory(configurableListableBeanFactory);
-
-		verify(configurableListableBeanFactory).registerScope(eq(CallScope.SCOPE_NAME), any(CallScope.class));
-	}
-}
\ No newline at end of file
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallContextAttachingInterceptorTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/common/CallContextAttachingInterceptorTest.java
deleted file mode 100644
index 68aac26e25f858d8017dd703a6df4c28ba55d4b6..0000000000000000000000000000000000000000
--- a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallContextAttachingInterceptorTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2023-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.info.common;
-
-import static org.mockito.Mockito.*;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import io.grpc.Metadata;
-import io.grpc.ServerCallHandler;
-
-@ExtendWith(MockitoExtension.class)
-class CallContextAttachingInterceptorTest {
-	@InjectMocks
-	private CallContextAttachingInterceptor interceptor;
-	@Mock
-	private ContextService contextService;
-
-	@Mock
-	ServerCallHandler<?, ?> handler;
-
-	@Test
-	void shouldInterceptCall() {
-		interceptor.interceptCall(null, MetadataTestFactory.create(), handler);
-
-		verify(handler).startCall(any(), any());
-	}
-
-	@Test
-	void shouldFillContextService() {
-		interceptor.interceptCall(null, MetadataTestFactory.create(), handler);
-
-		verify(contextService).readMetadata(any(Metadata.class));
-	}
-}
\ No newline at end of file
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallScopeTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/common/CallScopeTest.java
deleted file mode 100644
index 3748b3b187f7cb57f7499cec3423ef0ee00e3e3f..0000000000000000000000000000000000000000
--- a/info-manager-server/src/test/java/de/ozgcloud/info/common/CallScopeTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2023-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.info.common;
-
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.Mockito.*;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Spy;
-import org.mockito.junit.jupiter.MockitoExtension;
-import org.springframework.beans.factory.ObjectFactory;
-
-@ExtendWith(MockitoExtension.class)
-class CallScopeTest {
-	private static final String TEST = "Test";
-	private static final String TEST_NEW = "TestNew";
-
-	@Spy
-	@InjectMocks
-	private CallScope callScope;
-
-	@Nested
-	class TestFreshCallScope {
-		@Test
-		void shouldStartScope() {
-			callScope.startScope();
-
-			assertThat(CallScope.scopedObjectsHolder).isNotNull();
-			assertThat(CallScope.destructionCallbacksHolder).isNotNull();
-		}
-
-		@Test
-		void shouldEndScope() {
-			callScope.endScope();
-
-			verify(callScope).callAllDestructionCallbacks();
-		}
-
-		@Test
-		void getConversationId() {
-			var id = callScope.getConversationId();
-
-			assertThat(id).isEqualTo(Thread.currentThread().getName());
-		}
-	}
-
-	@Nested
-	class TestCallScope {
-		@Mock
-		private ObjectFactory<Object> objectFactory;
-
-		@BeforeEach
-		void setupEmptyCallScope() {
-			callScope.startScope();
-			CallScope.scopedObjectsHolder.get().put(TEST, objectFactory);
-		}
-
-		@Test
-		void shouldGetAdded() {
-			var newObjectFactory = mock(ObjectFactory.class);
-			var object = new Object();
-			when(newObjectFactory.getObject()).thenReturn(object);
-
-			var recievedObject = callScope.get(TEST_NEW, newObjectFactory);
-
-			assertThat(recievedObject).isNotNull().isEqualTo(object);
-		}
-
-		@Test
-		void shouldGetNullName() {
-			var newObjectFactory = mock(ObjectFactory.class);
-
-			assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.get(null, newObjectFactory));
-		}
-
-		@Test
-		void shouldGetNullFactory() {
-			assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.get(TEST, null));
-		}
-
-		@Test
-		void shouldGetExisting() {
-			var recievedObject = callScope.get(TEST, mock(ObjectFactory.class));
-
-			assertThat(recievedObject).isNotNull().isEqualTo(objectFactory);
-		}
-
-		@Test
-		void remove() {
-			var res = callScope.remove(TEST);
-
-			assertThat(res).isNotNull().isEqualTo(objectFactory);
-		}
-
-		@Test
-		void removeNull() {
-			assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.remove(null));
-		}
-
-		@Test
-		void registerDestructionCallback() {
-			var callBack = mock(Runnable.class);
-
-			callScope.registerDestructionCallback(TEST, callBack);
-
-			assertThat(CallScope.destructionCallbacksHolder.get()).containsEntry(TEST, callBack);
-		}
-
-		@Test
-		void registerDestructionCallbackNullName() {
-			var callBack = mock(Runnable.class);
-			assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.registerDestructionCallback(null, callBack));
-		}
-
-		@Test
-		void registerDestructionCallbackNullCallback() {
-			assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.registerDestructionCallback(TEST, null));
-		}
-
-		@Test
-		void resolveContextualObject() {
-			var contextualObject = callScope.resolveContextualObject(TEST);
-
-			assertThat(contextualObject).isEqualTo(objectFactory);
-		}
-
-		@Test
-		void resolveContextualObjectNullName() {
-			assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> callScope.resolveContextualObject(null));
-		}
-	}
-}
\ No newline at end of file
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/common/ContextServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/common/ContextServiceTest.java
deleted file mode 100644
index f66260e93a10e17acba5acf459ffe2611bfe3f68..0000000000000000000000000000000000000000
--- a/info-manager-server/src/test/java/de/ozgcloud/info/common/ContextServiceTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * 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.info.common;
-
-import static de.ozgcloud.info.common.MetadataTestFactory.*;
-import static org.assertj.core.api.Assertions.*;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Spy;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-@ExtendWith(MockitoExtension.class)
-class ContextServiceTest {
-	@Spy
-	@InjectMocks
-	private ContextService contextService;
-
-	@Nested
-	class TestCallContext {
-		@BeforeEach
-		void init() {
-			contextService.readMetadata(MetadataTestFactory.create());
-		}
-
-		@Test
-		void shouldGetRequestId() {
-			var requestId = contextService.getRequestId(MetadataTestFactory.create());
-
-			assertThat(requestId).isPresent().hasValue(REQUEST_ID_BYTES);
-		}
-
-		@Test
-		void shouldGetClientName() {
-			var clientName = contextService.getClientName(MetadataTestFactory.create());
-
-			assertThat(clientName).isPresent().hasValue(CLIENT_NAME_BYTES);
-		}
-
-		@Test
-		void shouldGetAuthentication() {
-			var clientName = contextService.getAuthentication(MetadataTestFactory.create());
-
-			assertThat(clientName).isPresent().hasValue(SAML_TOKEN_BYTES);
-		}
-
-		@Test
-		void shouldReadRequestAttributesRequestId() {
-			assertThat(contextService.getRequestAttributes().getRequestId()).isEqualTo(new String(REQUEST_ID_BYTES));
-		}
-
-		@Test
-		void shouldReadRequestAttributesClientName() {
-			assertThat(contextService.getRequestAttributes().getClientName()).isEqualTo(new String(CLIENT_NAME_BYTES));
-		}
-
-		@Test
-		void shouldReadRequestAttributesAuth() {
-			assertThat(contextService.getRequestAttributes().getSamlToken()).isEqualTo(new String(SAML_TOKEN_BYTES));
-		}
-	}
-
-	@Nested
-	class TestEmptyCallContext {
-		@BeforeEach
-		void init() {
-			contextService.readMetadata(MetadataTestFactory.createEmpty());
-		}
-
-		@Test
-		void shouldReadRequestAttributesRequestId() {
-			assertThat(contextService.getRequestAttributes().getRequestId()).isNotEmpty();
-		}
-
-		@Test
-		void shouldReadRequestAttributesClientName() {
-			assertThat(contextService.getRequestAttributes().getClientName()).isNull();
-		}
-
-		@Test
-		void shouldReadRequestAttributesSamlToken() {
-			assertThat(contextService.getRequestAttributes().getSamlToken()).isNull();
-		}
-	}
-}
\ No newline at end of file
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/common/MetadataTestFactory.java b/info-manager-server/src/test/java/de/ozgcloud/info/common/MetadataTestFactory.java
deleted file mode 100644
index a4dd8873f43c9649f623e8435aa6801e59634213..0000000000000000000000000000000000000000
--- a/info-manager-server/src/test/java/de/ozgcloud/info/common/MetadataTestFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * 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.info.common;
-
-import static de.ozgcloud.info.common.ContextService.*;
-
-import java.util.UUID;
-
-import io.grpc.Metadata;
-
-public class MetadataTestFactory {
-	public static byte[] CLIENT_NAME_BYTES = "ANTRAGSRAUM".getBytes();
-	public static byte[] REQUEST_ID_BYTES = UUID.randomUUID().toString().getBytes();
-	public static byte[] SAML_TOKEN_BYTES = UUID.randomUUID().toString().getBytes();
-
-	public static Metadata create() {
-		var metadata = new Metadata();
-		metadata.put(createKeyOf(KEY_CLIENT_NAME), CLIENT_NAME_BYTES);
-		metadata.put(createKeyOf(KEY_REQUEST_ID), REQUEST_ID_BYTES);
-		metadata.put(createKeyOf(KEY_AUTHENTICATION_ID), SAML_TOKEN_BYTES);
-
-		return metadata;
-	}
-
-	public static Metadata createEmpty() {
-		return new Metadata();
-	}
-
-	public static Metadata.Key<byte[]> createKeyOf(String key) {
-		return Metadata.Key.of(key, Metadata.BINARY_BYTE_MARSHALLER);
-	}
-}
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithEventsConfiguration.java b/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithEventsConfiguration.java
deleted file mode 100644
index 033e3f7bc831a81bf1db46bf61b7ca60a3f5a159..0000000000000000000000000000000000000000
--- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithEventsConfiguration.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * 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.info.infomanager;
-
-import java.util.UUID;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.test.util.ReflectionTestUtils;
-
-import de.ozgcloud.info.common.ContextService;
-import de.ozgcloud.info.common.RequestAttributes;
-
-@Configuration
-public class UserWithEventsConfiguration {
-	RequestAttributes requestAttributes() {
-		return RequestAttributes.builder()
-		  .clientName("Antragsraum")
-		  .requestId(UUID.randomUUID().toString()).build();
-	}
-
-	@Bean
-	ContextService contextService() {
-		var contextService = new ContextService();
-		ReflectionTestUtils.setField(contextService, "requestAttributes", requestAttributes());
-		return contextService;
-	}
-}
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithOutEventsConfiguration.java b/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithOutEventsConfiguration.java
deleted file mode 100644
index 421e007c2120d312dc584a8964fbcce306fecc63..0000000000000000000000000000000000000000
--- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/UserWithOutEventsConfiguration.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2023-2024.
- * 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.info.infomanager;
-
-import java.util.UUID;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.test.util.ReflectionTestUtils;
-
-import de.ozgcloud.info.common.ContextService;
-import de.ozgcloud.info.common.RequestAttributes;
-
-@Configuration
-public class UserWithOutEventsConfiguration {
-	RequestAttributes requestAttributes() {
-		return RequestAttributes.builder()
-		  .clientName("Antragsraum")
-		  .requestId(UUID.randomUUID().toString()).build();
-	}
-
-	@Bean
-	ContextService contextService() {
-		var contextService = new ContextService();
-		ReflectionTestUtils.setField(contextService, "requestAttributes", requestAttributes());
-		return contextService;
-	}
-}
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceNoEventsITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceNoEventsITCase.java
similarity index 91%
rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceNoEventsITCase.java
rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceNoEventsITCase.java
index 1324f1adce7b6c1d862303ade68466b060db40f2..2074a34b5db687cec93618b33d62a00d2ed2e434 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceNoEventsITCase.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceNoEventsITCase.java
@@ -18,7 +18,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import static org.assertj.core.api.Assertions.*;
 
@@ -32,7 +32,6 @@ import de.ozgcloud.info.GrpcInformationByIdRequest;
 import de.ozgcloud.info.GrpcInformationRequest;
 import de.ozgcloud.info.InformationServiceGrpc;
 import de.ozgcloud.info.NachrichtEventTestFactory;
-import de.ozgcloud.info.SecurityConfiguration;
 import io.grpc.StatusRuntimeException;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
@@ -41,8 +40,7 @@ import net.devh.boot.grpc.client.inject.GrpcClient;
   "grpc.server.port=-1",
   "grpc.client.inProcess.address=in-process:test"
 })
-@SpringJUnitConfig(classes = { UserWithOutEventsConfiguration.class, InformationGrpcTestConfiguration.class,
-  SecurityConfiguration.class })
+@SpringJUnitConfig(classes = { InformationGrpcTestConfiguration.class })
 @DirtiesContext
 class InformationGrpcServiceNoEventsITCase {
 	@GrpcClient("inProcess")
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceTest.java
similarity index 97%
rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceTest.java
rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceTest.java
index 3f5ac156d2ad546aded509c018590460c3933c30..5d1414434fabb57803148149a44baabf31c74c41 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceTest.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceTest.java
@@ -18,7 +18,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
@@ -43,7 +43,7 @@ import de.ozgcloud.info.GrpcInformationNachricht;
 import de.ozgcloud.info.GrpcInformationRequest;
 import de.ozgcloud.info.GrpcInformationResponse;
 import de.ozgcloud.info.NachrichtEventTestFactory;
-import de.ozgcloud.info.nachricht.NachrichtEvent;
+import de.ozgcloud.info.common.NachrichtEvent;
 import io.grpc.stub.StreamObserver;
 
 @ExtendWith(MockitoExtension.class)
@@ -98,7 +98,7 @@ class InformationGrpcServiceTest {
 
 			assertThat(response.getNachrichtenList()).hasSize(2);
 
-			var information = response.getNachrichtenList().get(0);
+			var information = response.getNachrichtenList().getFirst();
 
 			assertThat(information.getPostfachId()).isEqualTo(firstNachrichtEvent.getPostfachId());
 			assertThat(information.getOzgCloudAddress()).isEqualTo(firstNachrichtEvent.getNachrichtenListUrl());
@@ -171,7 +171,7 @@ class InformationGrpcServiceTest {
 			var nachricht = response.getNachricht();
 
 			assertThat(nachricht).isInstanceOf(GrpcInformationNachricht.class);
-			assertThat(nachricht.getId()).isEqualTo(nachrichtEvent.getId().toHexString());
+			assertThat(nachricht.getId()).isEqualTo(nachrichtEvent.getId());
 			assertThat(nachricht.getPostfachId()).isEqualTo(nachrichtEvent.getPostfachId());
 			assertThat(nachricht.getOzgCloudAddress()).isEqualTo(nachrichtEvent.getNachrichtenListUrl());
 		}
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceWithEventsITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceWithEventsITCase.java
similarity index 88%
rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceWithEventsITCase.java
rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceWithEventsITCase.java
index 5ff98ee4a256e663f2dd3e4195bf1c3ae55eaa41..5aae56c0dceea803939210148344e1fa49de2a80 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcServiceWithEventsITCase.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcServiceWithEventsITCase.java
@@ -18,7 +18,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import static org.assertj.core.api.Assertions.*;
 
@@ -33,7 +33,6 @@ import de.ozgcloud.info.GrpcInformationNachricht;
 import de.ozgcloud.info.GrpcInformationRequest;
 import de.ozgcloud.info.InformationServiceGrpc;
 import de.ozgcloud.info.NachrichtEventTestFactory;
-import de.ozgcloud.info.SecurityConfiguration;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
 @SpringBootTest(properties = {
@@ -41,8 +40,7 @@ import net.devh.boot.grpc.client.inject.GrpcClient;
   "grpc.server.port=-1",
   "grpc.client.inProcess.address=in-process:test"
 })
-@SpringJUnitConfig(classes = { UserWithEventsConfiguration.class, InformationGrpcTestConfiguration.class,
-  SecurityConfiguration.class })
+@SpringJUnitConfig(classes = { InformationGrpcTestConfiguration.class })
 @DirtiesContext
 class InformationGrpcServiceWithEventsITCase {
 	@GrpcClient("inProcess")
@@ -57,7 +55,7 @@ class InformationGrpcServiceWithEventsITCase {
 			var values = response.getNachrichtenList();
 
 			assertThat(values).hasSize(1);
-			assertThat(values.get(0).getPostfachId()).isEqualTo(NachrichtEventTestFactory.POSTKORB_HANDLE);
+			assertThat(values.getFirst().getPostfachId()).isEqualTo(NachrichtEventTestFactory.POSTKORB_HANDLE);
 		}
 	}
 
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcTestConfiguration.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcTestConfiguration.java
similarity index 94%
rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcTestConfiguration.java
rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcTestConfiguration.java
index 8c04d9662d2210175869aa8a8b686728cef35aa9..269cf96411e9763c3894c14c1b6f8537c407ddf8 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationGrpcTestConfiguration.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationGrpcTestConfiguration.java
@@ -18,20 +18,18 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import static org.mockito.Mockito.*;
 
 import java.util.List;
 import java.util.NoSuchElementException;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 import de.ozgcloud.info.NachrichtEventTestFactory;
-import de.ozgcloud.info.common.ContextService;
 import lombok.extern.log4j.Log4j2;
 import net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration;
 import net.devh.boot.grpc.client.autoconfigure.GrpcClientTraceAutoConfiguration;
@@ -52,8 +50,6 @@ import net.devh.boot.grpc.server.autoconfigure.GrpcServerSecurityAutoConfigurati
   GrpcClientAutoConfiguration.class,
   GrpcClientTraceAutoConfiguration.class })
 public class InformationGrpcTestConfiguration {
-	@Autowired
-	ContextService contextService;
 
 	@Bean
 	InformationService informationService() {
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationMapperTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationMapperTest.java
similarity index 93%
rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationMapperTest.java
rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationMapperTest.java
index a7ca16d8f16427111c2b4de48fde7d40e7101619..a723973e555c8963f8e627da504f3dad2fa48714 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationMapperTest.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationMapperTest.java
@@ -18,7 +18,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import static org.assertj.core.api.Assertions.*;
 
@@ -26,7 +26,7 @@ import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
 import de.ozgcloud.info.NachrichtEventTestFactory;
-import de.ozgcloud.info.nachricht.NachrichtEvent;
+import de.ozgcloud.info.common.NachrichtEvent;
 
 class InformationMapperTest {
 	@Nested
@@ -37,7 +37,7 @@ class InformationMapperTest {
 		void shouldHaveId() {
 			var grpcInformationNachricht = InformationMapper.fromNachrichtEvent(nachrichtEvent);
 
-			assertThat(grpcInformationNachricht.getId()).isEqualTo(NachrichtEventTestFactory.ID.toHexString());
+			assertThat(grpcInformationNachricht.getId()).isEqualTo(NachrichtEventTestFactory.ID_STRING);
 		}
 
 		@Test
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationRepositoryITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationRepositoryITCase.java
similarity index 98%
rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationRepositoryITCase.java
rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationRepositoryITCase.java
index 5aa77484a7c5838d5f0e90201ad9337e1c81b0aa..dbd3b39e5ffcefd51663358b5ec6ed4ffe9bd1f8 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationRepositoryITCase.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationRepositoryITCase.java
@@ -18,7 +18,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import static org.assertj.core.api.Assertions.*;
 
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationServiceTest.java
similarity index 89%
rename from info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationServiceTest.java
rename to info-manager-server/src/test/java/de/ozgcloud/info/information/InformationServiceTest.java
index 7c645107fbf7c6149ab3337830c7b81c4e5480b9..b3f720510eae7f334aa8b9bd460856c984c085dd 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/infomanager/InformationServiceTest.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/information/InformationServiceTest.java
@@ -21,7 +21,7 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 
-package de.ozgcloud.info.infomanager;
+package de.ozgcloud.info.information;
 
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
@@ -39,7 +39,7 @@ import org.mockito.Spy;
 import org.mockito.junit.jupiter.MockitoExtension;
 
 import de.ozgcloud.info.NachrichtEventTestFactory;
-import de.ozgcloud.info.nachricht.NachrichtEvent;
+import de.ozgcloud.info.common.NachrichtEvent;
 
 @ExtendWith(MockitoExtension.class)
 class InformationServiceTest {
@@ -56,12 +56,12 @@ class InformationServiceTest {
 
 		@BeforeEach
 		void init() {
-			when(repository.findById(NachrichtEventTestFactory.ID)).thenReturn(Optional.of(nachrichtEvent));
+			when(repository.findById(NachrichtEventTestFactory.ID_STRING)).thenReturn(Optional.of(nachrichtEvent));
 		}
 
 		@Test
 		void shouldReturnInformation() {
-			var information = service.getInformationById(NachrichtEventTestFactory.ID.toHexString());
+			var information = service.getInformationById(NachrichtEventTestFactory.ID_STRING);
 
 			assertThat(information).isEqualTo(nachrichtEvent);
 		}
@@ -81,7 +81,7 @@ class InformationServiceTest {
 			var information = service.getInformationOfPostfach(NachrichtEventTestFactory.POSTKORB_HANDLE);
 
 			assertThat(information).hasSize(1);
-			assertThat(information.get(0)).isEqualTo(nachrichtEvent);
+			assertThat(information.getFirst()).isEqualTo(nachrichtEvent);
 		}
 	}
 }
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java
index f255947684af1e34fcaf89ab4451e96332d68bf2..03a58213faef6c7bdee5d8cfc73a046ffedeaafa 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceITCase.java
@@ -20,7 +20,7 @@
 
 package de.ozgcloud.info.nachricht;
 
-import static de.ozgcloud.info.nachricht.NachrichtenGrpcService.*;
+import static de.ozgcloud.info.nachricht.NachrichtGrpcService.*;
 import static org.assertj.core.api.Assertions.*;
 
 import org.junit.jupiter.api.Nested;
@@ -30,7 +30,7 @@ import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
 
 import de.ozgcloud.info.NachrichtEventTestFactory;
-import de.ozgcloud.info.SecurityConfiguration;
+import io.grpc.StatusRuntimeException;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
 @SpringBootTest(properties = {
@@ -38,7 +38,7 @@ import net.devh.boot.grpc.client.inject.GrpcClient;
   "grpc.server.port=-1",
   "grpc.client.inProcess.address=in-process:test"
 })
-@SpringJUnitConfig(classes = { NachrichtenGrpcTestConfiguration.class, SecurityConfiguration.class })
+@SpringJUnitConfig(classes = { NachrichtenGrpcTestConfiguration.class })
 @DirtiesContext
 class NachrichtenGrpcServiceITCase {
 
@@ -55,6 +55,15 @@ class NachrichtenGrpcServiceITCase {
 
 			assertThat(response.getStatus()).isEqualTo(STATUS_OK);
 		}
+
+		@Test
+		@DirtiesContext
+		void shouldNotSaveInvalidNewNachricht() {
+			var nachricht = GrpcNachricht.newBuilder().setNachrichtenListUrl("lala").build();
+			var request = NachrichtEventTestFactory.createNewNachrichtRequest().toBuilder().setNachricht(nachricht).build();
+
+			assertThatExceptionOfType(StatusRuntimeException.class).isThrownBy(() -> service.saveNewNachricht(request));
+		}
 	}
 
 	@Nested
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java
index 03ab5bfcfda7cbaa66f3fc875c0fdf3bcec4660b..223e74bba19796799218cdf4ea40c69a1c5a3a17 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcServiceTest.java
@@ -23,7 +23,10 @@ package de.ozgcloud.info.nachricht;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
+import java.util.Set;
+
 import jakarta.validation.ConstraintViolationException;
+import jakarta.validation.Validator;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
@@ -38,19 +41,23 @@ import org.mockito.junit.jupiter.MockitoExtension;
 
 import de.ozgcloud.info.NachrichtEventTestFactory;
 import de.ozgcloud.info.common.InvalidNachrichtenListUrlException;
+import de.ozgcloud.info.common.NachrichtEvent;
 import io.grpc.stub.StreamObserver;
 
 @ExtendWith(MockitoExtension.class)
 class NachrichtenGrpcServiceTest {
 	@Spy
 	@InjectMocks
-	private NachrichtenGrpcService nachrichtenGrpcService;
+	private NachrichtGrpcService nachrichtenGrpcService;
+
+	@Mock
+	private NachrichtService nachrichtenService;
 
 	@Mock
-	private NachrichtenService nachrichtenService;
+	private NachrichtMapper nachrichtenMapper;
 
 	@Mock
-	private NachrichtenMapper nachrichtenMapper;
+	private Validator validator;
 
 	@Captor
 	private ArgumentCaptor<NachrichtEvent> nachrichtArgumentCaptor;
@@ -66,6 +73,8 @@ class NachrichtenGrpcServiceTest {
 		void init() {
 			when(nachrichtenMapper.fromGrpcNachricht(newNachrichtRequest.getNachricht())).thenReturn(
 			  NachrichtEventTestFactory.createNachrichtEventBuilder().id(null).build());
+
+			when(validator.validate(any(NachrichtEvent.class))).thenReturn(Set.of());
 		}
 
 		@Test
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java
index 34ec18cca069e83168bf1995a369ddd9c51fbc17..1585b165118a2753a910b4e30404a8bf61b0f6d9 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenGrpcTestConfiguration.java
@@ -24,9 +24,13 @@ package de.ozgcloud.info.nachricht;
 
 import static org.mockito.Mockito.*;
 
+import jakarta.validation.Validator;
+
 import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
 
 import net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration;
 import net.devh.boot.grpc.server.autoconfigure.GrpcServerAutoConfiguration;
@@ -39,22 +43,27 @@ import net.devh.boot.grpc.server.autoconfigure.GrpcServerFactoryAutoConfiguratio
   GrpcClientAutoConfiguration.class })
 class NachrichtenGrpcTestConfiguration {
 	@Bean
-	NachrichtenService nachrichtenService() {
-		return mock(NachrichtenService.class);
+	NachrichtService nachrichtenService() {
+		return new NachrichtService(nachrichtenRepository());
+	}
+
+	@Bean
+	Validator validator() {
+		return new LocalValidatorFactoryBean();
 	}
 
 	@Bean
-	NachrichtenRepository nachrichtenRepository() {
-		return mock(NachrichtenRepository.class);
+	NachrichtRepository nachrichtenRepository() {
+		return mock(NachrichtRepository.class);
 	}
 
 	@Bean
-	NachrichtenMapper nachrichtenMapper() {
-		return mock(NachrichtenMapper.class);
+	NachrichtMapper nachrichtenMapper() {
+		return new NachrichtMapper(mock(Environment.class));
 	}
 
 	@Bean
-	NachrichtenGrpcService nachrichtenGrpcService() {
-		return new NachrichtenGrpcService(nachrichtenService(), nachrichtenMapper());
+	NachrichtGrpcService nachrichtenGrpcService() {
+		return new NachrichtGrpcService(nachrichtenService(), nachrichtenMapper(), validator());
 	}
 }
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java
index 2ec9d34070626abb6b98cf166cedada52b9c658c..958b0233da5868c6224ee81741fa915e463fa388 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenMapperTest.java
@@ -20,7 +20,7 @@
 
 package de.ozgcloud.info.nachricht;
 
-import static de.ozgcloud.info.nachricht.NachrichtenMapper.*;
+import static de.ozgcloud.info.nachricht.NachrichtMapper.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
@@ -44,7 +44,7 @@ import de.ozgcloud.info.common.InvalidNachrichtenListUrlException;
 class NachrichtenMapperTest {
 	@Spy
 	@InjectMocks
-	private NachrichtenMapper nachrichtenMapper;
+	private NachrichtMapper nachrichtenMapper;
 
 	@Mock
 	private Environment environment;
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenRepositoryITCase.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenRepositoryITCase.java
index 9b0ac2b75a08b924155ef61436e21f12f65348df..62746e8d467749bf395f0eb7c37e3b0c6e0be817 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenRepositoryITCase.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenRepositoryITCase.java
@@ -26,6 +26,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.test.context.ContextConfiguration;
@@ -33,13 +34,15 @@ import org.testcontainers.junit.jupiter.Testcontainers;
 
 import de.ozgcloud.info.MongoDBTestContainerConfig;
 import de.ozgcloud.info.NachrichtEventTestFactory;
+import de.ozgcloud.info.common.NachrichtEvent;
 
 @DataMongoTest
 @Testcontainers
 @ContextConfiguration(classes = MongoDBTestContainerConfig.class)
 public class NachrichtenRepositoryITCase {
+	@Qualifier("nachrichtRepository")
 	@Autowired
-	private NachrichtenRepository repository;
+	private NachrichtRepository repository;
 
 	@Nested
 	class TestNewNachrichtEvent {
diff --git a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java
index ea8c1fd9944c6f4efec4f7da6ea4d9b51c484766..38d8a14bf966ac47d9b055a74008a84c99d54eec 100644
--- a/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java
+++ b/info-manager-server/src/test/java/de/ozgcloud/info/nachricht/NachrichtenServiceTest.java
@@ -38,15 +38,16 @@ import org.mockito.Spy;
 import org.mockito.junit.jupiter.MockitoExtension;
 
 import de.ozgcloud.info.NachrichtEventTestFactory;
+import de.ozgcloud.info.common.NachrichtEvent;
 
 @ExtendWith(MockitoExtension.class)
 class NachrichtenServiceTest {
 	@Spy
 	@InjectMocks
-	private NachrichtenService service;
+	private NachrichtService service;
 
 	@Mock
-	private NachrichtenRepository repository;
+	private NachrichtRepository repository;
 
 	@Nested
 	class TestAddingNewNachrichtEvent {
diff --git a/info-manager-server/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/info-manager-server/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension
new file mode 100644
index 0000000000000000000000000000000000000000..79b126e6cdb86bec1f4f08c205de8961bde1934a
--- /dev/null
+++ b/info-manager-server/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension
@@ -0,0 +1 @@
+org.mockito.junit.jupiter.MockitoExtension
\ No newline at end of file
diff --git a/info-manager-server/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/info-manager-server/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
new file mode 100644
index 0000000000000000000000000000000000000000..ca6ee9cea8ec189a088d50559325d4e84ff8ad09
--- /dev/null
+++ b/info-manager-server/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
@@ -0,0 +1 @@
+mock-maker-inline
\ No newline at end of file
diff --git a/release-erstellen.sh b/release-erstellen.sh
index 8fac40d077b65c2121f36466823ff4c6da0ea934..6275997f509a88a813fdd95d1c1c5309b856f302 100644
--- a/release-erstellen.sh
+++ b/release-erstellen.sh
@@ -1,4 +1,22 @@
-VERSION=1.2.0
+#!/bin/sh
+
+if [ "$#" -ne 1 ]; then
+    echo "Aufruf: release-erstellen.sh JA"
+    echo "Als Parameter bitte 'JA' eintragen zur Sicherheit"
+    exit 1
+fi
+
+
+## alle -SNAPSHOT in pom.xmls entfernen
+SED_PARAMS="-i"
+if [[ "$OSTYPE" =~ ^darwin ]]; then
+    SED_PARAMS="$SED_PARAMS '' -e"
+fi
+find . -name pom.xml -exec sed $SED_PARAMS 's/-SNAPSHOT//g' {} +
+
+## release version auslesen
+NEWVERSION=$(xmlstarlet sel -N w="http://maven.apache.org/POM/4.0.0" -t -v '//w:project/w:version' -n pom.xml)
+
 git checkout dev
 git pull
 git checkout release
@@ -6,12 +24,24 @@ git pull
 git merge dev
 
 # Die Version von `"X.X.X-SNAPSHOT"` auf `"X.X.X"` ändern
-find . -name pom.xml | xargs perl -i -p -e"s/${VERSION}-SNAPSHOT/$VERSION/g"
+find . -name pom.xml | xargs perl -i -p -e"s/${NEWVERSION}-SNAPSHOT/$NEWVERSION/g"
 
-git commit -am "release version $VERSION"
-git push
-git tag $VERSION
-git push origin $VERSION
+echo
+echo "NEXT STEPS:"
+echo "***********"
+echo "Änderungen prüfen"
+echo "git commit -a -m 'release version "$NEWVERSION"'"
+echo "git push"
+echo "git tag "$NEWVERSION
+echo "git push --tags"
+echo "git checkout dev"
+echo "git merge release"
 
-git checkout dev
-git merge release
+# to do by script
+#git commit -am "release version $NEWVERSION"
+#git push
+#git tag $VERSION
+#git push origin $VERSION
+
+#git checkout dev
+#git merge release
diff --git a/release-startdev.sh b/release-startdev.sh
index be21f7450f4afb0fac3f714bce266a6615c6bb1e..0a0973080e5b088b1706a15f38ca2e9d1b6b2a1d 100644
--- a/release-startdev.sh
+++ b/release-startdev.sh
@@ -1,6 +1,52 @@
-NEXTVERSION=X.X+1.X
-# Die Version im dev branch von `"X.X.X"` auf `"X.X+1.X-SNAPSHOT"` ändern
-find . -name pom.xml | xargs perl -i -p -e"s/$VERSION/${NEXTVERSION}-SNAPSHOT/g"
+#!/bin/bash
 
-git commit -am "start development $NEXTVERSION"
-git push
+#set -x
+
+if [ "$#" -ne 1 ]; then
+    echo "Aufruf: release-startdev.sh NEWVERSION"
+    exit 1
+fi
+
+NEWVERSION=$1
+
+echo
+
+# pom.xml:main -> project.version setzen
+# projectname/pom.xml:parent -> project.parent.version setzen
+# projectname/pom.xml:parent,main -> project.parent.version und project.version setzen
+#
+PROJECTS="pom.xml:main
+          server/pom.xml:main
+        "
+
+for PROJECT in $PROJECTS;
+do
+  POMFILE=$(echo $PROJECT | cut -d':' -f1)
+  ACTIONS=$(echo $PROJECT | cut -d':' -f2)
+
+  ## Auf SNAPSHOT Versionen testen
+  if fgrep -q "SNAPSHOT" $POMFILE; then
+    RED='\033[0;31m'
+    NC='\033[0m'
+    echo "${RED}ERROR: Datei "$POMFILE" enthält noch SNAPSHOT Versionen, das sollte hier nicht passieren.${NC}"
+    exit 1
+  fi
+echo $ACTIONS
+  ## Versionen setzen
+  if [[ $ACTIONS == "main" ]] ; then
+    xmlstarlet ed --pf -L -N w="http://maven.apache.org/POM/4.0.0" -u '//w:project/w:version' -v $NEWVERSION $POMFILE
+  fi
+
+  if [[ $ACTIONS == "parent" ]]; then
+    xmlstarlet ed --pf -L -N w="http://maven.apache.org/POM/4.0.0" -u '//w:project/w:parent/w:version' -v $NEWVERSION $POMFILE
+  fi
+done
+
+
+
+echo
+echo "NEXT STEPS:"
+echo "***********"
+echo "Änderungen prüfen"
+echo "git commit -a -m 'start development "$NEWVERSION"'"
+echo "git push"