diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/ArchiveManagerConfiguration.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/ArchiveManagerConfiguration.java
index 90f158d548309ca8961473fb78cafec16219e6d4..01c7a03353bbc42301b1416adb83706dd34df872 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/ArchiveManagerConfiguration.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/ArchiveManagerConfiguration.java
@@ -26,6 +26,7 @@ package de.ozgcloud.archive;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 import de.ozgcloud.apilib.client_attribute.OzgCloudClientAttributeService;
 import de.ozgcloud.apilib.client_attribute.grpc.OzgCloudClientAttributeGrpcService;
@@ -50,43 +51,44 @@ import net.devh.boot.grpc.client.inject.GrpcClient;
 
 @Configuration
 @RequiredArgsConstructor
+@EnableScheduling
 public class ArchiveManagerConfiguration {
 
-	public static final String VORGANG_SERVICE_NAME = "archive_VorgangService";
-	public static final String VORGANG_REMOTE_MANAGER_SERVICE_NAME = "archive_VorgangRemoteService";
-	public static final String VORGANG_WITH_EINGANG_MAPPER_NAME = "archive_VorgangWithEingangMapper";
+	public static final String VORGANG_SERVICE_NAME = "archiveVorgangService";
+	public static final String VORGANG_REMOTE_MANAGER_SERVICE_NAME = "archiveVorgangRemoteService";
+	public static final String VORGANG_WITH_EINGANG_MAPPER_NAME = "archiveVorgangWithEingangMapper";
 
-	public static final String CURRENT_USER_SERVICE_NAME = "archive_CurrentUserService";
-	public static final String DOCUMENT_MAPPER_NAME = "archive_DocumentMapper";
-	public static final String DOCUMENT_REMOTE_SERVICE_NAME = "archive_DocumentRemoteService";
+	public static final String CURRENT_USER_SERVICE_NAME = "archiveCurrentUserService";
+	public static final String DOCUMENT_MAPPER_NAME = "archiveDocumentMapper";
+	public static final String DOCUMENT_REMOTE_SERVICE_NAME = "archiveDocumentRemoteService";
 
-	public static final String USER_SERVICE_NAME = "archive_UserService";
-	public static final String USER_PROFILE_MAPPER_NAME = "archive_UserProfileMapper";
-	public static final String OZGCLOUD_USER_PROFILE_SERVICE_NAME = "archive_OzgCloudUserProfileService";
+	public static final String USER_SERVICE_NAME = "archiveUserService";
+	public static final String USER_PROFILE_MAPPER_NAME = "archiveUserProfileMapper";
+	public static final String OZGCLOUD_USER_PROFILE_SERVICE_NAME = "archiveOzgCloudUserProfileService";
 
-	public static final String COMMAND_SERVICE_NAME = "archive_CommandService";
-	public static final String COMMAND_REMOTE_SERVICE_NAME = "archive_CommandRemoteService";
-	public static final String COMMAND_MAPPER_NAME = "archive_CommandMapper";
-	public static final String OZGCLOUD_COMMAND_SERVICE_NAME = "archive_OzgCloudCommandService";
+	public static final String COMMAND_SERVICE_NAME = "archiveCommandService";
+	public static final String COMMAND_REMOTE_SERVICE_NAME = "archiveCommandRemoteService";
+	public static final String COMMAND_MAPPER_NAME = "archiveCommandMapper";
+	public static final String OZGCLOUD_COMMAND_SERVICE_NAME = "archiveOzgCloudCommandService";
 
-	public static final String BINARY_FILE_SERVICE_NAME = "archive_BinaryFileService";
-	public static final String BINARY_FILE_REMOTE_SERVICE_NAME = "archive_BinaryFileRemoteService";
-	public static final String OZGCLOUD_FILE_SERVICE_NAME = "archive_OzgCloudFileService";
+	public static final String BINARY_FILE_SERVICE_NAME = "archiveBinaryFileService";
+	public static final String BINARY_FILE_REMOTE_SERVICE_NAME = "archiveBinaryFileRemoteService";
+	public static final String OZGCLOUD_FILE_SERVICE_NAME = "archiveOzgCloudFileService";
 
-	public static final String FILE_ID_MAPPER_NAME = "archive_FileIdMapper";
+	public static final String FILE_ID_MAPPER_NAME = "archiveFileIdMapper";
 
-	public static final String BESCHEID_REMOTE_SERVICE_NAME = "archive_BescheidRemoteService";
-	public static final String BESCHEID_MAPPER_NAME = "archive_BescheidMapper";
+	public static final String BESCHEID_REMOTE_SERVICE_NAME = "archiveBescheidRemoteService";
+	public static final String BESCHEID_MAPPER_NAME = "archiveBescheidMapper";
 
-	public static final String CALL_CONTEXT_PROVIDER_NAME = "archive_CallContextProvider";
-	public static final String CALL_CONTEXT_MAPPER_NAME = "archive_CallContextMapper";
+	public static final String CALL_CONTEXT_PROVIDER_NAME = "archiveCallContextProvider";
+	public static final String CALL_CONTEXT_MAPPER_NAME = "archiveCallContextMapper";
 
-	public static final String OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME = "archive_OzgCloudClientAttributeService";
+	public static final String OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME = "archiveOzgCloudClientAttributeService";
 
-	public static final String KOMMENTAR_SERVICE_NAME = "archive_KommentarService";
-	public static final String KOMMENTAR_REMOTE_SERVICE_NAME = "archive_KommentarRemoteService";
+	public static final String KOMMENTAR_SERVICE_NAME = "archiveKommentarService";
+	public static final String KOMMENTAR_REMOTE_SERVICE_NAME = "archiveKommentarRemoteService";
 
-	public static final String CALL_CONTEXT_SERVER_INTERCEPTOR_NAME = "archive_CallContextGrpcServerInterceptor";
+	public static final String CALL_CONTEXT_SERVER_INTERCEPTOR_NAME = "archiveCallContextGrpcServerInterceptor";
 
 	public static final String GRPC_VORGANG_MANAGER_CLIENT_NAME = "vorgang-manager";
 	public static final String GRPC_COMMAND_MANAGER_CLIENT_NAME = "command-manager";
@@ -108,25 +110,25 @@ public class ArchiveManagerConfiguration {
 	@GrpcClient(GRPC_FILE_MANAGER_CLIENT_NAME)
 	private final BinaryFileServiceStub binaryFileServiceStub;
 
-	@Bean(ArchiveManagerConfiguration.OZGCLOUD_FILE_SERVICE_NAME) // NOSONAR
+	@Bean(ArchiveManagerConfiguration.OZGCLOUD_FILE_SERVICE_NAME)
 	OzgCloudFileService ozgCloudFileService(OzgCloudFileMapper mapper,
 			@Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) {
 		return new GrpcOzgCloudFileService(binaryFileServiceBlockingStub, binaryFileServiceStub, callContextProvider, mapper);
 	}
 
-	@Bean(ArchiveManagerConfiguration.OZGCLOUD_USER_PROFILE_SERVICE_NAME) // NOSONAR
+	@Bean(ArchiveManagerConfiguration.OZGCLOUD_USER_PROFILE_SERVICE_NAME)
 	OzgCloudUserProfileService grpcOzgCloudUserProfileService(UserProfileMapper userProfileMapper,
 			@Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) {
 		return new GrpcOzgCloudUserProfileService(userProfileServiceBlockingStub, userProfileMapper, callContextProvider);
 	}
 
-	@Bean(OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME) // NOSONAR
+	@Bean(OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME)
 	OzgCloudClientAttributeService ozgCloudAttributesService(OzgCloudClientAttributeMapper mapper,
 			@Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) {
 		return new OzgCloudClientAttributeGrpcService(clientAttributeServiceBlockingStub, mapper, callContextProvider);
 	}
 
-	@Bean(OZGCLOUD_COMMAND_SERVICE_NAME) // NOSONAR
+	@Bean(OZGCLOUD_COMMAND_SERVICE_NAME)
 	OzgCloudCommandService ozgCloudCommandService(CommandMapper commandMapper,
 			@Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) {
 		return new GrpcOzgCloudCommandService(commandServiceStub, commandMapper, callContextProvider,
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveEventListener.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveEventListener.java
index 1525b91fcbe26e08c3b1464869a5e23b8f380f41..34ce4ceab4ee17875b94de1db098119671c19c89 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveEventListener.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveEventListener.java
@@ -65,15 +65,15 @@ public class ArchiveEventListener {
 	public static final Predicate<Command> IS_LOCK_BY_ARCHIVE_MANAGER_COMMAND = command -> CallContextUser.ARCHIVE_MANAGER_CLIENT_NAME
 			.equals(command.getCreatedByClientName());
 
-	@Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME)
 	private final CurrentUserService currentUserService;
 
-	@Qualifier(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME)
 	private final VorgangService vorgangService;
 
 	private final ApplicationEventPublisher eventPublisher;
 
-	@Qualifier(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME)
 	private final CommandService commandService;
 	private final ArchiveService archiveService;
 
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveService.java
index dc45d255352044fa6b333ff08bc590851cb88274..464bfca7a32555738f0bb60bdb67cd6f7869f631 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/archivierung/ArchiveService.java
@@ -53,7 +53,7 @@ class ArchiveService {
 	public static final String ATTRIBUTE_NAME_ANTRAG_ARCHIVING = "ARCHIVING";
 	private final XtaService xtaService;
 	private final ExportService exportService;
-	@Qualifier(ArchiveManagerConfiguration.OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME)
 	private final OzgCloudClientAttributeService ozgCloudAttributesService;
 	private final OzgCloudVorgangIdMapper vorgangIdMapper;
 
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/BescheidRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/BescheidRemoteService.java
index a7e8d3999f28118fb4d951349b0090c2c9ad74b4..527701d6174dec35523e0f01d5e1ee5ca7a44883 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/BescheidRemoteService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/BescheidRemoteService.java
@@ -36,15 +36,15 @@ import de.ozgcloud.document.bescheid.GrpcGetAllBescheidRequest;
 import lombok.RequiredArgsConstructor;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
-@Service(ArchiveManagerConfiguration.BESCHEID_REMOTE_SERVICE_NAME) // NOSONAR
+@Service(ArchiveManagerConfiguration.BESCHEID_REMOTE_SERVICE_NAME)
 @RequiredArgsConstructor
 class BescheidRemoteService {
 
 	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME)
 	private final BescheidServiceBlockingStub grpcService;
-	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME)
 	private final OzgCloudCallContextProvider contextProvider;
-	@Qualifier(ArchiveManagerConfiguration.BESCHEID_MAPPER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.BESCHEID_MAPPER_NAME)
 	private final BescheidMapper bescheidMapper;
 
 	public Stream<Bescheid> findByVorgangId(String vorgangId) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/DocumentRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/DocumentRemoteService.java
index 4a4f63c82aa00d337a52a0ac420c654898f861c4..4f6ee36fbcc03b44b5ec0af84075fdb3a8fe7405 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/DocumentRemoteService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/DocumentRemoteService.java
@@ -35,15 +35,15 @@ import de.ozgcloud.document.GrpcGetDocumentRequest;
 import lombok.RequiredArgsConstructor;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
-@Service(ArchiveManagerConfiguration.DOCUMENT_REMOTE_SERVICE_NAME) // NOSONAR
+@Service(ArchiveManagerConfiguration.DOCUMENT_REMOTE_SERVICE_NAME)
 @RequiredArgsConstructor
 class DocumentRemoteService {
 
-	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) // NOSONAR
+	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME)
 	private final DocumentServiceBlockingStub grpcService;
-	@Qualifier(ArchiveManagerConfiguration.DOCUMENT_MAPPER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.DOCUMENT_MAPPER_NAME)
 	private final DocumentMapper documentMapper;
-	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME)
 	private final OzgCloudCallContextProvider contextProvider;
 
 	public FileId getDocument(String documentId) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/ExportBescheidService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/ExportBescheidService.java
index 6df64e3fd8f1a00300e0fd3ed8e98e2ea7224d12..bebc4d8f52cf45b557f4c9a14f07780f73fe9646 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/ExportBescheidService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/bescheid/ExportBescheidService.java
@@ -40,16 +40,16 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 public class ExportBescheidService {
 
-	@Qualifier(ArchiveManagerConfiguration.BESCHEID_REMOTE_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.BESCHEID_REMOTE_SERVICE_NAME)
 	private final BescheidRemoteService bescheidRemoteService;
 
-	@Qualifier(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME)
 	private final BinaryFileService binaryFileService;
 
-	@Qualifier(ArchiveManagerConfiguration.DOCUMENT_REMOTE_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.DOCUMENT_REMOTE_SERVICE_NAME)
 	private final DocumentRemoteService documentRemoteService;
 
-	@Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME)
 	private final UserService userService;
 
 	public BescheidExportData createExportData(VorgangWithEingang vorgang) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileRemoteService.java
index 91f2aa07daab14a81b95399347184dc5f8538d5b..60782ee819edeb45bb97da55aa6a20f15928eaf2 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileRemoteService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileRemoteService.java
@@ -43,22 +43,22 @@ import de.ozgcloud.vorgang.grpc.binaryFile.GrpcFindFilesResponse;
 import lombok.RequiredArgsConstructor;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
-@Service(ArchiveManagerConfiguration.BINARY_FILE_REMOTE_SERVICE_NAME) // NOSONAR
+@Service(ArchiveManagerConfiguration.BINARY_FILE_REMOTE_SERVICE_NAME)
 @RequiredArgsConstructor
 class BinaryFileRemoteService {
 
-	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) // NOSONAR
+	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME)
 	private final BinaryFileServiceBlockingStub grpcService;
 
-	@Qualifier(ArchiveManagerConfiguration.OZGCLOUD_FILE_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.OZGCLOUD_FILE_SERVICE_NAME)
 	private final OzgCloudFileService ozgCloudFileService;
 
 	private final OzgFileMapper ozgFileMapper;
 
-	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME)
 	private final OzgCloudCallContextProvider contextProvider;
 
-	@Qualifier(ArchiveManagerConfiguration.FILE_ID_MAPPER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.FILE_ID_MAPPER_NAME)
 	private final FileIdMapper fileIdMapper;
 
 	public Stream<OzgFile> getFiles(List<FileId> fileIds) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileService.java
index 015ce73c96f9dd4d38b9a79c3d0ff4bf54a7e409..fb4a6db3666ff2b9562cfbddb4086054cf2e4c04 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/binaryfile/BinaryFileService.java
@@ -35,11 +35,11 @@ import de.ozgcloud.archive.file.OzgFile;
 import de.ozgcloud.common.binaryfile.FileId;
 import lombok.RequiredArgsConstructor;
 
-@Service(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME) // NOSONAR
+@Service(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME)
 @RequiredArgsConstructor
 public class BinaryFileService {
 
-	@Qualifier(ArchiveManagerConfiguration.BINARY_FILE_REMOTE_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.BINARY_FILE_REMOTE_SERVICE_NAME)
 	private final BinaryFileRemoteService binaryFileRemoteService;
 
 	public Stream<OzgFile> getFiles(List<FileId> attachments) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptor.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptor.java
index 8422a9e4625cee1430d6151a2dd12be112fefac1..203f8020d2ce23f71470a6548ce964a654fdc80f 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptor.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptor.java
@@ -40,13 +40,13 @@ import io.grpc.ServerCallHandler;
 import io.grpc.ServerInterceptor;
 import lombok.RequiredArgsConstructor;
 
-@Component(ArchiveManagerConfiguration.CALL_CONTEXT_SERVER_INTERCEPTOR_NAME) // NOSONAR
+@Component(ArchiveManagerConfiguration.CALL_CONTEXT_SERVER_INTERCEPTOR_NAME)
 @RequiredArgsConstructor
 public class CallContextGrpcServerInterceptor implements ServerInterceptor {
 
-	@Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME)
 	private final CurrentUserService currentUserService;
-	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_MAPPER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_MAPPER_NAME)
 	private final CallContextMapper callContextMapper;
 
 	@Override
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextProvider.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextProvider.java
index dce8adf18e336911767493fc0868247f9555d3a0..3202e73abc6faeef77b97d686e153d6c7d3bb685 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextProvider.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CallContextProvider.java
@@ -31,13 +31,13 @@ import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
 import de.ozgcloud.archive.ArchiveManagerConfiguration;
 import lombok.RequiredArgsConstructor;
 
-@Component(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR
+@Component(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME)
 @RequiredArgsConstructor
 public class CallContextProvider implements OzgCloudCallContextProvider {
 
-	@Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME)
 	private final CurrentUserService currentUserService;
-	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_MAPPER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_MAPPER_NAME)
 	private final CallContextMapper mapper;
 
 	@Override
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CurrentUserService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CurrentUserService.java
index 07e867d69de62efecc026ddec84cf92644a3e241..e31e1c90e7c875458ccd63254377bf24ae89d982 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CurrentUserService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/callcontext/CurrentUserService.java
@@ -42,7 +42,7 @@ import de.ozgcloud.common.grpc.GrpcUtil;
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
-@Service(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR
+@Service(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME)
 public class CurrentUserService {
 
 	private final AuthenticationTrustResolver trustResolver;
@@ -97,7 +97,6 @@ public class CurrentUserService {
 		return ThreadContext.getContext().getOrDefault(GrpcUtil.KEY_REQUEST_ID, UUID.randomUUID().toString());
 	}
 
-
 	public SecurityContext startAndReturnPreviousSecurityContext(CallContextUser user) {
 		var prevContext = SecurityContextHolder.getContext();
 
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/ArchiveManagerCommand.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/ArchiveManagerCommand.java
index 2c6000d429c53488cb3b4c48c6e6e0fa6b1b39da..a6fe1c548fb8bf2b91251ce21e7d39808920cc34 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/ArchiveManagerCommand.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/ArchiveManagerCommand.java
@@ -24,18 +24,47 @@
 package de.ozgcloud.archive.common.command;
 
 import java.time.ZonedDateTime;
+import java.util.Collections;
 import java.util.Map;
 
+import de.ozgcloud.command.Command;
+import de.ozgcloud.command.CommandStatus;
 import lombok.Builder;
 import lombok.Getter;
+import lombok.ToString;
 
-@Builder(toBuilder = true)
+@ToString
 @Getter
-public class ArchiveManagerCommand {
+@Builder(toBuilder = true)
+public class ArchiveManagerCommand implements Command {
+
+	private String id;
+	private String vorgangId;
 
+	private ZonedDateTime createdAt;
 	private ZonedDateTime finishedAt;
+
+	private String createdBy;
 	private String createdByName;
+	private String createdByClientName;
+
+	private CommandStatus status;
+
 	private String order;
 
-	private Map<String, ?> body;
+	private String relationId;
+	private Long relationVersion;
+
+	@Builder.Default
+	private Map<String, Object> bodyObject = Collections.emptyMap();
+
+	/*
+	 * @deprecated use {@link ArchiveManagerCommand#bodyObject}
+	 */
+	@Deprecated(since = "0.2.0", forRemoval = true)
+	private Map<String, String> body;
+
+	private String errorMessage;
+
+	private String createdResource;
 }
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandMapper.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandMapper.java
index 106ae2502bee5d1ba65e30ca8776d63448c18db3..175a6ee53e7480e7df136e9a6672f22e90ab201c 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandMapper.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandMapper.java
@@ -41,7 +41,10 @@ import de.ozgcloud.vorgang.grpc.command.GrpcCommand;
 @AnnotateWith(value = Component.class, elements = @Element(strings = ArchiveManagerConfiguration.COMMAND_MAPPER_NAME))
 interface CommandMapper {
 
-	@Mapping(target = "body", source = "bodyObj")
+	@Mapping(target = "createdByClientName", ignore = true) // TODO Ergänzen sobald der aktueller Stand das zulässt
+	@Mapping(target = "relationVersion", ignore = true)
+	@Mapping(target = "body", ignore = true)
+	@Mapping(target = "bodyObject", source = "bodyObj")
 	@Mapping(target = "order", source = "orderString")
 	@Mapping(target = "finishedAt", expression = "java(mapToZonedDateTime(grpcCommand.getFinishedAt()))")
 	ArchiveManagerCommand fromGrpc(GrpcCommand grpcCommand);
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandRemoteService.java
index 58344ce3e7a567afcb01183f18c351480c6cc973..62a49a828931b173fe3475181f7dfdd38c9a81bc 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandRemoteService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandRemoteService.java
@@ -39,14 +39,14 @@ import lombok.RequiredArgsConstructor;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
 @RequiredArgsConstructor
-@Service(ArchiveManagerConfiguration.COMMAND_REMOTE_SERVICE_NAME) // NOSONAR
+@Service(ArchiveManagerConfiguration.COMMAND_REMOTE_SERVICE_NAME)
 class CommandRemoteService {
 
-	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) // NOSONAR
+	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME)
 	private final CommandServiceBlockingStub grpcService;
-	@Qualifier(ArchiveManagerConfiguration.COMMAND_MAPPER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.COMMAND_MAPPER_NAME)
 	private final CommandMapper mapper;
-	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME)
 	private final OzgCloudCallContextProvider contextProvider;
 
 	public Stream<ArchiveManagerCommand> findCommands(String vorgangId, Optional<String> status, Optional<String> order) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandService.java
index a1f4e512ba5723b7c28c322812a0784bf56473e6..19d9158710418249e40750331b2e217d240d8dbb 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/command/CommandService.java
@@ -35,20 +35,25 @@ import de.ozgcloud.apilib.common.command.OzgCloudCommand;
 import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
 import de.ozgcloud.archive.ArchiveManagerConfiguration;
+import de.ozgcloud.command.CommandStatus;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 
-@Service(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME) // NOSONAR
+@Service(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME)
 @RequiredArgsConstructor
 public class CommandService {
 
-	@Qualifier(ArchiveManagerConfiguration.COMMAND_REMOTE_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.COMMAND_REMOTE_SERVICE_NAME)
 	private final CommandRemoteService remoteService;
-	@Qualifier(ArchiveManagerConfiguration.OZGCLOUD_COMMAND_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.OZGCLOUD_COMMAND_SERVICE_NAME)
 	private final OzgCloudCommandService ozgCloudCommandService;
 
+	public Stream<ArchiveManagerCommand> findPending(String vorgangId, String order) {
+		return remoteService.findCommands(vorgangId, Optional.of(CommandStatus.PENDING.name()), Optional.of(order));
+	}
+
 	public Stream<ArchiveManagerCommand> findFinishedCommands(@NonNull String vorgangId) {
-		return remoteService.findCommands(vorgangId, Optional.of("FINISHED"), Optional.empty());
+		return remoteService.findCommands(vorgangId, Optional.of(CommandStatus.FINISHED.name()), Optional.empty());
 	}
 
 	public boolean hasPendingCommandsExceptWithOrder(String vorgangId, String order) {
@@ -59,5 +64,4 @@ public class CommandService {
 	private Predicate<? super OzgCloudCommand> hasNotOrder(String order) {
 		return command -> !StringUtils.equals(command.getOrder(), order);
 	}
-
-}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/user/UserService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/user/UserService.java
index 0faf0027ea8800e4ef92104c868f892fde9ef1b2..b68770283d9856550704c194c194379331d4c84c 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/user/UserService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/user/UserService.java
@@ -33,16 +33,16 @@ import de.ozgcloud.apilib.user.OzgCloudUserProfileService;
 import de.ozgcloud.archive.ArchiveManagerConfiguration;
 import lombok.RequiredArgsConstructor;
 
-@Service(ArchiveManagerConfiguration.USER_SERVICE_NAME) // NOSONAR
+@Service(ArchiveManagerConfiguration.USER_SERVICE_NAME)
 @RequiredArgsConstructor
 public class UserService {
 
 	private static final String SYSTEM_USER_ID_PREFIX = "system_";
 
-	@Qualifier(ArchiveManagerConfiguration.OZGCLOUD_USER_PROFILE_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.OZGCLOUD_USER_PROFILE_SERVICE_NAME)
 	private final OzgCloudUserProfileService grpcOzgCloudUserProfileService;
 
-	@Qualifier(ArchiveManagerConfiguration.USER_PROFILE_MAPPER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.USER_PROFILE_MAPPER_NAME)
 	private final UserProfileMapper mapper;
 
 	public String getFullNameById(String userId) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java
index 174f5862deb05402b3200b9aedd221f5cdd5e96b..6126927c98b25edead404097d17a1c9d7eca965c 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java
@@ -2,6 +2,10 @@ package de.ozgcloud.archive.common.xta;
 
 import java.io.IOException;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -58,4 +62,9 @@ class XtaConfiguration {
 	ObjectMapper objectMapper() {
 		return new ObjectMapper();
 	}
+
+	@Bean
+	DocumentBuilder documentBuilder() throws ParserConfigurationException {
+		return DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder();
+	}
 }
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileHelper.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..2e4f493eb3cc6909d22e617fd011e5977878c663
--- /dev/null
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileHelper.java
@@ -0,0 +1,13 @@
+package de.ozgcloud.archive.common.xta;
+
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.xta.client.model.XtaFile;
+
+@Component
+public class XtaFileHelper {
+
+	public XtaImportConfirmationHandler initImportConfirmationHandler(XtaFile file) {
+		return XtaImportConfirmationHandler.createFrom(file);
+	}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileParser.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileParser.java
new file mode 100644
index 0000000000000000000000000000000000000000..70e10b3348bd4b3581df8a75e222c6e5865397df
--- /dev/null
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileParser.java
@@ -0,0 +1,41 @@
+package de.ozgcloud.archive.common.xta;
+
+import java.io.IOException;
+
+import javax.xml.parsers.DocumentBuilder;
+
+import org.springframework.stereotype.Component;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import de.ozgcloud.xta.client.model.XtaFile;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
+
+@Log4j2
+@RequiredArgsConstructor
+@Component
+public class XtaFileParser {
+
+	private final DocumentBuilder documentBuilder;
+
+	public boolean isType(XtaFile file, XtaFileType type) {
+		try {
+			var doc = parse(file);
+			return type.getTypeStr().equals(getRootTagName(doc));
+		} catch (Exception e) {
+			LOG.warn("Error parsing xta file.", e);
+			return false;
+		}
+	}
+
+	Document parse(XtaFile file) throws SAXException, IOException {
+		var document = documentBuilder.parse(file.content().getDataSource().getInputStream());
+		document.getDocumentElement().normalize();
+		return document;
+	}
+
+	private String getRootTagName(Document doc) {
+		return doc.getDocumentElement().getTagName();
+	}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileReader.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..87320fb68a027534135b88832b29e00ca6912ed4
--- /dev/null
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileReader.java
@@ -0,0 +1,38 @@
+package de.ozgcloud.archive.common.xta;
+
+import java.io.IOException;
+
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.JAXBException;
+import jakarta.xml.bind.Unmarshaller;
+
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.xta.client.model.XtaFile;
+import de.xoev.xdomea.AbgabeImportBestaetigen0402;
+
+class XtaFileReader<T> {
+
+	private final Unmarshaller unmarshaller;
+
+	public static XtaFileReader<AbgabeImportBestaetigen0402> createAbgabeImportBestaetigen0402Reader() {
+		return new XtaFileReader<>(AbgabeImportBestaetigen0402.class);
+	}
+
+	private XtaFileReader(Class<T> clazz) {
+		try {
+			unmarshaller = JAXBContext.newInstance(clazz).createUnmarshaller();
+		} catch (JAXBException e) {
+			throw new TechnicalException("Error reading xta file content", e);
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	public T read(XtaFile xtaFile) {
+		try {
+			return (T) unmarshaller.unmarshal(xtaFile.content().getInputStream());
+		} catch (JAXBException | IOException e) {
+			throw new TechnicalException("Error on reading file %s.".formatted(xtaFile.name()), e);
+		}
+	}
+
+}
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileType.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileType.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae63bc7117b27927d599b422339c3351eaf15e84
--- /dev/null
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileType.java
@@ -0,0 +1,13 @@
+package de.ozgcloud.archive.common.xta;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+public enum XtaFileType {
+	IMPORT_CONFIRMATION("xdomea:Abgabe.ImportBestaetigen.0402"),
+	ABGABE("xdomea:Abgabe.Abgabe.0401");
+
+	@Getter
+	private final String typeStr;
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandler.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..70ad2f443b80beba421d9169bc598479e22c8ccf
--- /dev/null
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandler.java
@@ -0,0 +1,44 @@
+package de.ozgcloud.archive.common.xta;
+
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import de.ozgcloud.xta.client.model.XtaFile;
+import de.xoev.xdomea.AbgabeImportBestaetigen0402;
+import de.xoev.xdomea.ErfolgOderMisserfolgAbgabeType;
+import lombok.RequiredArgsConstructor;
+
+public class XtaImportConfirmationHandler {
+
+	private final AbgabeImportBestaetigen0402 importConfirmation;
+
+	public static XtaImportConfirmationHandler createFrom(XtaFile file) {
+		return new XtaImportConfirmationHandler(file);
+	}
+
+	private XtaImportConfirmationHandler(XtaFile file) {
+		importConfirmation = XtaFileReader.createAbgabeImportBestaetigen0402Reader().read(file);
+	}
+
+	public Stream<XtaAbgabeAdapter> getAbgaben() {
+		return importConfirmation.getAbgegebenesObjekt().stream().map(XtaAbgabeAdapter::new);
+	}
+
+	@RequiredArgsConstructor
+	public static class XtaAbgabeAdapter {
+
+		private final ErfolgOderMisserfolgAbgabeType abgabeType;
+
+		public String getVorgangId() {
+			return abgabeType.getIDSGO();
+		}
+
+		public boolean isSuccessful() {
+			return abgabeType.isErfolgreich();
+		}
+
+		public String getErrorMessage() {
+			return abgabeType.getFehlermeldung().stream().collect(Collectors.joining(";"));
+		}
+	}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaProperties.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaProperties.java
index d5409da8ffaf6e8b7d7ecb408f631007a45f9a6d..f30ed809dd6bfd59762a20b71645ac304034c92b 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaProperties.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaProperties.java
@@ -16,7 +16,7 @@ import lombok.Setter;
 @Setter
 public class XtaProperties {
 
-	static final String XTA_PROPERTIES_PREFIX = "ozgcloud.xta";
+	public static final String XTA_PROPERTIES_PREFIX = "ozgcloud.xta";
 
 	/*
 	 * Flag to enable/disable XTA adapter usage.
@@ -50,6 +50,11 @@ public class XtaProperties {
 	 * Client identifiers used to identify client at XTA adapter.
 	 */
 	private List<XtaIdentifier> clientIdentifiers;
+	/*
+	 * Times in cron format at which Quittungen are fetched. Default is set to every
+	 * 15 minutes.
+	 */
+	private String schedulerCron = "0 0/15 * * * *";
 
 	@Getter
 	@Setter
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaService.java
index 9aac41082bcaaa23dbb2b1acbadaf85411791ef5..9c7af3c1eee6c0bfd18b3c8bc114fb81cd07aab1 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaService.java
@@ -1,6 +1,7 @@
 package de.ozgcloud.archive.common.xta;
 
 import java.util.Optional;
+import java.util.function.Consumer;
 
 import org.springframework.stereotype.Service;
 
@@ -11,7 +12,9 @@ import de.ozgcloud.xta.client.model.XtaFile;
 import de.ozgcloud.xta.client.model.XtaMessage;
 import de.ozgcloud.xta.client.xdomea.XdomeaXtaMessageCreator;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 @RequiredArgsConstructor
 @Service
 public class XtaService {
@@ -38,4 +41,13 @@ public class XtaService {
 	XtaClient getXtaClient() {
 		return xtaClient.orElseThrow(() -> new TechnicalException(XTA_CLIENT_IS_NOT_CONFIGURED_MESSAGE));
 	}
+
+	public void fetchMessages(Consumer<XtaMessage> messageConsumer) {
+		try {
+			getXtaClient().fetchMessages(messageConsumer);
+		} catch (XtaClientException e) {
+			throw new TechnicalException("Error fetching xta messages.", e);
+		}
+	}
+
 }
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportService.java
index 555dd08ff192966cb4f0a90396053f8cec20be61..d5ecc52add0b1ab7efa515a2d559e39fdf4e64e0 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportService.java
@@ -65,10 +65,10 @@ public class ExportService {
 	private final XdomeaXmlMarshaller xDomeaXmlMarshaller;
 
 	private final ExportFileService exportFileService;
-	@Qualifier(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME)
 	private final VorgangService vorgangService;
 	private final ExportHistorieService exportHistorieService;
-	@Qualifier(ArchiveManagerConfiguration.KOMMENTAR_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.KOMMENTAR_SERVICE_NAME)
 	private final ExportKommentarService exportKommentarService;
 	private final ExportNachrichtService exportNachrichtService;
 	private final ExportBescheidService exportBescheidService;
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/file/OzgFileRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/file/OzgFileRemoteService.java
index 76dee5b4a028d3a19541ef73ddcd6ac292965206..5ed79e0b2c3efa91840b4973e33c6be86fffc5ea 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/file/OzgFileRemoteService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/file/OzgFileRemoteService.java
@@ -41,10 +41,10 @@ import net.devh.boot.grpc.client.inject.GrpcClient;
 @RequiredArgsConstructor
 class OzgFileRemoteService {
 
-	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) // NOSONAR
+	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME)
 	private final FileServiceBlockingStub grpcService;
 	private final OzgFileMapper fileMapper;
-	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME)
 	private final OzgCloudCallContextProvider contextProvider;
 
 	public Stream<OzgFile> getAttachments(String vorgangId) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilder.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilder.java
index febbbf87dd931033c03cd0e9bf18b23c1e70f080..3d391de243bd5ac4a7aafc2bc858e50be0b30067 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilder.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilder.java
@@ -66,6 +66,6 @@ class AktenzeichenChangeHistoryBuilder extends ChangeHistoryBuilder<Aktenzeichen
 	}
 
 	String getAktenzeichen(ArchiveManagerCommand command) {
-		return getValueFromCommandBody(BODY_PROPERTY_AKTENZEICHEN, command);
+		return getValueFromCommandBodyObject(BODY_PROPERTY_AKTENZEICHEN, command);
 	}
 }
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilder.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilder.java
index 3f7e8bcdfdd4e4bfddb93b4d67a940c4f417d326..1d16d066782fd65eb4c6a737e837b6c10b1437d6 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilder.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilder.java
@@ -74,7 +74,7 @@ class AssignedUserChangeHistoryBuilder extends ChangeHistoryBuilder<AssignedUser
 	}
 
 	String getAssignedUserFullNameFromCommand(ArchiveManagerCommand command) {
-		var assignedUserId = getValueFromCommandBody(BODY_PROPERTY_ASSIGNED_USER, command);
+		var assignedUserId = getValueFromCommandBodyObject(BODY_PROPERTY_ASSIGNED_USER, command);
 		return userProfileCache.getUserProfile(assignedUserId).map(UserProfile::getFullName).orElse("automatisch");
 	}
 }
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/ChangeHistoryBuilder.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/ChangeHistoryBuilder.java
index c05fdfc54cab82fcc3926052e7cc3de457d0e820..15a1b70220ff556df280e512d37d999f88fe61b9 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/ChangeHistoryBuilder.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/ChangeHistoryBuilder.java
@@ -104,8 +104,8 @@ abstract class ChangeHistoryBuilder<T extends ChangeHistoryBuilder<T>> {
 				.build();
 	}
 
-	String getValueFromCommandBody(String propertyName, ArchiveManagerCommand command) {
-		return Optional.ofNullable(command.getBody()).map(body -> body.get(propertyName)).map(Object::toString).orElse(StringUtils.EMPTY);
+	String getValueFromCommandBodyObject(String propertyName, ArchiveManagerCommand command) {
+		return Optional.ofNullable(command.getBodyObject()).map(body -> body.get(propertyName)).map(Object::toString).orElse(StringUtils.EMPTY);
 	}
 
 	record CommandWithChangeValues(ArchiveManagerCommand command, String valueBeforeChange, String valueAfterChange) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/VorgangChangeHistoryService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/VorgangChangeHistoryService.java
index 72f50de09755e54694dbcbe1b129de5ac8be2f8e..4bb0ad087cef198cc39fef7e19b6fe9af614868b 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/VorgangChangeHistoryService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/historie/VorgangChangeHistoryService.java
@@ -40,10 +40,10 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 class VorgangChangeHistoryService {
 
-	@Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME)
 	private final UserService userService;
 
-	@Qualifier(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.COMMAND_SERVICE_NAME)
 	private final CommandService commandService;
 
 	public VorgangChangeHistory createVorgangChangeHistory(VorgangWithEingang vorgang) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/ExportKommentarService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/ExportKommentarService.java
index 8922d1e87f3cfa57d9430df63c3aa7363cb26fbf..5462b2ed1aef821509543a38f65b5f6a5cbce284 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/ExportKommentarService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/ExportKommentarService.java
@@ -41,11 +41,11 @@ import lombok.RequiredArgsConstructor;
 @Service(ArchiveManagerConfiguration.KOMMENTAR_SERVICE_NAME)
 public class ExportKommentarService {
 
-	@Qualifier(ArchiveManagerConfiguration.KOMMENTAR_REMOTE_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.KOMMENTAR_REMOTE_SERVICE_NAME)
 	private final KommentarRemoteService kommentarRemoteService;
-	@Qualifier(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.BINARY_FILE_SERVICE_NAME)
 	private final BinaryFileService binaryFileService;
-	@Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME)
 	private final UserService userService;
 
 	public KommentarsExportData createExportData(VorgangWithEingang vorgang) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarRemoteService.java
index f42be6e0c777fbae782c822e3cef108d7ec812f1..ea9201a33284d4e0b1bd3b1e98126b951278e9e7 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarRemoteService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarRemoteService.java
@@ -36,7 +36,7 @@ import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.Vo
 import lombok.RequiredArgsConstructor;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
-@Service(ArchiveManagerConfiguration.KOMMENTAR_REMOTE_SERVICE_NAME) // NOSONAR
+@Service(ArchiveManagerConfiguration.KOMMENTAR_REMOTE_SERVICE_NAME)
 @RequiredArgsConstructor
 class KommentarRemoteService {
 
@@ -45,7 +45,7 @@ class KommentarRemoteService {
 	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME)
 	private final VorgangAttachedItemServiceBlockingStub grpcService;
 	private final KommentarMapper mapper;
-	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME)
 	private final OzgCloudCallContextProvider contextProvider;
 
 	public Stream<Kommentar> findByVorgangId(String vorgangId) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/postfach/ExportNachrichtService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/postfach/ExportNachrichtService.java
index 4f9de86b5b3e166e957a5b8dcd01f0680ae10694..8e480b13a8fee8efc62ee6b3622bff4879868ef8 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/postfach/ExportNachrichtService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/postfach/ExportNachrichtService.java
@@ -46,7 +46,7 @@ public class ExportNachrichtService {
 
 	private final PostfachMailRemoteService postfachMailRemoteService;
 	private final BinaryFileService binaryFileService;
-	@Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.USER_SERVICE_NAME)
 	private final UserService userService;
 
 	public PostfachMailExportData createExportData(VorgangWithEingang vorgang) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungScheduler.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungScheduler.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee8a238bbadadf5921aa478709f92b34b8f7f6f4
--- /dev/null
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungScheduler.java
@@ -0,0 +1,32 @@
+package de.ozgcloud.archive.quittung;
+
+import jakarta.annotation.PostConstruct;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Profile;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import de.ozgcloud.archive.common.xta.XtaProperties;
+import lombok.RequiredArgsConstructor;
+
+@Component
+@Profile("!itcase")
+@RequiredArgsConstructor
+@ConditionalOnProperty(prefix = XtaProperties.XTA_PROPERTIES_PREFIX, name = "enabled")
+public class QuittungScheduler {
+
+	private static final String SCHEDULER_CRON = "#{xtaProperties.schedulerCron}";
+
+	private final QuittungService service;
+
+	@PostConstruct
+	public void onStartup() {
+		run();
+	}
+
+	@Scheduled(cron = SCHEDULER_CRON)
+	public void run() {
+		service.fetchQuittung();
+	}
+}
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungService.java
new file mode 100644
index 0000000000000000000000000000000000000000..87a479849a0957c23a94a9eef892d78307d41ce4
--- /dev/null
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungService.java
@@ -0,0 +1,86 @@
+package de.ozgcloud.archive.quittung;
+
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Service;
+
+import de.ozgcloud.archive.common.command.ArchiveManagerCommand;
+import de.ozgcloud.archive.common.command.CommandService;
+import de.ozgcloud.archive.common.xta.XtaFileHelper;
+import de.ozgcloud.archive.common.xta.XtaFileParser;
+import de.ozgcloud.archive.common.xta.XtaFileType;
+import de.ozgcloud.archive.common.xta.XtaImportConfirmationHandler.XtaAbgabeAdapter;
+import de.ozgcloud.archive.common.xta.XtaService;
+import de.ozgcloud.command.Command;
+import de.ozgcloud.command.CommandExecutedEvent;
+import de.ozgcloud.command.CommandFailedEvent;
+import de.ozgcloud.xta.client.model.XtaFile;
+import de.ozgcloud.xta.client.model.XtaMessage;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
+
+@Log4j2
+@RequiredArgsConstructor
+@Service
+class QuittungService {
+
+	static final String ARCHIVE_VORGANG_ORDER = "ARCHIVE_VORGANG";
+
+	private final XtaService xtaService;
+	private final XtaFileHelper xtaFileHelper;
+	private final XtaFileParser xtaFileParser;
+
+	private final CommandService commandService;
+
+	private final ApplicationEventPublisher eventPublisher;
+
+	public void fetchQuittung() {
+		xtaService.fetchMessages(this::consumeQuittung);
+	}
+
+	void consumeQuittung(XtaMessage message) {
+		if (isImportConfirmation(message.messageFile())) {
+			xtaFileHelper.initImportConfirmationHandler(message.messageFile()).getAbgaben().forEach(this::handleAbgabe);
+		}
+	}
+
+	boolean isImportConfirmation(XtaFile xtaFile) {
+		return xtaFileParser.isType(xtaFile, XtaFileType.IMPORT_CONFIRMATION);
+	}
+
+	void handleAbgabe(XtaAbgabeAdapter abgabeHandler) {
+		var vorgangId = abgabeHandler.getVorgangId();
+		var pendingCommands = findPendingArchiveVorgangCommands(vorgangId);
+
+		if (CollectionUtils.isNotEmpty(pendingCommands)) {
+			evaluateAbgabe(abgabeHandler, pendingCommands);
+		} else {
+			LOG.warn("No pending archive command found for vorgang: %s. Cannot confirm archiving succesful", vorgangId);
+		}
+	}
+
+	private List<ArchiveManagerCommand> findPendingArchiveVorgangCommands(String vorgangId) {
+		return commandService.findPending(vorgangId, ARCHIVE_VORGANG_ORDER).toList();
+	}
+
+	void evaluateAbgabe(XtaAbgabeAdapter abgabeHandler, List<ArchiveManagerCommand> pendingCommands) {
+		if (pendingCommands.size() > 1) {
+			LOG.warn("Multiple pending commands found for vorgang: %s.", abgabeHandler.getVorgangId());
+		}
+		if (abgabeHandler.isSuccessful()) {
+			pendingCommands.forEach(this::publishCommandExecutedEvent);
+		} else {
+			pendingCommands.forEach(command -> publishCommandFailedEvent(abgabeHandler, command));
+		}
+	}
+
+	void publishCommandExecutedEvent(Command pendingCommand) {
+		eventPublisher.publishEvent(new CommandExecutedEvent(pendingCommand));
+	}
+
+	void publishCommandFailedEvent(XtaAbgabeAdapter contentHandler, Command pendingCommand) {
+		eventPublisher.publishEvent(new CommandFailedEvent(pendingCommand.getId(), contentHandler.getErrorMessage()));
+	}
+}
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangRemoteService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangRemoteService.java
index 6c0b50859a32db91ce76b566a9db7a080f546194..4394539cd722e418204e79bf0b9ba8a6e7b8394f 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangRemoteService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangRemoteService.java
@@ -34,17 +34,17 @@ import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub
 import lombok.RequiredArgsConstructor;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
-@Service(ArchiveManagerConfiguration.VORGANG_REMOTE_MANAGER_SERVICE_NAME) // NOSONAR
+@Service(ArchiveManagerConfiguration.VORGANG_REMOTE_MANAGER_SERVICE_NAME)
 @RequiredArgsConstructor
 class VorgangRemoteService {
 
-	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME) // NOSONAR
+	@GrpcClient(ArchiveManagerConfiguration.GRPC_VORGANG_MANAGER_CLIENT_NAME)
 	private final VorgangServiceBlockingStub grpcService;
 
-	@Qualifier(ArchiveManagerConfiguration.VORGANG_WITH_EINGANG_MAPPER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.VORGANG_WITH_EINGANG_MAPPER_NAME)
 	private final VorgangWithEingangMapper vorgangWithEingangMapper;
 
-	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CALL_CONTEXT_PROVIDER_NAME)
 	private final OzgCloudCallContextProvider contextProvider;
 
 	public VorgangWithEingang findVorgangWithEingang(String vorgangId) {
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangService.java
index 44c5f661718557c8c10b7f625e06b965cc4f2cd3..5d0be7ae621ebc838d9542bdf9be337ea83c8e39 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/vorgang/VorgangService.java
@@ -48,7 +48,7 @@ import de.xoev.xdomea.VorgangType;
 import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
-@Service(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME) // NOSONAR
+@Service(ArchiveManagerConfiguration.VORGANG_SERVICE_NAME)
 public class VorgangService {
 
 	static final String LOCK_VORGANG_ORDER = "LOCK_VORGANG";
@@ -56,11 +56,11 @@ public class VorgangService {
 	static final String LOCK_VORGANG_REASON = "Vorgang wird archiviert.";
 	static final String SUB_COMMAND_EXECUTION_MODE = "PARALLEL";
 
-	@Qualifier(ArchiveManagerConfiguration.VORGANG_REMOTE_MANAGER_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.VORGANG_REMOTE_MANAGER_SERVICE_NAME)
 	private final VorgangRemoteService vorgangRemoteService;
-	@Qualifier(ArchiveManagerConfiguration.OZGCLOUD_COMMAND_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.OZGCLOUD_COMMAND_SERVICE_NAME)
 	private final OzgCloudCommandService ozgCloudCommandService;
-	@Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR
+	@Qualifier(ArchiveManagerConfiguration.CURRENT_USER_SERVICE_NAME)
 	private final CurrentUserService currentUserService;
 	private final CommandMapper commandMapper;
 
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/ArchiveManagerTestApplication.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/ArchiveManagerTestApplication.java
index 9373e61aafa6b3ab1ec6c2d8d15de73e0443bce1..2b6ec1725317aa7b6fffc364481f496b6d563d3d 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/ArchiveManagerTestApplication.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/ArchiveManagerTestApplication.java
@@ -42,6 +42,7 @@ import de.ozgcloud.apilib.user.UserProfileMapper;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper;
 import de.ozgcloud.apilib.vorgang.grpc.OzgCloudVorgangMapper;
 import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc;
+import de.ozgcloud.xta.client.XtaClient;
 
 @SpringBootApplication
 @ComponentScan({ "de.ozgcloud.*" })
@@ -60,6 +61,8 @@ public class ArchiveManagerTestApplication {
 	@MockBean
 	private BuildProperties properties;
 	@MockBean
+	private XtaClient xtaClient;
+	@MockBean
 	private OzgCloudClientAttributeMapper clientAttributeMapper;
 
 	public static void main(String[] args) {
@@ -76,5 +79,4 @@ public class ArchiveManagerTestApplication {
 	CommandMapper commandMapper() {
 		return Mappers.getMapper(CommandMapper.class);
 	}
-
-}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptorTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptorTest.java
index 437490ce8620a3f5af6f6b587fae62e2a7e021ad..76556e7aed494d9ac10c1487da14f71473175364 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptorTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/callcontext/CallContextGrpcServerInterceptorTest.java
@@ -24,6 +24,7 @@
 package de.ozgcloud.archive.common.callcontext;
 
 import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 import java.util.Optional;
@@ -236,7 +237,4 @@ class CallContextGrpcServerInterceptorTest {
 
 	private record RequestTest() {
 	}
-
-	private record ResponseTest() {
-	}
 }
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandMapperTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandMapperTest.java
index a4d1c91c79f70b5f1e7b814a9a9b6723e76433c8..40c516b5733b5e613b7db8054def33b9f75ae20b 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandMapperTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandMapperTest.java
@@ -34,9 +34,7 @@ import org.mapstruct.factory.Mappers;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 
-import de.ozgcloud.apilib.common.command.grpc.GrpcCommandTestFactory;
 import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
-import de.ozgcloud.vorgang.grpc.command.GrpcCommand;
 
 class CommandMapperTest {
 
@@ -48,33 +46,25 @@ class CommandMapperTest {
 	@Nested
 	class TestFromGrpc {
 
-		private GrpcCommand command = GrpcCommandTestFactory.createBuilder()
-				.setFinishedAt(CommandTestFactory.FINISHED_AT.toString())
-				.setCreatedByName(CommandTestFactory.CREATED_BY_NAME)
-				.setOrderString(CommandTestFactory.ORDER)
-				.build();
-
 		@DisplayName("on existing body object at command")
 		@Nested
 		class TestOnExistingBodyObject {
 
 			@Test
 			void shouldCallGrpcObjectMapper() {
-				mapper.fromGrpc(command);
+				mapper.fromGrpc(GrpcCommandTestFactory.create());
 
-				verify(grpcObjectMapper).mapFromGrpc(command.getBodyObj());
+				verify(grpcObjectMapper).mapFromGrpc(GrpcCommandTestFactory.BODY_OBJECT);
 			}
 
 			@Test
 			void shouldMapToCommand() {
 				when(grpcObjectMapper.mapFromGrpc(any())).thenReturn(CommandTestFactory.BODY);
 
-				var result = mapper.fromGrpc(command);
+				var result = mapper.fromGrpc(GrpcCommandTestFactory.create());
 
 				assertThat(result).usingRecursiveComparison().isEqualTo(CommandTestFactory.create());
 			}
 		}
-
 	}
-
 }
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandServiceTest.java
index b4a09e172312f7e956b92cd758c662649ba69e7e..3baace331b1abdec2170a5e8ec8153d7ad913c86 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandServiceTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandServiceTest.java
@@ -30,7 +30,9 @@ import static org.mockito.Mockito.*;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
+import java.util.stream.Stream;
 
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
@@ -43,8 +45,10 @@ import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
 import de.ozgcloud.apilib.common.command.grpc.OzgCloudCommandTestFactory;
 import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
 import de.ozgcloud.archive.vorgang.VorgangWithEingangTestFactory;
+import de.ozgcloud.command.CommandStatus;
 
 class CommandServiceTest {
+
 	@Spy
 	@InjectMocks
 	private CommandService service;
@@ -66,6 +70,31 @@ class CommandServiceTest {
 		}
 	}
 
+	@DisplayName("Find pending")
+	@Nested
+	class TestFindPending {
+
+		private final String order = LoremIpsum.getInstance().getWords(1);
+
+		@Test
+		void shouldCallRemoteService() {
+			service.findPending(VorgangWithEingangTestFactory.ID, order);
+
+			verify(remoteService).findCommands(VorgangWithEingangTestFactory.ID, Optional.of(CommandStatus.PENDING.name()),
+					Optional.of(order));
+		}
+
+		@Test
+		void shouldReturnValue() {
+			var command = ArchiveManagerCommand.builder().build();
+			when(remoteService.findCommands(any(), any(), any())).thenReturn(Stream.of(command));
+
+			var commands = service.findPending(VorgangWithEingangTestFactory.ID, order).toList();
+
+			assertThat(commands).containsExactly(command);
+		}
+	}
+
 	@Nested
 	class TestHasPendingCommandsExceptArchive {
 
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandTestFactory.java
index 86671d991b629483928cdf946ac805460c1b9cce..22fbb411f8155392e181505e828524dbd11181a4 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandTestFactory.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/CommandTestFactory.java
@@ -25,33 +25,55 @@ package de.ozgcloud.archive.common.command;
 
 import java.time.ZonedDateTime;
 import java.util.Map;
+import java.util.UUID;
 
 import com.thedeanda.lorem.LoremIpsum;
 
-import de.ozgcloud.archive.common.command.ArchiveManagerCommand.ArchiveManagerCommandBuilder;
 import de.ozgcloud.archive.common.user.UserProfileTestFactory;
+import de.ozgcloud.command.CommandStatus;
 
 public class CommandTestFactory {
 
-	public static final ZonedDateTime FINISHED_AT = ZonedDateTime.now();
+	public static final String ID = UUID.randomUUID().toString();
+	public static final String VORGANG_ID = UUID.randomUUID().toString();;
+
 	public static final String CREATED_BY_NAME = UserProfileTestFactory.FULLNAME;
 	public static final String ORDER = LoremIpsum.getInstance().getWords(1);
+	public static final CommandStatus STATUS = CommandStatus.FINISHED;
+
+	public static final String BODY_FIELD_NAME = LoremIpsum.getInstance().getWords(1);
+	public static final String BODY_FIELD_VALUE = LoremIpsum.getInstance().getWords(1);
+	public static final Map<String, Object> BODY = Map.of(BODY_FIELD_NAME, BODY_FIELD_VALUE);
+
+	public static final String RELATION_ID = UUID.randomUUID().toString();
+	public static final long RELATION_VERSION = 42;
+
+	public static final String CREATED_AT_STR = "2023-08-18T13:54:10Z";
+	public static final ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR);
+	public static final String FINISHED_AT_STR = "2023-08-18T13:55:10Z";
+	public static final ZonedDateTime FINISHED_AT = ZonedDateTime.parse(FINISHED_AT_STR);
 
-	public static final String PROPERTY_1 = LoremIpsum.getInstance().getWords(1);
-	public static final String PROPERTY_2 = LoremIpsum.getInstance().getWords(1);
-	public static final String VALUE_1 = LoremIpsum.getInstance().getWords(1);
-	public static final String VALUE_2 = LoremIpsum.getInstance().getWords(1);
-	public static final Map<String, Object> BODY = Map.of(PROPERTY_1, VALUE_1, PROPERTY_2, VALUE_2);
+	public static final String CREATED_RESOURCE = UUID.randomUUID().toString();
+	public static final String CREATED_BY = UUID.randomUUID().toString();
+	public static final String ERROR_MESSAGE = "An error occurred";
 
 	public static ArchiveManagerCommand create() {
-		return createBuilder()
-				.build();
+		return createBuilder().build();
 	}
 
-	public static ArchiveManagerCommandBuilder createBuilder() {
-		return ArchiveManagerCommand.builder().body(BODY)
+	public static ArchiveManagerCommand.ArchiveManagerCommandBuilder createBuilder() {
+		return ArchiveManagerCommand.builder()
+				.id(ID)
+				.vorgangId(VORGANG_ID)
+				.relationId(RELATION_ID)
+				.order(ORDER)
+				.status(STATUS)
+				.createdAt(CREATED_AT)
 				.finishedAt(FINISHED_AT)
+				.bodyObject(BODY)
+				.createdResource(CREATED_RESOURCE)
+				.createdBy(CREATED_BY)
 				.createdByName(CREATED_BY_NAME)
-				.order(ORDER);
+				.errorMessage(ERROR_MESSAGE);
 	}
-}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/GrpcCommandTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/GrpcCommandTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..831cee8510d5897df84552adfdf5bd2848fe6a7a
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/command/GrpcCommandTestFactory.java
@@ -0,0 +1,33 @@
+package de.ozgcloud.archive.common.command;
+
+import de.ozgcloud.vorgang.common.GrpcObject;
+import de.ozgcloud.vorgang.common.GrpcProperty;
+import de.ozgcloud.vorgang.grpc.command.GrpcCommand;
+
+public class GrpcCommandTestFactory {
+
+	public static final GrpcObject BODY_OBJECT = GrpcObject.newBuilder()
+			.addProperty(GrpcProperty.newBuilder()
+					.setName(CommandTestFactory.BODY_FIELD_NAME).addValue(CommandTestFactory.BODY_FIELD_VALUE))
+			.build();
+
+	public static GrpcCommand create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcCommand.Builder createBuilder() {
+		return GrpcCommand.newBuilder()
+				.setId(CommandTestFactory.ID.toString())
+				.setVorgangId(CommandTestFactory.VORGANG_ID)
+				.setCreatedAt(CommandTestFactory.CREATED_AT_STR)
+				.setFinishedAt(CommandTestFactory.FINISHED_AT_STR)
+				.setCreatedBy(CommandTestFactory.CREATED_BY)
+				.setCreatedByName(CommandTestFactory.CREATED_BY_NAME)
+				.setStatus(CommandTestFactory.STATUS.toString())
+				.setErrorMessage(CommandTestFactory.ERROR_MESSAGE)
+				.setRelationId(CommandTestFactory.RELATION_ID)
+				.setBodyObj(BODY_OBJECT)
+				.setOrderString(CommandTestFactory.ORDER)
+				.setCreatedResource(CommandTestFactory.CREATED_RESOURCE);
+	}
+}
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/AbgabeImportBestaetigen0402TestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/AbgabeImportBestaetigen0402TestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..d034a25e99f4699183b736593be47bde4b271d41
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/AbgabeImportBestaetigen0402TestFactory.java
@@ -0,0 +1,34 @@
+package de.ozgcloud.archive.common.xta;
+
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.JAXBException;
+import jakarta.xml.bind.Unmarshaller;
+
+import org.w3c.dom.Document;
+
+import de.xoev.xdomea.AbgabeImportBestaetigen0402;
+import lombok.SneakyThrows;
+
+public class AbgabeImportBestaetigen0402TestFactory {
+
+	public static final String VORGANG_ID = "DummyVorgangId";
+	public static final boolean ERFOLGREICH = false;
+	public static final String FEHLERMELDUNG = "Grund, warum der Import nicht funktioniert hat.";
+
+	public static final String FILE_PATH = "xml-templates/21b2f942-c454-44e6-a706-c4f6ef2d584a_Abgabe.ImportBestaetigen.0402.xml";
+
+	@SneakyThrows
+	public static AbgabeImportBestaetigen0402 create() {
+		return (AbgabeImportBestaetigen0402) getUnmarshaller()
+				.unmarshal(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH).content().getInputStream());
+	}
+
+	private static Unmarshaller getUnmarshaller() throws JAXBException {
+		return JAXBContext.newInstance(AbgabeImportBestaetigen0402.class).createUnmarshaller();
+	}
+
+	@SneakyThrows
+	public static Document createAsDocument() {
+		return DocumentTestFactory.createFrom(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH));
+	}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/DocumentTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/DocumentTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..36d4a24ef635b9f1b8f17493cf3cf86dfd21815d
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/DocumentTestFactory.java
@@ -0,0 +1,23 @@
+package de.ozgcloud.archive.common.xta;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+
+import de.ozgcloud.xta.client.model.XtaFile;
+import lombok.SneakyThrows;
+
+public class DocumentTestFactory {
+
+	public static final XtaFile FILE = XtaFileTestFactory.create();
+
+	public static Document create() {
+		return createFrom(FILE);
+	}
+
+	@SneakyThrows
+	public static Document createFrom(XtaFile file) {
+		return DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().parse(file.content().getDataSource().getInputStream());
+	}
+
+}
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileHelperTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileHelperTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5485f56607185add07b0b74df6b510007104b3c1
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileHelperTest.java
@@ -0,0 +1,26 @@
+package de.ozgcloud.archive.common.xta;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+
+class XtaFileHelperTest {
+
+	@InjectMocks
+	private XtaFileHelper service;
+
+	@DisplayName("Init import confirmation handler")
+	@Nested
+	class TestInitImportConfirmationHandler {
+
+		@Test
+		void shouldReturnInstanceOfHandler() {
+			var handler = service.initImportConfirmationHandler(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH));
+
+			assertThat(handler).isNotNull().isInstanceOf(XtaImportConfirmationHandler.class);
+		}
+	}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserITCase.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserITCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..47cca112e543d89778b4f4ce4764d3c754d44a4e
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserITCase.java
@@ -0,0 +1,38 @@
+package de.ozgcloud.archive.common.xta;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import de.ozgcloud.common.test.ITCase;
+
+@ITCase
+class XtaFileParserITCase {
+
+	@Autowired
+	private XtaFileParser parser;
+
+	@DisplayName("Is import confirmation")
+	@Nested
+	class TestIsType {
+
+		@Test
+		void shouldReturnTrueOnMatchingTag() {
+			var isImportConfirmation = parser.isType(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH),
+					XtaFileType.IMPORT_CONFIRMATION);
+
+			assertThat(isImportConfirmation).isTrue();
+		}
+
+		@Test
+		void shouldReturnFalseOnNonMatchingTag() {
+			var isImportConfirmation = parser.isType(XtaFileTestFactory.create(), XtaFileType.ABGABE);
+
+			assertThat(isImportConfirmation).isFalse();
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f3713ad2b66b577bbda5200903e45f5fffc2cb2
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserTest.java
@@ -0,0 +1,124 @@
+package de.ozgcloud.archive.common.xta;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import java.io.InputStream;
+
+import javax.xml.parsers.DocumentBuilder;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.springframework.core.io.ClassPathResource;
+import org.w3c.dom.Document;
+
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.xta.client.model.XtaFile;
+import lombok.SneakyThrows;
+
+class XtaFileParserTest {
+
+	@Spy
+	@InjectMocks
+	private XtaFileParser parser;
+
+	@Mock
+	private DocumentBuilder documentBuilder;
+
+	@DisplayName("Is import confirmation")
+	@Nested
+	class TestIsType {
+
+		private final XtaFile file = XtaFileTestFactory.create();
+
+		@Test
+		@SneakyThrows
+		void shouldCallParse() {
+			isType();
+
+			verify(parser).parse(file);
+		}
+
+		@Test
+		@SneakyThrows
+		void shouldReturnTrueOnMatchingTag() {
+			doReturn(AbgabeImportBestaetigen0402TestFactory.createAsDocument()).when(parser).parse(file);
+
+			var isImportConfirmation = isType();
+
+			assertThat(isImportConfirmation).isTrue();
+		}
+
+		@Test
+		@SneakyThrows
+		void shouldReturnFalseOnNonMatchingTag() {
+			doReturn(DocumentTestFactory.create()).when(parser).parse(file);
+
+			var isImportConfirmation = isType();
+
+			assertThat(isImportConfirmation).isFalse();
+		}
+
+		@Test
+		@SneakyThrows
+		void shouldReturnFalseOnException() {
+			doThrow(TechnicalException.class).when(parser).parse(any());
+
+			var isType = isType();
+
+			assertThat(isType).isFalse();
+		}
+
+		private boolean isType() {
+			return parser.isType(file, XtaFileType.IMPORT_CONFIRMATION);
+		}
+	}
+
+	@Nested
+	class TestParse {
+
+		private final XtaFile file = XtaFileTestFactory.create();
+		private final Document document = AbgabeImportBestaetigen0402TestFactory.createAsDocument();
+
+		@Captor
+		private ArgumentCaptor<InputStream> inputStreamCaptor;
+
+		@BeforeEach
+		@SneakyThrows
+		void mock() {
+			when(documentBuilder.parse(any(InputStream.class))).thenReturn(document);
+		}
+
+		@Test
+		@SneakyThrows
+		void shouldCallDocumentBuilder() {
+			var expectedBytes = new ClassPathResource(XtaFileTestFactory.DUMMY_XML_FILE_PATH).getContentAsByteArray();
+
+			parse();
+
+			verify(documentBuilder).parse(inputStreamCaptor.capture());
+			assertThat(inputStreamCaptor.getValue().readAllBytes()).isEqualTo(expectedBytes);
+		}
+
+		@Test
+		@SneakyThrows
+		void shouldReturnDocument() {
+			var result = parse();
+
+			assertThat(result).isEqualTo(document);
+		}
+
+		@SneakyThrows
+		private Document parse() {
+			return parser.parse(file);
+		}
+	}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReaderTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReaderTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..73c88d4bfc0d48758e059b3e1936fcfa1cb6f142
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileReaderTest.java
@@ -0,0 +1,62 @@
+package de.ozgcloud.archive.common.xta;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.Unmarshaller;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.common.test.ReflectionTestUtils;
+import de.ozgcloud.xta.client.model.XtaFile;
+import de.xoev.xdomea.AbgabeImportBestaetigen0402;
+import lombok.SneakyThrows;
+
+class XtaFileReaderTest {
+
+	@Nested
+	class TestCreateAbgabeImportBestaetigen0402Reader {
+
+		@Test
+		void shouldCreateReader() {
+			var reader = XtaFileReader.createAbgabeImportBestaetigen0402Reader();
+
+			assertThat(reader).isExactlyInstanceOf(XtaFileReader.class);
+		}
+
+		@Test
+		@SneakyThrows
+		void shouldSetUnmarshaller() {
+			var reader = XtaFileReader.createAbgabeImportBestaetigen0402Reader();
+
+			assertThat(ReflectionTestUtils.getField(reader, "unmarshaller", Unmarshaller.class)).usingRecursiveComparison()
+					.isEqualTo(JAXBContext.newInstance(AbgabeImportBestaetigen0402.class).createUnmarshaller());
+		}
+	}
+
+	@Nested
+	class TestRead {
+
+		@Test
+		@SneakyThrows
+		void shouldReadContent() {
+			var reader = XtaFileReader.createAbgabeImportBestaetigen0402Reader();
+
+			var abgabe = reader.read(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH));
+
+			assertThat(abgabe).usingRecursiveComparison().isEqualTo(AbgabeImportBestaetigen0402TestFactory.create());
+		}
+
+		@Test
+		@SneakyThrows
+		void shouldThrowTechnicalException() {
+			var reader = XtaFileReader.createAbgabeImportBestaetigen0402Reader();
+			XtaFile unknownFile = XtaFileTestFactory.create(XtaFileTestFactory.DUMMY_XML_FILE_PATH);
+
+			assertThrows(TechnicalException.class, () -> reader.read(unknownFile));
+		}
+	}
+}
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e03b8db6ffae2c86c18f18e07b03bda9231cb98
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileTestFactory.java
@@ -0,0 +1,37 @@
+package de.ozgcloud.archive.common.xta;
+
+import jakarta.activation.DataHandler;
+import jakarta.activation.FileDataSource;
+
+import org.springframework.core.io.ClassPathResource;
+
+import de.ozgcloud.xta.client.model.XtaFile;
+import lombok.SneakyThrows;
+
+public class XtaFileTestFactory {
+
+	public static final String DUMMY_XML_FILE_PATH = "xml-templates/dummy.xml";
+
+	public static XtaFile create() {
+		return create(DUMMY_XML_FILE_PATH);
+	}
+
+	public static XtaFile create(String filePath) {
+		return createBuilder(filePath).build();
+	}
+
+	public static XtaFile.XtaFileBuilder createBuilder() {
+		return createBuilder(DUMMY_XML_FILE_PATH);
+	}
+
+	public static XtaFile.XtaFileBuilder createBuilder(String filePath) {
+		return XtaFile.builder()
+				.content(createDataHandler(filePath));
+	}
+
+	@SneakyThrows
+	private static DataHandler createDataHandler(String filePath) {
+		var file = new ClassPathResource(filePath).getFile();
+		return new DataHandler(new FileDataSource(file));
+	}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandlerTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandlerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e36d432775aa4feeb8bd23679aee7fcfbae5f09
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaImportConfirmationHandlerTest.java
@@ -0,0 +1,118 @@
+package de.ozgcloud.archive.common.xta;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.MockedStatic;
+
+import de.ozgcloud.archive.common.xta.XtaImportConfirmationHandler.XtaAbgabeAdapter;
+import de.ozgcloud.common.test.ReflectionTestUtils;
+import de.ozgcloud.xta.client.model.XtaFile;
+import de.xoev.xdomea.AbgabeImportBestaetigen0402;
+
+class XtaImportConfirmationHandlerTest {
+
+	@DisplayName("Xta import confirmation handler")
+	@Nested
+	class TestXtaImportConfirmationHandler {
+
+		private final AbgabeImportBestaetigen0402 importConfirmation = AbgabeImportBestaetigen0402TestFactory.create();
+		private final XtaFile file = XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH);
+
+		@Mock
+		private XtaFileReader<AbgabeImportBestaetigen0402> reader;
+
+		@Nested
+		class TestCreateFrom {
+
+			@SuppressWarnings("rawtypes")
+			private MockedStatic<XtaFileReader> fileReaderStaticMock;
+
+			@BeforeEach
+			void initMock() {
+				fileReaderStaticMock = mockStatic(XtaFileReader.class);
+				fileReaderStaticMock.when(XtaFileReader::createAbgabeImportBestaetigen0402Reader).thenReturn(reader);
+			}
+
+			@AfterEach
+			void closeMock() {
+				fileReaderStaticMock.close();
+			}
+
+			@Test
+			void shouldReadFileContent() {
+				XtaImportConfirmationHandler.createFrom(file);
+
+				verify(reader).read(file);
+			}
+
+			@Test
+			void shouldSetImportConfirmation() {
+				when(reader.read(any())).thenReturn(importConfirmation);
+
+				var confiHandler = XtaImportConfirmationHandler.createFrom(file);
+
+				assertThat(ReflectionTestUtils.getField(confiHandler, "importConfirmation", AbgabeImportBestaetigen0402.class))
+						.usingRecursiveComparison().isEqualTo(importConfirmation);
+
+			}
+
+		}
+
+		@Nested
+		class TestGetAbgaben {
+			private final XtaFile file = XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH);
+
+			@Test
+			void shouldReturnAbgabenAsHandler() {
+				var handler = XtaImportConfirmationHandler.createFrom(file);
+
+				assertThat(handler.getAbgaben()).hasSize(1);
+				assertThat(handler.getAbgaben().findFirst()).isPresent().get().isInstanceOf(XtaAbgabeAdapter.class);
+			}
+		}
+	}
+
+	@DisplayName("Xta abgabe handler")
+	@Nested
+	class TestXtaAbgabeAdapter {
+
+		private final XtaFile file = XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH);
+
+		@Test
+		void shouldReturnVorgangId() {
+			var vorgangId = initAbgabeHandler().getVorgangId();
+
+			assertThat(vorgangId).isEqualTo(AbgabeImportBestaetigen0402TestFactory.VORGANG_ID);
+		}
+
+		@Test
+		void shouldReturnIsSucessful() {
+			var isSuccessful = initAbgabeHandler().isSuccessful();
+
+			assertThat(isSuccessful).isEqualTo(AbgabeImportBestaetigen0402TestFactory.ERFOLGREICH);
+		}
+
+		@Test
+		void shouldReturnErrorMessage() {
+			var errorMessage = initAbgabeHandler().getErrorMessage();
+
+			assertThat(errorMessage).isEqualTo(AbgabeImportBestaetigen0402TestFactory.FEHLERMELDUNG);
+		}
+
+		private XtaAbgabeAdapter initAbgabeHandler() {
+			return initImportConfirmationHandler().getAbgaben().findFirst().get();
+		}
+
+		private XtaImportConfirmationHandler initImportConfirmationHandler() {
+			return XtaImportConfirmationHandler.createFrom(file);
+		}
+	}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaMessageTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaMessageTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ab40253ff8a3ab8f8b4a36f979e4e07e29fb188
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaMessageTestFactory.java
@@ -0,0 +1,18 @@
+package de.ozgcloud.archive.common.xta;
+
+import de.ozgcloud.xta.client.model.XtaFile;
+import de.ozgcloud.xta.client.model.XtaMessage;
+
+public class XtaMessageTestFactory {
+
+	public static final XtaFile MESSAGE_FILE = XtaFileTestFactory.create();
+
+	public static XtaMessage create() {
+		return createBuilder().build();
+	}
+
+	public static XtaMessage.XtaMessageBuilder createBuilder() {
+		return XtaMessage.builder()
+				.messageFile(MESSAGE_FILE);
+	}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaServiceTest.java
index 536adb305f6e1acdac5731ff29f1c78eca0fec9a..8aa6c075b216996913d946da156958c7db6f0dae 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaServiceTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaServiceTest.java
@@ -6,16 +6,20 @@ import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 import java.util.Optional;
+import java.util.function.Consumer;
 
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.MockedStatic;
 import org.mockito.Spy;
+import org.springframework.context.ApplicationEventPublisher;
 
+import de.ozgcloud.archive.common.command.CommandService;
 import de.ozgcloud.archive.vorgang.XdomeaXtaFileTestFactory;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.xta.client.XtaClient;
@@ -148,6 +152,15 @@ class XtaServiceTest {
 
 		private XtaService xtaService;
 
+		@Mock
+		private XtaFileHelper xtaFileHelper;
+
+		@Mock
+		private CommandService commandService;
+
+		@Mock
+		private ApplicationEventPublisher eventPublisher;
+
 		@Nested
 		class TestOnConfiguredXtaClient {
 
@@ -183,4 +196,45 @@ class XtaServiceTest {
 			return xtaService.getXtaClient();
 		}
 	}
+
+	@DisplayName("Fetch messages")
+	@Nested
+	class TestFetchMessages {
+
+		@Mock
+		private Consumer<XtaMessage> messageConsumer;
+
+		@BeforeEach
+		void mock() {
+			doReturn(xtaClient).when(service).getXtaClient();
+		}
+
+		@Test
+		void shouldCallGetXtaClient() {
+			fetchMessages();
+
+			verify(service).getXtaClient();
+		}
+
+		@SneakyThrows
+		@Test
+		void shouldCallClient() {
+			fetchMessages();
+
+			verify(xtaClient).fetchMessages(messageConsumer);
+		}
+
+		@SneakyThrows
+		@Test
+		void shouldThrowException() {
+			when(xtaClient.fetchMessages(any())).thenThrow(new XtaClientException("error-message"));
+
+			assertThatThrownBy(this::fetchMessages).isInstanceOf(TechnicalException.class);
+		}
+
+		private void fetchMessages() {
+			service.fetchMessages(messageConsumer);
+		}
+	}
+
 }
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportGrpcServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportGrpcServiceTest.java
index 52694de1c9a693475348ab5174472e74be5de8f3..f2a0fb2f4f1467a12b56ef4b61948b4c55dccd76 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportGrpcServiceTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/export/ExportGrpcServiceTest.java
@@ -176,7 +176,8 @@ class ExportGrpcServiceTest {
 		@Mock
 		private OutputStream outputStream;
 
-		private MockedConstruction<GrpcBinaryFileServerDownloader> downloaderMockedConstruction; // NOSONAR
+		@SuppressWarnings("rawtypes")
+		private MockedConstruction<GrpcBinaryFileServerDownloader> downloaderMockedConstruction;
 		private GrpcBinaryFileServerDownloader<GrpcExportVorgangResponse> downloader;
 		private StreamObserver<GrpcExportVorgangResponse> setResponseObserver;
 		private TaskExecutor setTaskExecutor;
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilderTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilderTest.java
index deb8bba8e88d27f52b04e45df9389d24b550cfa3..cc6e23826262ea5c7301930af8d7ce26e58679fb 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilderTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AktenzeichenChangeHistoryBuilderTest.java
@@ -185,14 +185,14 @@ public class AktenzeichenChangeHistoryBuilderTest {
 
 		@BeforeEach
 		void init() {
-			when(builder.getValueFromCommandBody(BODY_PROPERTY_AKTENZEICHEN, previousCommand)).thenReturn(AKTENZEICHEN);
+			when(builder.getValueFromCommandBodyObject(BODY_PROPERTY_AKTENZEICHEN, previousCommand)).thenReturn(AKTENZEICHEN);
 		}
 
 		@Test
 		void shouldGetValueFromCommandBody() {
 			builder.getAktenzeichen(previousCommand);
 
-			verify(builder).getValueFromCommandBody(BODY_PROPERTY_AKTENZEICHEN, previousCommand);
+			verify(builder).getValueFromCommandBodyObject(BODY_PROPERTY_AKTENZEICHEN, previousCommand);
 		}
 
 		@Test
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilderTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilderTest.java
index 65db09161154086d5def426d792616d8eff35ab8..fe7afe21864ffe3befe9f506c210a6a6955fb248 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilderTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/AssignedUserChangeHistoryBuilderTest.java
@@ -217,7 +217,7 @@ public class AssignedUserChangeHistoryBuilderTest {
 
 		@BeforeEach
 		void init() {
-			doReturn(UserProfileTestFactory.USER_ID).when(builder).getValueFromCommandBody(any(), any());
+			doReturn(UserProfileTestFactory.USER_ID).when(builder).getValueFromCommandBodyObject(any(), any());
 			doReturn(Optional.of(UserProfileTestFactory.create())).when(userProfileCache).getUserProfile(any());
 		}
 
@@ -225,7 +225,7 @@ public class AssignedUserChangeHistoryBuilderTest {
 		void shouldGetUserIdFromCommand() {
 			callBuilder();
 
-			verify(builder).getValueFromCommandBody(BODY_PROPERTY_ASSIGNED_USER, previousCommand);
+			verify(builder).getValueFromCommandBodyObject(BODY_PROPERTY_ASSIGNED_USER, previousCommand);
 		}
 
 		@Test
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/ChangeHistoryBuilderTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/ChangeHistoryBuilderTest.java
index 457a8673679a869cd0e1743b5d17f1c2fb7f68d4..5cc94ff0a704dc7b28d75ec3abbc99e2e233edc8 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/ChangeHistoryBuilderTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/historie/ChangeHistoryBuilderTest.java
@@ -252,19 +252,19 @@ public class ChangeHistoryBuilderTest {
 
 		@ParameterizedTest
 		@NullAndEmptySource
-		void shouldReturnEmptyIfBodyIsNullOrEmpty(Map<String, ?> body) {
-			var command = previousCommand.toBuilder().body(body).build();
+		void shouldReturnEmptyIfBodyIsNullOrEmpty(Map<String, Object> body) {
+			var command = previousCommand.toBuilder().bodyObject(body).build();
 
-			var value = builder.getValueFromCommandBody(PROPERTY_NAME, command);
+			var value = builder.getValueFromCommandBodyObject(PROPERTY_NAME, command);
 
 			assertThat(value).isEmpty();
 		}
 
 		@Test
 		void shouldReturnEmptyIfPropertyIsNotPresentInBody() {
-			var command = previousCommand.toBuilder().body(Map.of("a", "b")).build();
+			var command = previousCommand.toBuilder().bodyObject(Map.of("a", "b")).build();
 
-			var value = builder.getValueFromCommandBody(PROPERTY_NAME, command);
+			var value = builder.getValueFromCommandBodyObject(PROPERTY_NAME, command);
 
 			assertThat(value).isEmpty();
 		}
@@ -272,9 +272,9 @@ public class ChangeHistoryBuilderTest {
 		@Test
 		void shouldReturnValueFromBody() {
 			var expectedValue = LoremIpsum.getInstance().getWords(2);
-			var command = previousCommand.toBuilder().body(Map.of(PROPERTY_NAME, expectedValue)).build();
+			var command = previousCommand.toBuilder().bodyObject(Map.of(PROPERTY_NAME, expectedValue)).build();
 
-			var value = builder.getValueFromCommandBody(PROPERTY_NAME, command);
+			var value = builder.getValueFromCommandBodyObject(PROPERTY_NAME, command);
 
 			assertThat(value).isEqualTo(expectedValue);
 		}
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungSchedulerTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungSchedulerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..120451f8f879100ad73f8e32f25581ecd94d4cf1
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungSchedulerTest.java
@@ -0,0 +1,40 @@
+package de.ozgcloud.archive.quittung;
+
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+class QuittungSchedulerTest {
+
+	@Spy
+	@InjectMocks
+	private QuittungScheduler scheduler;
+	@Mock
+	private QuittungService service;
+
+	@Nested
+	class TestOnStartup {
+
+		@Test
+		void shouldCallRun() {
+			scheduler.onStartup();
+
+			verify(scheduler).run();
+		}
+	}
+
+	@Nested
+	class TestRun {
+
+		@Test
+		void shouldCallService() {
+			scheduler.run();
+
+			verify(service).fetchQuittung();
+		}
+	}
+}
\ No newline at end of file
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c6e600aa2848d2dc97011ddf78f6e7ed2ff4cfc1
--- /dev/null
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungServiceTest.java
@@ -0,0 +1,300 @@
+package de.ozgcloud.archive.quittung;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.springframework.context.ApplicationEventPublisher;
+
+import de.ozgcloud.archive.common.command.ArchiveManagerCommand;
+import de.ozgcloud.archive.common.command.CommandService;
+import de.ozgcloud.archive.common.command.CommandTestFactory;
+import de.ozgcloud.archive.common.xta.AbgabeImportBestaetigen0402TestFactory;
+import de.ozgcloud.archive.common.xta.XtaFileHelper;
+import de.ozgcloud.archive.common.xta.XtaFileParser;
+import de.ozgcloud.archive.common.xta.XtaFileTestFactory;
+import de.ozgcloud.archive.common.xta.XtaFileType;
+import de.ozgcloud.archive.common.xta.XtaImportConfirmationHandler;
+import de.ozgcloud.archive.common.xta.XtaImportConfirmationHandler.XtaAbgabeAdapter;
+import de.ozgcloud.archive.common.xta.XtaMessageTestFactory;
+import de.ozgcloud.archive.common.xta.XtaService;
+import de.ozgcloud.archive.vorgang.VorgangWithEingangTestFactory;
+import de.ozgcloud.command.CommandExecutedEvent;
+import de.ozgcloud.command.CommandFailedEvent;
+import de.ozgcloud.xta.client.model.XtaFile;
+import de.ozgcloud.xta.client.model.XtaMessage;
+
+class QuittungServiceTest {
+
+	@Spy
+	@InjectMocks
+	private QuittungService service;
+	@Mock
+	private XtaService xtaService;
+	@Mock
+	private CommandService commandService;
+	@Mock
+	private ApplicationEventPublisher eventPublisher;
+	@Mock
+	private XtaFileHelper xtaFileHelper;
+	@Mock
+	private XtaFileParser xtaFileParser;
+
+	@Nested
+	class TestFetchQuittung {
+
+		@Captor
+		private ArgumentCaptor<Consumer<XtaMessage>> consumerCaptor;
+
+		private final XtaMessage message = XtaMessageTestFactory.create();
+
+		@Test
+		void shouldCallXtaService() {
+			service.fetchQuittung();
+
+			verify(xtaService).fetchMessages(any());
+		}
+
+		@Test
+		void shouldPassQuittungConsumerToXtaService() {
+			service.fetchQuittung();
+
+			verify(xtaService).fetchMessages(consumerCaptor.capture());
+			consumerCaptor.getValue().accept(message);
+			verify(service).consumeQuittung(message);
+		}
+	}
+
+	@DisplayName("Consume Quittung")
+	@Nested
+	class TestConsumeQuittung {
+
+		@Mock
+		private XtaImportConfirmationHandler xtaFileContentHandler;
+
+		private final XtaMessage xtaMessage = XtaMessageTestFactory.create();
+
+		@Test
+		void shouldCallIsImportConfirmation() {
+			service.consumeQuittung(xtaMessage);
+
+			verify(service).isImportConfirmation(XtaMessageTestFactory.MESSAGE_FILE);
+		}
+
+		@DisplayName("on import confirmation")
+		@Nested
+		class TestOnImportConfirmation {
+
+			@Mock
+			private XtaAbgabeAdapter abgabeHandler;
+
+			@BeforeEach
+			void mock() {
+				doReturn(true).when(service).isImportConfirmation(any());
+				when(xtaFileHelper.initImportConfirmationHandler(any())).thenReturn(xtaFileContentHandler);
+				when(xtaFileContentHandler.getAbgaben()).thenReturn(Stream.of(abgabeHandler, abgabeHandler));
+				doNothing().when(service).handleAbgabe(any());
+			}
+
+			@Test
+			void shouldInitContentHandler() {
+				service.consumeQuittung(xtaMessage);
+
+				verify(xtaFileHelper).initImportConfirmationHandler(XtaMessageTestFactory.MESSAGE_FILE);
+			}
+
+			@DisplayName("should handle import confirmation if type from document is matching")
+			@Test
+			void shouldCallHandleAbgabe() {
+				service.consumeQuittung(xtaMessage);
+
+				verify(service, times(2)).handleAbgabe(abgabeHandler);
+			}
+		}
+
+		@DisplayName("should not handle message if its not an import confirmation")
+		@Test
+		void shouldNotProceed() {
+			doReturn(false).when(service).isImportConfirmation(any());
+
+			service.consumeQuittung(xtaMessage);
+
+			verify(service, never()).handleAbgabe(any());
+			verify(xtaFileHelper, never()).initImportConfirmationHandler(any());
+		}
+	}
+
+	@Nested
+	class TestIsImportConfirmation {
+
+		private XtaFile xtaFile = XtaFileTestFactory.create();
+
+		@Test
+		void shouldCallXtaFileParser() {
+			service.isImportConfirmation(xtaFile);
+
+			verify(xtaFileParser).isType(xtaFile, XtaFileType.IMPORT_CONFIRMATION);
+		}
+
+		@ParameterizedTest
+		@ValueSource(booleans = { true, false })
+		void shouldReturnIsType(boolean isImportConfirmation) {
+			when(xtaFileParser.isType(any(), any())).thenReturn(isImportConfirmation);
+
+			var returnValue = service.isImportConfirmation(xtaFile);
+
+			assertThat(returnValue).isEqualTo(isImportConfirmation);
+		}
+
+	}
+
+	@DisplayName("Handle abgabe")
+	@Nested
+	class TestHandleAbgabe {
+
+		@Mock
+		private XtaAbgabeAdapter abgabeHandler;
+
+		@BeforeEach
+		void mock() {
+			when(abgabeHandler.getVorgangId()).thenReturn(VorgangWithEingangTestFactory.ID);
+			when(commandService.findPending(any(), any())).thenReturn(Stream.empty());
+		}
+
+		@Test
+		void shouldGetVorgangId() {
+			handleImportConfirmation();
+
+			verify(abgabeHandler).getVorgangId();
+		}
+
+		@Test
+		void shouldCallCommandService() {
+			handleImportConfirmation();
+
+			verify(commandService).findPending(VorgangWithEingangTestFactory.ID, QuittungService.ARCHIVE_VORGANG_ORDER);
+		}
+
+		@DisplayName("on existing pending commands")
+		@Nested
+		class TestOnExistingPendingCommands {
+
+			private final ArchiveManagerCommand command = CommandTestFactory.create();
+			private final List<ArchiveManagerCommand> commands = List.of(command);
+
+			@BeforeEach
+			void mock() {
+				when(commandService.findPending(any(), any())).thenReturn(commands.stream());
+				doNothing().when(service).evaluateAbgabe(any(), any());
+			}
+
+			@Test
+			void shouldCallEvaluateConfirmation() {
+				handleImportConfirmation();
+
+				verify(service).evaluateAbgabe(abgabeHandler, commands);
+			}
+		}
+
+		@Test
+		void shouldNotCallEvaluateImportConfirmationOnEmptyList() {
+			handleImportConfirmation();
+
+			verify(service, never()).evaluateAbgabe(any(), any());
+		}
+
+		private void handleImportConfirmation() {
+			service.handleAbgabe(abgabeHandler);
+		}
+	}
+
+	@DisplayName("Evaluate abgabe")
+	@Nested
+	class TestEvaluateConfirmation {
+
+		@Mock
+		private XtaAbgabeAdapter abgabeHandler;
+
+		private final ArchiveManagerCommand command = CommandTestFactory.create();
+		private final List<ArchiveManagerCommand> commands = List.of(command, command);
+
+		@Test
+		void shouldCallIsSuccessfullyDone() {
+			service.evaluateAbgabe(abgabeHandler, commands);
+
+			verify(abgabeHandler).isSuccessful();
+		}
+
+		@Test
+		void shouldCallPublishCommendExcecutedEvent() {
+			when(abgabeHandler.isSuccessful()).thenReturn(true);
+
+			service.evaluateAbgabe(abgabeHandler, commands);
+
+			verify(service, times(2)).publishCommandExecutedEvent(command);
+		}
+
+		@Test
+		void shouldCallPublishCommandFailedEvent() {
+			when(abgabeHandler.isSuccessful()).thenReturn(false);
+
+			service.evaluateAbgabe(abgabeHandler, commands);
+
+			verify(service, times(2)).publishCommandFailedEvent(abgabeHandler, command);
+		}
+
+		@DisplayName("on successfully done import confirmation")
+		@Nested
+		class TestPublishCommandExcutedEvent {
+
+			@Captor
+			private ArgumentCaptor<CommandExecutedEvent> commandExecutedEventCaptor;
+
+			@DisplayName("should publish command executed event")
+			@Test
+			void shouldPublishCommandExecutedEvent() {
+				service.publishCommandExecutedEvent(command);
+
+				verify(eventPublisher).publishEvent(commandExecutedEventCaptor.capture());
+				assertThat(commandExecutedEventCaptor.getValue().getCommand()).isEqualTo(command);
+			}
+		}
+
+		@DisplayName("on failed import confirmation")
+		@Nested
+		class TestPublishCommandFailedEvent {
+
+			@Captor
+			private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor;
+
+			private final ArchiveManagerCommand command = CommandTestFactory.create();
+
+			@DisplayName("should publish command failed event")
+			@Test
+			void shouldPublishCommandFailedEvent() {
+				when(abgabeHandler.getErrorMessage()).thenReturn(AbgabeImportBestaetigen0402TestFactory.FEHLERMELDUNG);
+
+				service.publishCommandFailedEvent(abgabeHandler, command);
+
+				verify(eventPublisher).publishEvent(commandFailedEventCaptor.capture());
+				assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(CommandTestFactory.ID);
+				assertThat(commandFailedEventCaptor.getValue().getErrorMessage()).isEqualTo(AbgabeImportBestaetigen0402TestFactory.FEHLERMELDUNG);
+			}
+		}
+	}
+}
diff --git a/archive-manager-server/src/test/resources/xml-templates/21b2f942-c454-44e6-a706-c4f6ef2d584a_Abgabe.ImportBestaetigen.0402.xml b/archive-manager-server/src/test/resources/xml-templates/21b2f942-c454-44e6-a706-c4f6ef2d584a_Abgabe.ImportBestaetigen.0402.xml
new file mode 100644
index 0000000000000000000000000000000000000000..41cf2682648701c84fe63a2b8b6ddb6cb764b2ec
--- /dev/null
+++ b/archive-manager-server/src/test/resources/xml-templates/21b2f942-c454-44e6-a706-c4f6ef2d584a_Abgabe.ImportBestaetigen.0402.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<xdomea:Abgabe.ImportBestaetigen.0402 xmlns:xoev-code="http://xoev.de/schemata/code/1_0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xoev-lc="http://xoev.de/latinchars/1_1/datatypes" xmlns:dinspec91379="urn:xoev-de:kosit:xoev:datentyp:din-spec-91379_2019-03" xmlns:xdomea="urn:xoev-de:xdomea:schema:3.0.0" xmlns:ns3="urn:ozgcloud-de:xdomea:schema:1.0.0">
+    <xdomea:Kopf>
+        <xdomea:ProzessID>662912249c67ff057850e259</xdomea:ProzessID>
+        <xdomea:Nachrichtentyp listURI="urn:xoev-de:xdomea:codeliste:nachrichtentyp" listVersionID="2.0">
+            <code>0402</code>
+        </xdomea:Nachrichtentyp>
+        <xdomea:Erstellungszeitpunkt>2024-04-24T14:21:30.331Z</xdomea:Erstellungszeitpunkt>
+        <xdomea:Absender>
+            <xdomea:Behoerdenkennung>
+                <xdomea:Behoerdenschluessel listURI="urn:de:bund:destatis:bevoelkerungsstatistik:schluessel:rs" listVersionID="2023-11-30"/>
+            </xdomea:Behoerdenkennung>
+            <xdomea:Organisationseinheit>
+                <xdomea:Name>9030229</xdomea:Name>
+            </xdomea:Organisationseinheit>
+        </xdomea:Absender>
+        <xdomea:Empfaenger>
+            <xdomea:Behoerdenkennung>
+                <xdomea:Behoerdenschluessel listURI="urn:de:bund:destatis:bevoelkerungsstatistik:schluessel:rs" listVersionID="2023-11-30"/>
+            </xdomea:Behoerdenkennung>
+        </xdomea:Empfaenger>
+		
+        <xdomea:SendendesSystem>
+            <xdomea:Produktname>DMS-Name</xdomea:Produktname>
+        </xdomea:SendendesSystem>
+    </xdomea:Kopf>
+    <xdomea:AbgegebenesObjekt>
+        <xdomea:IDSGO>DummyVorgangId</xdomea:IDSGO>
+        <xdomea:Erfolgreich>false</xdomea:Erfolgreich>
+        <xdomea:Fehlermeldung>Grund, warum der Import nicht funktioniert hat.</xdomea:Fehlermeldung>
+    </xdomea:AbgegebenesObjekt>
+</xdomea:Abgabe.ImportBestaetigen.0402>
\ No newline at end of file
diff --git a/archive-manager-server/src/test/resources/xml-templates/dummy.xml b/archive-manager-server/src/test/resources/xml-templates/dummy.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0687ccf63cb2c587bfbba3501cccabde537a2a67
--- /dev/null
+++ b/archive-manager-server/src/test/resources/xml-templates/dummy.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<tag:name xmlns:xoev-code="http://xoev.de/schemata/code/1_0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xoev-lc="http://xoev.de/latinchars/1_1/datatypes" xmlns:dinspec91379="urn:xoev-de:kosit:xoev:datentyp:din-spec-91379_2019-03" xmlns:xdomea="urn:xoev-de:xdomea:schema:3.0.0" xmlns:ns3="urn:ozgcloud-de:xdomea:schema:1.0.0">
+</tag:name>
\ No newline at end of file