diff --git a/alfa-client/apps/alfa-e2e/docker-compose.yml b/alfa-client/apps/alfa-e2e/docker-compose.yml
index 8994d0ba1df83cc3a256e13ed6c03ea61e85b6c4..8520757132d41b0af9b0452c8a8a192c230c95e9 100644
--- a/alfa-client/apps/alfa-e2e/docker-compose.yml
+++ b/alfa-client/apps/alfa-e2e/docker-compose.yml
@@ -105,6 +105,7 @@ services:
       - OZGCLOUD_VORGANG_PROCESSOR_1_FORM_ENGINE_NAME=AFM
       - OZGCLOUD_VORGANG_PROCESSOR_1_FORM_ID=Erstattung_FAIL
       - OZGCLOUD_VORGANG_PROCESSOR_NAMES_0=ticketCheck
+      - OZGCLOUD_DMS_ENABLED=true
       - SPRING_PROFILES_ACTIVE=remotekc, e2e
       - LOGGING_CONFIG=classpath:log4j2-local.xml
       - BPL_DEBUG_ENABLED=true
diff --git a/alfa-client/libs/command-shared/src/lib/command.model.ts b/alfa-client/libs/command-shared/src/lib/command.model.ts
index 50b3d13dfa7db22f1779e29309c8e8b726f90635..a64cb0dd5f581ff2a55b66d3ab9e56f22223841a 100644
--- a/alfa-client/libs/command-shared/src/lib/command.model.ts
+++ b/alfa-client/libs/command-shared/src/lib/command.model.ts
@@ -87,6 +87,7 @@ export enum CommandOrder {
   CREATE_BESCHEID_DOCUMENT = 'CREATE_BESCHEID_DOCUMENT',
   SEND_BESCHEID = 'SEND_BESCHEID',
   CREATE_COLLABORATION_REQUEST = 'CREATE_COLLABORATION_REQUEST',
+  ARCHIVE_VORGANG = 'ARCHIVE_VORGANG',
 }
 
 export interface CreateCommandProps {
diff --git a/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts b/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts
index e99b6e1d79106eaa29ce3120b9aacc6b74eb42be..f76f1f907cecaa625c3e1c6dc950458e3f4aa640 100644
--- a/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts
+++ b/alfa-client/libs/design-component/src/lib/button-with-spinner/button-with-spinner.component.ts
@@ -36,11 +36,7 @@ type ButtonVariants = VariantProps<typeof buttonVariants>;
   standalone: true,
   imports: [CommonModule, ButtonComponent, ErrorMessageComponent],
   styles: [':host {@apply flex flex-col w-fit}'],
-  template: ` <ods-error-message
-      *ngIf="isError"
-      text="Ein Fehler ist aufgetreten."
-      subText="Versuchen Sie es noch einmal."
-    >
+  template: ` <ods-error-message *ngIf="isError" text="Ein Fehler ist aufgetreten." subText="Versuchen Sie es noch einmal.">
     </ods-error-message>
     <ods-button
       [text]="text"
@@ -50,6 +46,7 @@ type ButtonVariants = VariantProps<typeof buttonVariants>;
       [isLoading]="isLoading"
       (click)="clickEmitter.emit()"
     >
+      <ng-content icon select="[icon]" />
     </ods-button>`,
 })
 export class ButtonWithSpinnerComponent implements OnInit {
@@ -74,8 +71,6 @@ export class ButtonWithSpinnerComponent implements OnInit {
   }
 
   get isError(): boolean {
-    return (
-      isLoaded(this.stateResource) && hasCommandError(<CommandResource>this.stateResource.resource)
-    );
+    return isLoaded(this.stateResource) && hasCommandError(<CommandResource>this.stateResource.resource);
   }
 }
diff --git a/alfa-client/libs/design-system/src/index.ts b/alfa-client/libs/design-system/src/index.ts
index 9dceac6674a3d849c3cd3729e2625e119e108ec2..4b74b5f244592bf7ff9884a75529d304fd6cc386 100644
--- a/alfa-client/libs/design-system/src/index.ts
+++ b/alfa-client/libs/design-system/src/index.ts
@@ -40,6 +40,7 @@ export * from './lib/form/text-input/text-input.component';
 export * from './lib/form/textarea/textarea.component';
 export * from './lib/icons/accessibility-icon/accessibility-icon.component';
 export * from './lib/icons/admin-logo-icon/admin-logo-icon.component';
+export * from './lib/icons/archive-icon/archive-icon.component';
 export * from './lib/icons/attachment-icon/attachment-icon.component';
 export * from './lib/icons/bescheid-generate-icon/bescheid-generate-icon.component';
 export * from './lib/icons/bescheid-upload-icon/bescheid-upload-icon.component';
diff --git a/alfa-client/libs/design-system/src/lib/icons/archive-icon/archive-icon.component.spec.ts b/alfa-client/libs/design-system/src/lib/icons/archive-icon/archive-icon.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4d5d18cdcc34eecdb0a8f9f04b79257382dc3aeb
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/archive-icon/archive-icon.component.spec.ts
@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ArchiveIconComponent } from './archive-icon.component';
+
+describe('ArchiveIconComponent', () => {
+  let component: ArchiveIconComponent;
+  let fixture: ComponentFixture<ArchiveIconComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ArchiveIconComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(ArchiveIconComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/alfa-client/libs/design-system/src/lib/icons/archive-icon/archive-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/archive-icon/archive-icon.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..28d9287daa74337999b788cec4b43ed5716f5624
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/archive-icon/archive-icon.component.ts
@@ -0,0 +1,41 @@
+import { CommonModule } from '@angular/common';
+import { Component, Input } from '@angular/core';
+import { twMerge } from 'tailwind-merge';
+import { iconVariants, IconVariants } from '../iconVariants';
+
+@Component({
+  selector: 'ods-archive-icon',
+  standalone: true,
+  imports: [CommonModule],
+  template: `<svg
+    viewBox="0 0 24 24"
+    xmlns="http://www.w3.org/2000/svg"
+    [ngClass]="twMerge(iconVariants({ size }), 'fill-primary', class)"
+    aria-hidden="true"
+  >
+    <path
+      d="M4.96804 21L2.85693 9H21.8569L19.7458 21H4.96804ZM6.7361 19H17.9778L19.3236 11H5.39027L6.7361 19ZM10.2458 15H14.468C14.7671 15 15.0178 14.9042 15.2201 14.7125C15.4224 14.5208 15.5236 14.2833 15.5236 14C15.5236 13.7167 15.4224 13.4792 15.2201 13.2875C15.0178 13.0958 14.7671 13 14.468 13H10.2458C9.94675 13 9.69605 13.0958 9.49374 13.2875C9.29142 13.4792 9.19027 13.7167 9.19027 14C9.19027 14.2833 9.29142 14.5208 9.49374 14.7125C9.69605 14.9042 9.94675 15 10.2458 15ZM6.0236 8C5.72453 8 5.47383 7.90417 5.27152 7.7125C5.0692 7.52083 4.96804 7.28333 4.96804 7C4.96804 6.71667 5.0692 6.47917 5.27152 6.2875C5.47383 6.09583 5.72453 6 6.0236 6H18.6903C18.9893 6 19.24 6.09583 19.4424 6.2875C19.6447 6.47917 19.7458 6.71667 19.7458 7C19.7458 7.28333 19.6447 7.52083 19.4424 7.7125C19.24 7.90417 18.9893 8 18.6903 8H6.0236ZM8.13471 5C7.83564 5 7.58494 4.90417 7.38263 4.7125C7.18031 4.52083 7.07916 4.28333 7.07916 4C7.07916 3.71667 7.18031 3.47917 7.38263 3.2875C7.58494 3.09583 7.83564 3 8.13471 3H16.5792C16.8782 3 17.1289 3.09583 17.3312 3.2875C17.5336 3.47917 17.6347 3.71667 17.6347 4C17.6347 4.28333 17.5336 4.52083 17.3312 4.7125C17.1289 4.90417 16.8782 5 16.5792 5H8.13471Z"
+    />
+    <path
+      d="M5 21C1.68629 21 -1 18.3137 -1 15C-1 11.6863 1.68629 9 5 9C8.31371 9 11 11.6863 11 15C11 18.3137 8.31371 21 5 21Z"
+      class="fill-whitetext"
+    />
+    <path
+      d="M5.00078 19.9999C2.23936 19.9999 0.00078249 17.7613 0.000782609 14.9999C0.000782728 12.2385 2.23936 9.99991 5.00078 9.99991C7.76221 9.99991 10.0008 12.2385 10.0008 14.9999C10.0008 17.7613 7.76221 19.9999 5.00078 19.9999Z"
+    />
+    <path
+      d="M5.00078 19.9999C2.23936 19.9999 0.00078249 17.7613 0.000782609 14.9999C0.000782728 12.2385 2.23936 9.99991 5.00078 9.99991C7.76221 9.99991 10.0008 12.2385 10.0008 14.9999C10.0008 17.7613 7.76221 19.9999 5.00078 19.9999Z"
+    />
+    <path
+      d="M7.99997 14.9999L4.99997 11.9999L3.94997 13.0499L5.14997 14.2499H1.99997V15.7499H5.14997L3.94997 16.9499L4.99997 17.9999L7.99997 14.9999Z"
+      class="fill-whitetext"
+    />
+  </svg> `,
+})
+export class ArchiveIconComponent {
+  @Input() size: IconVariants['size'] = 'medium';
+  @Input() class: string = undefined;
+
+  readonly iconVariants = iconVariants;
+  readonly twMerge = twMerge;
+}
diff --git a/alfa-client/libs/design-system/src/lib/icons/archive-icon/archive-icon.stories.ts b/alfa-client/libs/design-system/src/lib/icons/archive-icon/archive-icon.stories.ts
new file mode 100644
index 0000000000000000000000000000000000000000..33f6a6847ab87db944ce480838e84cf50cc5d0f3
--- /dev/null
+++ b/alfa-client/libs/design-system/src/lib/icons/archive-icon/archive-icon.stories.ts
@@ -0,0 +1,27 @@
+import type { Meta, StoryObj } from '@storybook/angular';
+
+import { ArchiveIconComponent } from './archive-icon.component';
+
+const meta: Meta<ArchiveIconComponent> = {
+  title: 'Icons/Archive icon',
+  component: ArchiveIconComponent,
+  excludeStories: /.*Data$/,
+  tags: ['autodocs'],
+};
+
+export default meta;
+type Story = StoryObj<ArchiveIconComponent>;
+
+export const Default: Story = {
+  args: { size: 'large' },
+  argTypes: {
+    size: {
+      control: 'select',
+      options: ['small', 'medium', 'large', 'extra-large', 'full'],
+      description: 'Size of icon. Property "full" means 100%',
+      table: {
+        defaultValue: { summary: 'medium' },
+      },
+    },
+  },
+};
diff --git a/alfa-client/libs/design-system/src/lib/icons/check-icon/check-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/check-icon/check-icon.component.ts
index bc40469a5206b07306caa19683d5522dcabb9091..a6b377a382a36589723627390d9a91e76a7cc6d8 100644
--- a/alfa-client/libs/design-system/src/lib/icons/check-icon/check-icon.component.ts
+++ b/alfa-client/libs/design-system/src/lib/icons/check-icon/check-icon.component.ts
@@ -32,7 +32,7 @@ import { iconVariants, IconVariants } from '../iconVariants';
   imports: [CommonModule],
   template: `<svg
     viewBox="0 0 24 24"
-    [ngClass]="[twMerge(iconVariants({ size }), 'fill-text', class)]"
+    [ngClass]="[twMerge(iconVariants({ size }), 'fill-primary', class)]"
     aria-hidden="true"
     xmlns="http://www.w3.org/2000/svg"
   >
diff --git a/alfa-client/libs/design-system/src/lib/icons/save-icon/save-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/save-icon/save-icon.component.ts
index 979a765b71da5b28823ba44c21ee3621d1996b1e..bb788b58a02f50a80369e702d153d17f83995e00 100644
--- a/alfa-client/libs/design-system/src/lib/icons/save-icon/save-icon.component.ts
+++ b/alfa-client/libs/design-system/src/lib/icons/save-icon/save-icon.component.ts
@@ -31,15 +31,14 @@ import { IconVariants, iconVariants } from '../iconVariants';
   selector: 'ods-save-icon',
   standalone: true,
   imports: [NgClass],
-  template: `<svg
-    xmlns="http://www.w3.org/2000/svg"
+  template: ` <svg
     [ngClass]="[twMerge(iconVariants({ size }), 'fill-primary', class)]"
     aria-hidden="true"
-    viewBox="0 0 24 24"
-    fill="none"
+    viewBox="0 0 32 32"
+    xmlns="http://www.w3.org/2000/svg"
   >
     <path
-      d="M21.3333 12V21.3333H2.66667V12H0V21.3333C0 22.8 1.2 24 2.66667 24H21.3333C22.8 24 24 22.8 24 21.3333V12H21.3333ZM13.3333 12.8933L16.7867 9.45333L18.6667 11.3333L12 18L5.33333 11.3333L7.21333 9.45333L10.6667 12.8933V0H13.3333V12.8933Z"
+      d="M25.3333 16V25.3333H6.66667V16H4V25.3333C4 26.8 5.2 28 6.66667 28H25.3333C26.8 28 28 26.8 28 25.3333V16H25.3333ZM17.3333 16.8933L20.7867 13.4533L22.6667 15.3333L16 22L9.33333 15.3333L11.2133 13.4533L14.6667 16.8933V4H17.3333V16.8933Z"
     />
   </svg>`,
 })
diff --git a/alfa-client/libs/design-system/src/lib/icons/send-icon/send-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/send-icon/send-icon.component.ts
index b4bd00c0ffdf26eb069de6a1aecc73c8923b4e3d..851ea807cfa4fddcc2b80a28bf76ea1232cfed9a 100644
--- a/alfa-client/libs/design-system/src/lib/icons/send-icon/send-icon.component.ts
+++ b/alfa-client/libs/design-system/src/lib/icons/send-icon/send-icon.component.ts
@@ -32,21 +32,19 @@ import { IconVariants, iconVariants } from '../iconVariants';
   standalone: true,
   imports: [NgClass],
   template: `<svg
-    xmlns="http://www.w3.org/2000/svg"
     [ngClass]="[twMerge(iconVariants({ size }), 'fill-primary', class)]"
     aria-hidden="true"
-    viewBox="0 0 24 24"
-    fill="none"
+    viewBox="0 0 32 32"
+    xmlns="http://www.w3.org/2000/svg"
   >
     <path
-      d="M0 21.6693V0.335938L25.3333 11.0026L0 21.6693ZM2.66667 17.6693L18.4667 11.0026L2.66667 4.33594V9.0026L10.6667 11.0026L2.66667 13.0026V17.6693Z"
+      d="M4 26.6688V5.33545L29.3333 16.0021L4 26.6688ZM6.66667 22.6688L22.4667 16.0021L6.66667 9.33545V14.0021L14.6667 16.0021L6.66667 18.0021V22.6688Z"
     />
   </svg>`,
 })
 export class SendIconComponent {
   @Input() size: IconVariants['size'] = 'medium';
   @Input() class: string = undefined;
-
   iconVariants = iconVariants;
   twMerge = twMerge;
 }
diff --git a/alfa-client/libs/ui/src/lib/ui/ui.module.ts b/alfa-client/libs/ui/src/lib/ui/ui.module.ts
index 197441ac7c872a95b4b37fa26ec4bd78c1ad8101..bd82ab257237a291f444eaf360c94335837e7cd6 100644
--- a/alfa-client/libs/ui/src/lib/ui/ui.module.ts
+++ b/alfa-client/libs/ui/src/lib/ui/ui.module.ts
@@ -239,6 +239,7 @@ import { ValidationErrorComponent } from './validation-error/validation-error.co
     OzgcloudPasteTextButtonComponent,
     CheckboxEnumEditorComponent,
     FileUploadButtonComponent,
+    OzgcloudButtonContentComponent,
   ],
   providers: [
     {
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-bescheid-versenden/vorgang-detail-bescheiden-bescheid-versenden.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-bescheid-versenden/vorgang-detail-bescheiden-bescheid-versenden.component.html
index d5ddb566808baa79394497f37bfc150ee91c8428..db7e7a2afbbe80ca4fef1198e35794870fc6f4a6 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-bescheid-versenden/vorgang-detail-bescheiden-bescheid-versenden.component.html
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps-content/vorgang-detail-bescheiden-bescheid-versenden/vorgang-detail-bescheiden-bescheid-versenden.component.html
@@ -37,7 +37,7 @@
       variant="bescheid_save"
       [fullWidthText]="true"
       data-test-id="send-to-antragsteller-button"
-      ><ods-send-icon></ods-send-icon
+      ><ods-send-icon size="large"></ods-send-icon
     ></ods-radio-button-card>
     <ods-radio-button-card
       *ngIf="bescheidResource$ | async | hasLink: bescheidLinkRel.BESCHEIDEN"
@@ -47,7 +47,7 @@
       variant="bescheid_save"
       [fullWidthText]="true"
       data-test-id="save-button"
-      ><ods-save-icon></ods-save-icon
+      ><ods-save-icon size="large"></ods-save-icon
     ></ods-radio-button-card>
   </ng-container>
 </div>
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..2e707527f298328a80090e2628ea37ca0adfdb03
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component.html
@@ -0,0 +1,5 @@
+<alfa-vorgang-archive-confirmation-dialog
+  [archiveStateResource]="archiveStateResource$ | async"
+  (confirmationButtonClicked)="onConfirmationButtonClicked()"
+  (cancelButtonClicked)="onCancelButtonClicked()"
+/>
\ No newline at end of file
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4b6462080eb25e10be2e6f6422ad5fabf7325d78
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component.spec.ts
@@ -0,0 +1,104 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CommandResource, isSuccessfulDone } from '@alfa-client/command-shared';
+import { createStateResource, StateResource } from '@alfa-client/tech-shared';
+import { mock } from '@alfa-client/test-utils';
+import { VorgangService, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { DialogRef } from '@angular/cdk/dialog';
+import { createCommandResource } from 'libs/command-shared/test/command';
+import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
+import { MockComponent } from 'ng-mocks';
+import { of } from 'rxjs';
+import { VorgangArchiveConfirmationDialogContainerComponent } from './vorgang-archive-confirmation-dialog-container.component';
+import { VorgangArchiveConfirmationDialogComponent } from './vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.component';
+
+jest.mock('@alfa-client/command-shared');
+
+describe('VorgangArchiveConfirmationDialogContainerComponent', () => {
+  let component: VorgangArchiveConfirmationDialogContainerComponent;
+  let fixture: ComponentFixture<VorgangArchiveConfirmationDialogContainerComponent>;
+
+  const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource();
+  const dialogRef = { ...mock(DialogRef), config: { data: { vorgangWithEingang } } };
+
+  const vorgangArchiveState: StateResource<boolean> = createStateResource(true);
+  const vorgangService = {
+    ...mock(VorgangService),
+    getVorgangArchive: jest.fn().mockReturnValue(of(createStateResource(vorgangArchiveState))),
+  };
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [
+        VorgangArchiveConfirmationDialogContainerComponent,
+        MockComponent(VorgangArchiveConfirmationDialogComponent),
+      ],
+      providers: [
+        { provide: DialogRef, useValue: dialogRef },
+        {
+          provide: VorgangService,
+          useValue: vorgangService,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(VorgangArchiveConfirmationDialogContainerComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('component', () => {
+    describe('archiveDoneHandler', () => {
+      it('should close dialog', () => {
+        component.archiveDoneHandler();
+
+        expect(dialogRef.close).toHaveBeenCalled();
+      });
+    });
+
+    describe('onCancelButtonClicked', () => {
+      it('should close dialog', () => {
+        component.onCancelButtonClicked();
+
+        expect(dialogRef.close).toHaveBeenCalled();
+      });
+    });
+
+    describe('onConfirmationButtonClicked', () => {
+      const commandState: StateResource<CommandResource> = createStateResource(createCommandResource());
+
+      beforeEach(() => {
+        component.archiveDoneHandler = jest.fn();
+        vorgangService.archive.mockReturnValue(of(commandState));
+      });
+
+      it('should call vorgangService archive', () => {
+        component.onConfirmationButtonClicked();
+
+        expect(vorgangService.archive).toHaveBeenCalledWith(vorgangWithEingang);
+      });
+
+      it('should call archiveDoneHandler if command was successfull', () => {
+        (isSuccessfulDone as jest.Mock).mockReturnValue(true);
+
+        component.onConfirmationButtonClicked();
+        component.archiveStateResource$.subscribe();
+
+        expect(component.archiveDoneHandler).toHaveBeenCalled();
+      });
+
+      it('should not call archiveDoneHandler if command was not successfull', () => {
+        (isSuccessfulDone as jest.Mock).mockReturnValue(false);
+
+        component.onConfirmationButtonClicked();
+        component.archiveStateResource$.subscribe();
+
+        expect(component.archiveDoneHandler).not.toHaveBeenCalled();
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..575322d084bbb81b2cff15bca74d82515165aed5
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component.ts
@@ -0,0 +1,35 @@
+import { CommandResource, isSuccessfulDone } from '@alfa-client/command-shared';
+import { StateResource } from '@alfa-client/tech-shared';
+import { VorgangService, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { DialogRef } from '@angular/cdk/dialog';
+import { Component, inject } from '@angular/core';
+import { Observable, tap } from 'rxjs';
+import { VorgangArchiveConfirmationDialogData } from './vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.model';
+
+@Component({
+  selector: 'alfa-vorgang-archive-confirmation-dialog-container',
+  templateUrl: './vorgang-archive-confirmation-dialog-container.component.html',
+})
+export class VorgangArchiveConfirmationDialogContainerComponent {
+  private vorgangService = inject(VorgangService);
+  private dialogRef = inject(DialogRef<unknown, VorgangArchiveConfirmationDialogData>);
+
+  private vorgangWithEingang: VorgangWithEingangResource = this.dialogRef.config.data.vorgangWithEingang;
+  public archiveStateResource$: Observable<StateResource<CommandResource>>;
+
+  archiveDoneHandler(): void {
+    this.dialogRef.close();
+  }
+
+  public onCancelButtonClicked(): void {
+    this.dialogRef.close();
+  }
+
+  public onConfirmationButtonClicked(): void {
+    this.archiveStateResource$ = this.vorgangService.archive(this.vorgangWithEingang).pipe(
+      tap((command: StateResource<CommandResource>) => {
+        if (isSuccessfulDone(command.resource)) this.archiveDoneHandler();
+      }),
+    );
+  }
+}
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..1d348fb6912ee1f7238036c3d153c711fe951c2f
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.component.html
@@ -0,0 +1,25 @@
+<div class="border border-grayborder rounded bg-background-50 p-8 shadow shadow-grayborder">
+  <h1 class="text-xl font-bold text-primary-600 mb-8">
+    Möchten Sie den Vorgang aus Alfa löschen und im DMS archivieren?
+  </h1>
+
+  <p class="text-base mb-8">
+    Diese Aktion kann nicht rückgängig gemacht werden!
+  </p>
+
+  <div class="flex gap-6">
+    <ods-button-with-spinner
+      dataTestId="archive-confirmation-button"
+      text="Löschen und archivieren"
+      [stateResource]="archiveStateResource"
+      (click)="confirmationButtonClicked.emit()"
+    />
+
+    <ods-button
+      dataTestId="archive-cancel-button"
+      text="Abbrechen"
+      variant="outline"
+      (click)="cancelButtonClicked.emit()"
+    />
+  </div>
+</div>
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cf49db8cce831963560561581528dfa7d308db55
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.component.spec.ts
@@ -0,0 +1,29 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ButtonWithSpinnerComponent } from '@ods/component';
+import { ButtonComponent } from '@ods/system';
+import { MockComponent } from 'ng-mocks';
+import { VorgangArchiveConfirmationDialogComponent } from './vorgang-archive-confirmation-dialog.component';
+
+describe('VorgangArchiveConfirmationDialogComponent', () => {
+  let component: VorgangArchiveConfirmationDialogComponent;
+  let fixture: ComponentFixture<VorgangArchiveConfirmationDialogComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [
+        VorgangArchiveConfirmationDialogComponent,
+        MockComponent(ButtonWithSpinnerComponent),
+        MockComponent(ButtonComponent),
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(VorgangArchiveConfirmationDialogComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2da7fc7fc50abea1400f55e3f0ddec479a715c33
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.component.ts
@@ -0,0 +1,14 @@
+import { CommandResource } from '@alfa-client/command-shared';
+import { StateResource } from '@alfa-client/tech-shared';
+import { Component, EventEmitter, Input, Output } from '@angular/core';
+
+@Component({
+  selector: 'alfa-vorgang-archive-confirmation-dialog',
+  templateUrl: './vorgang-archive-confirmation-dialog.component.html',
+})
+export class VorgangArchiveConfirmationDialogComponent {
+  @Input() archiveStateResource: StateResource<CommandResource>;
+
+  @Output() cancelButtonClicked: EventEmitter<void> = new EventEmitter();
+  @Output() confirmationButtonClicked: EventEmitter<void> = new EventEmitter();
+}
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.model.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..970fe72c357d5219599c1b08ae9b63fe4fa947e3
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.model.ts
@@ -0,0 +1,5 @@
+import { VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+
+export type VorgangArchiveConfirmationDialogData = {
+  vorgangWithEingang: VorgangWithEingangResource;
+};
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-container.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-container.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..aabaa1db527f7da3a18e21404dadf92a27395e49
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-container.component.html
@@ -0,0 +1,9 @@
+<ods-button
+  dataTestId="archive-vorgang"
+  (click)="openArchiveConfirmationDialog()"
+  variant="outline"
+  size="medium"
+  text="Archivierung starten"
+>
+  <ods-archive-icon icon />
+</ods-button>
\ No newline at end of file
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-container.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-container.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a8fa62ffcf26525cbb6677ea9b9db82624aa3f8b
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-container.component.spec.ts
@@ -0,0 +1,56 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { mock } from '@alfa-client/test-utils';
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { ArchiveIconComponent, ButtonComponent } from '@ods/system';
+import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
+import { MockComponent } from 'ng-mocks';
+import { VorgangArchiveConfirmationDialogContainerComponent } from './vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component';
+import { VorgangArchiveContainerComponent } from './vorgang-archive-container.component';
+
+describe('VorgangArchiveContainerComponent', () => {
+  let component: VorgangArchiveContainerComponent;
+  let fixture: ComponentFixture<VorgangArchiveContainerComponent>;
+
+  const vorgangWithEingang = createVorgangWithEingangResource();
+
+  const dialogService = mock(OzgcloudDialogService);
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [
+        VorgangArchiveContainerComponent,
+        MockComponent(ButtonComponent),
+        MockComponent(VorgangArchiveConfirmationDialogContainerComponent),
+        MockComponent(ArchiveIconComponent),
+      ],
+      providers: [
+        {
+          provide: OzgcloudDialogService,
+          useValue: dialogService,
+        },
+      ],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(VorgangArchiveContainerComponent);
+    component = fixture.componentInstance;
+    component.vorgangWithEingang = vorgangWithEingang;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+
+  describe('component', () => {
+    describe('openArchiveConfirmationDialog', () => {
+      it('should call dialog service open', () => {
+        component.openArchiveConfirmationDialog();
+
+        expect(dialogService.open).toHaveBeenCalledWith(VorgangArchiveConfirmationDialogContainerComponent, {
+          vorgangWithEingang,
+        });
+      });
+    });
+  });
+});
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-container.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-container.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e8928b9a514fbe1c75655491916c854c066efbc7
--- /dev/null
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-container.component.ts
@@ -0,0 +1,30 @@
+import { OzgcloudDialogService } from '@alfa-client/ui';
+import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { Component, inject, Input } from '@angular/core';
+import { VorgangArchiveConfirmationDialogContainerComponent } from './vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component';
+import { VorgangArchiveConfirmationDialogData } from './vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.model';
+
+@Component({
+  selector: 'alfa-vorgang-archive-container',
+  templateUrl: './vorgang-archive-container.component.html',
+})
+export class VorgangArchiveContainerComponent {
+  private dialogService = inject(OzgcloudDialogService);
+
+  @Input() vorgangWithEingang: VorgangWithEingangResource;
+
+  protected readonly vorgangWithEingangLinkRel = VorgangWithEingangLinkRel;
+
+  public openArchiveConfirmationDialog(): void {
+    this.dialogService.open<unknown, VorgangArchiveConfirmationDialogData>(
+      VorgangArchiveConfirmationDialogContainerComponent,
+      this.buildDialogData(),
+    );
+  }
+
+  private buildDialogData(): VorgangArchiveConfirmationDialogData {
+    return {
+      vorgangWithEingang: this.vorgangWithEingang,
+    };
+  }
+}
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-detail-more-menu.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-detail-more-menu.component.html
index 3db8fc277dffdaf3f9e669b3785f0da5b9d436c9..e2720d703156a5af42a4bb9356bc77dccc088c92 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-detail-more-menu.component.html
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-detail-more-menu.component.html
@@ -33,6 +33,19 @@
   <ozgcloud-icon icon="more_horiz"></ozgcloud-icon>
 </button>
 <ozgcloud-menu #moreMenu data-test-id="more-menu">
+  <ozgcloud-menu-item
+    *ngIf="vorgangWithEingang | hasLink: vorgangWithEingangLinkRel.ARCHIVE"
+    data-test-id="vorgang-archive-button"
+    headline="Vorgang im DMS archivieren"
+    text="Alle Informationen und Anhänge werden zur Archivierung ins DMS gesendet. Der Vorgang wird nach der Archivierung in Alfa gelöscht."
+    icon="xdomea_file"
+    [iconSizeBig]="true"
+    (click)="$event.stopPropagation()"
+  >
+    <alfa-vorgang-archive-container
+      [vorgangWithEingang]="vorgangWithEingang"
+    ></alfa-vorgang-archive-container>
+  </ozgcloud-menu-item>
   <ozgcloud-menu-item
     data-test-id="vorgang-exportieren-button"
     headline="Vorgang exportieren"
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-detail-more-menu.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-detail-more-menu.component.spec.ts
index 70e2bbea862ae13919f32e3593ef1a0837a04c29..fcbf720575cdd14ed0f5d9141b50189644a058c6 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-detail-more-menu.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-detail-more-menu.component.spec.ts
@@ -21,12 +21,7 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import {
-  getElementFromDomRoot,
-  getElementFromFixture,
-  getMockComponent,
-  getMockComponents,
-} from '@alfa-client/test-utils';
+import { getElementFromDomRoot, getElementFromFixture, getMockComponent, getMockComponents } from '@alfa-client/test-utils';
 import { MenuItemComponent, OzgcloudIconComponent, UiModule } from '@alfa-client/ui';
 import { VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 import { ChangeDetectorRef, SimpleChanges } from '@angular/core';
@@ -35,6 +30,7 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
+import { VorgangArchiveContainerComponent } from './vorgang-archive-container/vorgang-archive-container.component';
 import { VorgangDetailMoreMenuComponent } from './vorgang-detail-more-menu.component';
 import { VorgangExportContainerComponent } from './vorgang-export-container/vorgang-export-container.component';
 import { ProcessVorgangContainerComponent } from './vorgang-process-vorgang-container/vorgang-process-vorgang-container.component';
@@ -44,6 +40,7 @@ describe('VorgangDetailMoreMenuComponent', () => {
   let fixture: ComponentFixture<VorgangDetailMoreMenuComponent>;
 
   const moreMenuButton: string = getDataTestIdOf('more-menu-button');
+  const archiveMenuItem: string = getDataTestIdOf('vorgang-archive-button');
   const exportMenuItem: string = getDataTestIdOf('vorgang-exportieren-button');
   const processVorgangMenuItem: string = getDataTestIdOf('vorgang-process-vorgang-button');
 
@@ -55,6 +52,7 @@ describe('VorgangDetailMoreMenuComponent', () => {
         MockComponent(OzgcloudIconComponent),
         MockComponent(VorgangExportContainerComponent),
         MockComponent(ProcessVorgangContainerComponent),
+        MockComponent(VorgangArchiveContainerComponent),
       ],
       imports: [UiModule, NoopAnimationsModule],
     }).compileComponents();
@@ -137,9 +135,7 @@ describe('VorgangDetailMoreMenuComponent', () => {
   });
 
   describe('export menu item', () => {
-    const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource([
-      VorgangWithEingangLinkRel.EXPORT,
-    ]);
+    const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.EXPORT]);
 
     beforeEach(() => {
       component.buttonEnabled = true;
@@ -165,7 +161,7 @@ describe('VorgangDetailMoreMenuComponent', () => {
       it('should contains headline', () => {
         getElementFromFixture(fixture, moreMenuButton).click();
 
-        const menuItem: MenuItemComponent = getMockComponent(fixture, MenuItemComponent);
+        const menuItem: MenuItemComponent = getMockComponents(fixture, MenuItemComponent)[0];
 
         expect(menuItem.headline).toBe('Vorgang exportieren');
       });
@@ -173,17 +169,15 @@ describe('VorgangDetailMoreMenuComponent', () => {
       it('should contains text', () => {
         getElementFromFixture(fixture, moreMenuButton).click();
 
-        const menuItem: MenuItemComponent = getMockComponent(fixture, MenuItemComponent);
+        const menuItem: MenuItemComponent = getMockComponents(fixture, MenuItemComponent)[0];
 
-        expect(menuItem.text).toBe(
-          'Alle Informationen und Anhänge des Vorgangs zur Archivierung im DMS.',
-        );
+        expect(menuItem.text).toBe('Alle Informationen und Anhänge des Vorgangs zur Archivierung im DMS.');
       });
 
       it('should contains icon', () => {
         getElementFromFixture(fixture, moreMenuButton).click();
 
-        const menuItem: MenuItemComponent = getMockComponent(fixture, MenuItemComponent);
+        const menuItem: MenuItemComponent = getMockComponents(fixture, MenuItemComponent)[0];
 
         expect(menuItem.icon).toBe('xdomea_file');
       });
@@ -191,19 +185,69 @@ describe('VorgangDetailMoreMenuComponent', () => {
       it('should contains iconSizeBig', () => {
         getElementFromFixture(fixture, moreMenuButton).click();
 
-        const menuItem: MenuItemComponent = getMockComponent(fixture, MenuItemComponent);
+        const menuItem: MenuItemComponent = getMockComponents(fixture, MenuItemComponent)[0];
 
         expect(menuItem.iconSizeBig).toBeTruthy();
       });
+      describe('for button', () => {
+        it.skip('should contains vorgangWithEingang', () => {
+          getElementFromFixture(fixture, moreMenuButton).click();
+
+          const button: VorgangExportContainerComponent = getMockComponent(fixture, VorgangExportContainerComponent);
+
+          expect(button.vorgangWithEingang).toBe(vorgangWithEingang);
+        });
+      });
+    });
+  });
+
+  describe('archive menu item', () => {
+    const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.ARCHIVE]);
+
+    beforeEach(() => {
+      component.buttonEnabled = true;
+      component.vorgangWithEingang = vorgangWithEingang;
+      fixture.detectChanges();
+      getElementFromFixture(fixture, moreMenuButton).click();
+      fixture.detectChanges();
+    });
+
+    it('should be visible', () => {
+      const archiveElement: HTMLElement = getElementFromDomRoot(fixture, archiveMenuItem);
+
+      expect(archiveElement).toBeInTheDocument();
+    });
+
+    describe('input', () => {
+      let menuItem: MenuItemComponent;
+
+      beforeEach(() => {
+        menuItem = getMockComponent(fixture, MenuItemComponent);
+      });
+
+      it('should contains headline', () => {
+        expect(menuItem.headline).toBe('Vorgang im DMS archivieren');
+      });
+
+      it('should contains text', () => {
+        expect(menuItem.text).toBe(
+          'Alle Informationen und Anhänge werden zur Archivierung ins DMS gesendet. Der Vorgang wird nach der Archivierung in Alfa gelöscht.',
+        );
+      });
+
+      it('should contains icon', () => {
+        expect(menuItem.icon).toBe('xdomea_file');
+      });
+
+      it('should contains iconSizeBig', () => {
+        expect(menuItem.iconSizeBig).toBeTruthy();
+      });
 
       describe('for button', () => {
         it.skip('should contains vorgangWithEingang', () => {
           getElementFromFixture(fixture, moreMenuButton).click();
 
-          const button: ProcessVorgangContainerComponent = getMockComponent(
-            fixture,
-            ProcessVorgangContainerComponent,
-          );
+          const button: VorgangArchiveContainerComponent = getMockComponent(fixture, VorgangArchiveContainerComponent);
 
           expect(button.vorgangWithEingang).toBe(vorgangWithEingang);
         });
@@ -260,9 +304,7 @@ describe('VorgangDetailMoreMenuComponent', () => {
 
         const menuItem: MenuItemComponent = getMockComponents(fixture, MenuItemComponent)[1];
 
-        expect(menuItem.text).toBe(
-          'Eine Vorprüfung wird durchgeführt. Das Ergebnis wird als Kommentar hinzugefügt.',
-        );
+        expect(menuItem.text).toBe('Eine Vorprüfung wird durchgeführt. Das Ergebnis wird als Kommentar hinzugefügt.');
       });
 
       it('should contains icon', () => {
@@ -285,10 +327,7 @@ describe('VorgangDetailMoreMenuComponent', () => {
         it.skip('should contains vorgangWithEingang', () => {
           getElementFromFixture(fixture, moreMenuButton).click();
 
-          const button: VorgangExportContainerComponent = getMockComponent(
-            fixture,
-            VorgangExportContainerComponent,
-          );
+          const button: ProcessVorgangContainerComponent = getMockComponent(fixture, ProcessVorgangContainerComponent);
 
           expect(button.vorgangWithEingang).toBe(vorgangWithEingang);
         });
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html
index 5e342045a6fd05e9ee6c7dafa65b2337ceb8d58c..1ab39ddeb6953af23176375781680b3c93b58fe8 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html
@@ -23,14 +23,17 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<ozgcloud-button-with-spinner
+
+<ods-button-with-spinner
   *ngIf="vorgangWithEingang | hasLink: vorgangWithEingangLinkRel.EXPORT; else exportNotPossible"
   dataTestId="export-vorgang"
-  [showSpinner]="(exportStateResource$ | async)?.loading"
   (clickEmitter)="export()"
+  [stateResource]="exportStateResource$ | async"
+  variant="outline"
   text="Herunterladen"
-  icon="save_alt"
-/>
+>
+  <ods-save-icon icon />
+</ods-button-with-spinner>
 <ng-template #exportNotPossible>
   <div class="flex items-start gap-2" data-test-id="cannot-export-vorgang">
     <ods-exclamation-icon />
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.scss b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.scss
deleted file mode 100644
index 54c4f3eb8c92af93694c03cdf577fed23cf9f86b..0000000000000000000000000000000000000000
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts
index 252e214664a08b65bf33efda7a9c0520c51c255e..56a9ee5d0e97c4977955053e68da5e110ba3a4ba 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts
@@ -23,10 +23,10 @@
  */
 import { HasLinkPipe, StateResource, createStateResource } from '@alfa-client/tech-shared';
 import { getElementFromFixture, mock } from '@alfa-client/test-utils';
-import { OzgcloudButtonWithSpinnerComponent } from '@alfa-client/ui';
 import { VorgangService, VorgangWithEingangLinkRel } from '@alfa-client/vorgang-shared';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { ExclamationIconComponent } from '@ods/system';
+import { ButtonWithSpinnerComponent } from '@ods/component';
+import { ExclamationIconComponent, SaveIconComponent } from '@ods/system';
 import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
@@ -48,8 +48,9 @@ describe('VorgangExportContainerComponent', () => {
       declarations: [
         HasLinkPipe,
         VorgangExportContainerComponent,
-        MockComponent(OzgcloudButtonWithSpinnerComponent),
+        MockComponent(ButtonWithSpinnerComponent),
         MockComponent(ExclamationIconComponent),
+        MockComponent(SaveIconComponent),
       ],
       providers: [
         {
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.ts
index c41a76aa1bb1425107643c0fbbcec366c629e989..d7402d47d16f87180f042dd8b714896e0a0e3118 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.ts
@@ -22,18 +22,13 @@
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
 import { StateResource } from '@alfa-client/tech-shared';
-import {
-  VorgangService,
-  VorgangWithEingangLinkRel,
-  VorgangWithEingangResource,
-} from '@alfa-client/vorgang-shared';
+import { VorgangService, VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
 import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
 import { Observable, tap } from 'rxjs';
 
 @Component({
   selector: 'alfa-vorgang-export-container',
   templateUrl: './vorgang-export-container.component.html',
-  styleUrls: ['./vorgang-export-container.component.scss'],
 })
 export class VorgangExportContainerComponent implements OnInit {
   @Input() vorgangWithEingang: VorgangWithEingangResource;
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-process-vorgang-container/vorgang-process-vorgang-container.component.html b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-process-vorgang-container/vorgang-process-vorgang-container.component.html
index bc44557c368dc9d04d6b79e1ad0724acb9190993..881e47d601c89b457d5fc6d133dfc94d9a606005 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-process-vorgang-container/vorgang-process-vorgang-container.component.html
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-process-vorgang-container/vorgang-process-vorgang-container.component.html
@@ -23,11 +23,12 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<ozgcloud-button-with-spinner
+<ods-button-with-spinner
   dataTestId="process-vorgang"
-  [stateResource]="commandStateResource$ | async"
   (clickEmitter)="processVorgang()"
+  [stateResource]="commandStateResource$ | async"
+  variant="outline"
   text="Vorgang vorprüfen"
-  svgIcon="done"
 >
-</ozgcloud-button-with-spinner>
+  <ods-check-icon icon />
+</ods-button-with-spinner>
\ No newline at end of file
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-process-vorgang-container/vorgang-process-vorgang-container.component.spec.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-process-vorgang-container/vorgang-process-vorgang-container.component.spec.ts
index 60b3b51c3e4530a2706c251af445cfdc0df27e57..773833bfe55f109a87ba1c1c5c4984a4f958a1a0 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-process-vorgang-container/vorgang-process-vorgang-container.component.spec.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-process-vorgang-container/vorgang-process-vorgang-container.component.spec.ts
@@ -21,16 +21,13 @@
  * Die sprachspezifischen Genehmigungen und Beschränkungen
  * unter der Lizenz sind dem Lizenztext zu entnehmen.
  */
-import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { CommandResource } from '@alfa-client/command-shared';
-import {
-  StateResource,
-  createEmptyStateResource,
-  createStateResource,
-} from '@alfa-client/tech-shared';
+import { StateResource, createEmptyStateResource, createStateResource } from '@alfa-client/tech-shared';
 import { dispatchEventFromFixture, getMockComponent, mock } from '@alfa-client/test-utils';
-import { OzgcloudButtonWithSpinnerComponent } from '@alfa-client/ui';
 import { VorgangService, VorgangWithEingangResource } from '@alfa-client/vorgang-shared';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ButtonWithSpinnerComponent } from '@ods/component';
+import { CheckIconComponent } from '@ods/system';
 import { createCommandResource } from 'libs/command-shared/test/command';
 import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent } from 'ng-mocks';
@@ -41,8 +38,7 @@ describe('ProcessVorgangContainerComponent', () => {
   let component: ProcessVorgangContainerComponent;
   let fixture: ComponentFixture<ProcessVorgangContainerComponent>;
 
-  const commandStateResource: StateResource<CommandResource> =
-    createStateResource(createCommandResource());
+  const commandStateResource: StateResource<CommandResource> = createStateResource(createCommandResource());
   const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource();
   const vorgangService = mock(VorgangService);
 
@@ -52,7 +48,8 @@ describe('ProcessVorgangContainerComponent', () => {
     await TestBed.configureTestingModule({
       declarations: [
         ProcessVorgangContainerComponent,
-        MockComponent(OzgcloudButtonWithSpinnerComponent),
+        MockComponent(ButtonWithSpinnerComponent),
+        MockComponent(CheckIconComponent),
       ],
       providers: [
         {
@@ -93,30 +90,15 @@ describe('ProcessVorgangContainerComponent', () => {
 
   describe('button component should be called with', () => {
     it('stateResource', () => {
-      const button: OzgcloudButtonWithSpinnerComponent = getMockComponent(
-        fixture,
-        OzgcloudButtonWithSpinnerComponent,
-      );
+      const button: ButtonWithSpinnerComponent = getMockComponent(fixture, ButtonWithSpinnerComponent);
 
       expect(button.stateResource).toEqual(createEmptyStateResource());
     });
 
     it('text', () => {
-      const button: OzgcloudButtonWithSpinnerComponent = getMockComponent(
-        fixture,
-        OzgcloudButtonWithSpinnerComponent,
-      );
+      const button: ButtonWithSpinnerComponent = getMockComponent(fixture, ButtonWithSpinnerComponent);
 
       expect(button.text).toBe('Vorgang vorprüfen');
     });
-
-    it('icon', () => {
-      const button: OzgcloudButtonWithSpinnerComponent = getMockComponent(
-        fixture,
-        OzgcloudButtonWithSpinnerComponent,
-      );
-
-      expect(button.svgIcon).toBe('done');
-    });
   });
 });
diff --git a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
index a38e7ac4f64234612560d13dddd674776b95ecbc..33de77704a82b60284d655cd1fd584f7dc12142a 100644
--- a/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
+++ b/alfa-client/libs/vorgang-detail/src/lib/vorgang-detail.module.ts
@@ -49,6 +49,7 @@ import {
   TextareaEditorComponent,
 } from '@ods/component';
 import {
+  ArchiveIconComponent,
   AttachmentComponent,
   AttachmentWrapperComponent,
   BescheidGenerateIconComponent,
@@ -56,6 +57,7 @@ import {
   BescheidUploadIconComponent,
   ButtonCardComponent,
   ButtonComponent,
+  CheckIconComponent,
   CloseIconComponent,
   ErrorMessageComponent,
   ExclamationIconComponent,
@@ -110,6 +112,9 @@ import { VorgangDetailBescheidenUeberspringenDialogComponent } from './vorgang-d
 import { VorgangDetailBescheidenStepsComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-steps.component';
 import { VorgangDetailBescheidenWeiterButtonComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden-steps/vorgang-detail-bescheiden-weiter-button/vorgang-detail-bescheiden-weiter-button.component';
 import { VorgangDetailBescheidenComponent } from './vorgang-detail-page/vorgang-detail-bescheiden/vorgang-detail-bescheiden.component';
+import { VorgangArchiveConfirmationDialogContainerComponent } from './vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog-container.component';
+import { VorgangArchiveConfirmationDialogComponent } from './vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-confirmation-dialog-container/vorgang-archive-confirmation-dialog/vorgang-archive-confirmation-dialog.component';
+import { VorgangArchiveContainerComponent } from './vorgang-detail-page/vorgang-detail-more-menu/vorgang-archive-container/vorgang-archive-container.component';
 import { VorgangDetailMoreMenuComponent } from './vorgang-detail-page/vorgang-detail-more-menu/vorgang-detail-more-menu.component';
 import { VorgangExportContainerComponent } from './vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component';
 import { ProcessVorgangContainerComponent } from './vorgang-detail-page/vorgang-detail-more-menu/vorgang-process-vorgang-container/vorgang-process-vorgang-container.component';
@@ -163,6 +168,8 @@ const routes: Routes = [
     BescheidStatusTextComponent,
     ErrorMessageComponent,
     CollaborationModule,
+    ArchiveIconComponent,
+    CheckIconComponent,
   ],
   declarations: [
     VorgangDetailPageComponent,
@@ -214,11 +221,10 @@ const routes: Routes = [
     VorgangDetailBescheidenBescheidVersendenComponent,
     VorgangDetailBescheidenResultNachrichtComponent,
     VorgangDetailDateienContainerComponent,
+    VorgangArchiveContainerComponent,
+    VorgangArchiveConfirmationDialogContainerComponent,
+    VorgangArchiveConfirmationDialogComponent,
   ],
-  exports: [
-    VorgangDetailAntragstellerComponent,
-    VorgangDetailAntragDataComponent,
-    VorgangDetailBescheidenComponent,
-  ],
+  exports: [VorgangDetailAntragstellerComponent, VorgangDetailAntragDataComponent, VorgangDetailBescheidenComponent],
 })
 export class VorgangDetailModule {}
diff --git a/alfa-client/libs/vorgang-detail/src/test-setup.ts b/alfa-client/libs/vorgang-detail/src/test-setup.ts
index 441104418102c44d26727ce0f15e858de5e234b2..4a63ad17f3a42bad58aae670797a179dcffcc931 100644
--- a/alfa-client/libs/vorgang-detail/src/test-setup.ts
+++ b/alfa-client/libs/vorgang-detail/src/test-setup.ts
@@ -25,10 +25,7 @@ import '@testing-library/jest-dom';
 import 'jest-preset-angular/setup-jest';
 
 import { getTestBed } from '@angular/core/testing';
-import {
-  BrowserDynamicTestingModule,
-  platformBrowserDynamicTesting,
-} from '@angular/platform-browser-dynamic/testing';
+import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing';
 
 getTestBed().resetTestEnvironment();
 getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), {
diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts
index 075cfb3701277c9b59fd7ff4dfe595e1122f84b5..ed59d9c3e4d04166dab03b8d34d12510769f148e 100644
--- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts
+++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.linkrel.ts
@@ -56,6 +56,7 @@ export enum VorgangWithEingangLinkRel {
   HISTORIE = 'historie',
   SEARCH_USER_PROFILES = 'search-user-profiles',
   EXPORT = 'export',
+  ARCHIVE = 'archive',
   CREATE_BESCHEID_DRAFT = 'createBescheidDraft',
   PROCESS_VORGANG = 'processVorgang',
 
diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang.model.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang.model.ts
index 37ee685e930d77d35c7b8c4994886c7b0e99ef24..8417137108330ec18fd817f11a55d134e9e47f24 100644
--- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.model.ts
+++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.model.ts
@@ -25,11 +25,7 @@ import { ListResource, StateResource } from '@alfa-client/tech-shared';
 import { HttpErrorResponse } from '@angular/common/http';
 import { Action } from '@ngrx/store';
 import { Resource, ResourceUri } from '@ngxp/rest';
-import {
-  CommandOrder,
-  CommandResource,
-  CreateCommand,
-} from '../../../command-shared/src/lib/command.model';
+import { CommandOrder, CommandResource, CreateCommand } from '../../../command-shared/src/lib/command.model';
 
 export interface Vorgang {
   status: VorgangStatus;
@@ -41,6 +37,7 @@ export interface Vorgang {
   hasPostfachNachricht: boolean;
   hasNewPostfachNachricht: boolean;
   antragBewilligt?: boolean;
+  archiving: boolean;
 }
 
 export interface VorgangWithEingang extends Vorgang {
diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts
index fb38b271928a3652918110bd424eda8ba9764c3c..ab918999111af08299caac6135e57299bea939b7 100644
--- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts
+++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.spec.ts
@@ -23,20 +23,10 @@
  */
 import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
 import { BinaryFileListResource } from '@alfa-client/binary-file-shared';
-import {
-  CommandOrder,
-  CommandResource,
-  CommandService,
-  CreateCommandProps,
-} from '@alfa-client/command-shared';
+import { CommandOrder, CommandResource, CommandService, CreateCommandProps } from '@alfa-client/command-shared';
 import { Environment } from '@alfa-client/environment-shared';
 import { NavigationService } from '@alfa-client/navigation-shared';
-import {
-  EMPTY_STRING,
-  StateResource,
-  createEmptyStateResource,
-  createStateResource,
-} from '@alfa-client/tech-shared';
+import { EMPTY_STRING, StateResource, createEmptyStateResource, createStateResource } from '@alfa-client/tech-shared';
 import { Mock, mock, useFromMock } from '@alfa-client/test-utils';
 import { HttpErrorResponse } from '@angular/common/http';
 import { ResourceUri, getUrl } from '@ngxp/rest';
@@ -82,12 +72,10 @@ describe('VorgangService', () => {
   });
 
   const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource();
-  const vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource> =
-    createStateResource(vorgangWithEingang);
+  const vorgangWithEingangStateResource: StateResource<VorgangWithEingangResource> = createStateResource(vorgangWithEingang);
 
   describe('getVorgangWithEingang', () => {
-    const apiRootStateResource: StateResource<ApiRootResource> =
-      createStateResource(createApiRootResource());
+    const apiRootStateResource: StateResource<ApiRootResource> = createStateResource(createApiRootResource());
 
     beforeEach(() => {
       apiRootService.getApiRoot.mockReturnValue(of(apiRootStateResource));
@@ -108,17 +96,13 @@ describe('VorgangService', () => {
     describe('initial', () => {
       beforeEach(() => {
         apiRootService.getApiRoot.mockReturnValue(hot('-a', { a: apiRootStateResource }));
-        facade.getVorgangWithEingang.mockReturnValue(
-          hot('-a', { a: vorgangWithEingangStateResource }),
-        );
+        facade.getVorgangWithEingang.mockReturnValue(hot('-a', { a: vorgangWithEingangStateResource }));
       });
 
       it('should return value', () => {
         const vorgangList = service.getVorgangWithEingang();
 
-        expect(vorgangList).toBeObservable(
-          cold('ab', { a: createEmptyStateResource(true), b: vorgangWithEingangStateResource }),
-        );
+        expect(vorgangList).toBeObservable(cold('ab', { a: createEmptyStateResource(true), b: vorgangWithEingangStateResource }));
       });
     });
 
@@ -145,16 +129,13 @@ describe('VorgangService', () => {
     it('should call facade', () => {
       service.getVorgangWithEingangUri();
 
-      expect(navigationService.getDecodedParam).toHaveBeenCalledWith(
-        VorgangService.VORGANG_WITH_EINGANG_URL,
-      );
+      expect(navigationService.getDecodedParam).toHaveBeenCalledWith(VorgangService.VORGANG_WITH_EINGANG_URL);
     });
   });
 
   describe('getAttachments', () => {
     const binaryFile: BinaryFileListResource = createBinaryFileListResource();
-    const binaryFileStateResource: StateResource<BinaryFileListResource> =
-      createStateResource(binaryFile);
+    const binaryFileStateResource: StateResource<BinaryFileListResource> = createStateResource(binaryFile);
 
     beforeEach(() => {
       facade.getAttachmentList.mockReturnValue(of(binaryFileStateResource));
@@ -182,9 +163,7 @@ describe('VorgangService', () => {
       it('should return value', () => {
         const vorgangList = service.getAttachments();
 
-        expect(vorgangList).toBeObservable(
-          cold('ab', { a: createEmptyStateResource(true), b: binaryFileStateResource }),
-        );
+        expect(vorgangList).toBeObservable(cold('ab', { a: createEmptyStateResource(true), b: binaryFileStateResource }));
       });
     });
 
@@ -215,8 +194,7 @@ describe('VorgangService', () => {
 
   describe('getRepresentations', () => {
     const binaryFile: BinaryFileListResource = createBinaryFileListResource();
-    const binaryFileStateResource: StateResource<BinaryFileListResource> =
-      createStateResource(binaryFile);
+    const binaryFileStateResource: StateResource<BinaryFileListResource> = createStateResource(binaryFile);
 
     beforeEach(() => {
       facade.getRepresentationList.mockReturnValue(of(binaryFileStateResource));
@@ -244,9 +222,7 @@ describe('VorgangService', () => {
       it('should return value', () => {
         const vorgangList = service.getRepresentations();
 
-        expect(vorgangList).toBeObservable(
-          cold('ab', { a: createEmptyStateResource(true), b: binaryFileStateResource }),
-        );
+        expect(vorgangList).toBeObservable(cold('ab', { a: createEmptyStateResource(true), b: binaryFileStateResource }));
       });
     });
 
@@ -305,8 +281,7 @@ describe('VorgangService', () => {
   });
 
   describe('setPendingForwardSingleCommand', () => {
-    const commandStateResource: StateResource<CommandResource> =
-      createStateResource(createCommandResource());
+    const commandStateResource: StateResource<CommandResource> = createStateResource(createCommandResource());
 
     it('should call facade', () => {
       service.setPendingForwardSingleCommand(commandStateResource);
@@ -337,8 +312,7 @@ describe('VorgangService', () => {
   });
 
   describe('setPendingForwardSingleCommand', () => {
-    const commandStateResource: StateResource<CommandResource> =
-      createStateResource(createCommandResource());
+    const commandStateResource: StateResource<CommandResource> = createStateResource(createCommandResource());
 
     it('should call facade', () => {
       service.setPendingForwardSingleCommand(commandStateResource);
@@ -355,9 +329,7 @@ describe('VorgangService', () => {
     it('should call navigation service', () => {
       service.reloadCurrentVorgang();
 
-      expect(navigationService.getDecodedParam).toHaveBeenCalledWith(
-        VorgangService.VORGANG_WITH_EINGANG_URL,
-      );
+      expect(navigationService.getDecodedParam).toHaveBeenCalledWith(VorgangService.VORGANG_WITH_EINGANG_URL);
     });
 
     it('should call loadVorgangWithEingang', () => {
@@ -380,9 +352,7 @@ describe('VorgangService', () => {
     it('should call navigation service', () => {
       service.reloadCurrentVorgangWithAddtionalActions(additionalActions);
 
-      expect(navigationService.getDecodedParam).toHaveBeenCalledWith(
-        VorgangService.VORGANG_WITH_EINGANG_URL,
-      );
+      expect(navigationService.getDecodedParam).toHaveBeenCalledWith(VorgangService.VORGANG_WITH_EINGANG_URL);
     });
 
     it('should call loadVorgangWithEingangWithAdditionalActions', () => {
@@ -391,10 +361,7 @@ describe('VorgangService', () => {
 
       service.reloadCurrentVorgangWithAddtionalActions(additionalActions);
 
-      expect(facade.loadVorgangWithEingangWithAdditionalActions).toHaveBeenCalledWith(
-        vorgangUri,
-        additionalActions,
-      );
+      expect(facade.loadVorgangWithEingangWithAdditionalActions).toHaveBeenCalledWith(vorgangUri, additionalActions);
     });
   });
 
@@ -423,9 +390,7 @@ describe('VorgangService', () => {
     it('should call facade', () => {
       service.reloadVorgang(command);
 
-      expect(facade.loadVorgangWithEingang).toHaveBeenCalledWith(
-        getUrl(command, CommandLinkRel.EFFECTED_RESOURCE),
-      );
+      expect(facade.loadVorgangWithEingang).toHaveBeenCalledWith(getUrl(command, CommandLinkRel.EFFECTED_RESOURCE));
     });
   });
 
@@ -493,6 +458,20 @@ describe('VorgangService', () => {
     });
   });
 
+  describe('archive', () => {
+    it('should call commandService createCommandByProps', () => {
+      service.archive(vorgangWithEingang);
+
+      const expectedProps = {
+        resource: vorgangWithEingang,
+        linkRel: VorgangWithEingangLinkRel.ARCHIVE,
+        command: { order: CommandOrder.ARCHIVE_VORGANG, body: {} },
+        snackBarMessage: 'Vorgang in Archivierung.',
+      };
+      expect(commandService.createCommandByProps).toHaveBeenCalledWith(expectedProps);
+    });
+  });
+
   describe('processVorgang', () => {
     const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource();
     const command: CommandResource = createCommandResource();
@@ -518,8 +497,7 @@ describe('VorgangService', () => {
     });
 
     it('should return command', () => {
-      const processVorgangCommand: Observable<StateResource<CommandResource>> =
-        service.processVorgang(vorgangWithEingang);
+      const processVorgangCommand: Observable<StateResource<CommandResource>> = service.processVorgang(vorgangWithEingang);
 
       expect(processVorgangCommand).toBeObservable(cold('a', { a: commandStateResource }));
     });
@@ -531,11 +509,10 @@ describe('VorgangService', () => {
 
       service.setAktenzeichen(vorgangWithEingang, aktenzeichen);
 
-      expect(commandService.createCommand).toHaveBeenCalledWith(
-        vorgangWithEingang,
-        VorgangWithEingangLinkRel.SET_AKTENZEICHEN,
-        { order: CommandOrder.SET_AKTENZEICHEN, body: { aktenzeichen } },
-      );
+      expect(commandService.createCommand).toHaveBeenCalledWith(vorgangWithEingang, VorgangWithEingangLinkRel.SET_AKTENZEICHEN, {
+        order: CommandOrder.SET_AKTENZEICHEN,
+        body: { aktenzeichen },
+      });
     });
   });
 });
diff --git a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts
index 8a4750ebf5923fcaf731759c7b5af929fbb21ae0..1af6e12ff7877e9e221d05730199423689663082 100644
--- a/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts
+++ b/alfa-client/libs/vorgang-shared/src/lib/vorgang.service.ts
@@ -32,12 +32,7 @@ import {
 } from '@alfa-client/command-shared';
 import { ENVIRONMENT_CONFIG, Environment } from '@alfa-client/environment-shared';
 import { NavigationService } from '@alfa-client/navigation-shared';
-import {
-  StateResource,
-  createEmptyStateResource,
-  doIfLoadingRequired,
-  isNotNull,
-} from '@alfa-client/tech-shared';
+import { StateResource, createEmptyStateResource, doIfLoadingRequired, isNotNull } from '@alfa-client/tech-shared';
 import { Inject, Injectable } from '@angular/core';
 import { ResourceUri, hasLink } from '@ngxp/rest';
 import { Observable, combineLatest } from 'rxjs';
@@ -61,15 +56,10 @@ export class VorgangService {
   ) {}
 
   public getVorgangWithEingang(): Observable<StateResource<VorgangWithEingangResource>> {
-    return combineLatest([
-      this.facade.getVorgangWithEingang(),
-      this.apiRootService.getApiRoot(),
-    ]).pipe(
+    return combineLatest([this.facade.getVorgangWithEingang(), this.apiRootService.getApiRoot()]).pipe(
       tap(([vorgangWithEingang, apiRoot]) => {
         if (isNotNull(apiRoot.resource))
-          doIfLoadingRequired(vorgangWithEingang, () =>
-            this.facade.loadVorgangWithEingang(this.getVorgangWithEingangUri()),
-          );
+          doIfLoadingRequired(vorgangWithEingang, () => this.facade.loadVorgangWithEingang(this.getVorgangWithEingangUri()));
       }),
       map(([vorgangWithEingang]) => vorgangWithEingang),
       startWith(createEmptyStateResource<VorgangWithEingangResource>(true)),
@@ -80,9 +70,7 @@ export class VorgangService {
     return this.facade.getAttachmentList().pipe(
       withLatestFrom(this.facade.getVorgangWithEingang()),
       tap(([attachmentList, vorgangWithEingang]) =>
-        doIfLoadingRequired(attachmentList, () =>
-          this.facade.loadAttachmentList(vorgangWithEingang.resource),
-        ),
+        doIfLoadingRequired(attachmentList, () => this.facade.loadAttachmentList(vorgangWithEingang.resource)),
       ),
       map(([attachmentList]) => attachmentList),
       startWith(createEmptyStateResource<BinaryFileListResource>(true)),
@@ -93,9 +81,7 @@ export class VorgangService {
     return this.facade.getRepresentationList().pipe(
       withLatestFrom(this.facade.getVorgangWithEingang()),
       tap(([representationList, vorgangWithEingang]) =>
-        doIfLoadingRequired(representationList, () =>
-          this.facade.loadRepresentationList(vorgangWithEingang.resource),
-        ),
+        doIfLoadingRequired(representationList, () => this.facade.loadRepresentationList(vorgangWithEingang.resource)),
       ),
       map(([representationList]) => representationList),
       startWith(createEmptyStateResource<BinaryFileListResource>(true)),
@@ -131,10 +117,7 @@ export class VorgangService {
   }
 
   public reloadCurrentVorgangWithAddtionalActions(additionalActions: AdditionalActions): void {
-    this.facade.loadVorgangWithEingangWithAdditionalActions(
-      this.getVorgangWithEingangUri(),
-      additionalActions,
-    );
+    this.facade.loadVorgangWithEingangWithAdditionalActions(this.getVorgangWithEingangUri(), additionalActions);
   }
 
   getVorgangWithEingangUri(): ResourceUri {
@@ -185,17 +168,24 @@ export class VorgangService {
     this.facade.export(vorgangWithEingang);
   }
 
-  public processVorgang(
-    vorgangWithEingang: VorgangWithEingangResource,
-  ): Observable<StateResource<CommandResource>> {
-    return this.commandService.createCommandByProps(
-      this.createProcessVorgangCommandProps(vorgangWithEingang),
-    );
+  public archive(vorgangWithEingang: VorgangWithEingangResource): Observable<StateResource<CommandResource>> {
+    return this.commandService.createCommandByProps(this.createVorgangArchiveCommandProps(vorgangWithEingang));
   }
 
-  private createProcessVorgangCommandProps(
-    vorgangWithEingang: VorgangWithEingangResource,
-  ): CreateCommandProps {
+  private createVorgangArchiveCommandProps(vorgangWithEingang: VorgangWithEingangResource): CreateCommandProps {
+    return {
+      resource: vorgangWithEingang,
+      linkRel: VorgangWithEingangLinkRel.ARCHIVE,
+      command: { order: CommandOrder.ARCHIVE_VORGANG, body: {} },
+      snackBarMessage: 'Vorgang in Archivierung.',
+    };
+  }
+
+  public processVorgang(vorgangWithEingang: VorgangWithEingangResource): Observable<StateResource<CommandResource>> {
+    return this.commandService.createCommandByProps(this.createProcessVorgangCommandProps(vorgangWithEingang));
+  }
+
+  private createProcessVorgangCommandProps(vorgangWithEingang: VorgangWithEingangResource): CreateCommandProps {
     return {
       resource: vorgangWithEingang,
       linkRel: VorgangWithEingangLinkRel.PROCESS_VORGANG,
@@ -204,15 +194,8 @@ export class VorgangService {
     };
   }
 
-  public setAktenzeichen(
-    vorgang: VorgangWithEingangResource,
-    aktenzeichen: string,
-  ): Observable<StateResource<CommandResource>> {
+  public setAktenzeichen(vorgang: VorgangWithEingangResource, aktenzeichen: string): Observable<StateResource<CommandResource>> {
     const createCommand = { order: CommandOrder.SET_AKTENZEICHEN, body: { aktenzeichen } };
-    return this.commandService.createCommand(
-      vorgang,
-      VorgangWithEingangLinkRel.SET_AKTENZEICHEN,
-      createCommand,
-    );
+    return this.commandService.createCommand(vorgang, VorgangWithEingangLinkRel.SET_AKTENZEICHEN, createCommand);
   }
 }
diff --git a/alfa-client/libs/vorgang-shared/test/vorgang.ts b/alfa-client/libs/vorgang-shared/test/vorgang.ts
index dc541c981705436d19a3ed70bc8d6d8f67fcaaf4..9eadf4c36b6fbb1e06bab1d81880a2d386db0246 100644
--- a/alfa-client/libs/vorgang-shared/test/vorgang.ts
+++ b/alfa-client/libs/vorgang-shared/test/vorgang.ts
@@ -57,6 +57,7 @@ export function createVorgang(): Vorgang {
     hasPostfachNachricht: faker.datatype.boolean(),
     hasNewPostfachNachricht: faker.datatype.boolean(),
     antragBewilligt: false,
+    archiving: false,
   };
 }
 
@@ -163,9 +164,7 @@ function createByStatus(): ByStatus {
   };
 }
 
-export function createVorgangWithEingangResource(
-  linkRelations: string[] = [],
-): VorgangWithEingangResource {
+export function createVorgangWithEingangResource(linkRelations: string[] = []): VorgangWithEingangResource {
   return toResource(createVorgangWithEingang(), linkRelations);
 }
 
diff --git a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-archive-status/vorgang-archive-status.component.html b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-archive-status/vorgang-archive-status.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..8da0edfd4e7c0cce005e53e94a060b699dd6436f
--- /dev/null
+++ b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-archive-status/vorgang-archive-status.component.html
@@ -0,0 +1,4 @@
+<div class="flex gap-1 items-center">
+  <ods-archive-icon class="fill-black"/>
+  <span>in Archivierung</span>
+</div>
diff --git a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-archive-status/vorgang-archive-status.component.spec.ts b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-archive-status/vorgang-archive-status.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..69aab5616df025543a0f6e55bafea885c8ca8aa8
--- /dev/null
+++ b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-archive-status/vorgang-archive-status.component.spec.ts
@@ -0,0 +1,29 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Vorgang } from '@alfa-client/vorgang-shared';
+import { ArchiveIconComponent } from '@ods/system';
+import { createVorgang } from '../../../../../../../vorgang-shared/test/vorgang';
+import { VorgangArchiveStatusComponent } from './vorgang-archive-status.component';
+
+describe('VorgangArchiveStatusComponent', () => {
+  let component: VorgangArchiveStatusComponent;
+  let fixture: ComponentFixture<VorgangArchiveStatusComponent>;
+
+  const vorgang: Vorgang = createVorgang();
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ArchiveIconComponent],
+      declarations: [VorgangArchiveStatusComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(VorgangArchiveStatusComponent);
+    component = fixture.componentInstance;
+    component.vorgang = vorgang;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-archive-status/vorgang-archive-status.component.ts b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-archive-status/vorgang-archive-status.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b47eafe5b016228c6a36609e2a09a82e8efdeeec
--- /dev/null
+++ b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-archive-status/vorgang-archive-status.component.ts
@@ -0,0 +1,10 @@
+import { Vorgang } from '@alfa-client/vorgang-shared';
+import { Component, Input } from '@angular/core';
+
+@Component({
+  selector: 'alfa-vorgang-archive-status',
+  templateUrl: './vorgang-archive-status.component.html',
+})
+export class VorgangArchiveStatusComponent {
+  @Input() vorgang: Vorgang;
+}
diff --git a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.html b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.html
index b7e362147f00bd68bec7cf1f850f8e37a8eb7c58..de7460f9be79a5989e1bcd424c1603b3bc495a8b 100644
--- a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.html
+++ b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.html
@@ -31,7 +31,7 @@
 >
   <div class="flex grow flex-row gap-4">
     <div class="flex flex-1 flex-col gap-4 lg:flex-row">
-      <div class="flex flex-none flex-row lg:w-32 lg:flex-col">
+      <div class="flex flex-none flex-row lg:w-40 lg:flex-col">
         <div class="flex items-center gap-3">
           <alfa-vorgang-status-dot [status]="vorgang.status" diameter="12" data-test-class="status-dot"></alfa-vorgang-status-dot>
           <alfa-vorgang-status-text
@@ -47,6 +47,13 @@
             data-test-id="vorgang-list-item-bescheid-status"
           ></alfa-vorgang-bescheid-status>
         </div>
+        <div class="ml-6 flex text-sm lg:mt-3">
+          <alfa-vorgang-archive-status
+            *ngIf="vorgang.archiving === true"
+            [vorgang]="vorgang"
+            data-test-id="vorgang-list-item-archive-status"
+          ></alfa-vorgang-archive-status>
+        </div>
       </div>
       <div class="ml-6 flex flex-1 flex-col gap-1 lg:ml-0">
         <div data-test-id="name" class="break-all text-base font-medium">
diff --git a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts
index 2d5a4428d2b7cdc89475df42c97f125c212d0afe..19cf045603cf83efe2acddffaabc484dd7c63f2c 100644
--- a/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts
+++ b/alfa-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts
@@ -55,6 +55,7 @@ import { createUserProfileResource } from 'libs/user-profile-shared/test/user-pr
 import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang';
 import { MockComponent, MockModule } from 'ng-mocks';
 import { of } from 'rxjs';
+import { VorgangArchiveStatusComponent } from './vorgang-archive-status/vorgang-archive-status.component';
 import { VorgangBescheidStatusComponent } from './vorgang-bescheid-status/vorgang-bescheid-status.component';
 import { VorgangCreatedAtComponent } from './vorgang-created-at/vorgang-created-at.component';
 import { VorgangListItemComponent } from './vorgang-list-item.component';
@@ -71,6 +72,7 @@ describe('VorgangListItemComponent', () => {
   const user: string = getDataTestIdOf('vorgang-user-icon');
   const postfachStatus: string = getDataTestClassOf('postfach-icon');
   const bescheidStatus: string = getDataTestIdOf('vorgang-list-item-bescheid-status');
+  const archiveStatus: string = getDataTestIdOf('vorgang-list-item-archive-status');
 
   const userProfile: UserProfileResource = createUserProfileResource();
 
@@ -94,6 +96,7 @@ describe('VorgangListItemComponent', () => {
         MockComponent(UserProfileInVorgangListItemContainerComponent),
         MockComponent(VorgangCreatedAtComponent),
         MockComponent(VorgangBescheidStatusComponent),
+        MockComponent(VorgangArchiveStatusComponent),
         MockModule(MatTooltipModule),
       ],
       providers: [
@@ -119,9 +122,7 @@ describe('VorgangListItemComponent', () => {
     describe('user profile', () => {
       beforeEach(() => {
         component.buildAriaLabel = jest.fn();
-        component.userProfileService.getAssignedUserProfile = jest
-          .fn()
-          .mockReturnValue(of(createStateResource(userProfile)));
+        component.userProfileService.getAssignedUserProfile = jest.fn().mockReturnValue(of(createStateResource(userProfile)));
       });
 
       describe('vorgang has no "assigned to" link', () => {
@@ -163,10 +164,7 @@ describe('VorgangListItemComponent', () => {
 
   describe('bearbeiter/user-icon', () => {
     it('should be visible', () => {
-      component.vorgang = createVorgangResource([
-        VorgangHeaderLinkRel.VORGANG_WITH_EINGANG,
-        VorgangHeaderLinkRel.ASSIGN,
-      ]);
+      component.vorgang = createVorgangResource([VorgangHeaderLinkRel.VORGANG_WITH_EINGANG, VorgangHeaderLinkRel.ASSIGN]);
       fixture.detectChanges();
 
       const userElement = fixture.nativeElement.querySelector(user);
@@ -186,10 +184,7 @@ describe('VorgangListItemComponent', () => {
 
   describe('mail icon', () => {
     beforeEach(() => {
-      component.vorgang = createVorgangResource([
-        VorgangHeaderLinkRel.VORGANG_WITH_EINGANG,
-        VorgangHeaderLinkRel.POSTFACH_MAILS,
-      ]);
+      component.vorgang = createVorgangResource([VorgangHeaderLinkRel.VORGANG_WITH_EINGANG, VorgangHeaderLinkRel.POSTFACH_MAILS]);
     });
 
     it('should show mail icon if Vorgang has new Postfachnachricht', () => {
@@ -240,6 +235,26 @@ describe('VorgangListItemComponent', () => {
     });
   });
 
+  describe('Archive-Status', () => {
+    it('should show archive status if vorgang has archiving true', () => {
+      component.vorgang.archiving = true;
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, archiveStatus);
+
+      expect(element).toBeInstanceOf(HTMLElement);
+    });
+
+    it('should not show archive status if vorgang has archiving false', () => {
+      component.vorgang.archiving = false;
+      fixture.detectChanges();
+
+      const element = getElementFromFixture(fixture, archiveStatus);
+
+      expect(element).not.toBeInstanceOf(HTMLElement);
+    });
+  });
+
   describe('buildAriaLabel', () => {
     beforeEach(() => {
       component.getWiedervorlageText = jest.fn();
@@ -270,10 +285,7 @@ describe('VorgangListItemComponent', () => {
     });
 
     it('should get Wiedervorlage', () => {
-      component.vorgang = createVorgangResource([
-        VorgangHeaderLinkRel.VORGANG_WITH_EINGANG,
-        VorgangHeaderLinkRel.WIEDERVORLAGEN,
-      ]);
+      component.vorgang = createVorgangResource([VorgangHeaderLinkRel.VORGANG_WITH_EINGANG, VorgangHeaderLinkRel.WIEDERVORLAGEN]);
 
       component.buildAriaLabel();
 
@@ -282,10 +294,7 @@ describe('VorgangListItemComponent', () => {
 
     it('should not get Wiedervorlage if no nextFrist but LinkRel.WIEDERVORLAGEN', () => {
       component.vorgang = {
-        ...createVorgangResource([
-          VorgangHeaderLinkRel.VORGANG_WITH_EINGANG,
-          VorgangHeaderLinkRel.WIEDERVORLAGEN,
-        ]),
+        ...createVorgangResource([VorgangHeaderLinkRel.VORGANG_WITH_EINGANG, VorgangHeaderLinkRel.WIEDERVORLAGEN]),
         nextFrist: null,
       };
 
@@ -393,9 +402,7 @@ describe('VorgangListItemComponent', () => {
     it('should return assigned user text', () => {
       const result: string = component.getUserText(userProfile);
 
-      expect(result).toBe(
-        `Aktuell zugewiesener Nutzer: ${userProfile.firstName} ${userProfile.lastName}`,
-      );
+      expect(result).toBe(`Aktuell zugewiesener Nutzer: ${userProfile.firstName} ${userProfile.lastName}`);
     });
   });
 });
diff --git a/alfa-client/libs/vorgang/src/lib/vorgang.module.ts b/alfa-client/libs/vorgang/src/lib/vorgang.module.ts
index d2b90b1991909463bc9cbb646744e211e3161efc..4a58042a60125194bd7fd2b2b4953188c1f4aa28 100644
--- a/alfa-client/libs/vorgang/src/lib/vorgang.module.ts
+++ b/alfa-client/libs/vorgang/src/lib/vorgang.module.ts
@@ -34,10 +34,11 @@ import { NgModule } from '@angular/core';
 import { MatButtonToggleModule } from '@angular/material/button-toggle';
 import { RouterModule, Routes } from '@angular/router';
 import { ButtonToggleGroupComponent } from '@ods/component';
-import { ButtonToggleComponent } from '@ods/system';
+import { ArchiveIconComponent, ButtonToggleComponent } from '@ods/system';
 import { vorgangFilterViewGuard } from './vorgang-filter-view.guard';
 import { VorgangListContainerComponent } from './vorgang-list-container/vorgang-list-container.component';
 import { EmptyListComponent } from './vorgang-list-container/vorgang-list/empty-list/empty-list.component';
+import { VorgangArchiveStatusComponent } from './vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-archive-status/vorgang-archive-status.component';
 import { VorgangBescheidStatusComponent } from './vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-bescheid-status/vorgang-bescheid-status.component';
 import { VorgangCreatedAtComponent } from './vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-created-at/vorgang-created-at.component';
 import { VorgangListItemComponent } from './vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component';
@@ -180,6 +181,7 @@ const routes: Routes = [
     HintModule,
     ButtonToggleComponent,
     ButtonToggleGroupComponent,
+    ArchiveIconComponent,
   ],
   declarations: [
     VorgangListComponent,
@@ -201,6 +203,7 @@ const routes: Routes = [
     VorgangViewsMenuContainerComponent,
     VorgangListSearchComponent,
     VorgangBescheidStatusComponent,
+    VorgangArchiveStatusComponent,
   ],
 })
 export class VorgangModule {}
diff --git a/alfa-server/src/main/resources/application-e2e.yml b/alfa-server/src/main/resources/application-e2e.yml
index 1f162b5430da5727476ee84d73e8cdc8dfa51e63..d56ddccb468a1ec933afa67796cc933a031851a8 100644
--- a/alfa-server/src/main/resources/application-e2e.yml
+++ b/alfa-server/src/main/resources/application-e2e.yml
@@ -13,3 +13,5 @@ ozgcloud:
       url: /assets/benutzerleitfaden/benutzerleitfaden.pdf
   user-manager:
     url: http://localhost:9092
+  dms:
+    enabled: true
diff --git a/alfa-server/src/main/resources/application-local.yml b/alfa-server/src/main/resources/application-local.yml
index 48d45f7c8f167f2cdfed114c5b34929437d9663b..76f4ccb48052de1ee266058c1f7377dafdac11b0 100644
--- a/alfa-server/src/main/resources/application-local.yml
+++ b/alfa-server/src/main/resources/application-local.yml
@@ -32,6 +32,8 @@ ozgcloud:
     url: http://localhost:9092
     profile-template: /api/userProfiles/%s
     search-template: /api/userProfiles/?searchBy={searchBy}
+  dms:
+    enabled: true
 
 keycloak:
   auth-server-url: http://localhost:8088
diff --git a/alfa-server/src/main/resources/application.yml b/alfa-server/src/main/resources/application.yml
index 14fb3b10fdecfbcd1383fb0030be1e1ba3ed33ab..521222a6f86965335ce7a54b6387c1d76902649a 100644
--- a/alfa-server/src/main/resources/application.yml
+++ b/alfa-server/src/main/resources/application.yml
@@ -103,3 +103,5 @@ ozgcloud:
   user-manager:
     profile-template: /api/userProfiles/%s
     search-template: /api/userProfiles/?searchBy={searchBy}
+  dms:
+    enabled: false
diff --git a/alfa-service/pom.xml b/alfa-service/pom.xml
index 3a483d4908b9eae538a03ff8c3b1741285140812..22eab80d592ab5d23b5911b71264931dfc103880 100644
--- a/alfa-service/pom.xml
+++ b/alfa-service/pom.xml
@@ -24,7 +24,8 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
 	<modelVersion>4.0.0</modelVersion>
 
@@ -144,6 +145,10 @@
 			<groupId>de.ozgcloud.archive</groupId>
 			<artifactId>archive-manager-interface</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>de.ozgcloud.document</groupId>
+			<artifactId>document-manager-interface</artifactId>
+		</dependency>
 
 		<!-- tools -->
 		<dependency>
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssembler.java
index e25e5262112fa8d243bc9019d499ceae874db313..cdcc60be022212764463013dd956efa906508806 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssembler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssembler.java
@@ -39,6 +39,7 @@ import de.ozgcloud.alfa.common.CollectionModelBuilder;
 import de.ozgcloud.alfa.common.ModelBuilder;
 import de.ozgcloud.alfa.common.command.CommandController;
 import de.ozgcloud.alfa.vorgang.VorgangController;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import lombok.RequiredArgsConstructor;
 
 @Component
@@ -59,19 +60,19 @@ class CollaborationModelAssembler implements RepresentationModelAssembler<Collab
 	}
 
 	public CollectionModel<EntityModel<Collaboration>> toCollectionModel(Stream<? extends Collaboration> entities, String vorgangId) {
+		var vorgang = vorgangController.getVorgang(vorgangId);
 		var entityModels = entities.map(this::toModel).toList();
 
 		var selfLink = linkTo(methodOn(CollaborationByVorgangController.class).getAllByVorgangId(vorgangId)).withSelfRel();
 
 		return CollectionModelBuilder.fromEntities(entityModels)
 				.addLink(selfLink)
-				.ifMatch(entityModels::isEmpty)
-				.addLink(() -> buildCreateCollaborationRequestLink(vorgangId))
+				.ifMatch(() -> entityModels.isEmpty() && vorgangController.isEditable(vorgang))
+				.addLink(() -> buildCreateCollaborationRequestLink(vorgang))
 				.buildModel();
 	}
 
-	Link buildCreateCollaborationRequestLink(String vorgangId) {
-		var vorgang = vorgangController.getVorgang(vorgangId);
+	Link buildCreateCollaborationRequestLink(VorgangWithEingang vorgang) {
 		return linkTo(methodOn(CommandController.CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(),
 				vorgang.getVersion(), null)).withRel(REL_CREATE_COLLABORATION_REQUEST);
 	}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/clientattribute/ClientAttribute.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/clientattribute/ClientAttribute.java
index 758dd10557ea5c5cfa8d97b0fd7449227fef0e1a..b8dc1197c5fea34b92e6cc46c5dcfbe271657d65 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/clientattribute/ClientAttribute.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/clientattribute/ClientAttribute.java
@@ -33,7 +33,8 @@ public enum ClientAttribute {
 	WIEDERVORLAGE_NEXT_FRIST("nextWiedervorlageFrist", ClientName.ALFA),
 	HAS_POSTFACH_NACHRICHT("hasPostfachNachricht", ClientName.NACHRICHTEN_MANAGER),
 	HAS_NEW_POSTFACH_NACHRICHT("hasNewPostfachNachricht", ClientName.NACHRICHTEN_MANAGER),
-	ANTRAG_BEWILLIGT("antragBewilligt", ClientName.BESCHEID_MANAGER);
+	ANTRAG_BEWILLIGT("antragBewilligt", ClientName.BESCHEID_MANAGER),
+	ARCHIVING("ARCHIVING", ClientName.ARCHIVE_MANAGER);
 
 	private final String attributeName;
 	private final ClientName clientName;
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/clientattribute/ClientName.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/clientattribute/ClientName.java
index 541358ff0ae97fd4d1fd19294a302ae3286a4763..0feaa9190f9d25dceaa01a525c059bf6077ab140 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/clientattribute/ClientName.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/clientattribute/ClientName.java
@@ -29,7 +29,8 @@ import lombok.RequiredArgsConstructor;
 public enum ClientName {
 	ALFA("Alfa"),
 	NACHRICHTEN_MANAGER("OzgCloud_NachrichtenManager"),
-	BESCHEID_MANAGER("OzgCloud_BescheidManager");
+	BESCHEID_MANAGER("OzgCloud_BescheidManager"),
+	ARCHIVE_MANAGER("OzgCloud_ArchiveManager");
 
 	private final String text;
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandBody.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandBody.java
index 035f0af46bfa59df2dc3b1907958d9ba0788674c..eff4c6d7cdb8e907412b0f9a98ac9c793cfdbc59 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandBody.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandBody.java
@@ -56,7 +56,8 @@ import de.ozgcloud.alfa.wiedervorlage.Wiedervorlage;
 		@Type(value = ProcessVorgangBody.class, name = "PROCESS_VORGANG"),
 		@Type(value = AktenzeichenCommandBody.class, name = "SET_AKTENZEICHEN"),
 		@Type(value = BescheidDocumentFromFileBody.class, name = "CREATE_BESCHEID_DOCUMENT_FROM_FILE"),
-		@Type(value = CollaborationCommandBody.class, name = "CREATE_COLLABORATION_REQUEST")
+		@Type(value = CollaborationCommandBody.class, name = "CREATE_COLLABORATION_REQUEST"),
+		@Type(value = EmptyCommandBody.class, name="ARCHIVE_VORGANG")
 })
 public interface CommandBody {
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/EmptyCommandBody.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/EmptyCommandBody.java
new file mode 100644
index 0000000000000000000000000000000000000000..3095c1084dc8e64355c1622e0db528fdac472657
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/EmptyCommandBody.java
@@ -0,0 +1,4 @@
+package de.ozgcloud.alfa.common.command;
+
+class EmptyCommandBody implements CommandBody {
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/export/DmsProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/export/DmsProperties.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ec65379fa46462a9e3c9eab9fd84deeb2ce419a
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/export/DmsProperties.java
@@ -0,0 +1,16 @@
+package de.ozgcloud.alfa.export;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Configuration
+@ConfigurationProperties("ozgcloud.dms")
+class DmsProperties {
+
+	private boolean enabled;
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java
index 836ade09e0989e7b4afb49662098c9a0724301f7..33e5c38b351cb727281233dd7b9e9a26d88acc55 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/export/ExportVorgangProcessor.java
@@ -34,7 +34,9 @@ import org.springframework.hateoas.server.RepresentationModelProcessor;
 import org.springframework.stereotype.Component;
 
 import de.ozgcloud.alfa.common.ModelBuilder;
+import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController;
 import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
+import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import lombok.RequiredArgsConstructor;
 
@@ -45,6 +47,10 @@ class ExportVorgangProcessor implements RepresentationModelProcessor<EntityModel
 	private static final Predicate<VorgangWithEingang> IS_VORGANG_ABGESCHLOSSEN = vorgang -> vorgang.getStatus() == VorgangStatus.ABGESCHLOSSEN;
 
 	static final LinkRelation REL_EXPORT = LinkRelation.of("export");
+	static final LinkRelation REL_ARCHIVE = LinkRelation.of("archive");
+
+	private final DmsProperties dmsProperties;
+	private final VorgangController vorgangController;
 
 	@Override
 	public EntityModel<VorgangWithEingang> process(EntityModel<VorgangWithEingang> model) {
@@ -55,8 +61,15 @@ class ExportVorgangProcessor implements RepresentationModelProcessor<EntityModel
 		}
 
 		return ModelBuilder.fromModel(model)
-				.ifMatch(IS_VORGANG_ABGESCHLOSSEN)
+				.ifMatch(IS_VORGANG_ABGESCHLOSSEN.and(vorgangController::isEditable))
 				.addLink(linkTo(methodOn(ExportVorgangController.class).exportVorgang(vorgang.getId())).withRel(REL_EXPORT))
+				.ifMatch(IS_VORGANG_ABGESCHLOSSEN.and(isDmsEnabled()).and(vorgangController::isEditable))
+				.addLink(linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(),
+						null)).withRel(REL_ARCHIVE))
 				.buildModel();
 	}
+
+	private Predicate<VorgangWithEingang> isDmsEnabled() {
+		return vorgang -> dmsProperties.isEnabled();
+	}
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java
index ec7457e481490c30121690daafa11046a0b84040..ed4c3a53428540126bb1e7440fbba411d9b58753 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarModelAssembler.java
@@ -38,7 +38,6 @@ import de.ozgcloud.alfa.common.CollectionModelBuilder;
 import de.ozgcloud.alfa.common.ModelBuilder;
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileController;
 import de.ozgcloud.alfa.kommentar.KommentarCommandController.KommentarCommandByVorgangController;
-import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
 import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 
@@ -67,7 +66,7 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar,
 		var attachmentsLink = linkTo(methodOn(KommentarController.class).getAttachments(kommentar.getId()));
 
 		return ModelBuilder.fromEntity(kommentar).addLink(selfLink.withSelfRel())
-				.ifMatch(() -> isEditable(vorgang))
+				.ifMatch(() -> vorgangController.isEditable(vorgang))
 				.addLink(commandLink.withRel(REL_EDIT))
 				.ifMatch(HAS_ATTACHMENTS)
 				.addLink(attachmentsLink.withRel(REL_ATTACHMENTS))
@@ -80,13 +79,9 @@ class KommentarModelAssembler implements RepresentationModelAssembler<Kommentar,
 		return CollectionModelBuilder.fromEntities(entities.map(kommentar -> buildModel(kommentar, vorgang)))
 				.addLink(linkTo(KommentarController.class).withSelfRel())
 				.addLink(linkTo(BinaryFileController.class).slash(vorgangId).slash("kommentarAttachment").slash("file").withRel(REL_UPLOAD_FILE))
-				.ifMatch(kommentareModel -> isEditable(vorgang))
+				.ifMatch(() -> vorgangController.isEditable(vorgang))
 				.addLink(linkTo(methodOn(KommentarCommandByVorgangController.class).createKommentar(null, vorgangId))
 						.withRel(REL_CREATE))
 				.buildModel();
 	}
-
-	private boolean isEditable(VorgangWithEingang vorgang) {
-		return vorgang.getStatus() != VorgangStatus.ZU_LOESCHEN;
-	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessor.java
index 61bc5ec641fa9e92ccd5bc15af397a8835ef5864..5281c140049b6c730996d7243ae76b3e0a3ec408 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessor.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessor.java
@@ -29,7 +29,6 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.hateoas.EntityModel;
 import org.springframework.hateoas.Link;
 import org.springframework.hateoas.LinkRelation;
@@ -43,8 +42,11 @@ import de.ozgcloud.alfa.common.user.UserRole;
 import de.ozgcloud.alfa.loeschanforderung.LoeschAnforderungController.LoeschAnforderungByVorgangController;
 import de.ozgcloud.alfa.vorgang.Vorgang;
 import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
+import de.ozgcloud.alfa.vorgang.VorgangController;
+import lombok.RequiredArgsConstructor;
 
 @Component
+@RequiredArgsConstructor
 class LoeschAnforderungVorgangProcessor implements RepresentationModelProcessor<EntityModel<? extends Vorgang>> {
 
 	static final LinkRelation REL_LOESCHEN_ANFORDERN = LinkRelation.of("loeschen_anfordern");
@@ -53,11 +55,9 @@ class LoeschAnforderungVorgangProcessor implements RepresentationModelProcessor<
 	static final List<String> USER_ROLES_ALLOWED_TO_LOESCHEN_ANFORDERN = List.of(UserRole.VERWALTUNG_USER, UserRole.EINHEITLICHER_ANSPRECHPARTNER);
 	static final List<VorgangStatus> VORGANG_STATUSES_ALLOWED_TO_LOESCHEN_ANFORDERN = List.of(VorgangStatus.VERWORFEN, VorgangStatus.ABGESCHLOSSEN);
 
-	@Autowired
-	private LoeschAnforderungService service;
-
-	@Autowired
-	private CurrentUserService currentUserService;
+	private final LoeschAnforderungService service;
+	private final CurrentUserService currentUserService;
+	private final VorgangController vorgangController;
 
 	@Override
 	public EntityModel<? extends Vorgang> process(EntityModel<? extends Vorgang> model) {
@@ -77,7 +77,7 @@ class LoeschAnforderungVorgangProcessor implements RepresentationModelProcessor<
 	}
 
 	boolean isLoeschenAnfordernAllowed(Vorgang vorgang) {
-		return isAllowedStatus(vorgang) && isAllowedUserRole();
+		return isAllowedStatus(vorgang) && isAllowedUserRole() && vorgangController.isEditable(vorgang);
 	}
 
 	private boolean isAllowedStatus(Vorgang vorgang) {
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java
index ca8dc1cdf6f7497f3111933394d02cb3ae52299d..8de875f0fae7795526b3f0b7ec0dd996a2a38d79 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssembler.java
@@ -45,7 +45,6 @@ import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
 import de.ozgcloud.alfa.postfach.PostfachMail.Direction;
 import de.ozgcloud.alfa.postfach.PostfachMailController.PostfachMailCommandByVorgangController;
 import de.ozgcloud.alfa.postfach.PostfachMailController.PostfachMailCommandController;
-import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
 import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangHead;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
@@ -79,6 +78,7 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac
 			.map(createdBy -> !createdBy.toString().startsWith(SYSTEM_USER_IDENTIFIER)).orElse(false);
 
 	private final UserManagerUrlProvider userManagerUrlProvider;
+	private final VorgangController vorgangController;
 
 	public RepresentationModel<EntityModel<PostfachSettings>> toCollectionModel(Stream<PostfachMail> postfachMails, VorgangWithEingang vorgang,
 			PostfachSettings postfachSettings) {
@@ -107,7 +107,7 @@ class PostfachMailModelAssembler implements RepresentationModelAssembler<Postfac
 	void addPostfachNachrichtLinks(RepresentationModel<EntityModel<PostfachSettings>> model, VorgangWithEingang vorgang) {
 		var vorgangId = vorgang.getId();
 
-		if (vorgang.getStatus() != VorgangStatus.ZU_LOESCHEN) {
+		if (vorgangController.isEditable(vorgang)) {
 			model.add(linkTo(methodOn(PostfachMailCommandByVorgangController.class).sendPostfachMail(vorgangId, null))
 					.withRel(REL_SEND_POSTFACH_MAIL));
 		}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java
index f1ea42acbacd3b762ef9ceb98fb09971811e3596..3b6facda1bdca1ad3dd53fa54f250e4df2cbda93 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java
@@ -213,4 +213,8 @@ public class VorgangController {
 
 		return handleGetAllRequest(requestCriteria);
 	}
+
+	public boolean isEditable(Vorgang vorgang) {
+		return vorgangService.isVorgangEditable(vorgang);
+	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHead.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHead.java
index 0d6ec5d9e3a908e993b4da3d59ef146abeea96e9..8cd2afc524e3fd7f24c9335823e6e1b57f44f8d0 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHead.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHead.java
@@ -31,4 +31,5 @@ import lombok.Getter;
 public class VorgangHead {
 
 	private ServiceKonto serviceKonto;
+	private boolean locked;
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHeader.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHeader.java
index 19f68babc69eabbae67df770bfc609a9b0eeea9d..095dfd131f3aeb751d197df5422efb18c32f5088 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHeader.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHeader.java
@@ -63,4 +63,6 @@ class VorgangHeader implements Vorgang {
 	private boolean hasNewPostfachNachricht;
 
 	private Boolean antragBewilligt;
+
+	private boolean archiving;
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHeaderMapper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHeaderMapper.java
index ff57a7ad8a9050f7d9184c7822b8530e3ae441e3..c7d0b102c241d120e654ac9bb77cb4566ae296eb 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHeaderMapper.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangHeaderMapper.java
@@ -45,6 +45,7 @@ interface VorgangHeaderMapper {
 	@Mapping(target = "antragBewilligt", source = "clientAttributesList")
 	@Mapping(target = "hasPostfachNachricht", expression = "java(mapBoolClientAttribute(vorgangHeader.getClientAttributesList(), ClientAttribute.HAS_POSTFACH_NACHRICHT))")
 	@Mapping(target = "hasNewPostfachNachricht", expression = "java(mapBoolClientAttribute(vorgangHeader.getClientAttributesList(), ClientAttribute.HAS_NEW_POSTFACH_NACHRICHT))")
+	@Mapping(target = "archiving", expression = "java(mapBoolClientAttribute(vorgangHeader.getClientAttributesList(), ClientAttribute.ARCHIVING))")
 	VorgangHeader toVorgangHeader(GrpcVorgangHeader vorgangHeader);
 
 	default LocalDate mapNextFrist(List<GrpcClientAttribute> clientAttributes) {
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java
index 538bc3b6fdc7e5b1c5a8943a5408436de316011b..47c76b1574946937db404c0342d93411f029cc6d 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangModelAssembler.java
@@ -29,7 +29,6 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.hateoas.EntityModel;
 import org.springframework.hateoas.Link;
 import org.springframework.hateoas.RepresentationModel;
@@ -44,10 +43,11 @@ import de.ozgcloud.alfa.common.user.CurrentUserService;
 import de.ozgcloud.alfa.common.user.UserId;
 import de.ozgcloud.alfa.common.user.UserRole;
 import de.ozgcloud.alfa.statistic.Statistic;
-import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
 import de.ozgcloud.alfa.wiedervorlage.WiedervorlageController;
+import lombok.RequiredArgsConstructor;
 
 @Component
+@RequiredArgsConstructor
 class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, EntityModel<Vorgang>> {
 
 	static final String REL_NEXT = "next";
@@ -56,8 +56,8 @@ class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, Ent
 	static final String REL_WIEDERVORLAGEN = "wiedervorlagen";
 	static final String REL_VORGANG_ASSIGN = "assign";
 
-	@Autowired
-	private CurrentUserService userService;
+	private final CurrentUserService userService;
+	private final VorgangService vorgangService;
 
 	public RepresentationModel<EntityModel<EnhancedVorgang>> toCollectionModel(Stream<VorgangHeader> entities, VorgaengeHeaderResponse response,
 			FindVorgaengeHeaderRequestCriteria requestCriteria, Statistic statistic) {
@@ -148,6 +148,6 @@ class VorgangModelAssembler implements RepresentationModelAssembler<Vorgang, Ent
 
 	boolean isAssigneable(Vorgang vorgang) {
 		return (userService.hasRole(UserRole.VERWALTUNG_USER) || userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE))
-				&& vorgang.getStatus() != VorgangStatus.ZU_LOESCHEN;
+				&& vorgangService.isVorgangEditable(vorgang);
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangService.java
index 7c6e80ebcbcd0b414731625741c6400d2a703187..cb9bb12fbd8121227543a03eb95a7b38b4b2e0e0 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangService.java
@@ -97,4 +97,15 @@ class VorgangService {
 	private Collection<String> getOrganisationseinheitenIdsFromUser() {
 		return userService.getUser().getOrganisationseinheitIds();
 	}
+
+	public boolean isVorgangEditable(Vorgang vorgang) {
+		var vorgangWithEingang = vorgang instanceof VorgangWithEingang ?
+				(VorgangWithEingang) vorgang :
+				findVorgangWithEingang(vorgang.getId());
+		return isVorgangWithEingangEditable(vorgangWithEingang);
+	}
+
+	boolean isVorgangWithEingangEditable(VorgangWithEingang vorgang) {
+		return vorgang.getStatus() != VorgangStatus.ZU_LOESCHEN && (vorgang.getHeader() == null || !vorgang.getHeader().isLocked());
+	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangMapper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangMapper.java
index 7dd86abc57718c0ad2e0986bd8af2b098842f48e..ba60698fca8bc039d34a7202a1b6b0ba3038751d 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangMapper.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangMapper.java
@@ -34,6 +34,7 @@ import de.ozgcloud.alfa.common.clientattribute.ClientAttributeUtils;
 import de.ozgcloud.alfa.common.user.UserIdMapper;
 import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute;
 import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttributeValue;
+import de.ozgcloud.vorgang.vorgang.GrpcVorgangHead;
 import de.ozgcloud.vorgang.vorgang.GrpcVorgangWithEingang;
 
 @Mapper(uses = { EingangMapper.class, UserIdMapper.class, BaseTypesMapper.class, ServiceKontoMapper.class })
@@ -49,4 +50,6 @@ interface VorgangWithEingangMapper {
 				.orElse(false);
 	}
 
+	@Mapping(target = "locked", expression = "java(vorgangHead.hasLock())")
+	VorgangHead toVorgangHead(GrpcVorgangHead vorgangHead);
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangCommandProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangCommandProcessor.java
index 0689b7860ea757b8901c4297d75425a15d4a5178..75b537da45bf69aaafece14961ba5db974837cfd 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangCommandProcessor.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangCommandProcessor.java
@@ -27,7 +27,6 @@ import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
 
 import java.util.Objects;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.hateoas.EntityModel;
 import org.springframework.hateoas.LinkRelation;
 import org.springframework.hateoas.server.RepresentationModelProcessor;
@@ -38,8 +37,11 @@ import de.ozgcloud.alfa.common.user.CurrentUserService;
 import de.ozgcloud.alfa.common.user.UserRole;
 import de.ozgcloud.alfa.vorgang.Vorgang;
 import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
+import de.ozgcloud.alfa.vorgang.VorgangController;
+import lombok.RequiredArgsConstructor;
 
 @Component
+@RequiredArgsConstructor
 class VorgangCommandProcessor implements RepresentationModelProcessor<EntityModel<? extends Vorgang>> {
 
 	static final LinkRelation REL_VORGANG_ANNEHMEN = LinkRelation.of("annehmen");
@@ -51,14 +53,14 @@ class VorgangCommandProcessor implements RepresentationModelProcessor<EntityMode
 	static final LinkRelation REL_VORGANG_ABSCHLIESSEN = LinkRelation.of("abschliessen");
 	static final LinkRelation REL_VORGANG_WIEDEREROEFFNEN = LinkRelation.of("wiedereroeffnen");
 
-	@Autowired
-	private CurrentUserService userService;
+	private final CurrentUserService userService;
+	private final VorgangController vorgangController;
 
 	@Override
 	public EntityModel<? extends Vorgang> process(EntityModel<? extends Vorgang> model) {
 		var vorgang = model.getContent();
 
-		if (Objects.isNull(vorgang)) {
+		if (Objects.isNull(vorgang) || !vorgangController.isEditable(vorgang)) {
 			return model;
 		}
 
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssembler.java
index c77857e911bb8f7db60932f23b9b20c8da6204cd..2a94ca0fcd0a618ed77ae80988c4b61821489e70 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssembler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssembler.java
@@ -37,7 +37,6 @@ import org.springframework.stereotype.Component;
 import de.ozgcloud.alfa.common.CollectionModelBuilder;
 import de.ozgcloud.alfa.common.ModelBuilder;
 import de.ozgcloud.alfa.common.binaryfile.BinaryFileController;
-import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
 import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.ozgcloud.alfa.wiedervorlage.WiedervorlageCommandController.WiedervorlageCommandByVorgangController;
@@ -75,7 +74,7 @@ class WiedervorlageModelAssembler implements RepresentationModelAssembler<Wieder
 				methodOn(WiedervorlageCommandController.class).updateWiedervorlage(null, wiedervorlage.getId(), wiedervorlage.getVersion()));
 
 		return ModelBuilder.fromEntity(wiedervorlage).addLink(selfLink.withSelfRel())
-				.ifMatch(() -> isEditable(vorgang))
+				.ifMatch(() -> vorgangController.isEditable(vorgang))
 				.addLink(commandLink.withRel(REL_EDIT))
 				.ifMatch(ALLOW_ERLEDIGEN).addLink(commandLink.withRel(REL_ERLEDIGEN))
 				.ifMatch(ALLOW_WIEDEREROEFFNEN).addLink(commandLink.withRel(REL_WIEDEREROEFFNEN))
@@ -89,15 +88,11 @@ class WiedervorlageModelAssembler implements RepresentationModelAssembler<Wieder
 
 		return CollectionModelBuilder.fromEntities(entities.map(wiedervorlage -> buildModel(wiedervorlage, vorgang)))
 				.addLink(linkTo(WiedervorlageController.class).withSelfRel())
-				.ifMatch(wiedervorlagenModel -> isEditable(vorgang))
+				.ifMatch(wiedervorlagenModel -> vorgangController.isEditable(vorgang))
 				.addLink(linkTo(methodOn(WiedervorlageCommandByVorgangController.class).createWiedervorlage(null, vorgangId))
 						.withRel(REL_CREATE))
 				.addLink(linkTo(BinaryFileController.class).slash(vorgangId).slash(WIEDERVORLAGE_ATTACHMENT_PATH).slash(FILE_PATH)
 						.withRel(REL_UPLOAD_FILE))
 				.buildModel();
 	}
-
-	private boolean isEditable(VorgangWithEingang vorgang) {
-		return vorgang.getStatus() != VorgangStatus.ZU_LOESCHEN;
-	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssemblerTest.java
index 42136dd1f808fbbdbacf43e24f51a9072597f712..3f4db275292b754887a4287662e537e5fba55284 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssemblerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationModelAssemblerTest.java
@@ -115,11 +115,25 @@ class CollaborationModelAssemblerTest {
 
 	@Nested
 	class TestToCollectionModel {
+
 		private final Collaboration collaboration = FachstelleCollaborationTestFactory.create();
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
+		@BeforeEach
+		void mockVorgangController() {
+			when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang);
+		}
 
 		@Nested
 		class OnNonEmptyCollaborationList {
 
+			@Test
+			void shouldGetVorgang() {
+				callAssembler();
+
+				verify(vorgangController).getVorgang(VorgangHeaderTestFactory.ID);
+			}
+
 			@Test
 			void shouldCallToModel() {
 				callAssembler();
@@ -160,12 +174,11 @@ class CollaborationModelAssemblerTest {
 		@Nested
 		class OnEmptyCollaborationList {
 
-			@Mock
-			private Link createCollaborationRequestLink;
+			@Test
+			void shouldGetVorgang() {
+				callAssembler();
 
-			@BeforeEach
-			void mock() {
-				doReturn(createCollaborationRequestLink).when(assembler).buildCreateCollaborationRequestLink(VorgangHeaderTestFactory.ID);
+				verify(vorgangController).getVorgang(VorgangHeaderTestFactory.ID);
 			}
 
 			@Test
@@ -183,11 +196,40 @@ class CollaborationModelAssemblerTest {
 						.isEqualTo(CollaborationByVorgangController.PATH + "/" + VorgangHeaderTestFactory.ID + "/collaborations");
 			}
 
-			@Test
-			void shouldHaveCreateCollaborationRequestLink() {
-				var collectionModel = callAssembler();
+			@Nested
+			class OnVorgangIsEditable {
+
+				@Mock
+				private Link createCollaborationRequestLink;
 
-				assertThat(collectionModel.getLinks()).contains(createCollaborationRequestLink);
+				@BeforeEach
+				void mock() {
+					when(vorgangController.isEditable(vorgang)).thenReturn(true);
+					doReturn(createCollaborationRequestLink).when(assembler).buildCreateCollaborationRequestLink(vorgang);
+				}
+
+				@Test
+				void shouldHaveCreateCollaborationRequestLink() {
+					var collectionModel = callAssembler();
+
+					assertThat(collectionModel.getLinks()).contains(createCollaborationRequestLink);
+				}
+			}
+
+			@Nested
+			class OnVorgangIsNotEditable {
+
+				@BeforeEach
+				void mock() {
+					when(vorgangController.isEditable(vorgang)).thenReturn(false);
+				}
+
+				@Test
+				void shouldNotHaveCreateCollaborationRequestLink() {
+					var collectionModel = callAssembler();
+
+					assertThat(collectionModel.getLink(CollaborationModelAssembler.REL_CREATE_COLLABORATION_REQUEST)).isEmpty();
+				}
 			}
 
 			private CollectionModel<EntityModel<Collaboration>> callAssembler() {
@@ -201,18 +243,6 @@ class CollaborationModelAssemblerTest {
 
 		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
 
-		@BeforeEach
-		void mockVorgangController() {
-			when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang);
-		}
-
-		@Test
-		void shouldCallVorgangController() {
-			callAssembler();
-
-			verify(vorgangController).getVorgang(VorgangHeaderTestFactory.ID);
-		}
-
 		@Test
 		void shouldHaveHrefToCreateCommand() {
 			var expectedHref = UriTemplate.of(CommandByRelationController.COMMAND_BY_RELATION_PATH)
@@ -231,7 +261,7 @@ class CollaborationModelAssemblerTest {
 		}
 
 		private Link callAssembler() {
-			return assembler.buildCreateCollaborationRequestLink(VorgangHeaderTestFactory.ID);
+			return assembler.buildCreateCollaborationRequestLink(vorgang);
 		}
 	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java
index f8ecca4343e8b30e6421c716c17894c18faef459..756653dc959487e3fcc444bc110304ca08477e4e 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/export/ExportVorgangProcessorTest.java
@@ -25,6 +25,7 @@ package de.ozgcloud.alfa.export;
 
 import static de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory.*;
 import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -33,11 +34,15 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.EnumSource;
 import org.mockito.InjectMocks;
+import org.mockito.Mock;
 import org.springframework.hateoas.EntityModel;
 import org.springframework.hateoas.Link;
+import org.springframework.hateoas.UriTemplate;
 
 import de.ozgcloud.alfa.common.UserProfileUrlProvider;
+import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController;
 import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
+import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
@@ -46,24 +51,29 @@ class ExportVorgangProcessorTest {
 
 	@InjectMocks
 	private ExportVorgangProcessor processor;
+	@Mock
+	private DmsProperties dmsProperties;
+	@Mock
+	private VorgangController vorgangController;
 
 	private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider();
 
 	@Nested
 	class TestProcess {
 
+		@BeforeEach
+		void init() {
+			initUserProfileUrlProvider(urlProvider);
+		}
+
 		@DisplayName("Export link")
 		@Nested
 		class TestExportLink {
 
-			@BeforeEach
-			void init() {
-				initUserProfileUrlProvider(urlProvider);
-			}
-
 			@Test
-			void shouldAddLinkWhenVorgangIsAbgeschlossen() {
+			void shouldAddLink() {
 				var vorgang = vorgangInStatus(VorgangStatus.ABGESCHLOSSEN);
+				givenVorgangIsEditable(vorgang);
 
 				var model = processor.process(EntityModel.of(vorgang));
 
@@ -81,11 +91,83 @@ class ExportVorgangProcessorTest {
 				assertThat(model.getLink(ExportVorgangProcessor.REL_EXPORT)).isEmpty();
 			}
 
-			private VorgangWithEingang vorgangInStatus(VorgangStatus status) {
-				return VorgangWithEingangTestFactory.createBuilder().status(status).build();
+			@Test
+			void shouldNotAddLinkWhenVorgangIsNotEditable() {
+				var vorgang = vorgangInStatus(VorgangStatus.ABGESCHLOSSEN);
+				givenVorgangIsNotEditable(vorgang);
+
+				var model = processor.process(EntityModel.of(vorgang));
+
+				assertThat(model.getLink(ExportVorgangProcessor.REL_EXPORT)).isEmpty();
 			}
 		}
 
-	}
+		@Nested
+		class TestArchiveLink {
 
+			@Test
+			void shouldAddLink() {
+				givenDmsIsEnabled();
+				var vorgang = vorgangInStatus(VorgangStatus.ABGESCHLOSSEN);
+				givenVorgangIsEditable(vorgang);
+
+				var model = processor.process(EntityModel.of(vorgang));
+
+				assertThat(model.getLink(ExportVorgangProcessor.REL_ARCHIVE)).isPresent().get().extracting(Link::getHref)
+						.isEqualTo(UriTemplate.of(CommandByRelationController.COMMAND_BY_RELATION_PATH)
+								.expand(VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.ID, VorgangHeaderTestFactory.VERSION).toString());
+			}
+
+			@ParameterizedTest
+			@EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "ABGESCHLOSSEN")
+			void shouldNotAddLinkWhenVorgangIsNotAbgeschlossen(VorgangStatus status) {
+				var vorgang = vorgangInStatus(status);
+
+				var model = processor.process(EntityModel.of(vorgang));
+
+				assertThat(model.getLink(ExportVorgangProcessor.REL_ARCHIVE)).isEmpty();
+			}
+
+			@Test
+			void shouldNotAddLinkWhenDmsIsNotEnabled() {
+				givenDmsIsNotEnabled();
+				var vorgang = vorgangInStatus(VorgangStatus.ABGESCHLOSSEN);
+
+				var model = processor.process(EntityModel.of(vorgang));
+
+				assertThat(model.getLink(ExportVorgangProcessor.REL_ARCHIVE)).isEmpty();
+			}
+
+			@Test
+			void shouldNotAddLinkWhenVorgangIsNotEditable() {
+				givenDmsIsEnabled();
+				var vorgang = vorgangInStatus(VorgangStatus.ABGESCHLOSSEN);
+				givenVorgangIsNotEditable(vorgang);
+
+				var model = processor.process(EntityModel.of(vorgang));
+
+				assertThat(model.getLink(ExportVorgangProcessor.REL_ARCHIVE)).isEmpty();
+			}
+
+			void givenDmsIsEnabled() {
+				when(dmsProperties.isEnabled()).thenReturn(true);
+			}
+
+			void givenDmsIsNotEnabled() {
+				when(dmsProperties.isEnabled()).thenReturn(false);
+			}
+		}
+
+		void givenVorgangIsEditable(VorgangWithEingang vorgang) {
+			when(vorgangController.isEditable(vorgang)).thenReturn(true);
+		}
+
+		void givenVorgangIsNotEditable(VorgangWithEingang vorgang) {
+			when(vorgangController.isEditable(vorgang)).thenReturn(false);
+		}
+
+		private VorgangWithEingang vorgangInStatus(VorgangStatus status) {
+			return VorgangWithEingangTestFactory.createBuilder().status(status).build();
+		}
+	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java
index c9acf6d69157ebdb8943bcf7c1576c22cbefa7bd..882b6eab5e7d2b9a7d5e393b8797bed66eb28c30 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarModelAssemblerTest.java
@@ -43,9 +43,9 @@ import org.springframework.hateoas.server.EntityLinks;
 
 import de.ozgcloud.alfa.common.UserProfileUrlProvider;
 import de.ozgcloud.alfa.common.UserProfileUrlProviderTestFactory;
-import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
 import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
 
 class KommentarModelAssemblerTest {
@@ -90,11 +90,13 @@ class KommentarModelAssemblerTest {
 
 	@Nested
 	class TestLinksOnModel {
-		final String COMMAND_BY_KOMMENTAR_PATH = //
+		private static final String COMMAND_BY_KOMMENTAR_PATH = //
 				KommentarCommandController.KOMMENTAR_COMMANDS
 						.replace("{kommentarId}", KommentarTestFactory.ID)
 						.replace("{kommentarVersion}", String.valueOf(KommentarTestFactory.VERSION));
 
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
 		@Test
 		void shouldHaveSelfLink() {
 			var link = buildModel().getLink(IanaLinkRelations.SELF);
@@ -105,6 +107,8 @@ class KommentarModelAssemblerTest {
 
 		@Test
 		void shouldHaveEditLink() {
+			when(vorgangController.isEditable(vorgang)).thenReturn(true);
+
 			var model = buildModel();
 
 			assertThat(model.getLink(KommentarModelAssembler.REL_EDIT)).isPresent().get().extracting(Link::getHref)
@@ -113,9 +117,9 @@ class KommentarModelAssemblerTest {
 
 		@Test
 		void shouldNotHaveEditLink() {
-			var vorgang = VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN).build();
+			when(vorgangController.isEditable(vorgang)).thenReturn(false);
 
-			var model = modelAssembler.buildModel(KommentarTestFactory.create(), vorgang);
+			var model = buildModel();
 
 			assertThat(model.getLink(KommentarModelAssembler.REL_EDIT)).isEmpty();
 		}
@@ -149,7 +153,7 @@ class KommentarModelAssemblerTest {
 		}
 
 		EntityModel<Kommentar> buildModel() {
-			return modelAssembler.buildModel(KommentarTestFactory.create(), VorgangWithEingangTestFactory.create());
+			return modelAssembler.buildModel(KommentarTestFactory.create(), vorgang);
 		}
 	}
 
@@ -157,10 +161,11 @@ class KommentarModelAssemblerTest {
 	class TestLinksOnCollectionModel {
 
 		private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider();
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
 
 		@BeforeEach
 		void beforeEach() {
-			when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(VorgangWithEingangTestFactory.create());
+			when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang);
 		}
 
 		@Test
@@ -187,6 +192,7 @@ class KommentarModelAssemblerTest {
 		@Test
 		void shouldHaveCreateKommentarLink() {
 			initUserProfileUrlProvider(urlProvider);
+			when(vorgangController.isEditable(vorgang)).thenReturn(true);
 
 			var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(KommentarTestFactory.create()).stream(),
 					VorgangHeaderTestFactory.ID);
@@ -201,8 +207,7 @@ class KommentarModelAssemblerTest {
 		@Test
 		void shouldNotHaveCreateKommentarLink() {
 			initUserProfileUrlProvider(urlProvider);
-			var vorgang = VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN).build();
-			when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang);
+			when(vorgangController.isEditable(vorgang)).thenReturn(false);
 
 			var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(KommentarTestFactory.create()).stream(),
 					VorgangHeaderTestFactory.ID);
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessorTest.java
index 407f80cfc8b60f886812ce6ef346ce26f923c9a0..a8ddd9361ca3b7c887d1ef2047010303d47a9fe1 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessorTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungVorgangProcessorTest.java
@@ -50,6 +50,7 @@ import de.ozgcloud.alfa.common.user.UserRole;
 import de.ozgcloud.alfa.loeschanforderung.LoeschAnforderungController.LoeschAnforderungByVorgangController;
 import de.ozgcloud.alfa.vorgang.Vorgang;
 import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
+import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 
 class LoeschAnforderungVorgangProcessorTest {
@@ -60,9 +61,10 @@ class LoeschAnforderungVorgangProcessorTest {
 
 	@Mock
 	private CurrentUserService currentUserService;
-
 	@Mock
 	private LoeschAnforderungService loeschAnforderungService;
+	@Mock
+	private VorgangController vorgangController;
 
 	@DisplayName("Process")
 	@Nested
@@ -152,11 +154,23 @@ class LoeschAnforderungVorgangProcessorTest {
 				@EnumSource(names = { "VERWORFEN", "ABGESCHLOSSEN" })
 				void shouldReturnTrue(VorgangStatus vorgangStatus) {
 					var vorgang = VorgangHeaderTestFactory.createBuilder().status(vorgangStatus).build();
+					when(vorgangController.isEditable(vorgang)).thenReturn(true);
 
 					var isAllowed = processor.isLoeschenAnfordernAllowed(vorgang);
 
 					assertThat(isAllowed).isTrue();
 				}
+
+				@ParameterizedTest
+				@EnumSource(names = { "VERWORFEN", "ABGESCHLOSSEN" })
+				void shouldReturnFalseIfVorgangNotEditable(VorgangStatus vorgangStatus) {
+					var vorgang = VorgangHeaderTestFactory.createBuilder().status(vorgangStatus).build();
+					when(vorgangController.isEditable(vorgang)).thenReturn(false);
+
+					var isAllowed = processor.isLoeschenAnfordernAllowed(vorgang);
+
+					assertThat(isAllowed).isFalse();
+				}
 			}
 
 			@DisplayName("with EINHEITLICHER_ANSPRECHPARTNER role")
@@ -173,11 +187,23 @@ class LoeschAnforderungVorgangProcessorTest {
 				@EnumSource(names = { "VERWORFEN", "ABGESCHLOSSEN" })
 				void shouldReturnTrue(VorgangStatus vorgangStatus) {
 					var vorgang = VorgangHeaderTestFactory.createBuilder().status(vorgangStatus).build();
+					when(vorgangController.isEditable(vorgang)).thenReturn(true);
 
 					var isAllowed = processor.isLoeschenAnfordernAllowed(vorgang);
 
 					assertThat(isAllowed).isTrue();
 				}
+
+				@ParameterizedTest
+				@EnumSource(names = { "VERWORFEN", "ABGESCHLOSSEN" })
+				void shouldReturnFalseIfVorgangNotEditable(VorgangStatus vorgangStatus) {
+					var vorgang = VorgangHeaderTestFactory.createBuilder().status(vorgangStatus).build();
+					when(vorgangController.isEditable(vorgang)).thenReturn(false);
+
+					var isAllowed = processor.isLoeschenAnfordernAllowed(vorgang);
+
+					assertThat(isAllowed).isFalse();
+				}
 			}
 		}
 
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java
index 5011984faff86f2dd409e0237238bf754014e606..5c8e2874053681408887e2b97e6157456e3c714c 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachMailModelAssemblerTest.java
@@ -53,7 +53,7 @@ import de.ozgcloud.alfa.common.user.UserManagerUrlProvider;
 import de.ozgcloud.alfa.postfach.PostfachMail.Direction;
 import de.ozgcloud.alfa.postfach.PostfachMailController.PostfachMailCommandByVorgangController;
 import de.ozgcloud.alfa.vorgang.ServiceKontoTestFactory;
-import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
+import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangHeadTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
@@ -67,6 +67,8 @@ class PostfachMailModelAssemblerTest {
 	private PostfachMailModelAssembler modelAssembler;
 	@Mock
 	private UserManagerUrlProvider userManagerUrlProvider;
+	@Mock
+	private VorgangController vorgangController;
 
 	@Nested
 	class TestToModel {
@@ -455,10 +457,20 @@ class PostfachMailModelAssemblerTest {
 		class SendPostfachMailLink {
 
 			private final String sendPostfachMailLinkRel = PostfachMailModelAssembler.REL_SEND_POSTFACH_MAIL;
+			private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
+			@Test
+			void shouldCheckIfVorgangIsEditable() {
+				callModelAssembler(vorgang);
+
+				verify(vorgangController).isEditable(vorgang);
+			}
 
 			@Test
 			void shouldExist() {
-				callModelAssembler(VorgangWithEingangTestFactory.create());
+				when(vorgangController.isEditable(vorgang)).thenReturn(true);
+
+				callModelAssembler(vorgang);
 
 				var link = model.getLink(sendPostfachMailLinkRel);
 				assertThat(link).get().extracting(Link::getHref)
@@ -466,8 +478,10 @@ class PostfachMailModelAssemblerTest {
 			}
 
 			@Test
-			void shouldNotExistOnStatusZuLoeschen() {
-				callModelAssembler(VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN).build());
+			void shouldNotExistWhenVorgangIsNotEditable() {
+				when(vorgangController.isEditable(vorgang)).thenReturn(false);
+
+				callModelAssembler(vorgang);
 
 				var link = model.getLink(sendPostfachMailLinkRel);
 				assertThat(link).isEmpty();
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcLockTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcLockTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..b8f28d98535105c457b34f1c3d6b8ce4f2e56951
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcLockTestFactory.java
@@ -0,0 +1,14 @@
+package de.ozgcloud.alfa.vorgang;
+
+import de.ozgcloud.vorgang.vorgang.GrpcLock;
+
+class GrpcLockTestFactory {
+
+	public static GrpcLock create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcLock.Builder createBuilder() {
+		return GrpcLock.newBuilder();
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcVorgangHeadTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcVorgangHeadTestFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..b11ce836e7bf43f9c4ff85bcc3d5d73a9a8886fa
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcVorgangHeadTestFactory.java
@@ -0,0 +1,14 @@
+package de.ozgcloud.alfa.vorgang;
+
+import de.ozgcloud.vorgang.vorgang.GrpcVorgangHead;
+
+class GrpcVorgangHeadTestFactory {
+
+	public static GrpcVorgangHead create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcVorgangHead.Builder createBuilder() {
+		return GrpcVorgangHead.newBuilder();
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java
index ec54915cbf4e0356bbffb92841b52938a52491f1..ba6f94d6a7ba3f5518b8b371b8a1d346161afb94 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerTest.java
@@ -901,4 +901,27 @@ class VorgangControllerTest {
 							.content(body));
 		}
 	}
+
+	@Nested
+	class TestIsEditable {
+
+		private final Vorgang vorgang = VorgangWithEingangTestFactory.create();
+
+		@Test
+		void shouldCallService() {
+			controller.isEditable(vorgang);
+
+			verify(vorgangService).isVorgangEditable(vorgang);
+		}
+
+		@ParameterizedTest
+		@ValueSource(booleans = {true, false})
+		void shouldReturnServiceResult(boolean serviceResult) {
+			when(vorgangService.isVorgangEditable(vorgang)).thenReturn(serviceResult);
+
+			var editable = controller.isEditable(vorgang);
+
+			assertThat(editable).isEqualTo(serviceResult);
+		}
+	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderMapperTest.java
index d4a2212f8e7f9465cc93a45adf86d5dc01f6a7e6..66927d5cf6f096c5a1d5a14835dfe2e2936e6d76 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderMapperTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderMapperTest.java
@@ -235,4 +235,26 @@ class VorgangHeaderMapperTest {
 			return mapper.toVorgangHeader(GrpcVorgangHeaderTestFactory.create());
 		}
 	}
+
+	@Nested
+	class TestArchiving {
+
+		@Test
+		void shouldBeFalseIfClientAttributeIsMissing() {
+			var header = mapper.toVorgangHeader(GrpcVorgangHeaderTestFactory.create());
+
+			assertThat(header.isArchiving()).isFalse();
+		}
+
+		@ParameterizedTest
+		@ValueSource(booleans = { true, false })
+		void shouldBeValueOfClientAttribute(boolean value) {
+			var clientAttribute = GrpcClientAttributeTestFactory.createWith(ClientAttribute.ARCHIVING, value);
+			var vorgangHeader = GrpcVorgangHeaderTestFactory.createBuilder().addClientAttributes(clientAttribute).build();
+
+			var mapped = mapper.toVorgangHeader(vorgangHeader);
+
+			assertThat(mapped.isArchiving()).isEqualTo(value);
+		}
+	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java
index ce086063abdabff1414092f6fb2dfbb43eb01241..94ae793fbbe99920ac5cb16dc8551675ecd9b93d 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangModelAssemblerTest.java
@@ -49,7 +49,6 @@ import de.ozgcloud.alfa.common.user.CurrentUserService;
 import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
 import de.ozgcloud.alfa.common.user.UserRole;
 import de.ozgcloud.alfa.statistic.StatisticTestFactory;
-import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
 
 class VorgangModelAssemblerTest {
 
@@ -58,6 +57,8 @@ class VorgangModelAssemblerTest {
 	private VorgangModelAssembler modelAssembler;
 	@Mock
 	private CurrentUserService userService;
+	@Mock
+	private VorgangService vorgangService;
 
 	private UserProfileUrlProvider urlProvider = new UserProfileUrlProvider();
 
@@ -317,6 +318,7 @@ class VorgangModelAssemblerTest {
 	class TestLinksOnModel {
 
 		private final UserProfileUrlProvider urlProvider = new UserProfileUrlProvider();
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
 
 		@BeforeEach
 		void beforeEach() {
@@ -337,82 +339,39 @@ class VorgangModelAssemblerTest {
 			assertThat(link).isPresent().get().extracting(Link::getHref).isEqualTo(VorgangController.PATH + "/" + VorgangHeaderTestFactory.ID);
 		}
 
-		@DisplayName("Without any roles")
-		@Nested
-		class WithoutRoles {
-
-			@Test
-			void shouldNotHaveWiedervorlagenLink() {
-				var link = toModel().getLink(VorgangModelAssembler.REL_WIEDERVORLAGEN);
-
-				assertThat(link).isEmpty();
-			}
+		@Test
+		void shouldHaveAssignLink() {
+			doReturn(true).when(modelAssembler).isAssigneable(vorgang);
 
-			@DisplayName("Should not have Vorgang-assign-links")
-			@Test
-			void shouldNotHaveAssignLink() {
-				var link = toModel().getLink(VorgangModelAssembler.REL_VORGANG_ASSIGN);
+			var link = toModel().getLink(VorgangModelAssembler.REL_VORGANG_ASSIGN);
 
-				assertThat(link).isEmpty();
-			}
+			assertThat(link).isPresent().get().extracting(Link::getHref).isEqualTo(buildCommandLink());
 		}
 
-		@Nested
-		class ForRoleVerwaltungPoststelle {
-
-			@Test
-			void shouldHaveAssignLink() {
-				when(userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)).thenReturn(true);
-				when(userService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(false);
-
-				var link = toModel().getLink(VorgangModelAssembler.REL_VORGANG_ASSIGN);
-
-				assertThat(link).isPresent().get().extracting(Link::getHref).isEqualTo(buildCommandLink());
-			}
-
-			@Test
-			void shouldNotHaveAssignLink() {
-				var vorgang = VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN).build();
-				doReturn(false).when(modelAssembler).isAssigneable(vorgang);
-
-				var model = modelAssembler.toModel(vorgang);
-				var link = model.getLink(VorgangModelAssembler.REL_VORGANG_ASSIGN);
+		@Test
+		void shouldNotHaveAssignLink() {
+			doReturn(false).when(modelAssembler).isAssigneable(vorgang);
 
-				assertThat(link).isEmpty();
-			}
+			var link = toModel().getLink(VorgangModelAssembler.REL_VORGANG_ASSIGN);
 
+			assertThat(link).isEmpty();
 		}
 
-		@Nested
-		class ForRoleVerwaltungUser {
-
-			@BeforeEach
-			void mockUserService() {
-				when(userService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true);
-			}
-
-			@Test
-			void shouldHaveWiedervorlagenLink() {
-				var link = toModel().getLink(VorgangModelAssembler.REL_WIEDERVORLAGEN);
-
-				assertThat(link).isPresent().get().extracting(Link::getHref)
-						.isEqualTo("/api/wiedervorlages?vorgangId=" + VorgangHeaderTestFactory.ID);
-			}
+		@Test
+		void shouldHaveWiedervorlagenLink() {
+			when(userService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true);
 
-			@Test
-			void shouldHaveAssignLink() {
-				var link = toModel().getLink(VorgangModelAssembler.REL_VORGANG_ASSIGN);
+			var link = toModel().getLink(VorgangModelAssembler.REL_WIEDERVORLAGEN);
 
-				assertThat(link).isPresent().get().extracting(Link::getHref).isEqualTo(buildCommandLink());
-			}
+			assertThat(link).isPresent().get().extracting(Link::getHref)
+					.isEqualTo("/api/wiedervorlages?vorgangId=" + VorgangHeaderTestFactory.ID);
+		}
 
-			@Test
-			void shouldNotHaveAssignLink() {
-				var model = modelAssembler.toModel(VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN).build());
-				var link = model.getLink(VorgangModelAssembler.REL_VORGANG_ASSIGN);
+		@Test
+		void shouldNotHaveWiedervorlagenLink() {
+			var link = toModel().getLink(VorgangModelAssembler.REL_WIEDERVORLAGEN);
 
-				assertThat(link).isEmpty();
-			}
+			assertThat(link).isEmpty();
 		}
 
 		private String buildCommandLink() {
@@ -421,62 +380,92 @@ class VorgangModelAssemblerTest {
 		}
 
 		private EntityModel<Vorgang> toModel() {
-			return modelAssembler.toModel(VorgangWithEingangTestFactory.create());
+			return modelAssembler.toModel(vorgang);
 		}
 	}
 
 	@Nested
 	class TestIsAssigneable {
 
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
 		@Test
-		void shouldReturnTrueForVerwaltungUser() {
-			when(userService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true);
-			var vorgang = VorgangHeaderTestFactory.createBuilder().status(VorgangStatus.NEU);
+		void shoudCheckIfVorgangIsEditable() {
+			givenVerwaltungUser();
 
-			assertThat(modelAssembler.isAssigneable(vorgang.build())).isTrue();
+			modelAssembler.isAssigneable(vorgang);
+
+			verify(vorgangService).isVorgangEditable(vorgang);
 		}
 
 		@Test
-		void shouldReturnFalseForVerwaltungUser() {
-			when(userService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(false);
-			var vorgang = VorgangHeaderTestFactory.createBuilder().status(VorgangStatus.NEU);
+		void shouldReturnTrueForVerwaltungUser() {
+			givenVerwaltungUser();
+			givenVorgangIsEditable();
 
-			assertThat(modelAssembler.isAssigneable(vorgang.build())).isFalse();
+			assertThat(modelAssembler.isAssigneable(vorgang)).isTrue();
 		}
 
 		@Test
-		void shouldReturnFalseForVerwatlugnUserAndVorgangZuLoeschen() {
-			when(userService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true);
-			var vorgang = VorgangHeaderTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN);
+		void shouldReturnTrueForPoststelleUser() {
+			givenNotVerwaltungUser();
+			givenPoststelleUser();
+			givenVorgangIsEditable();
 
-			assertThat(modelAssembler.isAssigneable(vorgang.build())).isFalse();
+			assertThat(modelAssembler.isAssigneable(vorgang)).isTrue();
 		}
 
 		@Test
-		void shouldReturnTrueForPoststelleUser() {
-			when(userService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(false);
-			when(userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)).thenReturn(true);
-			var vorgang = VorgangHeaderTestFactory.createBuilder().status(VorgangStatus.NEU);
+		void shouldReturnFalseForNotPoststelleUser() {
+			givenNotVerwaltungUser();
+			givenNotPoststelleUser();
 
-			assertThat(modelAssembler.isAssigneable(vorgang.build())).isTrue();
+			assertThat(modelAssembler.isAssigneable(vorgang)).isFalse();
 		}
 
 		@Test
-		void shouldReturnFalseForPoststelleUser() {
-			when(userService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(false);
-			when(userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)).thenReturn(false);
-			var vorgang = VorgangHeaderTestFactory.createBuilder().status(VorgangStatus.NEU);
+		void shouldReturnFalseForVerwaltungUserAndVorgangNotEditable() {
+			givenVerwaltungUser();
+			givenVorgangIsNotEditable();
 
-			assertThat(modelAssembler.isAssigneable(vorgang.build())).isFalse();
+			var assignable = modelAssembler.isAssigneable(vorgang);
+
+			assertThat(assignable).isFalse();
 		}
 
 		@Test
-		void shouldReturnFalseForPoststelleUserAndVorgangZuLoeschen() {
+		void shouldReturnFalseForPoststelleUserAndVorgangNotEditable() {
+			givenNotVerwaltungUser();
+			givenPoststelleUser();
+			givenVorgangIsNotEditable();
+
+			var assignable = modelAssembler.isAssigneable(vorgang);
+
+			assertThat(assignable).isFalse();
+		}
+
+		private void givenVerwaltungUser() {
+			when(userService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true);
+		}
+
+		private void givenNotVerwaltungUser() {
 			when(userService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(false);
+		}
+
+		private void givenPoststelleUser() {
 			when(userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)).thenReturn(true);
-			var vorgang = VorgangHeaderTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN);
+		}
+
+		private void givenNotPoststelleUser() {
+			when(userService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)).thenReturn(false);
+		}
+
+		private void givenVorgangIsEditable() {
+			doReturn(true).when(vorgangService).isVorgangEditable(vorgang);
+		}
 
-			assertThat(modelAssembler.isAssigneable(vorgang.build())).isFalse();
+		private void givenVorgangIsNotEditable() {
+			doReturn(false).when(vorgangService).isVorgangEditable(vorgang);
 		}
 	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangServiceTest.java
index 2b52a27b760d0769dcb9159d594996af31a2f930..fa26b153010675a2873b292c5ae8716e90ce3f98 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangServiceTest.java
@@ -33,6 +33,9 @@ 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.EnumSource;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
@@ -332,4 +335,122 @@ class VorgangServiceTest {
 			verify(service).buildFilterCriteria(any(FilterCriteria.class));
 		}
 	}
+
+	@Nested
+	class TestIsVorgangEditable {
+
+		@Nested
+		class OnIsVorgangWithEingang {
+
+			private final VorgangWithEingang vorgangWithEingang = VorgangWithEingangTestFactory.create();
+
+			@Test
+			void shouldCheckIfVorgangIsEditable() {
+				service.isVorgangEditable(vorgangWithEingang);
+
+				verify(service).isVorgangWithEingangEditable(vorgangWithEingang);
+			}
+
+			@ParameterizedTest
+			@ValueSource(booleans = { true, false })
+			void shouldReturnCheckResult(boolean checkResult) {
+				when(service.isVorgangWithEingangEditable(vorgangWithEingang)).thenReturn(checkResult);
+
+				var editable = service.isVorgangEditable(vorgangWithEingang);
+
+				assertThat(editable).isEqualTo(checkResult);
+			}
+		}
+
+		@Nested
+		class OnIsNotVorgangWithEingang {
+
+			private final Vorgang vorgang = VorgangHeaderTestFactory.create();
+			private final VorgangWithEingang vorgangWithEingang = VorgangWithEingangTestFactory.create();
+
+			@BeforeEach
+			void init() {
+				doReturn(vorgangWithEingang).when(service).findVorgangWithEingang(VorgangHeaderTestFactory.ID);
+			}
+
+			@Test
+			void shouldFindVorgangWithEingang() {
+				service.isVorgangEditable(vorgang);
+
+				verify(service).findVorgangWithEingang(VorgangHeaderTestFactory.ID);
+			}
+
+			@Test
+			void shouldCheckIfVorgangIsEditable() {
+				service.isVorgangEditable(vorgang);
+
+				verify(service).isVorgangWithEingangEditable(vorgangWithEingang);
+			}
+
+			@ParameterizedTest
+			@ValueSource(booleans = { true, false })
+			void shouldReturnCheckResult(boolean checkResult) {
+				when(service.isVorgangWithEingangEditable(vorgangWithEingang)).thenReturn(checkResult);
+
+				var editable = service.isVorgangEditable(vorgang);
+
+				assertThat(editable).isEqualTo(checkResult);
+			}
+		}
+	}
+
+	@Nested
+	class TestIsVorgangWithEingangEditable {
+
+		@ParameterizedTest
+		@EnumSource
+		void shouldBeFalseWhenVorgangIsLocked(VorgangStatus status) {
+			var vorgang = VorgangWithEingangTestFactory.createBuilder()
+					.header(VorgangHeadTestFactory.createBuilder().locked(true).build())
+					.status(status)
+					.build();
+
+			var editable = service.isVorgangWithEingangEditable(vorgang);
+
+			assertThat(editable).isFalse();
+		}
+
+		@Test
+		void shouldBeFalseWhenVorgangZuLoeschen() {
+			var vorgang = VorgangWithEingangTestFactory.createBuilder()
+					.header(VorgangHeadTestFactory.createBuilder().locked(false).build())
+					.status(VorgangStatus.ZU_LOESCHEN)
+					.build();
+
+			var editable = service.isVorgangWithEingangEditable(vorgang);
+
+			assertThat(editable).isFalse();
+		}
+
+		@ParameterizedTest
+		@EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "ZU_LOESCHEN")
+		void shouldBeTrueWhenVorgangIsNotZuLoeschen(VorgangStatus status) {
+			var vorgang = VorgangWithEingangTestFactory.createBuilder()
+					.header(VorgangHeadTestFactory.createBuilder().locked(false).build())
+					.status(status)
+					.build();
+
+			var editable = service.isVorgangWithEingangEditable(vorgang);
+
+			assertThat(editable).isTrue();
+		}
+
+		@ParameterizedTest
+		@EnumSource(mode = EnumSource.Mode.EXCLUDE, names = "ZU_LOESCHEN")
+		void shouldBeTrueIfHeaderIsNull(VorgangStatus status) {
+			var vorgang = VorgangWithEingangTestFactory.createBuilder()
+					.header(null)
+					.status(status)
+					.build();
+
+			var editable = service.isVorgangWithEingangEditable(vorgang);
+
+			assertThat(editable).isTrue();
+		}
+	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangMapperTest.java
index 0d48a860a7d26c458ee0de58d24a631d565fbbfb..d250ba9754edca347108767a369ddc4c152240b3 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangMapperTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangMapperTest.java
@@ -144,6 +144,26 @@ class VorgangWithEingangMapperTest {
 			assertThat(vorgang.isHasNewPostfachNachricht()).isEqualTo(value);
 		}
 
+		@Test
+		void shouldMapLockedToFalseIfLockIsNotPresent() {
+			var grpcVorgang = GrpcVorgangWithEingangTestFactory.createBuilder().setHeader(GrpcVorgangHeadTestFactory.create()).build();
+
+			var vorgang = mapper.toVorgangWithEingang(grpcVorgang);
+
+			assertThat(vorgang.getHeader().isLocked()).isFalse();
+		}
+
+		@Test
+		void shouldMapLockedToTrueIfLockIsPresent() {
+			var grpcVorgang = GrpcVorgangWithEingangTestFactory.createBuilder()
+					.setHeader(GrpcVorgangHeadTestFactory.createBuilder().setLock(GrpcLockTestFactory.create()).build())
+					.build();
+
+			var vorgang = mapper.toVorgangWithEingang(grpcVorgang);
+
+			assertThat(vorgang.getHeader().isLocked()).isTrue();
+		}
+
 		private VorgangWithEingang callMapper() {
 			return mapper.toVorgangWithEingang(grpcVorgangMitEingang);
 		}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangCommandProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangCommandProcessorTest.java
index 299e8f6e5576fd74aa31370e9a1abfcdb73ec6fc..83e431f870d0b470841cb427a4c4a4954b83acbf 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangCommandProcessorTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangCommandProcessorTest.java
@@ -46,6 +46,7 @@ import de.ozgcloud.alfa.common.user.CurrentUserService;
 import de.ozgcloud.alfa.common.user.UserRole;
 import de.ozgcloud.alfa.vorgang.Vorgang;
 import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
+import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
 
 class VorgangCommandProcessorTest {
@@ -59,6 +60,28 @@ class VorgangCommandProcessorTest {
 	private VorgangCommandProcessor processor;
 	@Mock
 	private CurrentUserService userService;
+	@Mock
+	private VorgangController vorgangController;
+
+	@Test
+	void shouldNotAddLinksIfVorgangIsNull() {
+		var entityModel = mock(EntityModel.class);
+
+		processor.process(entityModel);
+
+		verify(entityModel, never()).add(any(Link.class));
+	}
+
+	@ParameterizedTest
+	@EnumSource(value = VorgangStatus.class)
+	void shouldNotAddLinksIfVorgangIsNotEditable(VorgangStatus status) {
+		var vorgang = VorgangHeaderTestFactory.createBuilder().status(status).build();
+		when(vorgangController.isEditable(vorgang)).thenReturn(false);
+
+		var entityModel = processor.process(EntityModel.of(vorgang));
+
+		assertThat(entityModel.hasLinks()).isFalse();
+	}
 
 	@Nested
 	@DisplayName("add 'annehmen' link")
@@ -68,7 +91,7 @@ class VorgangCommandProcessorTest {
 
 		@Test
 		void shouldBePresent() {
-			var processed = processor.process(buildVorgangInStatus(VorgangStatus.NEU));
+			var processed = processor.process(buildEditableVorgangInStatus(VorgangStatus.NEU));
 
 			assertThat(processed.getLink(linkRel)).isPresent().get()
 					.extracting(Link::getHref).isEqualTo(EXPECTED_COMMAND_LINK);
@@ -77,7 +100,7 @@ class VorgangCommandProcessorTest {
 		@ParameterizedTest
 		@EnumSource(mode = Mode.EXCLUDE, names = { "NEU" })
 		void shouldNOTbePresentbyStatus(VorgangStatus status) {
-			var processed = processor.process(buildVorgangInStatus(status));
+			var processed = processor.process(buildEditableVorgangInStatus(status));
 
 			assertThat(processed.getLink(linkRel)).isEmpty();
 		}
@@ -94,7 +117,7 @@ class VorgangCommandProcessorTest {
 		void shouldBePresentAtStatusAndRole(String userRole) {
 			doReturn(userRole).when(processor).getUserRole();
 
-			var processed = processor.process(buildVorgangInStatus(VorgangStatus.NEU));
+			var processed = processor.process(buildEditableVorgangInStatus(VorgangStatus.NEU));
 
 			assertThat(processed.getLink(linkRel)).isPresent().get()
 					.extracting(Link::getHref).isEqualTo(EXPECTED_COMMAND_LINK);
@@ -105,7 +128,7 @@ class VorgangCommandProcessorTest {
 		void shouldNOTbePresentAtStatusAndRoleEa(VorgangStatus status) {
 			doReturn(UserRole.EINHEITLICHER_ANSPRECHPARTNER).when(processor).getUserRole();
 
-			var processed = processor.process(buildVorgangInStatus(status));
+			var processed = processor.process(buildEditableVorgangInStatus(status));
 
 			assertThat(processed.getLink(linkRel)).isEmpty();
 		}
@@ -115,7 +138,7 @@ class VorgangCommandProcessorTest {
 		void shouldNOTbePresentAtStatusAndRoleVerwaltungUser(VorgangStatus status) {
 			doReturn(UserRole.VERWALTUNG_USER).when(processor).getUserRole();
 
-			var processed = processor.process(buildVorgangInStatus(status));
+			var processed = processor.process(buildEditableVorgangInStatus(status));
 
 			assertThat(processed.getLink(linkRel)).isEmpty();
 		}
@@ -130,7 +153,8 @@ class VorgangCommandProcessorTest {
 		@ParameterizedTest
 		@ValueSource(strings = { "EINHEITLICHER_ANSPRECHPARTNER", "VERWALTUNG_USER" })
 		void shouldBePresentAtStatusAndRole(String userRole) {
-			var processed = processor.process(buildVorgangInStatus(VorgangStatus.VERWORFEN));
+			doReturn(userRole).when(processor).getUserRole();
+			var processed = processor.process(buildEditableVorgangInStatus(VorgangStatus.VERWORFEN));
 
 			assertThat(processed.getLink(linkRel)).isPresent().get()
 					.extracting(Link::getHref).isEqualTo(EXPECTED_COMMAND_LINK);
@@ -141,7 +165,7 @@ class VorgangCommandProcessorTest {
 		void shouldNOTbePresentAtStatusAndRoleVerwaltungUser(VorgangStatus status) {
 			doReturn(UserRole.VERWALTUNG_USER).when(processor).getUserRole();
 
-			var processed = processor.process(buildVorgangInStatus(status));
+			var processed = processor.process(buildEditableVorgangInStatus(status));
 
 			assertThat(processed.getLink(linkRel)).isEmpty();
 		}
@@ -151,7 +175,7 @@ class VorgangCommandProcessorTest {
 		void shouldNOTbePresentAtStatusAndRoleEa(VorgangStatus status) {
 			doReturn(UserRole.EINHEITLICHER_ANSPRECHPARTNER).when(processor).getUserRole();
 
-			var processed = processor.process(buildVorgangInStatus(status));
+			var processed = processor.process(buildEditableVorgangInStatus(status));
 
 			assertThat(processed.getLink(linkRel)).isEmpty();
 		}
@@ -165,7 +189,7 @@ class VorgangCommandProcessorTest {
 
 		@Test
 		void shouldBePresent() {
-			var processed = processor.process(buildVorgangInStatus(VorgangStatus.ANGENOMMEN));
+			var processed = processor.process(buildEditableVorgangInStatus(VorgangStatus.ANGENOMMEN));
 
 			assertThat(processed.getLink(linkRel)).isPresent().get()
 					.extracting(Link::getHref)
@@ -175,7 +199,7 @@ class VorgangCommandProcessorTest {
 		@ParameterizedTest
 		@EnumSource(mode = Mode.EXCLUDE, names = { "ANGENOMMEN", "ABGESCHLOSSEN" })
 		void shouldNOTbePresentbyStatus(VorgangStatus status) {
-			var processed = processor.process(buildVorgangInStatus(status));
+			var processed = processor.process(buildEditableVorgangInStatus(status));
 
 			assertThat(processed.getLink(linkRel)).isEmpty();
 		}
@@ -189,7 +213,7 @@ class VorgangCommandProcessorTest {
 
 		@Test
 		void shouldBePresent() {
-			var processed = processor.process(buildVorgangInStatus(VorgangStatus.IN_BEARBEITUNG));
+			var processed = processor.process(buildEditableVorgangInStatus(VorgangStatus.IN_BEARBEITUNG));
 
 			assertThat(processed.getLink(linkRel)).isPresent().get()
 					.extracting(Link::getHref)
@@ -199,7 +223,7 @@ class VorgangCommandProcessorTest {
 		@ParameterizedTest
 		@EnumSource(mode = Mode.EXCLUDE, names = { "IN_BEARBEITUNG" })
 		void shouldNOTbePresentbyStatus(VorgangStatus status) {
-			var processed = processor.process(buildVorgangInStatus(status));
+			var processed = processor.process(buildEditableVorgangInStatus(status));
 
 			assertThat(processed.getLink(linkRel)).isEmpty();
 		}
@@ -213,7 +237,7 @@ class VorgangCommandProcessorTest {
 
 		@Test
 		void shouldBePresent() {
-			var processed = processor.process(buildVorgangInStatus(VorgangStatus.IN_BEARBEITUNG));
+			var processed = processor.process(buildEditableVorgangInStatus(VorgangStatus.IN_BEARBEITUNG));
 
 			assertThat(processed.getLink(linkRel)).isPresent().get()
 					.extracting(Link::getHref).isEqualTo(EXPECTED_COMMAND_LINK);
@@ -222,7 +246,7 @@ class VorgangCommandProcessorTest {
 		@ParameterizedTest
 		@EnumSource(mode = Mode.EXCLUDE, names = { "IN_BEARBEITUNG" })
 		void shouldNOTbePresentbyStatus(VorgangStatus status) {
-			var processed = processor.process(buildVorgangInStatus(status));
+			var processed = processor.process(buildEditableVorgangInStatus(status));
 
 			assertThat(processed.getLink(linkRel)).isEmpty();
 		}
@@ -245,7 +269,7 @@ class VorgangCommandProcessorTest {
 			@ParameterizedTest
 			@EnumSource(mode = Mode.INCLUDE, names = { "IN_BEARBEITUNG", "BESCHIEDEN" })
 			void shouldBePresent(VorgangStatus status) {
-				var processed = processor.process(buildVorgangInStatus(status));
+				var processed = processor.process(buildEditableVorgangInStatus(status));
 
 				assertThat(processed.getLink(linkRel)).isPresent().get()
 						.extracting(Link::getHref)
@@ -255,7 +279,7 @@ class VorgangCommandProcessorTest {
 			@ParameterizedTest
 			@EnumSource(mode = Mode.EXCLUDE, names = { "IN_BEARBEITUNG", "BESCHIEDEN" })
 			void shouldNOTbePresentbyStatus(VorgangStatus status) {
-				var processed = processor.process(buildVorgangInStatus(status));
+				var processed = processor.process(buildEditableVorgangInStatus(status));
 
 				assertThat(processed.getLink(linkRel)).isEmpty();
 			}
@@ -271,7 +295,7 @@ class VorgangCommandProcessorTest {
 
 			@Test
 			void shouldBePresent() {
-				var processed = processor.process(buildVorgangInStatus(VorgangStatus.IN_BEARBEITUNG));
+				var processed = processor.process(buildEditableVorgangInStatus(VorgangStatus.IN_BEARBEITUNG));
 
 				assertThat(processed.getLink(linkRel)).isPresent().get()
 						.extracting(Link::getHref)
@@ -281,7 +305,7 @@ class VorgangCommandProcessorTest {
 			@ParameterizedTest
 			@EnumSource(mode = Mode.EXCLUDE, names = { "IN_BEARBEITUNG" })
 			void shouldNOTbePresentbyStatus(VorgangStatus status) {
-				var processed = processor.process(buildVorgangInStatus(status));
+				var processed = processor.process(buildEditableVorgangInStatus(status));
 
 				assertThat(processed.getLink(linkRel)).isEmpty();
 			}
@@ -300,7 +324,7 @@ class VorgangCommandProcessorTest {
 		void shouldBePresentOnStatusAbgeschlossen(String userRole) {
 			doReturn(userRole).when(processor).getUserRole();
 
-			var processed = processor.process(buildVorgangInStatus(VorgangStatus.ABGESCHLOSSEN));
+			var processed = processor.process(buildEditableVorgangInStatus(VorgangStatus.ABGESCHLOSSEN));
 
 			assertThat(processed.getLink(linkRel)).isPresent().get()
 					.extracting(Link::getHref).isEqualTo(EXPECTED_COMMAND_LINK);
@@ -309,7 +333,7 @@ class VorgangCommandProcessorTest {
 		@Test
 		@DisplayName("on Vorgang with Status Beschieden and Role VerwaltungUser")
 		void shouldBePresentOnStatusBeschieden() {
-			var processed = processor.process(buildVorgangInStatus(VorgangStatus.BESCHIEDEN));
+			var processed = processor.process(buildEditableVorgangInStatus(VorgangStatus.BESCHIEDEN));
 
 			assertThat(processed.getLink(linkRel)).isPresent().get()
 					.extracting(Link::getHref).isEqualTo(EXPECTED_COMMAND_LINK);
@@ -320,7 +344,7 @@ class VorgangCommandProcessorTest {
 		void shouldBeNotPresentOnStatusBeschiedenAndRoleEA() {
 			doReturn(UserRole.EINHEITLICHER_ANSPRECHPARTNER).when(processor).getUserRole();
 
-			var processed = processor.process(buildVorgangInStatus(VorgangStatus.BESCHIEDEN));
+			var processed = processor.process(buildEditableVorgangInStatus(VorgangStatus.BESCHIEDEN));
 
 			assertThat(processed.getLink(linkRel)).isNotPresent();
 		}
@@ -330,7 +354,7 @@ class VorgangCommandProcessorTest {
 		void shouldNOTbePresentbyStatusAndRoleVerwaltungUser(VorgangStatus status) {
 			doReturn(UserRole.VERWALTUNG_USER).when(processor).getUserRole();
 
-			var processed = processor.process(buildVorgangInStatus(status));
+			var processed = processor.process(buildEditableVorgangInStatus(status));
 
 			assertThat(processed.getLink(linkRel)).isEmpty();
 		}
@@ -340,7 +364,7 @@ class VorgangCommandProcessorTest {
 		void shouldNOTbePresentbyStatusAndRoleEA(VorgangStatus status) {
 			doReturn(UserRole.EINHEITLICHER_ANSPRECHPARTNER).when(processor).getUserRole();
 
-			var processed = processor.process(buildVorgangInStatus(status));
+			var processed = processor.process(buildEditableVorgangInStatus(status));
 
 			assertThat(processed.getLink(linkRel)).isEmpty();
 		}
@@ -357,14 +381,15 @@ class VorgangCommandProcessorTest {
 		@ParameterizedTest
 		@EnumSource()
 		void shouldNotBePresent(VorgangStatus status) {
-			var processed = processor.process(buildVorgangInStatus(status));
+			var processed = processor.process(buildEditableVorgangInStatus(status));
 
 			assertThat(processed.getLinks()).isEmpty();
 		}
 	}
 
-	private EntityModel<Vorgang> buildVorgangInStatus(VorgangStatus status) {
-		return EntityModel.of(VorgangHeaderTestFactory.createBuilder().status(status).build());
+	private EntityModel<Vorgang> buildEditableVorgangInStatus(VorgangStatus status) {
+		var vorgangInStatus = VorgangHeaderTestFactory.createBuilder().status(status).build();
+		when(vorgangController.isEditable(vorgangInStatus)).thenReturn(true);
+		return EntityModel.of(vorgangInStatus);
 	}
-
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssemblerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssemblerTest.java
index b442bcaa6eb72d576947b6497eb0d742401d00b9..01cbb98f06ab930c917ae0bff08a2afd6d90e7aa 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssemblerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageModelAssemblerTest.java
@@ -44,9 +44,9 @@ import org.springframework.hateoas.server.EntityLinks;
 
 import de.ozgcloud.alfa.common.UserProfileUrlProvider;
 import de.ozgcloud.alfa.common.file.OzgFileTestFactory;
-import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
 import de.ozgcloud.alfa.vorgang.VorgangController;
 import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
+import de.ozgcloud.alfa.vorgang.VorgangWithEingang;
 import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory;
 
 class WiedervorlageModelAssemblerTest {
@@ -103,6 +103,8 @@ class WiedervorlageModelAssemblerTest {
 				.replace("{wiedervorlageId}", WiedervorlageTestFactory.ID)
 				.replace("{wiedervorlageVersion}", String.valueOf(WiedervorlageTestFactory.VERSION));
 
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
 		@Test
 		void shouldHaveSelfLink() {
 			var link = buildModel().getLink(IanaLinkRelations.SELF);
@@ -113,6 +115,8 @@ class WiedervorlageModelAssemblerTest {
 
 		@Test
 		void shouldHaveEditLink() {
+			when(vorgangController.isEditable(vorgang)).thenReturn(true);
+
 			var link = buildModel().getLink(WiedervorlageModelAssembler.REL_EDIT);
 
 			assertThat(link).isPresent();
@@ -121,9 +125,9 @@ class WiedervorlageModelAssemblerTest {
 
 		@Test
 		void shouldNotHaveEditLink() {
-			var model = modelAssembler.buildModel(WiedervorlageTestFactory.createBuilder().done(true).build(),
-					VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN).build());
-			var link = model.getLink(WiedervorlageModelAssembler.REL_EDIT);
+			when(vorgangController.isEditable(vorgang)).thenReturn(false);
+
+			var link = buildModel().getLink(WiedervorlageModelAssembler.REL_EDIT);
 
 			assertThat(link).isEmpty();
 		}
@@ -201,23 +205,23 @@ class WiedervorlageModelAssemblerTest {
 		}
 
 		private EntityModel<Wiedervorlage> buildModel() {
-			return modelAssembler.buildModel(WiedervorlageTestFactory.create(), VorgangWithEingangTestFactory.create());
+			return modelAssembler.buildModel(WiedervorlageTestFactory.create(), vorgang);
 		}
 	}
 
 	@Nested
 	class TestLinksOnCollectionModel {
 
+		private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create();
+
 		@BeforeEach
 		void beforeEach() {
-			when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(VorgangWithEingangTestFactory.create());
+			when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang);
 		}
 
 		@Test
 		void shouldBuildModel() {
 			var wiedervorlage = WiedervorlageTestFactory.create();
-			var vorgang = VorgangWithEingangTestFactory.create();
-			when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang);
 
 			modelAssembler.toCollectionModel(Stream.of(wiedervorlage), VorgangHeaderTestFactory.ID);
 
@@ -226,9 +230,10 @@ class WiedervorlageModelAssemblerTest {
 
 		@Test
 		void shouldHaveCreateWiedervorlageLink() {
+			when(vorgangController.isEditable(vorgang)).thenReturn(true);
+
 			var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(WiedervorlageTestFactory.create()).stream(),
 					VorgangHeaderTestFactory.ID);
-
 			var link = collectionModel.getLink(WiedervorlageModelAssembler.REL_CREATE);
 
 			assertThat(link).isPresent();
@@ -237,12 +242,10 @@ class WiedervorlageModelAssemblerTest {
 
 		@Test
 		void shouldNotHaveCreateWiedervorlageLink() {
-			var vorgang = VorgangWithEingangTestFactory.createBuilder().status(VorgangStatus.ZU_LOESCHEN).build();
-			when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang);
+			when(vorgangController.isEditable(vorgang)).thenReturn(false);
 
 			var collectionModel = modelAssembler.toCollectionModel(Collections.singleton(WiedervorlageTestFactory.create()).stream(),
 					VorgangHeaderTestFactory.ID);
-
 			var link = collectionModel.getLink(WiedervorlageModelAssembler.REL_CREATE);
 
 			assertThat(link).isEmpty();
diff --git a/pom.xml b/pom.xml
index 3240af88a9f01d6ad9a6de5d9ea77f892ea664e6..6fd32b540aa6b09230597abaa05d71fafa121f65 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,13 +50,14 @@
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 
-		<vorgang-manager.version>2.13.0</vorgang-manager.version>
+		<vorgang-manager.version>2.19.0-SNAPSHOT</vorgang-manager.version>
 		<nachrichten-manager.version>2.11.0</nachrichten-manager.version>
 		<ozgcloud-common-pdf.version>3.0.1</ozgcloud-common-pdf.version>
 		<user-manager.version>2.8.0</user-manager.version>
 		<zufi-manager.version>1.5.0</zufi-manager.version>
 		<collaboration-manager.version>0.5.0</collaboration-manager.version>
-		<archive-manager.version>0.1.0</archive-manager.version>
+		<archive-manager.version>0.1.0-SNAPSHOT</archive-manager.version>
+		<document-manager.version>1.1.0</document-manager.version>
 		<spring-cloud-config-client.version>4.1.3</spring-cloud-config-client.version>
 
 		<!-- TODO: die Version über ozgcloud-common ziehen -->
@@ -126,6 +127,11 @@
 				<artifactId>archive-manager-interface</artifactId>
 				<version>${archive-manager.version}</version>
 			</dependency>
+			<dependency>
+				<groupId>de.ozgcloud.document</groupId>
+				<artifactId>document-manager-interface</artifactId>
+				<version>${document-manager.version}</version>
+			</dependency>
 
 			<dependency>
 				<groupId>io.jsonwebtoken</groupId>