diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts
index 06b2333d5..0e075ff19 100644
--- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts
+++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts
@@ -195,6 +195,9 @@ export class FilterableDropdownComponent {
   @Input()
   editing = false
 
+  @Input()
+  applyOnClose = false
+
   @Output()
   apply = new EventEmitter<ChangedItems>()
 
@@ -208,7 +211,9 @@ export class FilterableDropdownComponent {
   applyClicked() {
     if (this.selectionModel.isDirty()) {
       this.dropdown.close()
-      this.apply.emit(this.selectionModel.diff())
+      if (!this.applyOnClose) {
+        this.apply.emit(this.selectionModel.diff())
+      }
     }
   }
 
@@ -223,6 +228,9 @@ export class FilterableDropdownComponent {
       this.open.next()
     } else {
       this.filterText = ''
+      if (this.applyOnClose && this.selectionModel.isDirty()) {
+        this.apply.emit(this.selectionModel.diff())
+      }
     }
   }
 
diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.html b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.html
index e08d50c47..62a2bb95d 100644
--- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.html
+++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.html
@@ -30,6 +30,7 @@
         [items]="tags"
         [editing]="true"
         [multiple]="true"
+        [applyOnClose]="applyOnClose"
         (open)="openTagsDropdown()"
         [(selectionModel)]="tagSelectionModel"
         (apply)="setTags($event)">
@@ -37,6 +38,7 @@
       <app-filterable-dropdown class="mr-2 mr-md-3" title="Correspondent" icon="person-fill"
         [items]="correspondents"
         [editing]="true"
+        [applyOnClose]="applyOnClose"
         (open)="openCorrespondentDropdown()"
         [(selectionModel)]="correspondentSelectionModel"
         (apply)="setCorrespondents($event)">
@@ -44,6 +46,7 @@
       <app-filterable-dropdown class="mr-2 mr-md-3" title="Document Type" icon="file-earmark-fill"
         [items]="documentTypes"
         [editing]="true"
+        [applyOnClose]="applyOnClose"
         (open)="openDocumentTypeDropdown()"
         [(selectionModel)]="documentTypeSelectionModel"
         (apply)="setDocumentTypes($event)">
diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts
index f8520b84d..64b84b47a 100644
--- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts
+++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts
@@ -15,6 +15,7 @@ import { ConfirmDialogComponent } from 'src/app/components/common/confirm-dialog
 import { ChangedItems, FilterableDropdownSelectionModel } from '../../common/filterable-dropdown/filterable-dropdown.component';
 import { ToggleableItemState } from '../../common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component';
 import { MatchingModel } from 'src/app/data/matching-model';
+import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service';
 
 @Component({
   selector: 'app-bulk-editor',
@@ -38,9 +39,13 @@ export class BulkEditorComponent {
     public list: DocumentListViewService,
     private documentService: DocumentService,
     private modalService: NgbModal,
-    private openDocumentService: OpenDocumentsService
+    private openDocumentService: OpenDocumentsService,
+    private settings: SettingsService
   ) { }
 
+  applyOnClose: boolean = this.settings.get(SETTINGS_KEYS.BULK_EDIT_APPLY_ON_CLOSE)
+  showConfirmationDialogs: boolean = this.settings.get(SETTINGS_KEYS.BULK_EDIT_CONFIRMATION_DIALOGS)
+
   ngOnInit() {
     this.tagService.listAll().subscribe(result => this.tags = result.results)
     this.correspondentService.listAll().subscribe(result => this.correspondents = result.results)
@@ -54,7 +59,6 @@ export class BulkEditorComponent {
         this.list.selected.forEach(id => {
           this.openDocumentService.refreshDocument(id)
         })
-        this.list.selectNone()
       })
     )
   }
@@ -105,30 +109,40 @@ export class BulkEditorComponent {
   setTags(changedTags: ChangedItems) {
     if (changedTags.itemsToAdd.length == 0 && changedTags.itemsToRemove.length == 0) return
 
-    let modal = this.modalService.open(ConfirmDialogComponent, {backdrop: 'static'})
-    modal.componentInstance.title = $localize`Confirm tags assignment`
-    if (changedTags.itemsToAdd.length == 1 && changedTags.itemsToRemove.length == 0) {
-      let tag = changedTags.itemsToAdd[0]
-      modal.componentInstance.message = $localize`This operation will add the tag ${tag.name} to all ${this.list.selected.size} selected document(s).`
-    } else if (changedTags.itemsToAdd.length > 1 && changedTags.itemsToRemove.length == 0) {
-      modal.componentInstance.message = $localize`This operation will add the tags ${this._localizeList(changedTags.itemsToAdd)} to all ${this.list.selected.size} selected document(s).`
-    } else if (changedTags.itemsToAdd.length == 0 && changedTags.itemsToRemove.length == 1) {
-      let tag = changedTags.itemsToAdd[0]
-      modal.componentInstance.message = $localize`This operation will remove the tag ${tag.name} from all ${this.list.selected.size} selected document(s).`
-    } else if (changedTags.itemsToAdd.length == 0 && changedTags.itemsToRemove.length > 1) {
-      modal.componentInstance.message = $localize`This operation will remove the tags ${this._localizeList(changedTags.itemsToRemove)} from all ${this.list.selected.size} selected document(s).`
+    if (this.showConfirmationDialogs) {
+      let modal = this.modalService.open(ConfirmDialogComponent, {backdrop: 'static'})
+      modal.componentInstance.title = $localize`Confirm tags assignment`
+      if (changedTags.itemsToAdd.length == 1 && changedTags.itemsToRemove.length == 0) {
+        let tag = changedTags.itemsToAdd[0]
+        modal.componentInstance.message = $localize`This operation will add the tag ${tag.name} to all ${this.list.selected.size} selected document(s).`
+      } else if (changedTags.itemsToAdd.length > 1 && changedTags.itemsToRemove.length == 0) {
+        modal.componentInstance.message = $localize`This operation will add the tags ${this._localizeList(changedTags.itemsToAdd)} to all ${this.list.selected.size} selected document(s).`
+      } else if (changedTags.itemsToAdd.length == 0 && changedTags.itemsToRemove.length == 1) {
+        let tag = changedTags.itemsToAdd[0]
+        modal.componentInstance.message = $localize`This operation will remove the tag ${tag.name} from all ${this.list.selected.size} selected document(s).`
+      } else if (changedTags.itemsToAdd.length == 0 && changedTags.itemsToRemove.length > 1) {
+        modal.componentInstance.message = $localize`This operation will remove the tags ${this._localizeList(changedTags.itemsToRemove)} from all ${this.list.selected.size} selected document(s).`
+      } else {
+        modal.componentInstance.message = $localize`This operation will add the tags ${this._localizeList(changedTags.itemsToAdd)} and remove the tags ${this._localizeList(changedTags.itemsToRemove)} on all ${this.list.selected.size} selected document(s).`
+      }
+      
+      modal.componentInstance.btnClass = "btn-warning"
+      modal.componentInstance.btnCaption = $localize`Confirm`
+      modal.componentInstance.confirmClicked.subscribe(() => {
+        this.performSetTags(modal, changedTags)
+      })
     } else {
-      modal.componentInstance.message = $localize`This operation will add the tags ${this._localizeList(changedTags.itemsToAdd)} and remove the tags ${this._localizeList(changedTags.itemsToRemove)} on all ${this.list.selected.size} selected document(s).`
+      this.performSetTags(null, changedTags)
     }
-    
-    modal.componentInstance.btnClass = "btn-warning"
-    modal.componentInstance.btnCaption = $localize`Confirm`
-    modal.componentInstance.confirmClicked.subscribe(() => {
-      this.executeBulkOperation('modify_tags', {"add_tags": changedTags.itemsToAdd.map(t => t.id), "remove_tags": changedTags.itemsToRemove.map(t => t.id)}).subscribe(
-        response => {
-          this.tagService.clearCache()
+  }
+
+  private performSetTags(modal, changedTags: ChangedItems) {
+    this.executeBulkOperation('modify_tags', {"add_tags": changedTags.itemsToAdd.map(t => t.id), "remove_tags": changedTags.itemsToRemove.map(t => t.id)}).subscribe(
+      response => {
+        this.tagService.clearCache()
+        if (modal) {
           modal.close()
-        })
+        }
       }
     )
   }
@@ -136,47 +150,69 @@ export class BulkEditorComponent {
   setCorrespondents(changedCorrespondents: ChangedItems) {
     if (changedCorrespondents.itemsToAdd.length == 0 && changedCorrespondents.itemsToRemove.length == 0) return
 
-    let modal = this.modalService.open(ConfirmDialogComponent, {backdrop: 'static'})
-    modal.componentInstance.title = $localize`Confirm correspondent assignment`
     let correspondent = changedCorrespondents.itemsToAdd.length > 0 ? changedCorrespondents.itemsToAdd[0] : null
-    if (correspondent) {
-      modal.componentInstance.message = $localize`This operation will assign the correspondent ${correspondent.name} to all ${this.list.selected.size} selected document(s).`
+
+    if (this.showConfirmationDialogs) {
+      let modal = this.modalService.open(ConfirmDialogComponent, {backdrop: 'static'})
+      modal.componentInstance.title = $localize`Confirm correspondent assignment`
+      if (correspondent) {
+        modal.componentInstance.message = $localize`This operation will assign the correspondent ${correspondent.name} to all ${this.list.selected.size} selected document(s).`
+      } else {
+        modal.componentInstance.message = $localize`This operation will remove the correspondent from all ${this.list.selected.size} selected document(s).`
+      }
+      modal.componentInstance.btnClass = "btn-warning"
+      modal.componentInstance.btnCaption = $localize`Confirm`
+      modal.componentInstance.confirmClicked.subscribe(() => {
+        this.performSetCorrespondents(modal, correspondent)
+      })
     } else {
-      modal.componentInstance.message = $localize`This operation will remove the correspondent from all ${this.list.selected.size} selected document(s).`
+      this.performSetCorrespondents(null, correspondent)
     }
-    modal.componentInstance.btnClass = "btn-warning"
-    modal.componentInstance.btnCaption = $localize`Confirm`
-    modal.componentInstance.confirmClicked.subscribe(() => {
-      this.executeBulkOperation('set_correspondent', {"correspondent": correspondent ? correspondent.id : null}).subscribe(
-        response => {
-          this.correspondentService.clearCache()
+  }
+
+  private performSetCorrespondents(modal, correspondent: MatchingModel) {
+    this.executeBulkOperation('set_correspondent', {"correspondent": correspondent ? correspondent.id : null}).subscribe(
+      response => {
+        this.correspondentService.clearCache()
+        if (modal) {
           modal.close()
         }
-      )
-    })
+      }
+    )
   }
 
   setDocumentTypes(changedDocumentTypes: ChangedItems) {
     if (changedDocumentTypes.itemsToAdd.length == 0 && changedDocumentTypes.itemsToRemove.length == 0) return
 
-    let modal = this.modalService.open(ConfirmDialogComponent, {backdrop: 'static'})
-    modal.componentInstance.title = $localize`Confirm document type assignment`
     let documentType = changedDocumentTypes.itemsToAdd.length > 0 ? changedDocumentTypes.itemsToAdd[0] : null
-    if (documentType) {
-      modal.componentInstance.message = $localize`This operation will assign the document type ${documentType.name} to all ${this.list.selected.size} selected document(s).`
+
+    if (this.showConfirmationDialogs) {
+      let modal = this.modalService.open(ConfirmDialogComponent, {backdrop: 'static'})
+      modal.componentInstance.title = $localize`Confirm document type assignment`
+      if (documentType) {
+        modal.componentInstance.message = $localize`This operation will assign the document type ${documentType.name} to all ${this.list.selected.size} selected document(s).`
+      } else {
+        modal.componentInstance.message = $localize`This operation will remove the document type from all ${this.list.selected.size} selected document(s).`
+      }
+      modal.componentInstance.btnClass = "btn-warning"
+      modal.componentInstance.btnCaption = $localize`Confirm`
+      modal.componentInstance.confirmClicked.subscribe(() => {
+        this.performSetDocumentTypes(modal, documentType)
+      })
     } else {
-      modal.componentInstance.message = $localize`This operation will remove the document type from all ${this.list.selected.size} selected document(s).`
+      this.performSetDocumentTypes(null, documentType)
     }
-    modal.componentInstance.btnClass = "btn-warning"
-    modal.componentInstance.btnCaption = $localize`Confirm`
-    modal.componentInstance.confirmClicked.subscribe(() => {
-      this.executeBulkOperation('set_document_type', {"document_type": documentType ? documentType.id : null}).subscribe(
-        response => {
-          this.documentService.clearCache()
+  }
+
+  private performSetDocumentTypes(modal, documentType) {
+    this.executeBulkOperation('set_document_type', {"document_type": documentType ? documentType.id : null}).subscribe(
+      response => {
+        this.documentTypeService.clearCache()
+        if (modal) {
           modal.close()
         }
-      )
-    })
+      }
+    )
   }
 
   applyDelete() {
diff --git a/src-ui/src/app/components/manage/settings/settings.component.html b/src-ui/src/app/components/manage/settings/settings.component.html
index 6c16cfaa8..1f5374dba 100644
--- a/src-ui/src/app/components/manage/settings/settings.component.html
+++ b/src-ui/src/app/components/manage/settings/settings.component.html
@@ -26,8 +26,15 @@
             </select>
         
           </div>
+
+  
         </div>
 
+        <h4 i18n>Bulk editing</h4>
+
+        <app-input-check i18n-title title="Show confirmation dialogs" formControlName="bulkEditConfirmationDialogs" i18n-hint hint="Deleting documents will always ask for confirmation."></app-input-check>
+        <app-input-check i18n-title title="Apply on close" formControlName="bulkEditApplyOnClose"></app-input-check>
+
       </ng-template>
     </li>
     <li [ngbNavItem]="2">
diff --git a/src-ui/src/app/components/manage/settings/settings.component.ts b/src-ui/src/app/components/manage/settings/settings.component.ts
index a90966bb9..c26c63384 100644
--- a/src-ui/src/app/components/manage/settings/settings.component.ts
+++ b/src-ui/src/app/components/manage/settings/settings.component.ts
@@ -1,9 +1,9 @@
 import { Component, OnInit } from '@angular/core';
 import { FormControl, FormGroup } from '@angular/forms';
 import { PaperlessSavedView } from 'src/app/data/paperless-saved-view';
-import { GENERAL_SETTINGS } from 'src/app/data/storage-keys';
 import { DocumentListViewService } from 'src/app/services/document-list-view.service';
 import { SavedViewService } from 'src/app/services/rest/saved-view.service';
+import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service';
 import { ToastService } from 'src/app/services/toast.service';
 
 @Component({
@@ -16,14 +16,17 @@ export class SettingsComponent implements OnInit {
   savedViewGroup = new FormGroup({})
 
   settingsForm = new FormGroup({
-    'documentListItemPerPage': new FormControl(+localStorage.getItem(GENERAL_SETTINGS.DOCUMENT_LIST_SIZE) || GENERAL_SETTINGS.DOCUMENT_LIST_SIZE_DEFAULT),
+    'bulkEditConfirmationDialogs': new FormControl(this.settings.get(SETTINGS_KEYS.BULK_EDIT_CONFIRMATION_DIALOGS)),
+    'bulkEditApplyOnClose': new FormControl(this.settings.get(SETTINGS_KEYS.BULK_EDIT_APPLY_ON_CLOSE)),
+    'documentListItemPerPage': new FormControl(this.settings.get(SETTINGS_KEYS.DOCUMENT_LIST_SIZE)),
     'savedViews': this.savedViewGroup
   })
 
   constructor(
     public savedViewService: SavedViewService,
     private documentListViewService: DocumentListViewService,
-    private toastService: ToastService
+    private toastService: ToastService,
+    private settings: SettingsService
   ) { }
 
   savedViews: PaperlessSavedView[]
@@ -51,7 +54,9 @@ export class SettingsComponent implements OnInit {
   }
 
   private saveLocalSettings() {
-    localStorage.setItem(GENERAL_SETTINGS.DOCUMENT_LIST_SIZE, this.settingsForm.value.documentListItemPerPage)
+    this.settings.set(SETTINGS_KEYS.BULK_EDIT_APPLY_ON_CLOSE, this.settingsForm.value.bulkEditApplyOnClose)
+    this.settings.set(SETTINGS_KEYS.BULK_EDIT_CONFIRMATION_DIALOGS, this.settingsForm.value.bulkEditConfirmationDialogs)
+    this.settings.set(SETTINGS_KEYS.DOCUMENT_LIST_SIZE, this.settingsForm.value.documentListItemPerPage)
     this.documentListViewService.updatePageSize()
     this.toastService.showInfo($localize`Settings saved successfully.`)
   }
diff --git a/src-ui/src/app/data/storage-keys.ts b/src-ui/src/app/data/storage-keys.ts
index 13b41d4a7..ec91c06ac 100644
--- a/src-ui/src/app/data/storage-keys.ts
+++ b/src-ui/src/app/data/storage-keys.ts
@@ -5,8 +5,3 @@ export const OPEN_DOCUMENT_SERVICE = {
 export const DOCUMENT_LIST_SERVICE = {
   CURRENT_VIEW_CONFIG: 'document-list-service:currentViewConfig'
 }
-
-export const GENERAL_SETTINGS = {
-  DOCUMENT_LIST_SIZE: 'general-settings:documentListSize',
-  DOCUMENT_LIST_SIZE_DEFAULT: 50
-}
\ No newline at end of file
diff --git a/src-ui/src/app/services/document-list-view.service.ts b/src-ui/src/app/services/document-list-view.service.ts
index b148d4087..ab78d78b1 100644
--- a/src-ui/src/app/services/document-list-view.service.ts
+++ b/src-ui/src/app/services/document-list-view.service.ts
@@ -3,8 +3,9 @@ import { Observable } from 'rxjs';
 import { cloneFilterRules, FilterRule } from '../data/filter-rule';
 import { PaperlessDocument } from '../data/paperless-document';
 import { PaperlessSavedView } from '../data/paperless-saved-view';
-import { DOCUMENT_LIST_SERVICE, GENERAL_SETTINGS } from '../data/storage-keys';
+import { DOCUMENT_LIST_SERVICE } from '../data/storage-keys';
 import { DocumentService } from './rest/document.service';
+import { SettingsService, SETTINGS_KEYS } from './settings.service';
 
 
 /**
@@ -23,7 +24,7 @@ export class DocumentListViewService {
   isReloading: boolean = false
   documents: PaperlessDocument[] = []
   currentPage = 1
-  currentPageSize: number = +localStorage.getItem(GENERAL_SETTINGS.DOCUMENT_LIST_SIZE) || GENERAL_SETTINGS.DOCUMENT_LIST_SIZE_DEFAULT
+  currentPageSize: number = this.settings.get(SETTINGS_KEYS.DOCUMENT_LIST_SIZE)
   collectionSize: number
 
   /**
@@ -190,7 +191,7 @@ export class DocumentListViewService {
   }
 
   updatePageSize() {
-    let newPageSize = +localStorage.getItem(GENERAL_SETTINGS.DOCUMENT_LIST_SIZE) || GENERAL_SETTINGS.DOCUMENT_LIST_SIZE_DEFAULT
+    let newPageSize = this.settings.get(SETTINGS_KEYS.DOCUMENT_LIST_SIZE)
     if (newPageSize != this.currentPageSize) {
       this.currentPageSize = newPageSize
     }
@@ -239,7 +240,7 @@ export class DocumentListViewService {
     }
   }
 
-  constructor(private documentService: DocumentService) {
+  constructor(private documentService: DocumentService, private settings: SettingsService) {
     let documentListViewConfigJson = sessionStorage.getItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG)
     if (documentListViewConfigJson) {
       try {
diff --git a/src-ui/src/app/services/settings.service.spec.ts b/src-ui/src/app/services/settings.service.spec.ts
new file mode 100644
index 000000000..359cb6b7a
--- /dev/null
+++ b/src-ui/src/app/services/settings.service.spec.ts
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { SettingsService } from './settings.service';
+
+describe('SettingsService', () => {
+  let service: SettingsService;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(SettingsService);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});
diff --git a/src-ui/src/app/services/settings.service.ts b/src-ui/src/app/services/settings.service.ts
new file mode 100644
index 000000000..00e6ff639
--- /dev/null
+++ b/src-ui/src/app/services/settings.service.ts
@@ -0,0 +1,60 @@
+import { Injectable } from '@angular/core';
+
+export interface PaperlessSettings {
+  key: string
+  type: string
+  default: any
+}
+
+export const SETTINGS_KEYS = {
+  BULK_EDIT_CONFIRMATION_DIALOGS: 'general-settings:bulk-edit:confirmation-dialogs',
+  BULK_EDIT_APPLY_ON_CLOSE: 'general-settings:bulk-edit:apply-on-close',
+  DOCUMENT_LIST_SIZE: 'general-settings:documentListSize',
+}
+
+const SETTINGS: PaperlessSettings[] = [
+  {key: SETTINGS_KEYS.BULK_EDIT_CONFIRMATION_DIALOGS, type: "boolean", default: true},
+  {key: SETTINGS_KEYS.BULK_EDIT_APPLY_ON_CLOSE, type: "boolean", default: false},
+  {key: SETTINGS_KEYS.DOCUMENT_LIST_SIZE, type: "number", default: 50}
+]
+
+@Injectable({
+  providedIn: 'root'
+})
+export class SettingsService {
+
+  constructor() { }
+
+  get(key: string): any {
+    let setting = SETTINGS.find(s => s.key == key)
+
+    if (!setting) {
+      return null
+    }
+
+    let value = localStorage.getItem(key)
+
+    if (value != null) {
+      switch (setting.type) {
+        case "boolean":
+          return JSON.parse(value)
+        case "number":
+          return +value
+        case "string":
+          return value
+        default:
+          return value
+      }
+    } else {
+      return setting.default
+    }
+  }
+
+  set(key: string, value: any) {
+    localStorage.setItem(key, value.toString())
+  }
+
+  unset(key: string) {
+    localStorage.removeItem(key)
+  }
+}