From 22b74dac1b2321561221251196d92ff5deac6097 Mon Sep 17 00:00:00 2001
From: Stefan Hauffe <stefan.hauffe@mgm-tp.com>
Date: Mon, 22 Apr 2024 12:49:54 +0000
Subject: [PATCH] OpenSource Release 2.0.0

---
 .editorconfig                                 |  39 +++
 .gitignore                                    |  21 ++
 Jenkinsfile                                   | 101 ++++++++
 LICENSE                                       | 101 ++++++++
 README.md                                     |  94 +------
 api-lib-core/pom.xml                          | 201 +++++++++++++++
 .../de/ozgcloud/apilib/alfa/AlfaService.java  |  37 +++
 .../apilib/alfa/CommandAlfaService.java       |  61 +++++
 .../apilib/alfa/dummy/DummyAlfaService.java   |  43 ++++
 .../common/callcontext/CallContext.java       |  47 ++++
 .../DefaultOzgCloudCallContextProvider.java   |  56 +++++
 ...gCloudCallContextAttachingInterceptor.java | 107 ++++++++
 .../OzgCloudCallContextProvider.java          |  29 +++
 .../common/command/OzgCloudCommand.java       |  69 ++++++
 .../common/command/OzgCloudCommandId.java     |  40 +++
 .../command/OzgCloudCommandService.java       |  29 +++
 .../common/command/OzgCloudCommandStatus.java |  53 ++++
 .../common/command/grpc/CommandMapper.java    | 100 ++++++++
 .../grpc/GrpcOzgCloudCommandService.java      |  94 +++++++
 .../command/grpc/OzgCloudCommandMapper.java   |  74 ++++++
 .../apilib/common/datatypes/GenericId.java    |  37 +++
 .../errorhandling/NotFoundException.java      |  35 +++
 .../de/ozgcloud/apilib/file/OzgCloudFile.java |  40 +++
 .../apilib/file/OzgCloudFileGroup.java        |  42 ++++
 .../ozgcloud/apilib/file/OzgCloudFileId.java  |  37 +++
 .../apilib/file/OzgCloudFileService.java      |  33 +++
 .../file/dummy/DummyOzgCloudFileService.java  |  64 +++++
 .../file/grpc/GrpcOzgCloudFileService.java    | 128 ++++++++++
 .../OzgCloudFileDownloadStreamObserver.java   |  64 +++++
 .../apilib/file/grpc/OzgCloudFileMapper.java  |  38 +++
 .../user/GrpcOzgCloudUserProfileService.java  |  58 +++++
 .../ozgcloud/apilib/user/OzgCloudUserId.java  |  37 +++
 .../apilib/user/OzgCloudUserProfile.java      |  38 +++
 .../user/OzgCloudUserProfileService.java      |  29 +++
 .../apilib/user/UserProfileMapper.java        |  42 ++++
 .../apilib/vorgang/OzgCloudAntragsteller.java |  60 +++++
 .../apilib/vorgang/OzgCloudEingang.java       |  54 +++++
 .../apilib/vorgang/OzgCloudEingangHeader.java |  43 ++++
 .../apilib/vorgang/OzgCloudFormDataEntry.java |  38 +++
 .../apilib/vorgang/OzgCloudFormField.java     |  42 ++++
 .../vorgang/OzgCloudPostfachAddress.java      |  38 +++
 .../OzgCloudPostfachAddressIdentifier.java    |  35 +++
 .../apilib/vorgang/OzgCloudServiceKonto.java  |  36 +++
 .../vorgang/OzgCloudServiceKontoType.java     |  37 +++
 .../apilib/vorgang/OzgCloudSubForm.java       |  45 ++++
 .../apilib/vorgang/OzgCloudVorgang.java       |  48 ++++
 .../apilib/vorgang/OzgCloudVorgangHeader.java |  47 ++++
 .../apilib/vorgang/OzgCloudVorgangId.java     |  40 +++
 .../vorgang/OzgCloudVorgangIdMapper.java      |  32 +++
 .../apilib/vorgang/OzgCloudVorgangQuery.java  |  33 +++
 .../vorgang/OzgCloudVorgangSearchResult.java  |  38 +++
 .../vorgang/OzgCloudVorgangService.java       |  35 +++
 .../apilib/vorgang/OzgCloudVorgangStatus.java |  37 +++
 .../apilib/vorgang/OzgCloudVorgangStub.java   |  42 ++++
 .../vorgang/OzgCloudZustaendigeStelle.java    |  36 +++
 .../java/de/ozgcloud/apilib/vorgang/Page.java |  41 ++++
 .../vorgang/dummy/DummyVorgangService.java    | 127 ++++++++++
 .../grpc/GrpcOzgCloudVorgangService.java      |  93 +++++++
 .../vorgang/grpc/OzgCloudEingangMapper.java   |  71 ++++++
 .../vorgang/grpc/OzgCloudVorgangMapper.java   |  61 +++++
 .../grpc/OzgCloudVorgangStubMapper.java       |  41 ++++
 .../command/grpc/CommandMapperTest.java       |  49 ++++
 .../grpc/GrpcCommandResponseTestFactory.java  |  38 +++
 .../command/grpc/GrpcCommandTestFactory.java  |  37 +++
 .../GrpcCreateCommandRequestTestFactory.java  |  48 ++++
 .../grpc/GrpcOzgCloudCommandServiceTest.java  | 156 ++++++++++++
 .../grpc/OzgCloudCommandMapperTest.java       |  46 ++++
 .../grpc/OzgCloudCommandTestFactory.java      |  74 ++++++
 .../apilib/file/OzgCloudFileTestFactory.java  |  46 ++++
 .../GrpcFindFilesResponseTestFactory.java     |  38 +++
 .../grpc/GrpcOzgCloudFileServiceTest.java     | 119 +++++++++
 .../file/grpc/GrpcOzgFileTestFactory.java     |  42 ++++
 ...GrpcGetUserProfileResponseTestFactory.java |  39 +++
 .../GrpcOzgCloudUserProfileServiceTest.java   | 106 ++++++++
 .../user/GrpcUserProfileTestFactory.java      |  42 ++++
 .../user/OzgCloudUserProfileTestFactory.java  |  46 ++++
 .../apilib/vorgang/AttachmentTestFactory.java |  39 +++
 .../OzgCloudAntragstellerTestFactory.java     |  61 +++++
 .../OzgCloudEingangHeaderTestFactory.java     |  50 ++++
 .../OzgCloudVorgangEingangTestFactory.java    |  59 +++++
 .../OzgCloudVorgangHeaderTestFactory.java     |  50 ++++
 .../OzgCloudVorgangStubTestFactory.java       |  35 +++
 .../vorgang/OzgCloudVorgangTestFactory.java   |  50 ++++
 .../OzgCloudZustaendigeStelleTestFactory.java |  42 ++++
 .../grpc/GrpcAntragstellerTestFactory.java    |  51 ++++
 .../grpc/GrpcEingangHeaderTestFactory.java    |  44 ++++
 .../vorgang/grpc/GrpcEingangTestFactory.java  |  57 +++++
 ...VorgangWithEingangResponseTestFactory.java |  38 +++
 .../grpc/GrpcOzgCloudVorgangServiceTest.java  | 176 ++++++++++++++
 .../grpc/GrpcServiceKontoTestFactory.java     |  49 ++++
 .../grpc/GrpcVorgangHeadTestFactory.java      |  38 +++
 .../grpc/GrpcVorgangHeaderTestFactory.java    |  48 ++++
 .../GrpcVorgangWithEingangTestFactory.java    |  50 ++++
 .../GrpcZustaendigeStelleTestFactory.java     |  42 ++++
 .../grpc/OzgCloudVorgangMapperTest.java       |  78 ++++++
 .../org.junit.jupiter.api.extension.Extension |   1 +
 .../test/resources/junit-platform.properties  |   1 +
 api-lib-demo/pom.xml                          |  44 ++++
 .../ozgcloud/apilib/demo/DemoApplication.java |  35 +++
 .../de/ozgcloud/apilib/demo/DemoRunner.java   |  57 +++++
 .../src/main/resources/application.yml        |  11 +
 lombok.config                                 |  32 +++
 ozg-cloud-spring-boot-starter/pom.xml         |  87 +++++++
 .../GrpcChannelConfigurator.java              |  51 ++++
 .../OzgCloudClientAutoConfiguration.java      | 229 ++++++++++++++++++
 .../OzgCloudClientAutoConfiguration.java.orig | 201 +++++++++++++++
 .../OzgCloudCommandManagerProperties.java     |  47 ++++
 .../OzgCloudFileManagerProperties.java        |  47 ++++
 .../OzgCloudUserManagerProperties.java        |  53 ++++
 .../OzgCloudVorgangManagerProperties.java     |  47 ++++
 ...ot.autoconfigure.AutoConfiguration.imports |   2 +
 .../autoconfig/ApiLibTestApplication.java     |  38 +++
 .../autoconfigure/OzgCloudStarterITCase.java  |  45 ++++
 pom.xml                                       | 101 ++++++++
 114 files changed, 6387 insertions(+), 93 deletions(-)
 create mode 100644 .editorconfig
 create mode 100644 .gitignore
 create mode 100644 Jenkinsfile
 create mode 100644 LICENSE
 create mode 100644 api-lib-core/pom.xml
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/AlfaService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/CommandAlfaService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/dummy/DummyAlfaService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/CallContext.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/DefaultOzgCloudCallContextProvider.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/OzgCloudCallContextAttachingInterceptor.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/OzgCloudCallContextProvider.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommand.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandId.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/CommandMapper.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandMapper.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/datatypes/GenericId.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/common/errorhandling/NotFoundException.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFile.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileGroup.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileId.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/file/dummy/DummyOzgCloudFileService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileDownloadStreamObserver.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileMapper.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/user/GrpcOzgCloudUserProfileService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserId.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserProfile.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserProfileService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/user/UserProfileMapper.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudAntragsteller.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudEingang.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudEingangHeader.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudFormDataEntry.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudFormField.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudPostfachAddress.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudPostfachAddressIdentifier.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudServiceKonto.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudServiceKontoType.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudSubForm.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgang.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeader.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangId.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangIdMapper.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangQuery.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangSearchResult.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStatus.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStub.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudZustaendigeStelle.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/Page.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudEingangMapper.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapper.java
 create mode 100644 api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangStubMapper.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/CommandMapperTest.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandResponseTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCreateCommandRequestTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandMapperTest.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/file/OzgCloudFileTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcFindFilesResponseTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileServiceTest.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgFileTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcGetUserProfileResponseTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcOzgCloudUserProfileServiceTest.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcUserProfileTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/user/OzgCloudUserProfileTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/AttachmentTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudAntragstellerTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudEingangHeaderTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangEingangTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeaderTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStubTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudZustaendigeStelleTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcAntragstellerTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcEingangHeaderTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcEingangTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindVorgangWithEingangResponseTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcServiceKontoTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangHeadTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangHeaderTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangWithEingangTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcZustaendigeStelleTestFactory.java
 create mode 100644 api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapperTest.java
 create mode 100644 api-lib-core/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension
 create mode 100644 api-lib-core/src/test/resources/junit-platform.properties
 create mode 100644 api-lib-demo/pom.xml
 create mode 100644 api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoApplication.java
 create mode 100644 api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoRunner.java
 create mode 100644 api-lib-demo/src/main/resources/application.yml
 create mode 100644 lombok.config
 create mode 100644 ozg-cloud-spring-boot-starter/pom.xml
 create mode 100644 ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/GrpcChannelConfigurator.java
 create mode 100644 ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java
 create mode 100644 ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java.orig
 create mode 100644 ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudCommandManagerProperties.java
 create mode 100644 ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudFileManagerProperties.java
 create mode 100644 ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudUserManagerProperties.java
 create mode 100644 ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudVorgangManagerProperties.java
 create mode 100644 ozg-cloud-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
 create mode 100644 ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/apilib/autoconfig/ApiLibTestApplication.java
 create mode 100644 ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudStarterITCase.java
 create mode 100644 pom.xml

diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..4c795ab
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,39 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+# EditorConfig is awesome: https://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+[*]
+indent_style = tab
+indent_size = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = false
+
+[*.yml]
+indent_size = 2
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..dfef11f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,21 @@
+# SERVER
+target/
+.classpath
+.project
+.settings
+
+# IDE
+.project
+.classpath
+.settings/
+.idea
+*.iws
+*.iml
+*.ipr
+
+# Client
+goofy-client/.vscode/
+goofy-client/apps/coverage/
+
+.attach**
+.factorypath
diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000..62026ae
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,101 @@
+def FAILED_STAGE
+
+pipeline {
+    agent {
+       node {
+           label 'jenkins-build-agent'
+        }
+    }
+
+    environment {
+        BLUE_OCEAN_URL = "https://jenkins.ozg-sh.de/job/api-lib/job/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/"
+        RELEASE_REGEX = /\d+.\d+.\d+/
+        SNAPSHOT_REGEX = /\d+.\d+.\d+-SNAPSHOT/
+    }
+
+    options {
+        timeout(time: 1, unit: 'HOURS')
+        disableConcurrentBuilds()
+        buildDiscarder(logRotator(numToKeepStr: '5'))
+    }
+
+    stages {
+    	stage('Check Version') {
+    	    steps {
+    	        script {
+    	            FAILED_STAGE = env.STAGE_NAME
+    	            def rootPom = readMavenPom file: 'pom.xml'
+                    def rootVersion = rootPom.version
+                    
+                    if(env.BRANCH_NAME == 'release'){
+                        if ( !(rootVersion ==~ RELEASE_REGEX)) {
+                            error("Keine Release Version für Branch ${env.BRANCH_NAME}.")       
+                        }
+                    } else {
+                        if ( !(rootVersion ==~ SNAPSHOT_REGEX)) {
+                               error("Keine Snapshot Version für Branch ${env.BRANCH_NAME}.")                    
+                        }
+    	            }
+    	        }
+ 	       }
+ 	   } //stage check version
+ 	   stage('Build') {
+ 	       steps {
+ 	           script {
+                    FAILED_STAGE=env.STAGE_NAME
+                }
+                configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
+                     sh 'mvn -s $MAVEN_SETTINGS clean install'
+                }
+ 	       }
+ 	   } //stage build
+ 	   stage('Deploy to nexus') {
+ 	       when {
+ 	           anyOf {
+ 	               branch 'master'
+ 	               branch 'release'
+ 	           }
+ 	       }
+ 	       steps {
+ 	           script {
+ 	               FAILED_STAGE = env.STAGE_NAME
+ 	           }
+				configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
+                    sh 'mvn -s $MAVEN_SETTINGS -Pdeploy -DskipTests deploy'
+                }
+ 	       }
+ 	   } //stage deploy
+   } //stages
+   post {
+      failure {
+          script {
+              if (env.BRANCH_NAME == 'master' || env.BRANCH_NAME == 'release') {
+                  sendFailureMessage()
+              }
+          }
+      }
+   }
+} //pipeline
+
+Void sendFailureMessage() {
+    def room = ''
+    def data = """{"msgtype":"m.text", \
+                    "body":"api-lib: Build Failed. Stage: ${FAILED_STAGE} Build-ID: ${env.BUILD_NUMBER} Link: ${BLUE_OCEAN_URL}", \
+                    "format": "org.matrix.custom.html", \
+                    "formatted_body":"api-lib: Build Failed. Stage: ${FAILED_STAGE} Build-ID: <a href='${BLUE_OCEAN_URL}'>${env.BUILD_NUMBER}</a>"}"""
+       
+    if (env.BRANCH_NAME == 'master') {
+        room = "!iQPAvQIiRwRpNOszjw:matrix.ozg-sh.de"
+    }
+    else if (env.BRANCH_NAME == 'release') {
+        room = "!oWZpUGTFsxkJIYNfYg:matrix.ozg-sh.de"
+    }
+
+    sh "curl -XPOST -H 'authorization: Bearer ${getElementAccessToken()}' -d '${data}' https://matrix.ozg-sh.de/_matrix/client/v3/rooms/$room/send/m.room.message"
+}
+
+String getElementAccessToken() {
+    withCredentials([string(credentialsId: 'element-login-json', variable: 'LOGIN_JSON')]) {
+        return readJSON ( text: sh (script: '''curl -XPOST -d \"$LOGIN_JSON\" https://matrix.ozg-sh.de/_matrix/client/v3/login''', returnStdout: true)).access_token
+    }
+}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..c977909
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,101 @@
+OPEN-SOURCE-LIZENZ FÜR DIE EUROPÄISCHE UNION v. 1.2 
+EUPL © Europäische Union 2007, 2016 
+Diese Open-Source-Lizenz für die Europäische Union („EUPL“) gilt für Werke (im Sinne der nachfolgenden Begriffsbestimmung), die unter EUPL-Bedingungen zur Verfügung gestellt werden. Das Werk darf nur in der durch diese Lizenz gestatteten Form genutzt werden (insoweit eine solche Nutzung dem Urheber vorbehalten ist). 
+Das Werk wird unter den Bedingungen dieser Lizenz zur Verfügung gestellt, wenn der Lizenzgeber (im Sinne der nachfolgenden Begriffsbestimmung) den folgenden Hinweis unmittelbar hinter dem Urheberrechtshinweis dieses Werks anbringt: 
+                      Lizenziert unter der EUPL 
+oder in einer anderen Form zum Ausdruck bringt, dass er es unter der EUPL lizenzieren möchte. 
+
+1.Begriffsbestimmungen 
+Für diese Lizenz gelten folgende Begriffsbestimmungen:  
+— „Lizenz“:diese Lizenz.  
+— „Originalwerk“:das Werk oder die Software, die vom Lizenzgeber unter dieser Lizenz verbreitet oder zugänglich gemacht wird, und zwar als Quellcode und gegebenenfalls auch als ausführbarer Code.  
+— „Bearbeitungen“:die Werke oder Software, die der Lizenznehmer auf der Grundlage des Originalwerks oder seiner Bearbeitungen schaffen kann. In dieser Lizenz wird nicht festgelegt, wie umfangreich die Änderung oder wie stark die Abhängigkeit vom Originalwerk für eine Einstufung als Bearbeitung sein muss; dies bestimmt sich nach dem Urheberrecht, das in dem unter Artikel 15 aufgeführten Land anwendbar ist.  
+— „Werk“:das Originalwerk oder seine Bearbeitungen.  
+— „Quellcode“:diejenige Form des Werkes, die zur Auffassung durch den Menschen bestimmt ist und die am besten geeignet ist, um vom Menschen verstanden und verändert zu werden.  
+— „Ausführbarer Code“:die — üblicherweise — kompilierte Form des Werks, die von einem Computer als Programm ausgeführt werden soll.  
+— „Lizenzgeber“:die natürliche oder juristische Person, die das Werk unter der Lizenz verbreitet oder zugänglich macht.  
+— „Bearbeiter“:jede natürliche oder juristische Person, die das Werk unter der Lizenz verändert oder auf andere Weise zur Schaffung einer Bearbeitung beiträgt.  
+— „Lizenznehmer“ („Sie“):jede natürliche oder juristische Person, die das Werk unter den Lizenzbedingungen nutzt.  
+— „Verbreitung“ oder „Zugänglichmachung“:alle Formen von Verkauf, Überlassung, Verleih, Vermietung, Verbreitung, Weitergabe, Übermittlung oder anderweitiger Online- oder Offline-Bereitstellung von Vervielfältigungen des Werks oder Zugänglichmachung seiner wesentlichen Funktionen für dritte natürliche oder juristische Personen.
+
+2.Umfang der Lizenzrechte 
+Der Lizenzgeber erteilt Ihnen hiermit für die Gültigkeitsdauer der am Originalwerk bestehenden Urheberrechte eine weltweite, unentgeltliche, nicht ausschließliche, unterlizenzierbare Lizenz, die Sie berechtigt: 
+—  das Werk uneingeschränkt zu nutzen, 
+—  das Werk zu vervielfältigen, 
+—  das Werk zu verändern und Bearbeitungen auf der Grundlage des Werks zu schaffen, 
+—  das Werk öffentlich zugänglich zu machen, was das Recht einschließt, das Werk oder Vervielfältigungsstücke davon öffentlich bereitzustellen oder wahrnehmbar zu machen oder das Werk, soweit möglich, öffentlich aufzuführen, 
+—  das Werk oder Vervielfältigungen davon zu verbreiten, 
+—  das Werk oder Vervielfältigungen davon zu vermieten oder zu verleihen, 
+—  das Werk oder Vervielfältigungen davon weiter zu lizenzieren. 
+Für die Wahrnehmung dieser Rechte können beliebige, derzeit bekannte oder künftige Medien, Träger und Formate verwendet werden, soweit das geltende Recht dem nicht entgegensteht. Für die Länder, in denen Urheberpersönlichkeitsrechte an dem Werk bestehen, verzichtet der Lizenzgeber im gesetzlich zulässigen Umfang auf seine Urheberpersönlichkeitsrechte, um die Lizenzierung der oben aufgeführten Verwertungsrechte wirksam durchführen zu können. Der Lizenzgeber erteilt dem Lizenznehmer ein nicht ausschließliches, unentgeltliches Nutzungsrecht an seinen Patenten, sofern dies zur Ausübung der durch die Lizenz erteilten Nutzungsrechte am Werk notwendig ist. 
+
+3.Zugänglichmachung des Quellcodes 
+Der Lizenzgeber kann das Werk entweder als Quellcode oder als ausführbaren Code zur Verfügung stellen. Stellt er es als ausführbaren Code zur Verfügung, so stellt er darüber hinaus eine maschinenlesbare Kopie des Quellcodes für jedes von ihm verbreitete Vervielfältigungsstück des Werks zur Verfügung, oder er verweist in einem Vermerk im Anschluss an den dem Werk beigefügten Urheberrechtshinweis auf einen Speicherort, an dem problemlos und unentgeltlich auf den Quellcode zugegriffen werden kann, solange der Lizenzgeber das Werk verbreitet oder zugänglich macht. 
+
+4.Einschränkungen des Urheberrechts
+Es ist nicht Zweck dieser Lizenz, Ausnahmen oder Schranken der ausschließlichen Rechte des Urhebers am Werk, die dem Lizenznehmer zugutekommen, einzuschränken. Auch die Erschöpfung dieser Rechte bleibt von dieser Lizenz unberührt. 
+
+5.Pflichten des Lizenznehmers 
+Die Einräumung der oben genannten Rechte ist an mehrere Beschränkungen und Pflichten für den Lizenznehmer gebunden: 
+
+Urheberrechtshinweis, Lizenztext, Nennung des Bearbeiters: Der Lizenznehmer muss alle Urheberrechts-, Patent- oder Markenrechtshinweise und alle Hinweise auf die Lizenz und den Haftungsausschluss unverändert lassen. Jedem von ihm verbreiteten oder zugänglich gemachten Vervielfältigungsstück des Werks muss der Lizenznehmer diese Hinweise sowie diese Lizenz beifügen. Der Lizenznehmer muss auf jedem abgeleiteten Werk deutlich darauf hinweisen, dass das Werk geändert wurde, und das Datum der Bearbeitung angeben.
+
+„Copyleft“-Klausel: Der Lizenznehmer darf Vervielfältigungen des Originalwerks oder Bearbeitungen nur unter den Bedingungen dieser EUPL oder einer neueren Version dieser Lizenz verbreiten oder zugänglich machen, außer wenn das Originalwerk ausdrücklich nur unter dieser Lizenzversion — z. B. mit der Angabe „Nur EUPL V. 1.2“ — verbreitet werden darf. Der Lizenznehmer (der zum Lizenzgeber wird) darf für das Werk oder die Bearbeitung keine zusätzlichen Bedingungen anbieten oder vorschreiben, die die Bedingungen dieser Lizenz verändern oder einschränken. 
+
+Kompatibilitäts-Klausel: Wenn der Lizenznehmer Bearbeitungen, die auf dem Werk und einem anderen Werk, das unter einer kompatiblen Lizenz lizenziert wurde, basieren, oder die Kopien dieser Bearbeitungen verbreitet oder zugänglich macht, kann dies unter den Bedingungen dieser kompatiblen Lizenz erfolgen. Unter „kompatibler Lizenz“ ist eine im Anhang dieser Lizenz angeführte Lizenz zu verstehen. Sollten die Verpflichtungen des Lizenznehmers aus der kompatiblen Lizenz mit denjenigen aus der vorliegenden Lizenz (EUPL) in Konflikt stehen, werden die Verpflichtungen aus der kompatiblen Lizenz Vorrang haben.
+
+Bereitstellung des Quellcodes: Wenn der Lizenznehmer Vervielfältigungsstücke des Werks verbreitet oder zugänglich macht, muss er eine maschinenlesbare Fassung des Quellcodes mitliefern oder einen Speicherort angeben, über den problemlos und unentgeltlich so lange auf diesen Quellcode zugegriffen werden kann, wie der Lizenznehmer das Werk verbreitet oder zugänglich macht. 
+
+Rechtsschutz: Diese Lizenz erlaubt nicht die Benutzung von Kennzeichen, Marken oder geschützten Namensrechten des Lizenzgebers, soweit dies nicht für die angemessene und übliche Beschreibung der Herkunft des Werks und der inhaltlichen Wiedergabe des Urheberrechtshinweises erforderlich ist.
+
+6.Urheber und Bearbeiter 
+Der ursprüngliche Lizenzgeber gewährleistet, dass er das Urheberrecht am Originalwerk innehat oder dieses an ihn lizenziert wurde und dass er befugt ist, diese Lizenz zu erteilen. 
+Jeder Bearbeiter gewährleistet, dass er das Urheberrecht an den von ihm vorgenommenen Änderungen des Werks besitzt und befugt ist, diese Lizenz zu erteilen. 
+Jedes Mal, wenn Sie die Lizenz annehmen, erteilen Ihnen der ursprüngliche Lizenzgeber und alle folgenden Bearbeiter eine Befugnis zur Nutzung ihrer Beiträge zum Werk unter den Bedingungen dieser Lizenz. 
+
+7.Gewährleistungsausschluss 
+Die Arbeit an diesem Werk wird laufend fortgeführt; es wird durch unzählige Bearbeiter ständig verbessert. Das Werk ist nicht vollendet und kann daher Fehler („bugs“) enthalten, die dieser Art der Entwicklung inhärent sind. 
+Aus den genannten Gründen wird das Werk unter dieser Lizenz „so, wie es ist“ ohne jegliche Gewährleistung zur Verfügung gestellt. Dies gilt unter anderem — aber nicht ausschließlich — für Marktreife, Verwendbarkeit für einen bestimmten Zweck, Mängelfreiheit, Richtigkeit sowie Nichtverletzung von anderen Immaterialgüterrechten als dem Urheberrecht (vgl. dazu Artikel 6 dieser Lizenz). 
+Dieser Gewährleistungsausschluss ist wesentlicher Bestandteil der Lizenz und Bedingung für die Einräumung von Rechten an dem Werk.
+
+8.Haftungsausschluss/Haftungsbeschränkung 
+Außer in Fällen von Vorsatz oder der Verursachung von Personenschäden haftet der Lizenzgeber nicht für direkte oder indirekte, materielle oder immaterielle Schäden irgendwelcher Art, die aus der Lizenz oder der Benutzung des Werks folgen; dies gilt unter anderem, aber nicht ausschließlich, für Firmenwertverluste, Produktionsausfall, Computerausfall oder Computerfehler, Datenverlust oder wirtschaftliche Schäden, und zwar auch dann, wenn der Lizenzgeber auf die Möglichkeit solcher Schäden hingewiesen wurde. Unabhängig davon haftet der Lizenzgeber im Rahmen der gesetzlichen Produkthaftung, soweit die entsprechenden Regelungen auf das Werk anwendbar sind. 
+
+9.Zusatzvereinbarungen 
+Wenn Sie das Werk verbreiten, können Sie Zusatzvereinbarungen schließen, in denen Verpflichtungen oder Dienstleistungen festgelegt werden, die mit dieser Lizenz vereinbar sind. Sie dürfen Verpflichtungen indessen nur in Ihrem eigenen Namen und auf Ihre eigene Verantwortung eingehen, nicht jedoch im Namen des ursprünglichen Lizenzgebers oder eines anderen Bearbeiters, und nur, wenn Sie sich gegenüber allen Bearbeitern verpflichten, sie zu entschädigen, zu verteidigen und von der Haftung freizustellen, falls aufgrund der von Ihnen eingegangenen Gewährleistungsverpflichtung oder Haftungsübernahme Forderungen gegen sie geltend gemacht werden oder eine Haftungsverpflichtung entsteht. 
+
+10.Annahme der Lizenz 
+Sie können den Bestimmungen dieser Lizenz zustimmen, indem Sie das Symbol „Lizenz annehmen“ unter dem Fenster mit dem Lizenztext anklicken oder indem Sie Ihre Zustimmung auf vergleichbare Weise in einer nach anwendbarem Recht zulässigen Form geben. Das Anklicken des Symbols gilt als Anzeichen Ihrer eindeutigen und unwiderruflichen Annahme der Lizenz und der darin enthaltenen Klauseln und Bedingungen. In gleicher Weise gilt als Zeichen der eindeutigen und unwiderruflichen Zustimmung die Ausübung eines Rechtes, das in Artikel 2 dieser Lizenz angeführt ist, wie das Erstellen einer Bearbeitung oder die Verbreitung oder Zugänglichmachung des Werks oder dessen Vervielfältigungen. 
+
+11.Informationspflichten
+Wenn Sie das Werk verbreiten oder zugänglich machen (beispielsweise, indem Sie es zum Herunterladen von einer Website anbieten), müssen Sie über den Vertriebskanal oder das benutzte Verbreitungsmedium der Öffentlichkeit zumindest jene Informationen bereitstellen, die nach dem anwendbaren Recht bezüglich der Lizenzgeber, der Lizenz und ihrer Zugänglichkeit, des Abschlusses des Lizenzvertrags sowie darüber, wie die Lizenz durch den Lizenznehmer gespeichert und vervielfältigt werden kann, erforderlich sind.
+
+12.Beendigung der Lizenz 
+Die Lizenz und die damit eingeräumten Rechte erlöschen automatisch, wenn der Lizenznehmer gegen die Lizenzbedingungen verstößt. Ein solches Erlöschen der Lizenz führt nicht zum Erlöschen der Lizenzen von Personen, denen das Werk vom Lizenznehmer unter dieser Lizenz zur Verfügung gestellt worden ist, solange diese Personen die Lizenzbedingungen erfüllen. 
+13.Sonstiges
+Unbeschadet des Artikels 9 stellt die Lizenz die vollständige Vereinbarung der Parteien über das Werk dar. Sind einzelne Bestimmungen der Lizenz nach geltendem Recht nichtig oder unwirksam, so berührt dies nicht die Wirksamkeit oder Durchsetzbarkeit der Lizenz an sich. Solche Bestimmungen werden vielmehr so ausgelegt oder modifiziert, dass sie wirksam und durchsetzbar sind. Die Europäische Kommission kann weitere Sprachfassungen oder neue Versionen dieser Lizenz oder aktualisierte Fassungen des Anhangs veröffentlichen, soweit dies notwendig und angemessen ist, ohne den Umfang der Lizenzrechte zu verringern. Neue Versionen werden mit einer eindeutigen Versionsnummer veröffentlicht. Alle von der Europäischen Kommission anerkannten Sprachfassungen dieser Lizenz sind gleichwertig. Die Parteien können sich auf die Sprachfassung ihrer Wahl berufen.
+
+14.Gerichtsstand
+Unbeschadet besonderer Vereinbarungen zwischen den Parteien gilt Folgendes: 
+—  Für alle Streitigkeiten über die Auslegung dieser Lizenz zwischen den Organen, Einrichtungen und sonstigen Stellen der Europäischen Union als Lizenzgeber und einem Lizenznehmer ist der Gerichtshof der Europäischen Union gemäß Artikel 272 des Vertrags über die Arbeitsweise der Europäischen Union zuständig; 
+—  Gerichtsstand für Streitigkeiten zwischen anderen Parteien über die Auslegung dieser Lizenz ist allein der Ort, an dem der Lizenzgeber seinen Wohnsitz oder den wirtschaftlichen Mittelpunkt seiner Tätigkeit hat. 
+
+15.Anwendbares Recht
+Unbeschadet besonderer Vereinbarungen zwischen den Parteien gilt Folgendes: 
+—  Diese Lizenz unterliegt dem Recht des Mitgliedstaats der Europäischen Union, in dem der Lizenzgeber seinen Sitz, Wohnsitz oder eingetragenen Sitz hat; 
+—  diese Lizenz unterliegt dem belgischen Recht, wenn der Lizenzgeber keinen Sitz, Wohnsitz oder eingetragenen Sitz in einem Mitgliedstaat der Europäischen Union hat.
+   
+Anlage 
+„Kompatible Lizenzen“ nach Artikel 5 der EUPL sind: 
+—  GNU General Public License (GPL) v. 2, v. 3 
+—  GNU Affero General Public License (AGPL) v. 3 
+—  Open Software License (OSL) v. 2.1, v. 3.0 
+—  Eclipse Public License (EPL) v. 1.0 
+—  CeCILL v. 2.0, v. 2.1 
+—  Mozilla Public Licence (MPL) v. 2 
+—  GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 
+—  Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) für andere Werke als Software 
+—  European Union Public Licence (EUPL) v. 1.1, v. 1.2 
+—  Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) oder Strong Reciprocity (LiLiQ-R+)
+Die Europäische Kommission kann diesen Anhang aktualisieren, um neuere Fassungen der obigen Lizenzen aufzunehmen, ohne hierfür eine neue Fassung der EUPL auszuarbeiten, solange diese Lizenzen die in Artikel 2 gewährten Rechte gewährleisten und den erfassten Quellcode vor ausschließlicher Aneignung schützen.
+Alle sonstigen Änderungen oder Ergänzungen dieses Anhangs bedürfen der Ausarbeitung einer neuen Version der EUPL.    
diff --git a/README.md b/README.md
index cdf03ef..6621cfa 100644
--- a/README.md
+++ b/README.md
@@ -1,93 +1 @@
-# api-lib
-
-
-
-## Getting started
-
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
-
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
-
-## Add your files
-
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
-
-```
-cd existing_repo
-git remote add origin https://code.schleswig-holstein.de/kop/api-lib.git
-git branch -M main
-git push -uf origin main
-```
-
-## Integrate with your tools
-
-- [ ] [Set up project integrations](https://code.schleswig-holstein.de/kop/api-lib/-/settings/integrations)
-
-## Collaborate with your team
-
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
-
-## Test and Deploy
-
-Use the built-in continuous integration in GitLab.
-
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
-
-***
-
-# Editing this README
-
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
-
-## Suggestions for a good README
-
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
-
-## Name
-Choose a self-explaining name for your project.
-
-## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
-
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
-
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
-
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
-
-## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
-
-## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
-
-## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
-
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
-
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
-
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
-
-## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
-
-## License
-For open source projects, say how it is licensed.
-
-## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
+# OZG-Cloud API Library
diff --git a/api-lib-core/pom.xml b/api-lib-core/pom.xml
new file mode 100644
index 0000000..f221906
--- /dev/null
+++ b/api-lib-core/pom.xml
@@ -0,0 +1,201 @@
+<!--
+
+    Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+    Ministerpräsidenten des Landes Schleswig-Holstein
+    Staatskanzlei
+    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+
+    Lizenziert unter der EUPL, Version 1.2 oder - sobald
+    diese von der Europäischen Kommission genehmigt wurden -
+    Folgeversionen der EUPL ("Lizenz");
+    Sie dürfen dieses Werk ausschließlich gemäß
+    dieser Lizenz nutzen.
+    Eine Kopie der Lizenz finden Sie hier:
+
+    https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+
+    Sofern nicht durch anwendbare Rechtsvorschriften
+    gefordert oder in schriftlicher Form vereinbart, wird
+    die unter der Lizenz verbreitete Software "so wie sie
+    ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+    ausdrücklich oder stillschweigend - verbreitet.
+    Die sprachspezifischen Genehmigungen und Beschränkungen
+    unter der Lizenz sind dem Lizenztext zu entnehmen.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>de.ozgcloud.api-lib</groupId>
+		<artifactId>api-lib-parent</artifactId>
+		<version>0.5.0</version>
+	</parent>
+
+	<artifactId>api-lib-core</artifactId>
+
+	<properties>
+		<lombok.version>1.18.30</lombok.version>
+		<mapstruct.version>1.5.5.Final</mapstruct.version>
+		<!-- plugins -->
+		<maven-surefire-plugin.version>3.2.5</maven-surefire-plugin.version>
+		<maven-failsafe-plugin.version>3.2.5</maven-failsafe-plugin.version>
+		<jacoco.plugin.version>0.8.11</jacoco.plugin.version>
+	</properties>
+
+	<dependencies>
+		<!--ozg cloud project -->
+		<dependency>
+			<groupId>de.ozgcloud.common</groupId>
+			<artifactId>ozgcloud-common-lib</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>de.ozgcloud.vorgang</groupId>
+			<artifactId>vorgang-manager-interface</artifactId>
+			<version>${vorgang-manager.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>de.ozgcloud.vorgang</groupId>
+			<artifactId>vorgang-manager-utils</artifactId>
+			<version>${vorgang-manager.version}</version>
+		</dependency>
+		
+		<dependency>
+			<groupId>de.ozgcloud.user</groupId>
+			<artifactId>user-manager-interface</artifactId>
+			<version>${user-manager.version}</version>
+		</dependency>
+
+		<!--spring -->
+		<dependency>
+			<groupId>net.devh</groupId>
+			<artifactId>grpc-client-spring-boot-autoconfigure</artifactId>
+			<version>2.14.0.RELEASE</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.mapstruct</groupId>
+			<artifactId>mapstruct</artifactId>
+		</dependency>
+
+		<!-- test -->
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.assertj</groupId>
+			<artifactId>assertj-core</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-core</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-junit-jupiter</artifactId>
+			<scope>test</scope>
+		</dependency>
+
+		<!--dev-tools -->
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<scope>compile</scope>
+			<optional>true</optional>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.10.1</version>
+				<configuration>
+					<fork>true</fork>
+					<annotationProcessorPaths>
+						<path>
+							<groupId>org.projectlombok</groupId>
+							<artifactId>lombok</artifactId>
+							<version>${lombok.version}</version>
+						</path>
+						<path>
+							<groupId>org.mapstruct</groupId>
+							<artifactId>mapstruct-processor</artifactId>
+							<version>${mapstruct.version}</version>
+						</path>
+						<!-- other annotation processors -->
+					</annotationProcessorPaths>
+
+					<showWarnings>true</showWarnings>
+					<compilerArgs>
+						<compilerArg>
+							-Amapstruct.defaultComponentModel=default
+						</compilerArg>
+						<compilerArg>
+							-Amapstruct.unmappedTargetPolicy=WARN
+						</compilerArg>
+					</compilerArgs>
+				</configuration>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>${maven-jar-plugin.version}</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>test-jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>${maven-surefire-plugin.version}</version>
+				<configuration>
+					<argLine>
+						${surefire.jacoco.args}
+					</argLine>
+				</configuration>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-failsafe-plugin</artifactId>
+				<version>${maven-failsafe-plugin.version}</version>
+				<configuration>
+					<argLine>
+						${surefire.jacoco.args}
+					</argLine>
+					<classesDirectory>${project.build.outputDirectory}</classesDirectory>
+				</configuration>
+				<executions>
+					<execution>
+						<goals>
+							<goal>integration-test</goal>
+							<goal>verify</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/AlfaService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/AlfaService.java
new file mode 100644
index 0000000..b82461b
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/AlfaService.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.alfa;
+
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+
+public interface AlfaService {
+
+	/**
+	 * Add a Notiz (note) to a Akte (file) of a Vorgang
+	 * 
+	 * @param vorgangId Id for the Vorgang to add the note to it.
+	 * @param text      Content of the Note.
+	 */
+	public void addAktenNotiz(OzgCloudVorgangId vorgangId, String text);
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/CommandAlfaService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/CommandAlfaService.java
new file mode 100644
index 0000000..feebc21
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/CommandAlfaService.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.alfa;
+
+import java.time.ZonedDateTime;
+import java.util.Map;
+
+import de.ozgcloud.apilib.common.command.OzgCloudCommand;
+import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public class CommandAlfaService implements AlfaService {
+
+	private final OzgCloudCommandService commandService;
+
+	@Override
+	public void addAktenNotiz(OzgCloudVorgangId vorgangId, String text) {
+		var command = createCreateItemCommand(vorgangId, text);
+
+		commandService.createAndWaitUntilDone(command);
+	}
+
+	OzgCloudCommand createCreateItemCommand(OzgCloudVorgangId vorgangId, String text) {
+		Map<String, Object> item = Map.of("text", text,
+				"createdAt", ZonedDateTime.now().toString());
+		Map<String, Object> commandBody = Map.of("item", item,
+				"vorgangId", vorgangId.toString(),
+				"itemName", "Kommentar",
+				"client", "Alfa");
+
+		return OzgCloudCommand.builder()
+				.order("CREATE_ATTACHED_ITEM")
+				.vorgangId(vorgangId)
+				.relationId(vorgangId)
+				.bodyObject(commandBody)
+				.build();
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/dummy/DummyAlfaService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/dummy/DummyAlfaService.java
new file mode 100644
index 0000000..0fa80dc
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/alfa/dummy/DummyAlfaService.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.alfa.dummy;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+
+import de.ozgcloud.apilib.alfa.AlfaService;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService;
+import lombok.extern.java.Log;
+
+@Log
+@ConditionalOnMissingBean(OzgCloudVorgangService.class)
+public class DummyAlfaService implements AlfaService {
+
+	@Override
+	public void addAktenNotiz(OzgCloudVorgangId vorgangId, String text) {
+		// does nothing dummy implementation
+		LOG.info("Create Note on Alfa: " + text);
+	}
+
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/CallContext.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/CallContext.java
new file mode 100644
index 0000000..33d9dbb
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/CallContext.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.callcontext;
+
+import java.util.Collection;
+import java.util.UUID;
+
+import de.ozgcloud.apilib.user.OzgCloudUserId;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+
+@Builder
+@Getter
+public class CallContext {
+
+	private String clientName;
+	private OzgCloudUserId userId;
+
+	@Builder.Default
+	private String requestId = UUID.randomUUID().toString();
+	@Builder.Default
+	private boolean accessLimited = false;
+	@Singular
+	private Collection<String> accessLimitedToOrgaIds;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/DefaultOzgCloudCallContextProvider.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/DefaultOzgCloudCallContextProvider.java
new file mode 100644
index 0000000..d8bdc97
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/DefaultOzgCloudCallContextProvider.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.callcontext;
+
+import java.util.Optional;
+import java.util.UUID;
+import java.util.logging.Level;
+
+import org.springframework.context.ApplicationContext;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.java.Log;
+
+@Log
+@RequiredArgsConstructor
+public class DefaultOzgCloudCallContextProvider implements OzgCloudCallContextProvider {
+
+	private final ApplicationContext context;
+
+	@Override
+	public CallContext provideContext() {
+		return CallContext.builder()
+				.clientName(getClientName())
+				.requestId(UUID.randomUUID().toString())
+				.build();
+	}
+
+	private String getClientName() {
+		return Optional.ofNullable(context.getId()).orElseGet(() -> {
+			LOG.log(Level.WARNING, "No Client name given. Please configure 'spring.application.name'.");
+			return "unkown_client";
+		});
+
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/OzgCloudCallContextAttachingInterceptor.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/OzgCloudCallContextAttachingInterceptor.java
new file mode 100644
index 0000000..4612997
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/OzgCloudCallContextAttachingInterceptor.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.callcontext;
+
+import static de.ozgcloud.common.grpc.GrpcUtil.*;
+
+import java.util.Optional;
+import java.util.UUID;
+
+import org.apache.commons.lang3.StringUtils;
+
+import de.ozgcloud.apilib.user.OzgCloudUserId;
+import io.grpc.CallOptions;
+import io.grpc.Channel;
+import io.grpc.ClientCall;
+import io.grpc.ClientInterceptor;
+import io.grpc.ForwardingClientCall.SimpleForwardingClientCall;
+import io.grpc.Metadata;
+import io.grpc.MethodDescriptor;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public class OzgCloudCallContextAttachingInterceptor implements ClientInterceptor {
+
+	static final String KEY_USER_ID = "USER_ID-bin";
+	static final String KEY_CLIENT_NAME = "CLIENT_NAME-bin";
+	static final String KEY_REQUEST_ID = "REQUEST_ID-bin";
+	static final String KEY_ACCESS_LIMITED_ORGAID = "ACCESS_LIMITED_TO_ORGANISATORISCHEEINHEITENID-bin";
+	static final String KEY_ACCESS_LIMITED = "ACCESS_LIMITED-bin";
+
+	private final OzgCloudCallContextProvider callContextProvider;
+
+	@Override
+	public <A, B> ClientCall<A, B> interceptCall(MethodDescriptor<A, B> method, CallOptions callOptions, Channel next) {
+		return new CallContextAttachingClientCall<>(next.newCall(method, callOptions));
+	}
+
+	final class CallContextAttachingClientCall<A, B> extends SimpleForwardingClientCall<A, B> {
+
+		protected CallContextAttachingClientCall(ClientCall<A, B> delegate) {
+			super(delegate);
+		}
+
+		@Override
+		public void start(Listener<B> responseListener, Metadata headers) {
+			headers.merge(buildCallContextMetadata());
+			super.start(responseListener, headers);
+		}
+
+		private Metadata buildCallContextMetadata() {
+			var ctxt = callContextProvider.provideContext();
+			var metadata = new Metadata();
+
+			addClientName(ctxt, metadata);
+			addRequestId(ctxt, metadata);
+			Optional.ofNullable(ctxt.getUserId())
+					.map(OzgCloudUserId::toString)
+					.ifPresent(userId -> addToMetadata(metadata, KEY_USER_ID, userId));
+			Optional.ofNullable(ctxt.getAccessLimitedToOrgaIds())
+					.ifPresent(ids -> ids.stream().forEach(id -> addToMetadata(metadata, KEY_ACCESS_LIMITED_ORGAID, id)));
+			Optional.ofNullable(ctxt.isAccessLimited()).map(Boolean::valueOf)
+					.ifPresent(limited -> addToMetadata(metadata, KEY_ACCESS_LIMITED, limited.toString()));
+
+			return metadata;
+		}
+
+		private void addRequestId(CallContext ctxt, Metadata metadata) {
+			Optional.ofNullable(ctxt.getRequestId()).ifPresentOrElse(reqId -> metadata.put(createKeyOf(KEY_REQUEST_ID), reqId.getBytes()),
+					() -> addToMetadata(metadata, KEY_REQUEST_ID, UUID.randomUUID().toString()));
+		}
+
+		private void addClientName(CallContext ctxt, Metadata metadata) {
+			Optional.ofNullable(ctxt.getClientName())
+					.filter(StringUtils::isNoneBlank)
+					.ifPresentOrElse(clientName -> addToMetadata(metadata, KEY_CLIENT_NAME, clientName),
+							() -> {
+								throw new IllegalStateException("CLIENT_NAME must not be blank");
+							});
+		}
+
+		private void addToMetadata(Metadata metadata, String key, String value) {
+			metadata.put(createKeyOf(key), value.getBytes());
+		}
+
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/OzgCloudCallContextProvider.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/OzgCloudCallContextProvider.java
new file mode 100644
index 0000000..98154ad
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/callcontext/OzgCloudCallContextProvider.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.callcontext;
+
+public interface OzgCloudCallContextProvider {
+
+	public CallContext provideContext();
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommand.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommand.java
new file mode 100644
index 0000000..bab5265
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommand.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command;
+
+import java.time.ZonedDateTime;
+import java.util.Map;
+
+import de.ozgcloud.apilib.user.OzgCloudUserId;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+import de.ozgcloud.common.datatype.StringBasedValue;
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class OzgCloudCommand {
+
+	private OzgCloudCommandId id;
+
+	private OzgCloudVorgangId vorgangId;
+	/**
+	 * Id of the entity, that is referenced by this command to be processed. That
+	 * can be any Id, for example vorgangId, fileId and so on.
+	 */
+	private StringBasedValue relationId;
+	/**
+	 * Version of the entity, to be processed by this command. Used for optimistic
+	 * locking.
+	 */
+	private Long relationVersion;
+
+	private String order;
+
+	private ZonedDateTime createdAt;
+	private ZonedDateTime finishedAt;
+
+	private OzgCloudUserId createdBy;
+	private OzgCloudCommandStatus status;
+
+	private Map<String, Object> bodyObject;
+	/**
+	 * @deprecated use {@link OzgCloudCommand#bodyObject}
+	 */
+	@Deprecated(since = "0.2.0", forRemoval = true)
+	private Map<String, String> body;
+
+	private String errorMessage;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandId.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandId.java
new file mode 100644
index 0000000..6a15b91
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandId.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command;
+
+import org.mapstruct.ObjectFactory;
+
+import de.ozgcloud.common.datatype.StringBasedValue;
+
+public class OzgCloudCommandId extends StringBasedValue {
+
+	OzgCloudCommandId(String commandId) {
+		super(commandId);
+	}
+
+	@ObjectFactory
+	public static OzgCloudCommandId from(String commandId) {
+		return new OzgCloudCommandId(commandId);
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandService.java
new file mode 100644
index 0000000..487c2cf
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandService.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command;
+
+public interface OzgCloudCommandService {
+
+	public OzgCloudCommand createAndWaitUntilDone(OzgCloudCommand commandToCreate);
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java
new file mode 100644
index 0000000..02c0016
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command;
+
+import java.util.Set;
+
+import de.ozgcloud.common.datatype.StringBasedValue;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+public class OzgCloudCommandStatus extends StringBasedValue {
+
+	public static final OzgCloudCommandStatus PENDING = new OzgCloudCommandStatus("PENDING");
+	public static final OzgCloudCommandStatus FINISHED = new OzgCloudCommandStatus("FINISHED");
+	public static final OzgCloudCommandStatus ERROR = new OzgCloudCommandStatus("ERROR");
+	public static final OzgCloudCommandStatus REVOKE_PENDING = new OzgCloudCommandStatus("REVOKE_PENDING");
+	public static final OzgCloudCommandStatus REVOKED = new OzgCloudCommandStatus("REVOKED");
+
+	private static final Set<OzgCloudCommandStatus> FINAL_STATES = Set.of(FINISHED, ERROR, REVOKED);
+
+	OzgCloudCommandStatus(String status) {
+		super(status);
+	}
+
+	public static OzgCloudCommandStatus from(String status) {
+		return new OzgCloudCommandStatus(status);
+	}
+
+	public boolean isFinalState() {
+		return FINAL_STATES.contains(this);
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/CommandMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/CommandMapper.java
new file mode 100644
index 0000000..3381baf
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/CommandMapper.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command.grpc;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Named;
+
+import de.ozgcloud.apilib.common.command.OzgCloudCommand;
+import de.ozgcloud.apilib.common.command.OzgCloudCommandId;
+import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus;
+import de.ozgcloud.apilib.common.datatypes.GenericId;
+import de.ozgcloud.apilib.user.OzgCloudUserId;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+import de.ozgcloud.common.datatype.StringBasedValue;
+import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
+import de.ozgcloud.vorgang.grpc.command.GrpcCommand;
+import de.ozgcloud.vorgang.grpc.command.GrpcCreateCommandRequest;
+
+@Mapper(uses = { GrpcObjectMapper.class })
+public interface CommandMapper {
+
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "mergeBodyObj", ignore = true)
+	@Mapping(target = "mergeCallContext", ignore = true)
+	@Mapping(target = "mergeRedirectRequest", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "removeBody", ignore = true)
+	@Mapping(target = "callContext", ignore = true)
+	@Mapping(target = "order", ignore = true)
+	@Mapping(target = "orderStringBytes", ignore = true)
+	@Mapping(target = "orderValue", ignore = true)
+	@Mapping(target = "redirectRequest", ignore = true)
+	@Mapping(target = "relationIdBytes", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "vorgangIdBytes", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	@Mapping(target = "bodyBuilderList", ignore = true)
+	@Mapping(target = "bodyList", ignore = true)
+	@Mapping(target = "bodyOrBuilderList", ignore = true)
+
+	@Mapping(target = "bodyObj", source = "bodyObject")
+	@Mapping(target = "orderString", source = "order")
+	GrpcCreateCommandRequest buildCreateCommandRequest(OzgCloudCommand commandToCreate);
+
+	@Mapping(target = "bodyObject", source = "bodyObj")
+	@Mapping(target = "order", source = "orderString")
+	@Mapping(target = "relationVersion", ignore = true)
+	@Mapping(target = "relationId", qualifiedByName = "mapRelationId")
+	@Mapping(target = "body", ignore = true)
+	OzgCloudCommand fromGrpc(GrpcCommand command);
+
+	@Named("mapRelationId")
+	default StringBasedValue mapRelationId(String relationId) {
+		return GenericId.from(relationId);
+	}
+
+	default OzgCloudVorgangId toOzgCloudVorgangId(String userId) {
+		return OzgCloudVorgangId.from(userId);
+	}
+
+	default OzgCloudUserId toOzgCloudUserId(String userId) {
+		return OzgCloudUserId.from(userId);
+	}
+
+	default OzgCloudCommandStatus toOzgCloudCommandStatus(String status) {
+		return OzgCloudCommandStatus.from(status);
+	}
+
+	default OzgCloudCommandId toOzgCloudCommandId(String id) {
+		return OzgCloudCommandId.from(id);
+	}
+
+	default String valueToString(StringBasedValue value) {
+		return value.toString();
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java
new file mode 100644
index 0000000..4d5d240
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command.grpc;
+
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
+import de.ozgcloud.apilib.common.command.OzgCloudCommand;
+import de.ozgcloud.apilib.common.command.OzgCloudCommandId;
+import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
+import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus;
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
+import de.ozgcloud.vorgang.grpc.command.GrpcGetCommandRequest;
+import lombok.RequiredArgsConstructor;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+
+@RequiredArgsConstructor
+public class GrpcOzgCloudCommandService implements OzgCloudCommandService {
+
+	private static final int WAIT_TIME_MS = 500;
+	public static final int DEFAULT_COMMAND_REQUEST_THRESHOLD_MILLIS = 10000;
+
+	@GrpcClient("ozgcloud-command-manager")
+	private final CommandServiceBlockingStub commandServiceStub;
+
+	private final CommandMapper mapper;
+
+	private final OzgCloudCallContextProvider contextProvider;
+
+	private final int commandRequestThresholdMillis;
+
+	@Override
+	public OzgCloudCommand createAndWaitUntilDone(OzgCloudCommand commandToCreate) {
+		return waitUntilDone(create(commandToCreate));
+	}
+
+	OzgCloudCommand create(OzgCloudCommand commandToCreate) {
+		var created = getCommandServiceStub().createCommand(mapper.buildCreateCommandRequest(commandToCreate));
+		return mapper.fromGrpc(created.getCommand());
+	}
+
+	OzgCloudCommand waitUntilDone(OzgCloudCommand commandToWaitFor) {
+		var command = commandToWaitFor;
+		var timeout = System.currentTimeMillis() + commandRequestThresholdMillis;
+		while (!command.getStatus().isFinalState() && System.currentTimeMillis() < timeout) {
+			synchronized (this) {
+				try {
+					wait(WAIT_TIME_MS);
+					command = reloadCommand(command.getId());
+				} catch (InterruptedException e) {
+					Thread.currentThread().interrupt();
+				}
+			}
+		}
+		verifyCommand(command);
+		return command;
+	}
+
+	OzgCloudCommand reloadCommand(OzgCloudCommandId commandId) {
+		GrpcGetCommandRequest request = GrpcGetCommandRequest.newBuilder().setId(commandId.toString()).build();
+		return mapper.fromGrpc(getCommandServiceStub().getCommand(request));
+	}
+
+	CommandServiceBlockingStub getCommandServiceStub() {
+		return commandServiceStub.withInterceptors(new OzgCloudCallContextAttachingInterceptor(contextProvider));
+	}
+
+	void verifyCommand(OzgCloudCommand command) {
+		if (command.getStatus() == OzgCloudCommandStatus.ERROR) {
+			throw new TechnicalException("Command (id=%s) failed: %s".formatted(command.getId(), command.getErrorMessage()));
+		}
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandMapper.java
new file mode 100644
index 0000000..b6c694f
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandMapper.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command.grpc;
+
+import java.util.Objects;
+import java.util.Optional;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+
+import de.ozgcloud.apilib.common.command.OzgCloudCommand;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+import de.ozgcloud.common.datatype.StringBasedValue;
+import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
+import de.ozgcloud.vorgang.grpc.command.GrpcCreateCommandRequest;
+
+@Mapper(uses = GrpcObjectMapper.class)
+public interface OzgCloudCommandMapper {
+
+	@Mapping(target = "mergeFrom", ignore = true)
+	@Mapping(target = "clearField", ignore = true)
+	@Mapping(target = "clearOneof", ignore = true)
+	@Mapping(target = "mergeBodyObj", ignore = true)
+	@Mapping(target = "mergeCallContext", ignore = true)
+	@Mapping(target = "mergeRedirectRequest", ignore = true)
+	@Mapping(target = "mergeUnknownFields", ignore = true)
+	@Mapping(target = "removeBody", ignore = true)
+	@Mapping(target = "callContext", ignore = true)
+
+	@Mapping(target = "orderStringBytes", ignore = true)
+	@Mapping(target = "order", ignore = true)
+	@Mapping(target = "orderValue", ignore = true)
+	@Mapping(target = "redirectRequest", ignore = true)
+	@Mapping(target = "relationIdBytes", ignore = true)
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "vorgangIdBytes", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	@Mapping(target = "bodyBuilderList", ignore = true)
+	@Mapping(target = "bodyList", ignore = true)
+	@Mapping(target = "bodyOrBuilderList", ignore = true)
+
+	@Mapping(target = "bodyObj", source = "bodyObject")
+	@Mapping(target = "orderString", source = "order")
+	GrpcCreateCommandRequest toCreateRequest(OzgCloudCommand command);
+
+	default String toString(StringBasedValue stringBasedValue) {
+		return Optional.ofNullable(stringBasedValue).map(Objects::toString).orElse(null);
+	}
+
+	default String map(OzgCloudVorgangId value) {
+		return Optional.ofNullable(value).map(Objects::toString).orElse(null);
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/datatypes/GenericId.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/datatypes/GenericId.java
new file mode 100644
index 0000000..db51880
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/datatypes/GenericId.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.datatypes;
+
+import de.ozgcloud.common.datatype.StringBasedValue;
+
+public class GenericId extends StringBasedValue {
+
+	GenericId(String id) {
+		super(id);
+	}
+
+	public static GenericId from(String id) {
+		return new GenericId(id);
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/errorhandling/NotFoundException.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/errorhandling/NotFoundException.java
new file mode 100644
index 0000000..3f60ec1
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/errorhandling/NotFoundException.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.errorhandling;
+
+import de.ozgcloud.common.datatype.StringBasedValue;
+
+public class NotFoundException extends RuntimeException {
+
+	private static final String MESSAGE_TEMPL = "%s with id '%s' not found.";
+
+	public NotFoundException(StringBasedValue id, String entityName) {
+		super(MESSAGE_TEMPL.formatted(id.toString(), entityName));
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFile.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFile.java
new file mode 100644
index 0000000..9bc64c3
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFile.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.ToString;
+
+@Builder
+@Getter
+@ToString
+public class OzgCloudFile {
+
+	private OzgCloudFileId id;
+
+	private String name;
+	private String contentType;
+	private long size;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileGroup.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileGroup.java
new file mode 100644
index 0000000..415b93e
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileGroup.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file;
+
+import java.util.List;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+import lombok.ToString;
+
+@Builder
+@Getter
+@ToString
+public class OzgCloudFileGroup {
+
+	private String name;
+
+	@Singular
+	private List<OzgCloudFile> files;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileId.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileId.java
new file mode 100644
index 0000000..af93077
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileId.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file;
+
+import de.ozgcloud.common.datatype.StringBasedValue;
+
+public class OzgCloudFileId extends StringBasedValue {
+
+	public OzgCloudFileId(String id) {
+		super(id);
+	}
+
+	public static OzgCloudFileId from(String id) {
+		return new OzgCloudFileId(id);
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileService.java
new file mode 100644
index 0000000..a69f358
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/OzgCloudFileService.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file;
+
+import java.io.OutputStream;
+
+public interface OzgCloudFileService {
+
+	OzgCloudFile getFile(OzgCloudFileId id);
+
+	void writeFileDataToStream(OzgCloudFileId id, OutputStream streamToWriteData);
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/dummy/DummyOzgCloudFileService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/dummy/DummyOzgCloudFileService.java
new file mode 100644
index 0000000..f429631
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/dummy/DummyOzgCloudFileService.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file.dummy;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.stereotype.Service;
+
+import de.ozgcloud.apilib.file.OzgCloudFile;
+import de.ozgcloud.apilib.file.OzgCloudFileId;
+import de.ozgcloud.apilib.file.OzgCloudFileService;
+import de.ozgcloud.common.errorhandling.TechnicalException;
+
+@Service
+@ConditionalOnMissingBean(OzgCloudFileService.class)
+public class DummyOzgCloudFileService implements OzgCloudFileService {
+
+	private static final byte[] TEST_DATA = "Hello World!".getBytes();
+
+	public static final OzgCloudFile DUMMY_FILE = OzgCloudFile.builder()
+			.id(OzgCloudFileId.from("42"))
+			.contentType("text/plain")
+			.size(TEST_DATA.length)
+			.name("helloWorld.txt")
+			.build();
+
+	@Override
+	public OzgCloudFile getFile(OzgCloudFileId id) {
+		return DUMMY_FILE;
+	}
+
+	@Override
+	public void writeFileDataToStream(OzgCloudFileId id, OutputStream streamToWriteData) {
+		try {
+			streamToWriteData.write(TEST_DATA);
+		} catch (IOException e) {
+			throw new TechnicalException("Erro wrting dummy data.", e);
+		}
+	}
+
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java
new file mode 100644
index 0000000..89e8ca5
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileService.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file.grpc;
+
+import java.io.OutputStream;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.logging.Level;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Service;
+
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
+import de.ozgcloud.apilib.common.errorhandling.NotFoundException;
+import de.ozgcloud.apilib.file.OzgCloudFile;
+import de.ozgcloud.apilib.file.OzgCloudFileId;
+import de.ozgcloud.apilib.file.OzgCloudFileService;
+import de.ozgcloud.common.binaryfile.FileId;
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceBlockingStub;
+import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub;
+import de.ozgcloud.vorgang.grpc.binaryFile.GrpcBinaryFilesRequest;
+import de.ozgcloud.vorgang.grpc.binaryFile.GrpcFindFilesResponse;
+import de.ozgcloud.vorgang.grpc.binaryFile.GrpcGetBinaryFileDataRequest;
+import de.ozgcloud.vorgang.grpc.file.GrpcOzgFile;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.java.Log;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+
+@Service
+@ConditionalOnProperty("ozgcloud.file-manager.address")
+@RequiredArgsConstructor
+@Log
+public class GrpcOzgCloudFileService implements OzgCloudFileService {
+
+	@GrpcClient("file-manager")
+	private final BinaryFileServiceBlockingStub blockingStub;
+	@GrpcClient("file-manager")
+	private final BinaryFileServiceStub asyncServiceStub;
+
+	private final OzgCloudCallContextProvider contextProvider;
+
+	private final OzgCloudFileMapper mapper;
+
+	static final int CHUNK_SIZE = 255 * 1024;
+
+	@Override
+	public OzgCloudFile getFile(OzgCloudFileId id) {
+		var response = getBlockingStub().findBinaryFilesMetaData(buildFindFileRequest(id));
+
+		return mapper.fromGrpc(getSingleResponse(response, id));
+	}
+
+	GrpcBinaryFilesRequest buildFindFileRequest(OzgCloudFileId id) {
+		return GrpcBinaryFilesRequest.newBuilder()
+				.addFileId(id.toString())
+				.build();
+	}
+
+	GrpcOzgFile getSingleResponse(GrpcFindFilesResponse response, OzgCloudFileId id) {
+		var responseCount = response.getFileCount();
+		if (responseCount == 0) {
+			throw new NotFoundException(id, "OzgCloudFile");
+		}
+		if (responseCount > 1) {
+			LOG.log(Level.WARNING, () -> "Found more then one file with id '%s'. Returning first one, only.".formatted(id.toString()));
+		}
+		return response.getFile(0);
+	}
+
+	@Override
+	public void writeFileDataToStream(OzgCloudFileId id, OutputStream streamToWriteData) {
+		var fileId = FileId.from(id.toString());
+		var streamFuture = new CompletableFuture<Boolean>();
+		var responseObserver = new OzgCloudFileDownloadStreamObserver(streamFuture, streamToWriteData);
+
+		getAsyncServiceStub().getBinaryFileContent(buildGrpcGetBinaryFileDataRequest(fileId), responseObserver);
+
+		waitUntilFutureToComplete(streamFuture);
+	}
+
+	private GrpcGetBinaryFileDataRequest buildGrpcGetBinaryFileDataRequest(FileId fileId) {
+		return GrpcGetBinaryFileDataRequest.newBuilder().setFileId(fileId.toString()).build();
+	}
+
+	void waitUntilFutureToComplete(CompletableFuture<Boolean> streamFuture) {
+		try {
+			streamFuture.get(10, TimeUnit.MINUTES);
+		} catch (InterruptedException e) {
+			Thread.currentThread().interrupt();
+			throw new TechnicalException(e.getMessage(), e);
+		} catch (ExecutionException | TimeoutException e) {
+			throw new TechnicalException(e.getMessage(), e);
+		}
+	}
+
+	BinaryFileServiceBlockingStub getBlockingStub() {
+		return blockingStub.withInterceptors(new OzgCloudCallContextAttachingInterceptor(contextProvider));
+	}
+
+	BinaryFileServiceStub getAsyncServiceStub() {
+		return asyncServiceStub.withInterceptors(new OzgCloudCallContextAttachingInterceptor(contextProvider));
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileDownloadStreamObserver.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileDownloadStreamObserver.java
new file mode 100644
index 0000000..2ec0bd1
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileDownloadStreamObserver.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file.grpc;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.concurrent.CompletableFuture;
+
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.vorgang.grpc.binaryFile.GrpcGetBinaryFileDataResponse;
+import io.grpc.stub.StreamObserver;
+import lombok.AccessLevel;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
+class OzgCloudFileDownloadStreamObserver implements StreamObserver<GrpcGetBinaryFileDataResponse> {
+
+	private final CompletableFuture<Boolean> streamFuture;
+	private final OutputStream out;
+
+	@Override
+	public void onNext(GrpcGetBinaryFileDataResponse response) {
+		writeToStream(response.getFileContent().toByteArray());
+	}
+
+	void writeToStream(byte[] contentPart) {
+		try {
+			out.write(contentPart);
+		} catch (IOException e) {
+			throw new TechnicalException("Download file error writing on OutputStream", e);
+		}
+	}
+
+	@Override
+	public void onError(Throwable t) {
+		streamFuture.completeExceptionally(t);
+	}
+
+	@Override
+	public void onCompleted() {
+		streamFuture.complete(true);
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileMapper.java
new file mode 100644
index 0000000..b46d084
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/file/grpc/OzgCloudFileMapper.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file.grpc;
+
+import org.mapstruct.Mapper;
+
+import de.ozgcloud.apilib.file.OzgCloudFile;
+import de.ozgcloud.apilib.file.OzgCloudFileId;
+import de.ozgcloud.vorgang.grpc.file.GrpcOzgFile;
+
+@Mapper
+public interface OzgCloudFileMapper {
+
+	OzgCloudFile fromGrpc(GrpcOzgFile grpcFile);
+
+	OzgCloudFileId toOzgCloudFileId(String id);
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/user/GrpcOzgCloudUserProfileService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/GrpcOzgCloudUserProfileService.java
new file mode 100644
index 0000000..143562a
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/GrpcOzgCloudUserProfileService.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.user;
+
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
+import de.ozgcloud.user.grpc.userprofile.UserProfileServiceGrpc.UserProfileServiceBlockingStub;
+import de.ozgcloud.user.userprofile.GrpcGetUserProfileRequest;
+import lombok.RequiredArgsConstructor;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+
+@RequiredArgsConstructor
+public class GrpcOzgCloudUserProfileService implements OzgCloudUserProfileService {
+
+	@GrpcClient("user-manager")
+	private final UserProfileServiceBlockingStub serviceStub;
+
+	private final UserProfileMapper mapper;
+
+	private final OzgCloudCallContextProvider contextProvider;
+
+	@Override
+	public OzgCloudUserProfile getById(OzgCloudUserId userId) {
+		var grpcUserProfileResponse = getUserProfileServiceStub().getById(buildGetUserRequest(userId));
+
+		return mapper.mapFromGrpc(grpcUserProfileResponse.getUserProfile());
+	}
+
+	private GrpcGetUserProfileRequest buildGetUserRequest(OzgCloudUserId id) {
+		return GrpcGetUserProfileRequest.newBuilder().setUserId(id.toString())
+				.build();
+	}
+
+	private UserProfileServiceBlockingStub getUserProfileServiceStub() {
+		return serviceStub.withInterceptors(new OzgCloudCallContextAttachingInterceptor(contextProvider));
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserId.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserId.java
new file mode 100644
index 0000000..fec690f
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserId.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.user;
+
+import de.ozgcloud.common.datatype.StringBasedValue;
+
+public class OzgCloudUserId extends StringBasedValue {
+
+	OzgCloudUserId(String id) {
+		super(id);
+	}
+
+	public static OzgCloudUserId from(String id) {
+		return new OzgCloudUserId(id);
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserProfile.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserProfile.java
new file mode 100644
index 0000000..19aa740
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserProfile.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.user;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class OzgCloudUserProfile {
+
+	private OzgCloudUserId id;
+
+	private String firstName;
+	private String lastName;
+	private String email;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserProfileService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserProfileService.java
new file mode 100644
index 0000000..9c29490
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/OzgCloudUserProfileService.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.user;
+
+public interface OzgCloudUserProfileService {
+
+	public OzgCloudUserProfile getById(OzgCloudUserId userId);
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/user/UserProfileMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/UserProfileMapper.java
new file mode 100644
index 0000000..ce88d5b
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/user/UserProfileMapper.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.user;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+
+import de.ozgcloud.user.userprofile.GrpcUserProfile;
+import lombok.NonNull;
+
+@Mapper
+public interface UserProfileMapper {
+
+	@Mapping(target = "email", source = "email")
+	OzgCloudUserProfile mapFromGrpc(GrpcUserProfile userProfile);
+
+	default OzgCloudUserId toOzgCloudUserId(@NonNull String id) {
+		return OzgCloudUserId.from(id);
+	}
+
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudAntragsteller.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudAntragsteller.java
new file mode 100644
index 0000000..2aedf62
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudAntragsteller.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Getter
+@Builder
+public class OzgCloudAntragsteller {
+
+	/** Salutation */
+	private String anrede;
+	/** Firstname */
+	private String vorname;
+	/** Lastname */
+	private String nachname;
+
+	/** Day of birth */
+	private String geburtsdatum;
+	/** City of birth */
+	private String geburtsort;
+	/** Name of birth */
+	private String geburtsname;
+
+	/** Street */
+	private String strasse;
+	/** House Number */
+	private String hausnummer;
+	/** postcode / Zip Code */
+	private String plz;
+	/** City */
+	private String ort;
+
+	private String email;
+	/** Telephone number */
+	private String telefon;
+
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudEingang.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudEingang.java
new file mode 100644
index 0000000..0c34e47
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudEingang.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.util.List;
+
+import de.ozgcloud.apilib.file.OzgCloudFile;
+import de.ozgcloud.apilib.file.OzgCloudFileGroup;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+import lombok.ToString;
+
+@Builder
+@Getter
+@ToString(onlyExplicitlyIncluded = true)
+public class OzgCloudEingang {
+
+	@ToString.Include
+	@Builder.Default
+	private OzgCloudEingangHeader header = OzgCloudEingangHeader.builder().build();
+	@Builder.Default
+	private OzgCloudAntragsteller antragsteller = OzgCloudAntragsteller.builder().build();
+	@ToString.Include
+	private OzgCloudZustaendigeStelle zustaendigeStelle;
+
+	private List<OzgCloudFormDataEntry> formDataEntrys;
+
+	@Singular
+	private List<OzgCloudFileGroup> attachments;
+	@Singular
+	private List<OzgCloudFile> representations;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudEingangHeader.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudEingangHeader.java
new file mode 100644
index 0000000..3c0ff10
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudEingangHeader.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.time.ZonedDateTime;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.ToString;
+
+@Getter
+@Builder
+@ToString
+public class OzgCloudEingangHeader {
+
+	private String requestId;
+
+	private ZonedDateTime createdAt;
+	private String formId;
+	private String formName;
+	private String formEngineName;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudFormDataEntry.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudFormDataEntry.java
new file mode 100644
index 0000000..1908fbc
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudFormDataEntry.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+public interface OzgCloudFormDataEntry {
+
+	String getName();
+	String getLabel();
+
+	default boolean isSubForm() {
+		return false;
+	}
+
+	default boolean isFormEntry() {
+		return false;
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudFormField.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudFormField.java
new file mode 100644
index 0000000..1230d93
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudFormField.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class OzgCloudFormField implements OzgCloudFormDataEntry {
+
+	private String name;
+	private String label;
+
+	private Object value;
+
+	@Override
+	public boolean isFormEntry() {
+		return true;
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudPostfachAddress.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudPostfachAddress.java
new file mode 100644
index 0000000..5cbfe65
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudPostfachAddress.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.util.Collection;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Getter
+@Builder
+public class OzgCloudPostfachAddress {
+
+	private String version;
+
+	private Collection<OzgCloudPostfachAddressIdentifier> identifier;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudPostfachAddressIdentifier.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudPostfachAddressIdentifier.java
new file mode 100644
index 0000000..be061ef
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudPostfachAddressIdentifier.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class OzgCloudPostfachAddressIdentifier {
+
+	private String name;
+	private Object value;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudServiceKonto.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudServiceKonto.java
new file mode 100644
index 0000000..d4e17a3
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudServiceKonto.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class OzgCloudServiceKonto {
+
+	private OzgCloudServiceKontoType type;
+
+	private OzgCloudPostfachAddress address;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudServiceKontoType.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudServiceKontoType.java
new file mode 100644
index 0000000..4c8fef4
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudServiceKontoType.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import de.ozgcloud.common.datatype.StringBasedValue;
+
+public class OzgCloudServiceKontoType extends StringBasedValue {
+
+	OzgCloudServiceKontoType(String type) {
+		super(type);
+	}
+
+	public static OzgCloudServiceKontoType from(String type) {
+		return new OzgCloudServiceKontoType(type);
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudSubForm.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudSubForm.java
new file mode 100644
index 0000000..dfbf4c1
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudSubForm.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.util.List;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+
+@Getter
+@Builder
+public class OzgCloudSubForm implements OzgCloudFormDataEntry {
+
+	private String name;
+	private String label;
+	@Singular
+	private List<OzgCloudFormDataEntry> formEntrys;
+
+	@Override
+	public boolean isSubForm() {
+		return true;
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgang.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgang.java
new file mode 100644
index 0000000..4e95641
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgang.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.util.List;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Singular;
+import lombok.ToString;
+
+@Builder
+@Getter
+@ToString
+public class OzgCloudVorgang {
+
+	private OzgCloudVorgangId id;
+	private long version;
+
+	private String vorgangName;
+	private String vorgangNummer;
+
+	private OzgCloudVorgangHeader header;
+
+	@Singular
+	private List<OzgCloudEingang> eingangs;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeader.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeader.java
new file mode 100644
index 0000000..2dc166b
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeader.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.time.ZonedDateTime;
+
+import de.ozgcloud.apilib.user.OzgCloudUserId;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.ToString;
+
+@Builder
+@Getter
+public class OzgCloudVorgangHeader {
+
+	private OzgCloudVorgangStatus status;
+
+	private ZonedDateTime createdAt;
+
+	private OzgCloudUserId assignedTo;
+
+	private String aktenzeichen;
+
+	@ToString.Exclude
+	private OzgCloudServiceKonto serviceKonto;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangId.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangId.java
new file mode 100644
index 0000000..7c71bc9
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangId.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import org.mapstruct.ObjectFactory;
+
+import de.ozgcloud.common.datatype.StringBasedValue;
+
+public class OzgCloudVorgangId extends StringBasedValue {
+
+	OzgCloudVorgangId(String vorgangId) {
+		super(vorgangId);
+	}
+
+	@ObjectFactory
+	public static OzgCloudVorgangId from(String vorgangId) {
+		return new OzgCloudVorgangId(vorgangId);
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangIdMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangIdMapper.java
new file mode 100644
index 0000000..9fdf4ef
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangIdMapper.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import org.mapstruct.Mapper;
+
+@Mapper
+public interface OzgCloudVorgangIdMapper {
+
+	OzgCloudVorgangId fromString(String vorgangId);
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangQuery.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangQuery.java
new file mode 100644
index 0000000..592203e
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangQuery.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class OzgCloudVorgangQuery {
+
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangSearchResult.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangSearchResult.java
new file mode 100644
index 0000000..27f385f
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangSearchResult.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.util.List;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class OzgCloudVorgangSearchResult {
+
+	private long total;
+
+	private List<OzgCloudVorgangStub> vorgangs;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangService.java
new file mode 100644
index 0000000..49de994
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangService.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.util.List;
+
+public interface OzgCloudVorgangService {
+
+	public OzgCloudVorgang getById(OzgCloudVorgangId vorgangId);
+
+	public List<OzgCloudVorgangStub> search(String searchString);
+
+	public List<OzgCloudVorgangStub> search(String searchString, Page page);
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStatus.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStatus.java
new file mode 100644
index 0000000..430686f
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStatus.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import de.ozgcloud.common.datatype.StringBasedValue;
+
+public class OzgCloudVorgangStatus extends StringBasedValue {
+
+	OzgCloudVorgangStatus(String status) {
+		super(status);
+	}
+
+	public static OzgCloudVorgangStatus from(String status) {
+		return new OzgCloudVorgangStatus(status);
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStub.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStub.java
new file mode 100644
index 0000000..fd7db12
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStub.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.ToString;
+
+@Builder
+@Getter
+@ToString
+public class OzgCloudVorgangStub {
+
+	private OzgCloudVorgangId id;
+	private long version;
+
+	private String vorgangName;
+	private String vorgangNummer;
+
+	private OzgCloudVorgangHeader header;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudZustaendigeStelle.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudZustaendigeStelle.java
new file mode 100644
index 0000000..b2c41a1
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudZustaendigeStelle.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class OzgCloudZustaendigeStelle {
+
+	private String organisationsEinheitId;
+	private String bezeichnung;
+	private String email;
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/Page.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/Page.java
new file mode 100644
index 0000000..c314224
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/Page.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class Page {
+
+	@Builder.Default
+	private int limit = 100;
+	@Builder.Default
+	private int offset = 0;
+
+	public static Page startPage() {
+		return Page.builder().build();
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java
new file mode 100644
index 0000000..2af5b84
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/dummy/DummyVorgangService.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.dummy;
+
+import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import de.ozgcloud.apilib.common.errorhandling.NotFoundException;
+import de.ozgcloud.apilib.file.dummy.DummyOzgCloudFileService;
+import de.ozgcloud.apilib.vorgang.OzgCloudAntragsteller;
+import de.ozgcloud.apilib.vorgang.OzgCloudEingang;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgang;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangHeader;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStatus;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStub;
+import de.ozgcloud.apilib.vorgang.Page;
+
+public class DummyVorgangService implements OzgCloudVorgangService {
+
+	private final Map<OzgCloudVorgangId, OzgCloudVorgang> idToVorgang;
+	private final List<OzgCloudVorgangStub> vorgangs;
+
+	private static final String VORGANG_NAME_1 = "Antrag auf einen Waffelschein";
+	private static final String VORGANG_NR_1 = "1234";
+	private static final OzgCloudVorgangHeader HEADER_1 = OzgCloudVorgangHeader.builder()
+			.status(OzgCloudVorgangStatus.from("NEU"))
+			.createdAt(ZonedDateTime.now())
+			.aktenzeichen("ABC-123-04")
+			.build();
+	private static final OzgCloudEingang EINGANG_1 = OzgCloudEingang.builder()
+			.antragsteller(OzgCloudAntragsteller.builder().build())
+			.representations(List.of(DummyOzgCloudFileService.DUMMY_FILE))
+			.build();
+
+	private static final String VORGANG_NAME_2 = "Antrag auf Führung eines Kampfhamsters";
+	private static final String VORGANG_NR_2 = "5678";
+	private static final OzgCloudVorgangHeader HEADER_2 = OzgCloudVorgangHeader.builder()
+			.status(OzgCloudVorgangStatus.from("IN_BEARBEITUNG"))
+			.createdAt(ZonedDateTime.now().minus(1, ChronoUnit.DAYS))
+			.aktenzeichen("ABC-546-12")
+			.build();
+	private static final OzgCloudEingang EINGANG_2 = OzgCloudEingang.builder().build();
+
+	public DummyVorgangService() {
+		idToVorgang = buildMap();
+		vorgangs = initList();
+	}
+
+	private Map<OzgCloudVorgangId, OzgCloudVorgang> buildMap() {
+		return Map.of(
+				OzgCloudVorgangId.from("1"), OzgCloudVorgang.builder()
+						.id(OzgCloudVorgangId.from("1"))
+						.vorgangName(VORGANG_NAME_1)
+						.vorgangNummer(VORGANG_NR_1)
+						.header(HEADER_1)
+						.eingang(EINGANG_1)
+						.build(),
+				OzgCloudVorgangId.from("2"), OzgCloudVorgang.builder()
+						.id(OzgCloudVorgangId.from("2"))
+						.vorgangName(VORGANG_NAME_2)
+						.vorgangNummer(VORGANG_NR_2)
+						.header(HEADER_2)
+						.eingang(EINGANG_2)
+						.build());
+	}
+
+	private List<OzgCloudVorgangStub> initList() {
+		return List.of(
+				OzgCloudVorgangStub.builder().id(OzgCloudVorgangId.from("1"))
+						.vorgangName(VORGANG_NAME_1)
+						.vorgangNummer(VORGANG_NR_1)
+						.header(HEADER_1)
+						.build(),
+				OzgCloudVorgangStub.builder().id(OzgCloudVorgangId.from("2"))
+						.vorgangName(VORGANG_NAME_2)
+						.vorgangNummer(VORGANG_NR_2)
+						.header(HEADER_2)
+						.build());
+	}
+
+	@Override
+	public OzgCloudVorgang getById(OzgCloudVorgangId vorgangId) {
+		var vorgang = idToVorgang.get(vorgangId);
+
+		if (Objects.isNull(vorgang)) {
+			throw new NotFoundException(vorgangId, "Vorgang");
+		}
+
+		return vorgang;
+	}
+
+	@Override
+	public List<OzgCloudVorgangStub> search(String searchString) {
+		return vorgangs;
+	}
+
+	@Override
+	public List<OzgCloudVorgangStub> search(String searchString, Page page) {
+		return vorgangs;
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java
new file mode 100644
index 0000000..b33bbf4
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import java.util.List;
+
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgang;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStub;
+import de.ozgcloud.apilib.vorgang.Page;
+import de.ozgcloud.vorgang.vorgang.GrpcFilterBy;
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangRequest;
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangRequest.GrpcOrderBy;
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangRequest;
+import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+
+@RequiredArgsConstructor
+public class GrpcOzgCloudVorgangService implements OzgCloudVorgangService {
+
+	@GrpcClient("vorgang-manager")
+	private final VorgangServiceBlockingStub vorgangServiceStub;
+
+	private final OzgCloudVorgangMapper mapper;
+	private final OzgCloudVorgangStubMapper stubMapper;
+
+	private final OzgCloudCallContextProvider contextProvider;
+
+	@Override
+	public OzgCloudVorgang getById(@NonNull OzgCloudVorgangId vorgangId) {
+		var response = getVorgangServiceStub().findVorgangWithEingang(buildRequest(vorgangId));
+
+		return mapper.fromGrpc(response.getVorgangWithEingang());
+	}
+
+	private GrpcFindVorgangWithEingangRequest buildRequest(@NonNull OzgCloudVorgangId vorgangId) {
+		return GrpcFindVorgangWithEingangRequest.newBuilder()
+				.setId(vorgangId.toString())
+				.build();
+	}
+
+	@Override
+	public List<OzgCloudVorgangStub> search(@NonNull String searchString) {
+		return search(searchString, Page.startPage());
+	}
+
+	@Override
+	public List<OzgCloudVorgangStub> search(@NonNull String searchString, Page page) {
+		var response = getVorgangServiceStub().findVorgang(buildSearchRequest(searchString, page));
+
+		return response.getVorgangList().stream().map(stubMapper::fromGrpc).toList();
+	}
+
+	GrpcFindVorgangRequest buildSearchRequest(@NonNull String searchString, Page page) {
+		return GrpcFindVorgangRequest.newBuilder()
+				.setFilterBy(GrpcFilterBy.newBuilder().build())
+				.setSearchBy(searchString)
+				.setOffset(page.getOffset())
+				.setLimit(page.getLimit())
+				.setOrderBy(GrpcOrderBy.CREATED_AT_DESC)
+				.build();
+	}
+
+	VorgangServiceBlockingStub getVorgangServiceStub() {
+		return vorgangServiceStub.withInterceptors(new OzgCloudCallContextAttachingInterceptor(contextProvider));
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudEingangMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudEingangMapper.java
new file mode 100644
index 0000000..ad454cb
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudEingangMapper.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+
+import de.ozgcloud.apilib.vorgang.OzgCloudEingang;
+import de.ozgcloud.apilib.vorgang.OzgCloudFormDataEntry;
+import de.ozgcloud.apilib.vorgang.OzgCloudFormField;
+import de.ozgcloud.apilib.vorgang.OzgCloudSubForm;
+import de.ozgcloud.vorgang.vorgang.GrpcEingang;
+import de.ozgcloud.vorgang.vorgang.GrpcFormData;
+import de.ozgcloud.vorgang.vorgang.GrpcFormField;
+import de.ozgcloud.vorgang.vorgang.GrpcSubForm;
+
+@Mapper
+public interface OzgCloudEingangMapper {
+
+	// TODO map files
+	@Mapping(target = "attachments", ignore = true)
+	@Mapping(target = "representations", ignore = true)
+	@Mapping(target = "formDataEntrys", source = "formData")
+	@Mapping(target = "zustaendigeStelle.organisationsEinheitId", source = "zustaendigeStelle.organisationseinheitenId")
+	OzgCloudEingang fromGrpc(GrpcEingang eingang);
+
+	default List<OzgCloudFormDataEntry> mapFormData(GrpcFormData value) {
+		var fields = value.getFieldList().stream().map(this::fromGrpc);
+		var subForms = value.getFormList().stream().map(this::fromGrpc);
+
+		return Stream.concat(fields, subForms).toList();
+	}
+
+	OzgCloudFormField fromGrpc(GrpcFormField field);
+
+	@Mapping(target = "formEntry", ignore = true)
+	@Mapping(target = "formEntrys", source = "subForm")
+	@Mapping(target = "name", source = "title")
+	OzgCloudSubForm fromGrpc(GrpcSubForm subForm);
+
+	default List<OzgCloudFormDataEntry> mapSubForm(GrpcSubForm subForm) {
+		var fields = subForm.getFieldList().stream().map(this::fromGrpc);
+		var subForms = subForm.getSubFormList().stream().map(this::fromGrpc);
+
+		return Stream.concat(fields, subForms).toList();
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapper.java
new file mode 100644
index 0000000..376888e
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapper.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import java.util.Optional;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+
+import de.ozgcloud.apilib.user.OzgCloudUserId;
+import de.ozgcloud.apilib.vorgang.OzgCloudServiceKontoType;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgang;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStatus;
+import de.ozgcloud.vorgang.vorgang.GrpcVorgangWithEingang;
+
+@Mapper(uses = { OzgCloudEingangMapper.class, OzgCloudVorgangIdMapper.class })
+public interface OzgCloudVorgangMapper {
+
+	@Mapping(target = "eingangs", ignore = true)
+	@Mapping(target = "vorgangNummer", source = "nummer")
+	@Mapping(target = "vorgangName", source = "name")
+	@Mapping(target = "header.aktenzeichen", source = "aktenzeichen")
+	@Mapping(target = "header.assignedTo", source = "assignedTo")
+	@Mapping(target = "header.createdAt", source = "createdAt")
+	@Mapping(target = "header.status", source = "status")
+	OzgCloudVorgang fromGrpc(GrpcVorgangWithEingang response);
+
+	default OzgCloudServiceKontoType toOzgCloudServiceKontoType(String type) {
+		return Optional.ofNullable(type).map(OzgCloudServiceKontoType::from).orElse(null);
+	}
+
+	default OzgCloudUserId toUserId(String userId) {
+		return Optional.ofNullable(userId).map(OzgCloudUserId::from).orElse(null);
+	}
+
+	default OzgCloudVorgangStatus toVorgangId(String status) {
+		return Optional.ofNullable(status).map(OzgCloudVorgangStatus::from).orElse(null);
+	}
+}
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangStubMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangStubMapper.java
new file mode 100644
index 0000000..b4e77c8
--- /dev/null
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangStubMapper.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStub;
+import de.ozgcloud.vorgang.vorgang.GrpcVorgangHeader;
+
+@Mapper(uses = OzgCloudVorgangIdMapper.class)
+public interface OzgCloudVorgangStubMapper {
+
+	@Mapping(target = "header", ignore = true)
+	@Mapping(target = "vorgangName", ignore = true)
+	@Mapping(target = "vorgangNummer", ignore = true)
+	OzgCloudVorgangStub fromGrpc(GrpcVorgangHeader vorgang);
+
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/CommandMapperTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/CommandMapperTest.java
new file mode 100644
index 0000000..a61c3e1
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/CommandMapperTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command.grpc;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+import org.mockito.InjectMocks;
+
+class CommandMapperTest {
+
+	@InjectMocks
+	private CommandMapper mapper = Mappers.getMapper(CommandMapper.class);
+
+	@Nested
+	class TestBuildCreateCommandRequest {
+
+		@Test
+		void shouldBuildRequest() {
+			var request = mapper.buildCreateCommandRequest(OzgCloudCommandTestFactory.create());
+
+			assertThat(request).usingRecursiveComparison().isEqualTo(GrpcCreateCommandRequestTestFactory.create());
+		}
+	}
+
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandResponseTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandResponseTestFactory.java
new file mode 100644
index 0000000..ed324e0
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandResponseTestFactory.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command.grpc;
+
+import de.ozgcloud.vorgang.grpc.command.GrpcCommandResponse;
+
+public class GrpcCommandResponseTestFactory {
+
+	public static final GrpcCommandResponse create() {
+		return createBuilder().build();
+	}
+
+	public static final GrpcCommandResponse.Builder createBuilder() {
+		return GrpcCommandResponse.newBuilder()
+				.setCommand(GrpcCommandTestFactory.create());
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandTestFactory.java
new file mode 100644
index 0000000..512fbc6
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCommandTestFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command.grpc;
+
+import de.ozgcloud.vorgang.grpc.command.GrpcCommand;
+
+public class GrpcCommandTestFactory {
+
+	public static GrpcCommand create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcCommand.Builder createBuilder() {
+		return GrpcCommand.newBuilder();
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCreateCommandRequestTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCreateCommandRequestTestFactory.java
new file mode 100644
index 0000000..ff2fc49
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcCreateCommandRequestTestFactory.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command.grpc;
+
+import static de.ozgcloud.apilib.common.command.grpc.OzgCloudCommandTestFactory.*;
+
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangTestFactory;
+import de.ozgcloud.vorgang.common.GrpcObject;
+import de.ozgcloud.vorgang.common.GrpcProperty;
+import de.ozgcloud.vorgang.grpc.command.GrpcCreateCommandRequest;
+
+public class GrpcCreateCommandRequestTestFactory {
+
+	public static GrpcCreateCommandRequest create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcCreateCommandRequest.Builder createBuilder() {
+		return GrpcCreateCommandRequest.newBuilder()
+				.setVorgangId(OzgCloudVorgangTestFactory.ID.toString())
+				.setRelationId(RELATION_ID.toString())
+				.setRelationVersion(RELATION_VERSION)
+				.setOrderString(ORDER)
+				.setBodyObj(GrpcObject.newBuilder().addProperty(
+						GrpcProperty.newBuilder().setName(BODY_FIELD_NAME).addValue(BODY_FIELD_VALUE.toString()).build()));
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java
new file mode 100644
index 0000000..a86ebb4
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command.grpc;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
+import de.ozgcloud.apilib.common.command.OzgCloudCommand;
+import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus;
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
+
+class GrpcOzgCloudCommandServiceTest {
+
+	private GrpcOzgCloudCommandService service;
+
+	@Mock
+	private CommandServiceBlockingStub serviceStub;
+	@Mock
+	private CommandMapper mapper;
+	@Mock
+	private OzgCloudCallContextProvider contextProvider;
+
+	@BeforeEach
+	void init() {
+		service = spy(new GrpcOzgCloudCommandService(serviceStub, mapper, contextProvider, 600));
+	}
+
+	@Nested
+	class TestCreateAndWaitUntilDone {
+		private OzgCloudCommand command = OzgCloudCommandTestFactory.create();
+
+		@Test
+		void shouldCallCreate() {
+			var created = OzgCloudCommandTestFactory.create();
+			doReturn(created).when(service).create(any());
+
+			service.createAndWaitUntilDone(command);
+
+			verify(service).create(command);
+		}
+
+		@Test
+		void shouldWaitUntilDone() {
+			var created = OzgCloudCommandTestFactory.create();
+			doReturn(created).when(service).create(any());
+
+			service.createAndWaitUntilDone(command);
+
+			verify(service).waitUntilDone(created);
+		}
+
+		@Test
+		void shouldTerminateByTimeout() {
+			var command = OzgCloudCommandTestFactory.createBuilder().status(OzgCloudCommandStatus.PENDING).build();
+			doReturn(command).when(service).reloadCommand(any());
+
+			service.waitUntilDone(command);
+
+			Mockito.verify(service, Mockito.times(2)).reloadCommand(command.getId());
+		}
+
+		@Test
+		void shouldCallVerifyCommand() {
+			service.waitUntilDone(command);
+
+			verify(service).verifyCommand(command);
+		}
+
+		@Nested
+		class Create {
+
+			@BeforeEach
+			void init() {
+				when(serviceStub.withInterceptors(any())).thenReturn(serviceStub);
+				when(serviceStub.createCommand(any())).thenReturn(GrpcCommandResponseTestFactory.create());
+			}
+
+			@Test
+			void shouldBuildRequest() {
+				service.create(command);
+
+				verify(mapper).buildCreateCommandRequest(command);
+			}
+
+			@Test
+			void shouldCallStub() {
+				var request = GrpcCreateCommandRequestTestFactory.create();
+				doReturn(request).when(mapper).buildCreateCommandRequest(any());
+
+				service.create(OzgCloudCommandTestFactory.create());
+
+				verify(serviceStub).createCommand(request);
+			}
+
+			@Test
+			void shouldMapCommand() {
+				service.create(command);
+
+				verify(mapper).fromGrpc(GrpcCommandTestFactory.create());
+			}
+
+			@Test
+			void shouldReturnResult() {
+				var expected = OzgCloudCommandTestFactory.create();
+				when(mapper.fromGrpc(any())).thenReturn(expected);
+
+				var returned = service.create(command);
+
+				assertThat(returned).isSameAs(expected);
+			}
+		}
+	}
+
+	@Nested
+	class TestStatus {
+
+		@Test
+		void shouldThrowException() {
+			var command = OzgCloudCommandTestFactory.createBuilder().status(OzgCloudCommandStatus.ERROR).build();
+
+			assertThrows(TechnicalException.class, () -> service.verifyCommand(command));
+		}
+
+	}
+}
\ No newline at end of file
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandMapperTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandMapperTest.java
new file mode 100644
index 0000000..81b4aa0
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandMapperTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command.grpc;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+
+class OzgCloudCommandMapperTest {
+
+	private OzgCloudCommandMapper mapper = Mappers.getMapper(OzgCloudCommandMapper.class);
+
+	@Nested
+	class TestToCreateRequest {
+		@Test
+		void shouldMapFromCommand() {
+			var request = mapper.toCreateRequest(OzgCloudCommandTestFactory.create());
+
+			assertThat(request).usingRecursiveComparison().isEqualTo(GrpcCreateCommandRequestTestFactory.create());
+		}
+	}
+
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandTestFactory.java
new file mode 100644
index 0000000..9eff853
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/OzgCloudCommandTestFactory.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.common.command.grpc;
+
+import java.time.ZonedDateTime;
+import java.util.Map;
+import java.util.UUID;
+
+import de.ozgcloud.apilib.common.command.OzgCloudCommand;
+import de.ozgcloud.apilib.common.command.OzgCloudCommandId;
+import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus;
+import de.ozgcloud.apilib.file.OzgCloudFileTestFactory;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangTestFactory;
+import de.ozgcloud.common.datatype.StringBasedValue;
+
+public class OzgCloudCommandTestFactory {
+
+	public static final OzgCloudCommandId ID = OzgCloudCommandId.from(UUID.randomUUID().toString());
+
+	public static final OzgCloudVorgangId VORGANG_ID = OzgCloudVorgangTestFactory.ID;
+	public static final StringBasedValue RELATION_ID = OzgCloudFileTestFactory.ID;
+	public static final long RELATION_VERSION = 42;
+
+	public static final String ORDER = "CREATE_NOTE";
+	public static final OzgCloudCommandStatus STATUS = OzgCloudCommandStatus.FINISHED;
+
+	private static final String CREATED_AT_STR = "2023-08-18T13:54:10Z";
+	private static final ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR);
+	private static final String FINISHED_AT_STR = "2023-08-18T13:55:10Z";
+	private static final ZonedDateTime FINISHED_AT = ZonedDateTime.parse(FINISHED_AT_STR);
+
+	public static final String BODY_FIELD_NAME = "FIELD";
+	public static final Long BODY_FIELD_VALUE = 42L;
+	private static final Map<String, Object> BODY = Map.of(BODY_FIELD_NAME, BODY_FIELD_VALUE);
+
+	public static OzgCloudCommand create() {
+		return createBuilder().build();
+	}
+
+	public static OzgCloudCommand.OzgCloudCommandBuilder createBuilder() {
+		return OzgCloudCommand.builder()
+				.id(ID)
+				.vorgangId(VORGANG_ID)
+				.relationId(RELATION_ID)
+				.relationVersion(RELATION_VERSION)
+				.order(ORDER)
+				.status(STATUS)
+				.createdAt(CREATED_AT)
+				.finishedAt(FINISHED_AT)
+				.bodyObject(BODY);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/file/OzgCloudFileTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/OzgCloudFileTestFactory.java
new file mode 100644
index 0000000..a04e7af
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/OzgCloudFileTestFactory.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file;
+
+import java.util.UUID;
+
+public class OzgCloudFileTestFactory {
+
+	public static final OzgCloudFileId ID = OzgCloudFileId.from(UUID.randomUUID().toString());
+	public static final String NAME = "testfile.pdf";
+	public static final String CONTENT_TYPE = "application/pdf";
+	public static final long SIZE = 1024;
+
+	public static OzgCloudFile create() {
+		return createBuilder().build();
+	}
+
+	public static OzgCloudFile.OzgCloudFileBuilder createBuilder() {
+		return OzgCloudFile.builder()
+				.id(ID)
+				.name(NAME)
+				.contentType(CONTENT_TYPE)
+				.size(SIZE);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcFindFilesResponseTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcFindFilesResponseTestFactory.java
new file mode 100644
index 0000000..5a66042
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcFindFilesResponseTestFactory.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file.grpc;
+
+import de.ozgcloud.vorgang.grpc.binaryFile.GrpcFindFilesResponse;
+
+public class GrpcFindFilesResponseTestFactory {
+
+	public static GrpcFindFilesResponse create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcFindFilesResponse.Builder createBuilder() {
+		return GrpcFindFilesResponse.newBuilder()
+				.addFile(GrpcOzgFileTestFactory.create());
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileServiceTest.java
new file mode 100644
index 0000000..8bd138d
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgCloudFileServiceTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file.grpc;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+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.mapstruct.factory.Mappers;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import de.ozgcloud.apilib.common.errorhandling.NotFoundException;
+import de.ozgcloud.apilib.file.OzgCloudFileTestFactory;
+import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceBlockingStub;
+import de.ozgcloud.vorgang.grpc.binaryFile.GrpcFindFilesResponse;
+
+class GrpcOzgCloudFileServiceTest {
+
+	@InjectMocks
+	private GrpcOzgCloudFileService service;
+
+	@Mock
+	private BinaryFileServiceBlockingStub blockingStub;
+	@Spy
+	private OzgCloudFileMapper mapper = Mappers.getMapper(OzgCloudFileMapper.class);
+
+	@Nested
+	class TestGetFile {
+
+		@Nested
+		class CallGetFile {
+			@BeforeEach
+			void init() {
+				when(blockingStub.withInterceptors(any())).thenReturn(blockingStub);
+				when(blockingStub.findBinaryFilesMetaData(any())).thenReturn(GrpcFindFilesResponse.newBuilder().addFile(GrpcOzgFileTestFactory.create()).build());
+			}
+
+			@Test
+			void shouldCallStub() {
+				service.getFile(OzgCloudFileTestFactory.ID);
+
+				verify(blockingStub).findBinaryFilesMetaData(any());
+			}
+
+			@Test
+			void shouldCallMapper() {
+				service.getFile(OzgCloudFileTestFactory.ID);
+
+				verify(mapper).fromGrpc(any());
+			}
+		}
+
+		@Nested
+		class BuildFindFileRequest {
+
+			@Test
+			void shouldAddFileId() {
+				var request = service.buildFindFileRequest(OzgCloudFileTestFactory.ID);
+
+				assertThat(request.getFileIdList()).hasSize(1).first().isEqualTo(OzgCloudFileTestFactory.ID.toString());
+			}
+		}
+
+		@Nested
+		class GetSingleResponse {
+			@Test
+			void shouldReturnSingleFile() {
+				var result = service.getSingleResponse(GrpcFindFilesResponseTestFactory.create(), OzgCloudFileTestFactory.ID);
+
+				assertThat(result).usingRecursiveComparison().isEqualTo(GrpcOzgFileTestFactory.create());
+			}
+
+			@Test
+			void shouldReturnFirstFile() {
+				var response = GrpcFindFilesResponseTestFactory.createBuilder().addFile(GrpcOzgFileTestFactory.createBuilder().setId("2").build())
+						.build();
+
+				var result = service.getSingleResponse(response, OzgCloudFileTestFactory.ID);
+
+				assertThat(result).usingRecursiveComparison().isEqualTo(GrpcOzgFileTestFactory.create());
+			}
+
+			@Test
+			void shouldThrowNotFound() {
+				var response = GrpcFindFilesResponseTestFactory.createBuilder().clearFile().build();
+
+				assertThatThrownBy(() -> service.getSingleResponse(response, OzgCloudFileTestFactory.ID))
+						.isInstanceOf(NotFoundException.class);
+			}
+		}
+	}
+
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgFileTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgFileTestFactory.java
new file mode 100644
index 0000000..133d04f
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/file/grpc/GrpcOzgFileTestFactory.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.file.grpc;
+
+import de.ozgcloud.apilib.file.OzgCloudFileTestFactory;
+import de.ozgcloud.vorgang.grpc.file.GrpcOzgFile;
+
+public class GrpcOzgFileTestFactory {
+
+	static GrpcOzgFile create() {
+		return createBuilder().build();
+	}
+
+	static GrpcOzgFile.Builder createBuilder() {
+		return GrpcOzgFile.newBuilder()
+				.setId(OzgCloudFileTestFactory.ID.toString())
+				.setName(OzgCloudFileTestFactory.NAME)
+				.setContentType(OzgCloudFileTestFactory.CONTENT_TYPE)
+				.setSize(OzgCloudFileTestFactory.SIZE);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcGetUserProfileResponseTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcGetUserProfileResponseTestFactory.java
new file mode 100644
index 0000000..de6f929
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcGetUserProfileResponseTestFactory.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.user;
+
+import de.ozgcloud.user.userprofile.GrpcGetUserProfileResponse;
+
+public class GrpcGetUserProfileResponseTestFactory {
+
+	public static GrpcGetUserProfileResponse create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcGetUserProfileResponse.Builder createBuilder() {
+		return GrpcGetUserProfileResponse.newBuilder()
+				.setUserProfile(GrpcUserProfileTestFactory.create());
+	}
+
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcOzgCloudUserProfileServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcOzgCloudUserProfileServiceTest.java
new file mode 100644
index 0000000..4713e58
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcOzgCloudUserProfileServiceTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.user;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+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.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
+import de.ozgcloud.user.grpc.userprofile.UserProfileServiceGrpc.UserProfileServiceBlockingStub;
+import de.ozgcloud.user.userprofile.GrpcGetUserProfileRequest;
+
+class GrpcOzgCloudUserProfileServiceTest {
+
+	@InjectMocks
+	private GrpcOzgCloudUserProfileService service;
+
+	@Mock
+	private UserProfileServiceBlockingStub userProfileServiceStub;
+	@Mock
+	private UserProfileMapper mapper;
+
+	@Mock
+	private OzgCloudCallContextProvider contextProvider;
+
+	@BeforeEach
+	void prepareStubMock() {
+		when(userProfileServiceStub.withInterceptors(any())).thenReturn(userProfileServiceStub);
+	}
+
+	@Nested
+	class TestGetById {
+
+		@Captor
+		private ArgumentCaptor<GrpcGetUserProfileRequest> requestCaptor;
+
+		private OzgCloudUserProfile mappedUserProfile = OzgCloudUserProfileTestFactory.create();
+
+		@BeforeEach
+		void init() {
+			when(userProfileServiceStub.getById(any())).thenReturn(
+					GrpcGetUserProfileResponseTestFactory.create());
+			when(mapper.mapFromGrpc(any())).thenReturn(mappedUserProfile);
+		}
+
+		@Test
+		void shouldCallStub() {
+			service.getById(OzgCloudUserProfileTestFactory.ID);
+
+			verify(userProfileServiceStub).getById(requestCaptor.capture());
+			assertThat(requestCaptor.getValue().getUserId()).isEqualTo(
+					OzgCloudUserProfileTestFactory.ID.toString());
+		}
+
+		@Test
+		void shouldCallMapper() {
+			service.getById(OzgCloudUserProfileTestFactory.ID);
+
+			verify(mapper).mapFromGrpc(any());
+		}
+
+		@Test
+		void shouldReturnResult() {
+			var result = service.getById(OzgCloudUserProfileTestFactory.ID);
+
+			assertThat(result).isSameAs(mappedUserProfile);
+		}
+
+		@Test
+		void shouldAddInterceptor() {
+			service.getById(OzgCloudUserProfileTestFactory.ID);
+
+			verify(userProfileServiceStub).withInterceptors(notNull());
+		}
+	}
+
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcUserProfileTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcUserProfileTestFactory.java
new file mode 100644
index 0000000..bb3edb1
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/user/GrpcUserProfileTestFactory.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.user;
+
+import static de.ozgcloud.apilib.user.OzgCloudUserProfileTestFactory.*;
+
+import de.ozgcloud.user.userprofile.GrpcUserProfile;
+
+public class GrpcUserProfileTestFactory {
+
+	public static GrpcUserProfile create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcUserProfile.Builder createBuilder() {
+		return GrpcUserProfile.newBuilder().setId(ID.toString()).setFirstName(FIRST_NAME)
+				.setLastName(LAST_NAME);
+
+	}
+
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/user/OzgCloudUserProfileTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/user/OzgCloudUserProfileTestFactory.java
new file mode 100644
index 0000000..cceee9c
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/user/OzgCloudUserProfileTestFactory.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.user;
+
+import java.util.UUID;
+
+public class OzgCloudUserProfileTestFactory {
+
+	public static final OzgCloudUserId ID = OzgCloudUserId.from(UUID.randomUUID().toString());
+	public static final String FIRST_NAME = "Theo";
+	public static final String LAST_NAME = "Test";
+	public static final String EMAIL = "theo@local";
+
+	public static OzgCloudUserProfile create() {
+		return createBuilder().build();
+	}
+
+	public static OzgCloudUserProfile.OzgCloudUserProfileBuilder createBuilder() {
+		return OzgCloudUserProfile.builder()
+				.id(ID)
+				.firstName(FIRST_NAME)
+				.lastName(LAST_NAME)
+				.email(EMAIL);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/AttachmentTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/AttachmentTestFactory.java
new file mode 100644
index 0000000..9245078
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/AttachmentTestFactory.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import de.ozgcloud.apilib.file.OzgCloudFileGroup;
+import de.ozgcloud.apilib.file.OzgCloudFileTestFactory;
+
+public class AttachmentTestFactory {
+
+	public static final String GROUP_NAME = "test_attachments";
+
+	public static OzgCloudFileGroup createFileGroup() {
+		return OzgCloudFileGroup.builder()
+				.name(GROUP_NAME)
+				.file(OzgCloudFileTestFactory.create())
+				.build();
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudAntragstellerTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudAntragstellerTestFactory.java
new file mode 100644
index 0000000..3057fe3
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudAntragstellerTestFactory.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+public class OzgCloudAntragstellerTestFactory {
+
+	public static final String ANREDE = "Mr.";
+
+	public static final String FIRSTNAME = "Theo";
+	public static final String NACHNAME = "Test";
+	public static final String GEBURTSDATUM = "10.04.1995";
+	public static final String GEBURTSORT = "Downtown";
+	public static final String GEBURTSNAME = "Toast";
+	public static final String STRASSE = "Treestreet";
+	public static final String HAUSNUMMER = "5a";
+	public static final String PLZ = "12345";
+	public static final String ORT = "City";
+	public static final String E_MAIL = "test@local";
+	public static final String TELEFON = "0123 2354 546";
+
+	public static OzgCloudAntragsteller create() {
+		return createBuilder().build();
+	}
+
+	public static OzgCloudAntragsteller.OzgCloudAntragstellerBuilder createBuilder() {
+		return OzgCloudAntragsteller.builder()
+				.anrede(ANREDE)
+				.vorname(FIRSTNAME)
+				.nachname(NACHNAME)
+				.geburtsdatum(GEBURTSDATUM)
+				.geburtsort(GEBURTSORT)
+				.geburtsname(GEBURTSNAME)
+				.strasse(STRASSE)
+				.hausnummer(HAUSNUMMER)
+				.plz(PLZ)
+				.ort(ORT)
+				.email(E_MAIL)
+				.telefon(TELEFON);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudEingangHeaderTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudEingangHeaderTestFactory.java
new file mode 100644
index 0000000..8e3f334
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudEingangHeaderTestFactory.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.time.ZonedDateTime;
+
+public class OzgCloudEingangHeaderTestFactory {
+
+	public static final String REQUEST_ID = OzgCloudVorgangTestFactory.VORGANG_NAME;
+
+	public static final String CREATED_AT_STR = "2023-04-02T15:00:30Z";
+	public static final ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR);
+	public static final String FORM_ID = "4177";
+	public static final String FORM_NAME = OzgCloudVorgangTestFactory.VORGANG_NAME;
+	public static final String FORM_ENGINE_NAME = "AFM";
+
+	public static OzgCloudEingangHeader create() {
+		return createBuilder().build();
+	}
+
+	public static OzgCloudEingangHeader.OzgCloudEingangHeaderBuilder createBuilder() {
+		return OzgCloudEingangHeader.builder()
+				.requestId(REQUEST_ID)
+				.createdAt(CREATED_AT)
+				.formId(FORM_ID)
+				.formName(FORM_NAME)
+				.formEngineName(FORM_ENGINE_NAME);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangEingangTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangEingangTestFactory.java
new file mode 100644
index 0000000..3eff478
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangEingangTestFactory.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.util.List;
+
+public class OzgCloudVorgangEingangTestFactory {
+
+	public static final String FIELD_NAME = "firstname";
+	public static final String FIELD_LABEL = "Firstname";
+	public static final String FIELD_VALUE = "Klaus";
+
+	public static final String SUB_FORM_NAME = "address";
+	public static final String SUB_FORM_LABEL = "Address";
+	public static final String SUB_FORM_FIELD_NAME = "street";
+	public static final String SUB_FORM_FIELD_LABEL = "Street";
+	public static final String SUB_FORM_FIELD_VALUE = "Mainstreet 5";
+
+	public static OzgCloudEingang create() {
+		return createBuilder().build();
+	}
+
+	public static OzgCloudEingang.OzgCloudEingangBuilder createBuilder() {
+		return OzgCloudEingang.builder()
+				.header(OzgCloudEingangHeaderTestFactory.create())
+				.antragsteller(OzgCloudAntragstellerTestFactory.create())
+				.zustaendigeStelle(OzgCloudZustaendigeStelleTestFactory.create())
+				.attachments(List.of(AttachmentTestFactory.createFileGroup()))
+				.formDataEntrys(List.<OzgCloudFormDataEntry>of(
+						OzgCloudFormField.builder().name(FIELD_NAME).label(FIELD_LABEL).value(FIELD_VALUE).build(),
+						OzgCloudSubForm.builder().name(SUB_FORM_NAME).label(SUB_FORM_LABEL)
+								.formEntry(OzgCloudFormField.builder()
+										.name(SUB_FORM_FIELD_NAME)
+										.label(SUB_FORM_FIELD_LABEL)
+										.value(SUB_FORM_FIELD_VALUE).build())
+								.build()));
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeaderTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeaderTestFactory.java
new file mode 100644
index 0000000..7dcb06e
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangHeaderTestFactory.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.time.ZonedDateTime;
+import java.util.UUID;
+
+import de.ozgcloud.apilib.user.OzgCloudUserId;
+
+public class OzgCloudVorgangHeaderTestFactory {
+
+	public static OzgCloudVorgangStatus STATUS = OzgCloudVorgangStatus.from("WORKING");
+	public static String CREATED_AT_STR = "2023-04-01T10:00:15Z";
+	public static ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR);
+	public static OzgCloudUserId ASSIGNED_TO = OzgCloudUserId.from(UUID.randomUUID().toString());
+	public static String AKTENZEICHEN = "DE_12345_XY";
+
+	public static OzgCloudVorgangHeader create() {
+		return createBuilder().build();
+	}
+
+	public static OzgCloudVorgangHeader.OzgCloudVorgangHeaderBuilder createBuilder() {
+		return OzgCloudVorgangHeader.builder()
+				.status(STATUS)
+				.createdAt(CREATED_AT)
+				.assignedTo(ASSIGNED_TO)
+				.aktenzeichen(AKTENZEICHEN);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStubTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStubTestFactory.java
new file mode 100644
index 0000000..c1d68b8
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStubTestFactory.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+public class OzgCloudVorgangStubTestFactory {
+
+	public static OzgCloudVorgangStub create() {
+		return createBuilder().build();
+	}
+
+	public static OzgCloudVorgangStub.OzgCloudVorgangStubBuilder createBuilder() {
+		return OzgCloudVorgangStub.builder();
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangTestFactory.java
new file mode 100644
index 0000000..95f635e
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangTestFactory.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+import java.util.UUID;
+
+public class OzgCloudVorgangTestFactory {
+
+	public static final OzgCloudVorgangId ID = OzgCloudVorgangId.from(UUID.randomUUID().toString());
+	public static final long VERSION = 42L;
+
+	public static final String VORGANG_NAME = "Antrag auf Waffelschein";
+	public static final String VORGANG_NUMMER = "123-abc-XY";
+
+	public static OzgCloudVorgang create() {
+		return createBuilder().build();
+	}
+
+	public static OzgCloudVorgang.OzgCloudVorgangBuilder createBuilder() {
+		return OzgCloudVorgang.builder()
+				.id(ID)
+				.version(VERSION)
+				.vorgangName(VORGANG_NAME)
+				.vorgangNummer(VORGANG_NUMMER)
+				.header(OzgCloudVorgangHeaderTestFactory.create())
+				.eingang(OzgCloudVorgangEingangTestFactory.create());
+
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudZustaendigeStelleTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudZustaendigeStelleTestFactory.java
new file mode 100644
index 0000000..f857f20
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudZustaendigeStelleTestFactory.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang;
+
+public class OzgCloudZustaendigeStelleTestFactory {
+
+	public static final String ORGANISATIONS_EINHEIT_ID = "12345";
+	public static final String BEZEICHNUNG = "Amt für Dinge";
+	public static final String EMAIL = "amt@local";
+
+	public static OzgCloudZustaendigeStelle create() {
+		return createBuilder().build();
+	}
+
+	public static OzgCloudZustaendigeStelle.OzgCloudZustaendigeStelleBuilder createBuilder() {
+		return OzgCloudZustaendigeStelle.builder()
+				.organisationsEinheitId(ORGANISATIONS_EINHEIT_ID)
+				.bezeichnung(BEZEICHNUNG)
+				.email(EMAIL);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcAntragstellerTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcAntragstellerTestFactory.java
new file mode 100644
index 0000000..cca51d9
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcAntragstellerTestFactory.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import static de.ozgcloud.apilib.vorgang.OzgCloudAntragstellerTestFactory.*;
+
+import de.ozgcloud.vorgang.vorgang.GrpcAntragsteller;
+
+public class GrpcAntragstellerTestFactory {
+
+	public static GrpcAntragsteller create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcAntragsteller.Builder createBuilder() {
+		return GrpcAntragsteller.newBuilder()
+				.setAnrede(ANREDE)
+				.setVorname(FIRSTNAME)
+				.setNachname(NACHNAME)
+				.setGeburtsdatum(GEBURTSDATUM)
+				.setGeburtsort(GEBURTSORT)
+				.setGeburtsname(GEBURTSNAME)
+				.setStrasse(STRASSE)
+				.setHausnummer(HAUSNUMMER)
+				.setPlz(PLZ)
+				.setOrt(ORT)
+				.setEmail(E_MAIL)
+				.setTelefon(TELEFON);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcEingangHeaderTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcEingangHeaderTestFactory.java
new file mode 100644
index 0000000..8be5928
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcEingangHeaderTestFactory.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import static de.ozgcloud.apilib.vorgang.OzgCloudEingangHeaderTestFactory.*;
+
+import de.ozgcloud.vorgang.vorgang.GrpcEingangHeader;
+
+public class GrpcEingangHeaderTestFactory {
+
+	public static GrpcEingangHeader create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcEingangHeader.Builder createBuilder() {
+		return GrpcEingangHeader.newBuilder()
+				.setRequestId(REQUEST_ID)
+				.setCreatedAt(CREATED_AT_STR)
+				.setFormId(FORM_ID)
+				.setFormName(FORM_NAME)
+				.setFormEngineName(FORM_ENGINE_NAME);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcEingangTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcEingangTestFactory.java
new file mode 100644
index 0000000..6f44e38
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcEingangTestFactory.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import static de.ozgcloud.apilib.vorgang.OzgCloudVorgangEingangTestFactory.*;
+
+import de.ozgcloud.vorgang.vorgang.GrpcEingang;
+import de.ozgcloud.vorgang.vorgang.GrpcFormData;
+import de.ozgcloud.vorgang.vorgang.GrpcFormField;
+import de.ozgcloud.vorgang.vorgang.GrpcSubForm;
+
+public class GrpcEingangTestFactory {
+
+	public static GrpcEingang create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcEingang.Builder createBuilder() {
+		return GrpcEingang.newBuilder()
+				.setHeader(GrpcEingangHeaderTestFactory.create())
+				.setAntragsteller(GrpcAntragstellerTestFactory.create())
+				.setZustaendigeStelle(GrpcZustaendigeStelleTestFactory.create())
+				.setFormData(createFormData());
+	}
+
+	public static GrpcFormData createFormData() {
+		return GrpcFormData.newBuilder()
+				.addField(GrpcFormField.newBuilder().setName(FIELD_NAME).setLabel(FIELD_LABEL).setValue(FIELD_VALUE).build())
+				.addForm(GrpcSubForm.newBuilder().setTitle(SUB_FORM_NAME).setLabel(SUB_FORM_LABEL)
+						.addField(GrpcFormField.newBuilder()
+								.setName(SUB_FORM_FIELD_NAME)
+								.setLabel(SUB_FORM_FIELD_LABEL)
+								.setValue(SUB_FORM_FIELD_VALUE).build()))
+				.build();
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindVorgangWithEingangResponseTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindVorgangWithEingangResponseTestFactory.java
new file mode 100644
index 0000000..dc7828c
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindVorgangWithEingangResponseTestFactory.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangResponse;
+
+public class GrpcFindVorgangWithEingangResponseTestFactory {
+
+	public static GrpcFindVorgangWithEingangResponse create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcFindVorgangWithEingangResponse.Builder createBuilder() {
+		return GrpcFindVorgangWithEingangResponse.newBuilder()
+				.setVorgangWithEingang(GrpcVorgangWithEingangTestFactory.create());
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java
new file mode 100644
index 0000000..717c672
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+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.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStubTestFactory;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangTestFactory;
+import de.ozgcloud.apilib.vorgang.Page;
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangRequest;
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangResponse;
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangRequest;
+import de.ozgcloud.vorgang.vorgang.GrpcVorgangHeader;
+import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
+
+class GrpcOzgCloudVorgangServiceTest {
+
+	@InjectMocks
+	private GrpcOzgCloudVorgangService service;
+
+	@Mock
+	private VorgangServiceBlockingStub stub;
+	@Mock
+	private OzgCloudVorgangMapper mapper;
+	@Mock
+	private OzgCloudVorgangStubMapper stubMapper;
+
+	@Nested
+	class TestGetById {
+		@Captor
+		private ArgumentCaptor<GrpcFindVorgangWithEingangRequest> requestCaptor;
+
+		@BeforeEach
+		void init() {
+			when(stub.withInterceptors(any())).thenReturn(stub);
+			when(stub.findVorgangWithEingang(any())).thenReturn(GrpcFindVorgangWithEingangResponseTestFactory.create());
+		}
+
+		@Test
+		void shouldCallStub() {
+			service.getById(OzgCloudVorgangTestFactory.ID);
+
+			verify(stub).findVorgangWithEingang(notNull());
+		}
+
+		@Test
+		void shouldHaveVorgangId() {
+			service.getById(OzgCloudVorgangTestFactory.ID);
+
+			verify(stub).findVorgangWithEingang(requestCaptor.capture());
+			assertThat(requestCaptor.getValue().getId()).isEqualTo(OzgCloudVorgangTestFactory.ID.toString());
+		}
+
+		@Test
+		void shouldMapResponse() {
+			service.getById(OzgCloudVorgangTestFactory.ID);
+
+			verify(mapper).fromGrpc(any());
+		}
+
+		@Test
+		void shouldReturnMappedVorgang() {
+			var vorgang = OzgCloudVorgangTestFactory.create();
+			when(mapper.fromGrpc(any())).thenReturn(vorgang);
+
+			var result = service.getById(OzgCloudVorgangTestFactory.ID);
+
+			assertThat(result).isSameAs(vorgang);
+		}
+	}
+
+	@Nested
+	class TestSearch {
+
+		private static final String SEARCH_STR = "search";
+
+		@Captor
+		private ArgumentCaptor<GrpcFindVorgangRequest> requestCaptor;
+
+		@Nested
+		class BuildSearchRequest {
+			private static final Page PAGE = Page.builder().limit(40).offset(21).build();
+
+			@Test
+			void shouldSetSearchString() {
+				var request = service.buildSearchRequest(SEARCH_STR, PAGE);
+
+				assertThat(request.getSearchBy()).isEqualTo(SEARCH_STR);
+			}
+
+			@Test
+			void shouldSetLimit() {
+				var request = service.buildSearchRequest(SEARCH_STR, PAGE);
+
+				assertThat(request.getLimit()).isEqualTo(40);
+			}
+
+			@Test
+			void shouldSetOffset() {
+				var request = service.buildSearchRequest(SEARCH_STR, PAGE);
+
+				assertThat(request.getOffset()).isEqualTo(21);
+			}
+		}
+
+		@Nested
+		class doingRequest {
+
+			private static final GrpcVorgangHeader VORGANG = GrpcVorgangHeaderTestFactory.create();
+			private static final GrpcFindVorgangResponse RESPONSE = GrpcFindVorgangResponse.newBuilder()
+					.addVorgang(VORGANG).build();
+
+			@BeforeEach
+			void init() {
+				when(stub.withInterceptors(any())).thenReturn(stub);
+				when(stub.findVorgang(any())).thenReturn(RESPONSE);
+			}
+
+			@Test
+			void shouldCallStub() {
+				service.search(SEARCH_STR);
+
+				verify(stub).findVorgang(notNull());
+			}
+
+			@Test
+			void shouldMapResponse() {
+				service.search(SEARCH_STR);
+
+				verify(stubMapper).fromGrpc(notNull());
+			}
+
+			@Test
+			void shouldReturnResult() {
+				var vorgang = OzgCloudVorgangStubTestFactory.create();
+				when(stubMapper.fromGrpc(any())).thenReturn(vorgang);
+
+				var result = service.search(SEARCH_STR);
+
+				assertThat(result).contains(vorgang);
+			}
+		}
+
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcServiceKontoTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcServiceKontoTestFactory.java
new file mode 100644
index 0000000..3bd40fd
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcServiceKontoTestFactory.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import de.ozgcloud.vorgang.common.GrpcObject;
+import de.ozgcloud.vorgang.common.GrpcProperty;
+import de.ozgcloud.vorgang.vorgang.GrpcPostfachAddress;
+import de.ozgcloud.vorgang.vorgang.GrpcServiceKonto;
+
+public class GrpcServiceKontoTestFactory {
+
+	public static final String TYPE = "OSI";
+	public static final String VERSION = "1.0";
+
+	public static GrpcServiceKonto create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcServiceKonto.Builder createBuilder() {
+		return GrpcServiceKonto.newBuilder()
+				.setType(TYPE)
+				.addPostfachAddresses(GrpcPostfachAddress.newBuilder()
+						.setVersion(VERSION)
+						.setIdentifier(GrpcObject.newBuilder().addProperty(GrpcProperty.newBuilder()
+								.setName("postfachId").addValue("0815").build())));
+	}
+
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangHeadTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangHeadTestFactory.java
new file mode 100644
index 0000000..118eb4b
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangHeadTestFactory.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import de.ozgcloud.vorgang.vorgang.GrpcVorgangHead;
+
+public class GrpcVorgangHeadTestFactory {
+
+	public static GrpcVorgangHead create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcVorgangHead.Builder createBuilder() {
+		return GrpcVorgangHead.newBuilder()
+				.setServiceKonto(GrpcServiceKontoTestFactory.create());
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangHeaderTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangHeaderTestFactory.java
new file mode 100644
index 0000000..fd4a0d9
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangHeaderTestFactory.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import static de.ozgcloud.apilib.vorgang.OzgCloudVorgangHeaderTestFactory.*;
+import static de.ozgcloud.apilib.vorgang.OzgCloudVorgangTestFactory.*;
+
+import de.ozgcloud.vorgang.vorgang.GrpcVorgangHeader;
+
+public class GrpcVorgangHeaderTestFactory {
+
+	public static GrpcVorgangHeader create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcVorgangHeader.Builder createBuilder() {
+		return GrpcVorgangHeader.newBuilder()
+				.setId(ID.toString())
+				.setVersion(VERSION)
+				.setStatus(STATUS.toString())
+				.setName(VORGANG_NAME)
+				.setCreatedAt(CREATED_AT_STR)
+				.setAktenzeichen(AKTENZEICHEN)
+				.setAssignedTo(ASSIGNED_TO.toString())
+				.setNummer(VORGANG_NUMMER);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangWithEingangTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangWithEingangTestFactory.java
new file mode 100644
index 0000000..648af88
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcVorgangWithEingangTestFactory.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import static de.ozgcloud.apilib.vorgang.OzgCloudVorgangHeaderTestFactory.*;
+import static de.ozgcloud.apilib.vorgang.OzgCloudVorgangTestFactory.*;
+
+import de.ozgcloud.vorgang.vorgang.GrpcVorgangWithEingang;
+
+public class GrpcVorgangWithEingangTestFactory {
+
+	public static GrpcVorgangWithEingang create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcVorgangWithEingang.Builder createBuilder() {
+		return GrpcVorgangWithEingang.newBuilder()
+				.setId(ID.toString())
+				.setVersion(VERSION)
+				.setName(VORGANG_NAME)
+				.setNummer(VORGANG_NUMMER)
+				.setAktenzeichen(AKTENZEICHEN)
+				.setAssignedTo(ASSIGNED_TO.toString())
+				.setCreatedAt(CREATED_AT_STR)
+				.setStatus(STATUS.toString())
+				.setHeader(GrpcVorgangHeadTestFactory.create())
+				.setEingang(GrpcEingangTestFactory.create());
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcZustaendigeStelleTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcZustaendigeStelleTestFactory.java
new file mode 100644
index 0000000..533d946
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcZustaendigeStelleTestFactory.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import static de.ozgcloud.apilib.vorgang.OzgCloudZustaendigeStelleTestFactory.*;
+
+import de.ozgcloud.vorgang.vorgang.GrpcZustaendigeStelle;
+
+public class GrpcZustaendigeStelleTestFactory {
+
+	public static GrpcZustaendigeStelle create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcZustaendigeStelle.Builder createBuilder() {
+		return GrpcZustaendigeStelle.newBuilder()
+				.setOrganisationseinheitenId(ORGANISATIONS_EINHEIT_ID)
+				.setBezeichnung(BEZEICHNUNG)
+				.setEmail(EMAIL);
+	}
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapperTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapperTest.java
new file mode 100644
index 0000000..3c85084
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangMapperTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.vorgang.grpc;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+import org.mockito.InjectMocks;
+import org.mockito.Spy;
+
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangEingangTestFactory;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangHeaderTestFactory;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangTestFactory;
+
+class OzgCloudVorgangMapperTest {
+
+	@InjectMocks
+	private OzgCloudVorgangMapper mapper = Mappers.getMapper(OzgCloudVorgangMapper.class);
+
+	@Spy
+	private OzgCloudEingangMapper eingangMapper = Mappers.getMapper(OzgCloudEingangMapper.class);
+	@Spy
+	private OzgCloudVorgangIdMapper idMapper = Mappers.getMapper(OzgCloudVorgangIdMapper.class);
+
+	@Nested
+	class TestFromGrpc {
+		@Test
+		void shouldMapVorgangStub() {
+			var mapped = mapper.fromGrpc(GrpcVorgangWithEingangTestFactory.create());
+
+			assertThat(mapped).usingRecursiveComparison()
+					.ignoringFields("eingangs", "header")
+					.isEqualTo(OzgCloudVorgangTestFactory.create());
+		}
+
+		@Test
+		void shouldMapHeader() {
+			var mapped = mapper.fromGrpc(GrpcVorgangWithEingangTestFactory.create());
+
+			assertThat(mapped.getHeader()).usingRecursiveComparison()
+					.isEqualTo(OzgCloudVorgangHeaderTestFactory.create());
+		}
+
+		@Test
+		void shouldMapEingang() {
+			var mapped = mapper.fromGrpc(GrpcVorgangWithEingangTestFactory.create());
+
+			assertThat(mapped.getEingangs()).hasSize(1).first()
+					.usingRecursiveComparison().ignoringFields("attachments")
+					.isEqualTo(OzgCloudVorgangEingangTestFactory.create());
+		}
+	}
+
+}
diff --git a/api-lib-core/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/api-lib-core/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension
new file mode 100644
index 0000000..79b126e
--- /dev/null
+++ b/api-lib-core/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/api-lib-core/src/test/resources/junit-platform.properties b/api-lib-core/src/test/resources/junit-platform.properties
new file mode 100644
index 0000000..1cebb76
--- /dev/null
+++ b/api-lib-core/src/test/resources/junit-platform.properties
@@ -0,0 +1 @@
+junit.jupiter.extensions.autodetection.enabled = true
\ No newline at end of file
diff --git a/api-lib-demo/pom.xml b/api-lib-demo/pom.xml
new file mode 100644
index 0000000..9023685
--- /dev/null
+++ b/api-lib-demo/pom.xml
@@ -0,0 +1,44 @@
+<!--
+
+    Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+    Ministerpräsidenten des Landes Schleswig-Holstein
+    Staatskanzlei
+    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+
+    Lizenziert unter der EUPL, Version 1.2 oder - sobald
+    diese von der Europäischen Kommission genehmigt wurden -
+    Folgeversionen der EUPL ("Lizenz");
+    Sie dürfen dieses Werk ausschließlich gemäß
+    dieser Lizenz nutzen.
+    Eine Kopie der Lizenz finden Sie hier:
+
+    https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+
+    Sofern nicht durch anwendbare Rechtsvorschriften
+    gefordert oder in schriftlicher Form vereinbart, wird
+    die unter der Lizenz verbreitete Software "so wie sie
+    ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+    ausdrücklich oder stillschweigend - verbreitet.
+    Die sprachspezifischen Genehmigungen und Beschränkungen
+    unter der Lizenz sind dem Lizenztext zu entnehmen.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>de.ozgcloud.api-lib</groupId>
+		<artifactId>api-lib-parent</artifactId>
+		<version>0.5.0</version>
+	</parent>
+	<artifactId>api-lib-demo</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>de.ozgcloud.api-lib</groupId>
+			<artifactId>ozg-cloud-spring-boot-starter</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+	</dependencies>
+</project>
\ No newline at end of file
diff --git a/api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoApplication.java b/api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoApplication.java
new file mode 100644
index 0000000..16ea206
--- /dev/null
+++ b/api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoApplication.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(DemoApplication.class, args);
+	}
+}
diff --git a/api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoRunner.java b/api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoRunner.java
new file mode 100644
index 0000000..cf89d0b
--- /dev/null
+++ b/api-lib-demo/src/main/java/de/ozgcloud/apilib/demo/DemoRunner.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.demo;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.apilib.alfa.AlfaService;
+import de.ozgcloud.apilib.file.OzgCloudFileService;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService;
+
+@Component
+class DemoRunner implements ApplicationListener<ContextRefreshedEvent> {
+
+	private static final OzgCloudVorgangId VORGANG_ID = OzgCloudVorgangId.from("64e889ba8e24a914a1628047");
+
+	@Autowired
+	private OzgCloudVorgangService vorgangService;
+	@Autowired
+	private OzgCloudFileService fileService;
+	@Autowired
+	private AlfaService alfaService;
+
+	@Override
+	public void onApplicationEvent(ContextRefreshedEvent event) {
+		System.out.println(vorgangService.search("Deutschland"));
+
+		System.out.println(vorgangService.getById(VORGANG_ID));
+
+		alfaService.addAktenNotiz(VORGANG_ID, "Hello World!");
+	}
+
+}
diff --git a/api-lib-demo/src/main/resources/application.yml b/api-lib-demo/src/main/resources/application.yml
new file mode 100644
index 0000000..72dc612
--- /dev/null
+++ b/api-lib-demo/src/main/resources/application.yml
@@ -0,0 +1,11 @@
+ozgcloud:
+  vorgang-manager:
+    address: static://127.0.0.1:9090
+#    address: nordfriesland-pluto-grpc.test.by.ozg-cloud.de:443
+    negotiation-type: plaintext
+  file-manager:
+    address: ${ozgcloud.vorgang-manager.address}
+    negotiation-type: plaintext
+  command-manager:
+    address: ${ozgcloud.vorgang-manager.address}
+    negotiation-type: plaintext
\ No newline at end of file
diff --git a/lombok.config b/lombok.config
new file mode 100644
index 0000000..b7309c6
--- /dev/null
+++ b/lombok.config
@@ -0,0 +1,32 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+lombok.log.fieldName=LOG
+lombok.log.slf4j.flagUsage = ERROR
+lombok.log.log4j.flagUsage = ERROR
+lombok.data.flagUsage = ERROR
+lombok.nonNull.exceptionType = IllegalArgumentException
+lombok.addLombokGeneratedAnnotation = true
+
+lombok.copyableAnnotations += net.devh.boot.grpc.client.inject.GrpcClient
\ No newline at end of file
diff --git a/ozg-cloud-spring-boot-starter/pom.xml b/ozg-cloud-spring-boot-starter/pom.xml
new file mode 100644
index 0000000..ee0ec18
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/pom.xml
@@ -0,0 +1,87 @@
+<!--
+
+    Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+    Ministerpräsidenten des Landes Schleswig-Holstein
+    Staatskanzlei
+    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+
+    Lizenziert unter der EUPL, Version 1.2 oder - sobald
+    diese von der Europäischen Kommission genehmigt wurden -
+    Folgeversionen der EUPL ("Lizenz");
+    Sie dürfen dieses Werk ausschließlich gemäß
+    dieser Lizenz nutzen.
+    Eine Kopie der Lizenz finden Sie hier:
+
+    https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+
+    Sofern nicht durch anwendbare Rechtsvorschriften
+    gefordert oder in schriftlicher Form vereinbart, wird
+    die unter der Lizenz verbreitete Software "so wie sie
+    ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+    ausdrücklich oder stillschweigend - verbreitet.
+    Die sprachspezifischen Genehmigungen und Beschränkungen
+    unter der Lizenz sind dem Lizenztext zu entnehmen.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>de.ozgcloud.api-lib</groupId>
+		<artifactId>api-lib-parent</artifactId>
+		<version>0.5.0</version>
+	</parent>
+	<artifactId>ozg-cloud-spring-boot-starter</artifactId>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-autoconfigure</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>net.devh</groupId>
+			<artifactId>grpc-client-spring-boot-starter</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>de.ozgcloud.api-lib</groupId>
+			<artifactId>api-lib-core</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+
+		<!--Test -->
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-test-autoconfigure</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.assertj</groupId>
+			<artifactId>assertj-core</artifactId>
+		</dependency>
+
+		<!-- dev-tools -->
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-configuration-processor</artifactId>
+			<optional>true</optional>
+		</dependency>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<optional>true</optional>
+		</dependency>
+	</dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/GrpcChannelConfigurator.java b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/GrpcChannelConfigurator.java
new file mode 100644
index 0000000..8fbd43e
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/GrpcChannelConfigurator.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.client.autoconfigure;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.ToString;
+import net.devh.boot.grpc.client.config.GrpcChannelProperties;
+import net.devh.boot.grpc.client.config.GrpcChannelsProperties;
+import net.devh.boot.grpc.client.config.NegotiationType;
+
+@ToString
+@Builder
+@Getter
+public class GrpcChannelConfigurator {
+
+	private String clientName;
+	private String address;
+	private NegotiationType negotiationType;
+
+	public void addToProperties(GrpcChannelsProperties properties) {
+		var clientMap = properties.getClient();
+
+		var channelProps = new GrpcChannelProperties();
+		channelProps.setAddress(address);
+		channelProps.setNegotiationType(negotiationType);
+
+		clientMap.put(clientName, channelProps);
+	}
+}
diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java
new file mode 100644
index 0000000..e022bb9
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.client.autoconfigure;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.mapstruct.factory.Mappers;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Import;
+
+import de.ozgcloud.apilib.alfa.AlfaService;
+import de.ozgcloud.apilib.alfa.CommandAlfaService;
+import de.ozgcloud.apilib.alfa.dummy.DummyAlfaService;
+import de.ozgcloud.apilib.common.callcontext.DefaultOzgCloudCallContextProvider;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
+import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
+import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
+import de.ozgcloud.apilib.common.command.grpc.GrpcOzgCloudCommandService;
+import de.ozgcloud.apilib.file.dummy.DummyOzgCloudFileService;
+import de.ozgcloud.apilib.file.grpc.GrpcOzgCloudFileService;
+import de.ozgcloud.apilib.user.UserProfileMapper;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService;
+import de.ozgcloud.apilib.vorgang.dummy.DummyVorgangService;
+import de.ozgcloud.apilib.vorgang.grpc.GrpcOzgCloudVorgangService;
+import de.ozgcloud.apilib.vorgang.grpc.OzgCloudVorgangMapper;
+import de.ozgcloud.apilib.vorgang.grpc.OzgCloudVorgangStubMapper;
+import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc;
+import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
+import io.grpc.ManagedChannelBuilder;
+import net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration;
+import net.devh.boot.grpc.client.config.GrpcChannelProperties;
+import net.devh.boot.grpc.client.config.GrpcChannelsProperties;
+
+@AutoConfiguration(before = GrpcClientAutoConfiguration.class)
+@ComponentScan("de.ozgcloud.client.autoconfigure")
+@Import({
+		GrpcOzgCloudFileService.class, DummyOzgCloudFileService.class,
+		OzgCloudCallContextAttachingInterceptor.class
+})
+
+public class OzgCloudClientAutoConfiguration {
+
+	private static final String CLIENT_NAME_VORGANG_MANAGER = "vorgang-manager";
+	private static final String CLIENT_NAME_FILE_MANAGER = "file-manager";
+	private static final String CLIENT_NAME_COMMAND_MANAGER = "ozgcloud-command-manager";
+	private static final String CLIENT_NAME_USER_MANAGER = "ozgcloud-user-manager";
+
+	@Autowired
+	private OzgCloudVorgangManagerProperties vorgangManagerProperties;
+	@Autowired
+	private OzgCloudFileManagerProperties fileManagerProperties;
+	@Autowired
+	private OzgCloudCommandManagerProperties commandManagerProperties;
+	@Autowired
+	private OzgCloudUserManagerProperties userManagerProperties;
+
+	// @Bean
+	// @ConditionalOnProperty("ozgcloud.vorgang-manager.address")
+	GrpcChannelsProperties channelProperties(GrpcChannelsProperties properties) {
+		// var properties = new GrpcChannelsProperties();
+		var clientMap = properties.getClient();
+
+		addVorgangManager(clientMap);
+		addFileManager(clientMap);
+		addCommandManager(clientMap);
+
+		return properties;
+	}
+
+	@Bean
+	@ConditionalOnProperty("ozgcloud.command-manager.address")
+	GrpcChannelConfigurator commandConfigurator() {
+		return GrpcChannelConfigurator.builder()
+				.clientName(CLIENT_NAME_COMMAND_MANAGER)
+				.address(commandManagerProperties.getAddress())
+				.negotiationType(commandManagerProperties.getNegotiationType())
+				.build();
+	}
+
+	@Bean
+	@ConditionalOnProperty("ozgcloud.user-manager.address")
+	GrpcChannelConfigurator userManagerConfigurator() {
+		return GrpcChannelConfigurator.builder()
+				.clientName(CLIENT_NAME_USER_MANAGER)
+				.address(userManagerProperties.getAddress())
+				.negotiationType(userManagerProperties.getNegotiationType())
+				.build();
+	}
+
+	@Bean
+	GrpcChannelsProperties clientProperties(Collection<GrpcChannelConfigurator> configurators) {
+		var properties = new GrpcChannelsProperties();
+		configurators.stream().forEach(configurator -> configurator.addToProperties(properties));
+
+		return properties;
+	}
+
+	private void addVorgangManager(Map<String, GrpcChannelProperties> clientMap) {
+		var channelProps = new GrpcChannelProperties();
+		channelProps.setAddress(vorgangManagerProperties.getAddress());
+		channelProps.setNegotiationType(vorgangManagerProperties.getNegotiationType());
+
+		clientMap.put(CLIENT_NAME_VORGANG_MANAGER, channelProps);
+	}
+
+	private void addFileManager(Map<String, GrpcChannelProperties> clientMap) {
+		var channelProps = new GrpcChannelProperties();
+		channelProps.setAddress(fileManagerProperties.getAddress());
+		channelProps.setNegotiationType(fileManagerProperties.getNegotiationType());
+
+		clientMap.put(CLIENT_NAME_FILE_MANAGER, channelProps);
+	}
+
+	private void addCommandManager(Map<String, GrpcChannelProperties> clientMap) {
+		var channelProps = new GrpcChannelProperties();
+		channelProps.setAddress(commandManagerProperties.getAddress());
+		channelProps.setNegotiationType(commandManagerProperties.getNegotiationType());
+
+		clientMap.put(CLIENT_NAME_COMMAND_MANAGER, channelProps);
+	}
+
+	@Bean
+	@ConditionalOnMissingBean
+	OzgCloudCallContextProvider callContextProvider(ApplicationContext ctxt) {
+		return new DefaultOzgCloudCallContextProvider(ctxt);
+	}
+
+	@Bean("ozgCloudVorgangService")
+	@ConditionalOnProperty("ozgcloud.vorgang-manager.address")
+	OzgCloudVorgangService grpcOzgCloudVorgangService(VorgangServiceBlockingStub vorgangServiceStub,
+			OzgCloudVorgangMapper mapper,
+			OzgCloudVorgangStubMapper stubMapper, OzgCloudCallContextProvider contextProvider) {
+
+		return new GrpcOzgCloudVorgangService(vorgangServiceStub, mapper, stubMapper, contextProvider);
+	}
+
+	@Bean
+	OzgCloudVorgangMapper ozgCloudVorgangMapper() {
+		return Mappers.getMapper(OzgCloudVorgangMapper.class);
+	}
+
+	@Bean
+	OzgCloudVorgangStubMapper ozgCloudVorgangStubMapper() {
+		return Mappers.getMapper(OzgCloudVorgangStubMapper.class);
+	}
+
+	@Bean("ozgCloudVorgangService")
+	@ConditionalOnMissingBean(OzgCloudVorgangService.class)
+	OzgCloudVorgangService dummyOzgCloudVorgangService() {
+		return new DummyVorgangService();
+	}
+
+	@Bean
+	OzgCloudVorgangIdMapper ozgCloudVorgangIdMapper() {
+		return Mappers.getMapper(OzgCloudVorgangIdMapper.class);
+	}
+
+	@Bean
+	UserProfileMapper ozgCloudUserProfileMapper() {
+		return Mappers.getMapper(UserProfileMapper.class);
+	}
+
+	@Bean
+	@ConditionalOnProperty("ozgcloud.command-manager.address")
+	OzgCloudCommandService grpcOzgCloudCommandService(CommandMapper commandMapper, OzgCloudCallContextProvider contextProvider) {
+		var channel = ManagedChannelBuilder.forTarget(commandManagerProperties.getAddress()).usePlaintext().build();
+
+		var commandServiceStub = CommandServiceGrpc.newBlockingStub(channel);
+
+		return new GrpcOzgCloudCommandService(commandServiceStub, commandMapper, contextProvider,
+				GrpcOzgCloudCommandService.DEFAULT_COMMAND_REQUEST_THRESHOLD_MILLIS);
+	}
+
+	@Bean
+	@ConditionalOnProperty("ozgcloud.command-manager.address")
+	CommandMapper commandMapper() {
+		return Mappers.getMapper(CommandMapper.class);
+	}
+
+	@Bean
+	@ConditionalOnProperty("ozgcloud.command-manager.address")
+	AlfaService commandAlfaService(OzgCloudCommandService commandService) {
+		return new CommandAlfaService(commandService);
+	}
+
+	@Bean
+	@ConditionalOnMissingBean
+	AlfaService alfaService() {
+		return new DummyAlfaService();
+	}
+
+//	@Bean
+//	@ConditionalOnProperty("ozgcloud.user-manager.address")
+//	OzgCloudUserProfileService grpcOzgCloudUserProfileService(@GrpcClient("ozgcloud-user-manager") UserProfileServiceBlockingStub grpcStub,
+//			UserProfileMapper mapper) {
+//		System.out.println("#### building UM-ProfileService");
+//		return new GrpcOzgCloudUserProfileService(grpcStub, mapper);
+//	}
+}
diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java.orig b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java.orig
new file mode 100644
index 0000000..bc32aeb
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudClientAutoConfiguration.java.orig
@@ -0,0 +1,201 @@
+package de.ozgcloud.client.autoconfigure;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.mapstruct.factory.Mappers;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Import;
+
+import de.ozgcloud.apilib.alfa.AlfaService;
+import de.ozgcloud.apilib.alfa.CommandAlfaService;
+import de.ozgcloud.apilib.alfa.dummy.DummyAlfaService;
+import de.ozgcloud.apilib.common.callcontext.DefaultOzgCloudCallContextProvider;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor;
+import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
+import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
+import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
+import de.ozgcloud.apilib.common.command.grpc.GrpcOzgCloudCommandService;
+import de.ozgcloud.apilib.file.dummy.DummyOzgCloudFileService;
+import de.ozgcloud.apilib.file.grpc.GrpcOzgCloudFileService;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService;
+import de.ozgcloud.apilib.vorgang.dummy.DummyVorgangService;
+import de.ozgcloud.apilib.vorgang.grpc.GrpcOzgCloudVorgangService;
+import de.ozgcloud.apilib.vorgang.grpc.OzgCloudVorgangMapper;
+import de.ozgcloud.apilib.vorgang.grpc.OzgCloudVorgangStubMapper;
+import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
+import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
+import net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration;
+import net.devh.boot.grpc.client.config.GrpcChannelProperties;
+import net.devh.boot.grpc.client.config.GrpcChannelsProperties;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+
+@AutoConfiguration(before = GrpcClientAutoConfiguration.class)
+@ComponentScan("de.ozgcloud.client.autoconfigure")
+@Import({
+		GrpcOzgCloudFileService.class, DummyOzgCloudFileService.class,
+		OzgCloudCallContextAttachingInterceptor.class
+})
+
+public class OzgCloudClientAutoConfiguration {
+
+	private static final String CLIENT_NAME_VORGANG_MANAGER = "vorgang-manager";
+	private static final String CLIENT_NAME_FILE_MANAGER = "file-manager";
+	private static final String CLIENT_NAME_COMMAND_MANAGER = "command-manager";
+
+	@Autowired
+	private OzgCloudVorgangManagerProperties vorgangManagerProperties;
+	@Autowired
+	private OzgCloudFileManagerProperties fileManagerProperties;
+	@Autowired
+	private OzgCloudCommandManagerProperties commandManagerProperties;
+
+	// @Bean
+	// @ConditionalOnProperty("ozgcloud.vorgang-manager.address")
+	GrpcChannelsProperties channelProperties(GrpcChannelsProperties properties) {
+		// var properties = new GrpcChannelsProperties();
+		var clientMap = properties.getClient();
+
+		addVorgangManager(clientMap);
+		addFileManager(clientMap);
+		addCommandManager(clientMap);
+
+		return properties;
+	}
+
+	@Bean
+	@ConditionalOnProperty("ozgcloud.command-manager.address")
+	GrpcChannelConfigurator commandProperties() {
+		return GrpcChannelConfigurator.builder()
+				.clientName(CLIENT_NAME_COMMAND_MANAGER)
+				.address(commandManagerProperties.getAddress())
+				.negotiationType(commandManagerProperties.getNegotiationType())
+				.build();
+	}
+
+<<<<<<< Updated upstream
+=======
+	@Bean
+	@ConditionalOnProperty("ozgcloud.user-manager.address")
+	GrpcChannelConfigurator userManagerProperties() {
+		return GrpcChannelConfigurator.builder()
+				.clientName(CLIENT_NAME_USER_MANAGER)
+				.address(userManagerProperties.getAddress())
+				.negotiationType(userManagerProperties.getNegotiationType())
+				.build();
+//		var properties = new GrpcChannelsProperties();
+//		var clientMap = properties.getClient();
+//		addUserManager(clientMap);
+//		return properties;
+	}
+
+	@Bean
+	GrpcChannelsProperties clientProperties(Collection<GrpcChannelConfigurator> configurators) {
+		var properties = new GrpcChannelsProperties();
+		configurators.stream().forEach(configurator -> configurator.addToProperties(properties));
+
+		return properties;
+	}
+
+	private void addUserManager(Map<String, GrpcChannelProperties> clientMap) {
+		var channelProps = new GrpcChannelProperties();
+		channelProps.setAddress(userManagerProperties.getAddress());
+		channelProps.setNegotiationType(userManagerProperties.getNegotiationType());
+
+		clientMap.put(CLIENT_NAME_USER_MANAGER, channelProps);
+	}
+
+>>>>>>> Stashed changes
+	private void addVorgangManager(Map<String, GrpcChannelProperties> clientMap) {
+		var channelProps = new GrpcChannelProperties();
+		channelProps.setAddress(vorgangManagerProperties.getAddress());
+		channelProps.setNegotiationType(vorgangManagerProperties.getNegotiationType());
+
+		clientMap.put(CLIENT_NAME_VORGANG_MANAGER, channelProps);
+	}
+
+	private void addFileManager(Map<String, GrpcChannelProperties> clientMap) {
+		var channelProps = new GrpcChannelProperties();
+		channelProps.setAddress(fileManagerProperties.getAddress());
+		channelProps.setNegotiationType(fileManagerProperties.getNegotiationType());
+
+		clientMap.put(CLIENT_NAME_FILE_MANAGER, channelProps);
+	}
+
+	private void addCommandManager(Map<String, GrpcChannelProperties> clientMap) {
+		var channelProps = new GrpcChannelProperties();
+		channelProps.setAddress(commandManagerProperties.getAddress());
+		channelProps.setNegotiationType(commandManagerProperties.getNegotiationType());
+
+		clientMap.put(CLIENT_NAME_COMMAND_MANAGER, channelProps);
+	}
+
+	@Bean
+	@ConditionalOnMissingBean
+	OzgCloudCallContextProvider callContextProvider(ApplicationContext ctxt) {
+		return new DefaultOzgCloudCallContextProvider(ctxt);
+	}
+
+	@Bean("ozgCloudVorgangService")
+	@ConditionalOnProperty("ozgcloud.vorgang-manager.address")
+	OzgCloudVorgangService grpcOzgCloudVorgangService(VorgangServiceBlockingStub vorgangServiceStub,
+			OzgCloudVorgangMapper mapper,
+			OzgCloudVorgangStubMapper stubMapper, OzgCloudCallContextProvider contextProvider) {
+
+		return new GrpcOzgCloudVorgangService(vorgangServiceStub, mapper, stubMapper, contextProvider);
+	}
+
+	@Bean
+	OzgCloudVorgangMapper ozgCloudVorgangMapper() {
+		return Mappers.getMapper(OzgCloudVorgangMapper.class);
+	}
+
+	@Bean
+	OzgCloudVorgangStubMapper ozgCloudVorgangStubMapper() {
+		return Mappers.getMapper(OzgCloudVorgangStubMapper.class);
+	}
+
+	@Bean("ozgCloudVorgangService")
+	@ConditionalOnMissingBean(OzgCloudVorgangService.class)
+	OzgCloudVorgangService dummyOzgCloudVorgangService() {
+		return new DummyVorgangService();
+	}
+
+	@Bean
+	OzgCloudVorgangIdMapper ozgCloudVorgangIdMapper() {
+		return Mappers.getMapper(OzgCloudVorgangIdMapper.class);
+	}
+
+	@Bean
+	@ConditionalOnProperty("ozgcloud.command-manager.address")
+	OzgCloudCommandService grpcOzgCloudCommandService(@GrpcClient("command-manager") CommandServiceBlockingStub commandServiceStub,
+			CommandMapper commandMapper, OzgCloudCallContextProvider contextProvider) {
+		return new GrpcOzgCloudCommandService(commandServiceStub, commandMapper, contextProvider,
+				GrpcOzgCloudCommandService.DEFAULT_COMMAND_REQUEST_THRESHOLD_MILLIS);
+	}
+
+	@Bean
+	@ConditionalOnProperty("ozgcloud.command-manager.address")
+	CommandMapper commandMapper() {
+		return Mappers.getMapper(CommandMapper.class);
+	}
+
+	@Bean
+	@ConditionalOnProperty("ozgcloud.command-manager.address")
+	AlfaService commandAlfaService(OzgCloudCommandService commandService) {
+		return new CommandAlfaService(commandService);
+	}
+
+	@Bean
+	@ConditionalOnMissingBean
+	AlfaService alfaService() {
+		return new DummyAlfaService();
+	}
+}
diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudCommandManagerProperties.java b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudCommandManagerProperties.java
new file mode 100644
index 0000000..29d0825
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudCommandManagerProperties.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.client.autoconfigure;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+import net.devh.boot.grpc.client.config.NegotiationType;
+
+@Getter
+@Setter
+@Configuration
+@ConfigurationProperties("ozgcloud.command-manager")
+public class OzgCloudCommandManagerProperties {
+	/**
+	 * Network-Address of the Command-Manager instance, starting with resolving
+	 * protocol. Example for local use: static://127.0.0.1:9090
+	 */
+	private String address;
+	/**
+	 * Negotiation Type for the gRPC connection - possible Values: PLAINTEXT, TLS
+	 */
+	private NegotiationType negotiationType = NegotiationType.valueOf("TLS");
+}
diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudFileManagerProperties.java b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudFileManagerProperties.java
new file mode 100644
index 0000000..36602c7
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudFileManagerProperties.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.client.autoconfigure;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+import net.devh.boot.grpc.client.config.NegotiationType;
+
+@Getter
+@Setter
+@Configuration
+@ConfigurationProperties("ozgcloud.file-manager")
+public class OzgCloudFileManagerProperties {
+	/**
+	 * Network-Address of the File-Manager instance, starting with resolving
+	 * protocol. Example for local use: static://127.0.0.1:9090
+	 */
+	private String address;
+	/**
+	 * Negotiation Type for the gRPC connection - possible Values: PLAINTEXT, TLS
+	 */
+	private NegotiationType negotiationType = NegotiationType.valueOf("TLS");
+}
diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudUserManagerProperties.java b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudUserManagerProperties.java
new file mode 100644
index 0000000..5ccd458
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudUserManagerProperties.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.client.autoconfigure;
+
+import org.apache.logging.log4j.core.config.plugins.validation.constraints.NotBlank;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.validation.annotation.Validated;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import net.devh.boot.grpc.client.config.NegotiationType;
+
+@ToString
+@Getter
+@Setter
+@Configuration
+@ConfigurationProperties("ozgcloud.user-manager")
+@Validated
+public class OzgCloudUserManagerProperties {
+	/**
+	 * Network-Address of the User-Manager instance, starting with resolving
+	 * protocoll.
+	 */
+	@NotBlank
+	private String address;
+	/**
+	 * Negotiation Type for the gRPC connection - possible Values: PLAINTEXT, TLS
+	 */
+	private NegotiationType negotiationType = NegotiationType.valueOf("TLS");
+}
diff --git a/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudVorgangManagerProperties.java b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudVorgangManagerProperties.java
new file mode 100644
index 0000000..8e4b12c
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/src/main/java/de/ozgcloud/client/autoconfigure/OzgCloudVorgangManagerProperties.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.client.autoconfigure;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+import net.devh.boot.grpc.client.config.NegotiationType;
+
+@Getter
+@Setter
+@Configuration
+@ConfigurationProperties("ozgcloud.vorgang-manager")
+public class OzgCloudVorgangManagerProperties {
+	/**
+	 * Network-Address of the Vorgang-Manager instance, starting with resolving
+	 * protocoll. Example for local use: static://127.0.0.1:9090
+	 */
+	private String address;
+	/**
+	 * Negotiation Type for the gRPC connection - possible Values: PLAINTEXT, TLS
+	 */
+	private NegotiationType negotiationType = NegotiationType.valueOf("TLS");
+}
diff --git a/ozg-cloud-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ozg-cloud-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 0000000..daabf24
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1,2 @@
+de.ozgcloud.client.autoconfigure.OzgCloudClientAutoConfiguration
+net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration
\ No newline at end of file
diff --git a/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/apilib/autoconfig/ApiLibTestApplication.java b/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/apilib/autoconfig/ApiLibTestApplication.java
new file mode 100644
index 0000000..ccfbb0a
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/apilib/autoconfig/ApiLibTestApplication.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.apilib.autoconfig;
+
+import java.util.TimeZone;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ApiLibTestApplication {
+
+	public static void main(String[] args) {
+		TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+		SpringApplication.run(ApiLibTestApplication.class, args);
+	}
+}
diff --git a/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudStarterITCase.java b/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudStarterITCase.java
new file mode 100644
index 0000000..58ab9f6
--- /dev/null
+++ b/ozg-cloud-spring-boot-starter/src/test/java/de/ozgcloud/client/autoconfigure/OzgCloudStarterITCase.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.client.autoconfigure;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import de.ozgcloud.apilib.autoconfig.ApiLibTestApplication;
+import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService;
+
+@SpringBootTest(classes = ApiLibTestApplication.class)
+class OzgCloudStarterITCase {
+
+	@Autowired(required = false)
+	private OzgCloudVorgangService vorgangService;
+
+	@Test
+	void shouldInitializeVorgangService() {
+		assertThat(vorgangService).isNotNull();
+	}
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..6751cae
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,101 @@
+<!--
+
+    Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+    Ministerpräsidenten des Landes Schleswig-Holstein
+    Staatskanzlei
+    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+
+    Lizenziert unter der EUPL, Version 1.2 oder - sobald
+    diese von der Europäischen Kommission genehmigt wurden -
+    Folgeversionen der EUPL ("Lizenz");
+    Sie dürfen dieses Werk ausschließlich gemäß
+    dieser Lizenz nutzen.
+    Eine Kopie der Lizenz finden Sie hier:
+
+    https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+
+    Sofern nicht durch anwendbare Rechtsvorschriften
+    gefordert oder in schriftlicher Form vereinbart, wird
+    die unter der Lizenz verbreitete Software "so wie sie
+    ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+    ausdrücklich oder stillschweigend - verbreitet.
+    Die sprachspezifischen Genehmigungen und Beschränkungen
+    unter der Lizenz sind dem Lizenztext zu entnehmen.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>de.ozgcloud.common</groupId>
+		<artifactId>ozgcloud-common-dependencies</artifactId>
+		<version>3.0.1</version>
+		<relativePath /> <!-- lookup parent from repository -->
+	</parent>
+
+	<groupId>de.ozgcloud.api-lib</groupId>
+	<artifactId>api-lib-parent</artifactId>
+	<version>0.5.0</version>
+	<description>Library project to use the OZG-Cloud API</description>
+
+	<packaging>pom</packaging>
+	<modules>
+		<module>api-lib-core</module>
+		<module>ozg-cloud-spring-boot-starter</module>
+		<module>api-lib-demo</module>
+	</modules>
+
+	<properties>
+		<source-plugin.version>3.3.0</source-plugin.version>
+		<failsafe-plugin.version>3.2.2</failsafe-plugin.version>
+		<maven-jar-plugin.version>3.3.0</maven-jar-plugin.version>
+		
+		<vorgang-manager.version>2.4.0</vorgang-manager.version>
+		<user-manager.version>2.1.0</user-manager.version>
+	</properties>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-failsafe-plugin</artifactId>
+				<version>${failsafe-plugin.version}</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>integration-test</goal>
+							<goal>verify</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			
+		</plugins>
+	</build>
+
+	<profiles>
+		<profile>
+			<id>deploy</id>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-source-plugin</artifactId>
+						<version>${source-plugin.version}</version>
+						<executions>
+							<execution>
+								<id>attach-sources</id>
+								<goals>
+									<goal>jar-no-fork</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
+</project>
-- 
GitLab