diff --git a/web/src/elements/events/ObjectChangelog.ts b/web/src/elements/events/ObjectChangelog.ts
index 915133c84..5d22ce77e 100644
--- a/web/src/elements/events/ObjectChangelog.ts
+++ b/web/src/elements/events/ObjectChangelog.ts
@@ -4,7 +4,6 @@ import { AKResponse } from "../../api/Client";
 import { Table, TableColumn } from "../table/Table";
 import { Event, EventsApi } from "authentik-api";
 
-import "../forms/DeleteForm";
 import "../Tabs";
 import "../buttons/ModalButton";
 import "../buttons/SpinnerButton";
diff --git a/web/src/elements/events/UserEvents.ts b/web/src/elements/events/UserEvents.ts
index de52de8cf..eb2947f01 100644
--- a/web/src/elements/events/UserEvents.ts
+++ b/web/src/elements/events/UserEvents.ts
@@ -4,7 +4,6 @@ import { AKResponse } from "../../api/Client";
 import { Table, TableColumn } from "../table/Table";
 import { Event, EventsApi } from "authentik-api";
 
-import "../forms/DeleteForm";
 import "../Tabs";
 import "../buttons/ModalButton";
 import "../buttons/SpinnerButton";
diff --git a/web/src/elements/forms/DeleteBulkForm.ts b/web/src/elements/forms/DeleteBulkForm.ts
index 12b441999..88c8c3e1d 100644
--- a/web/src/elements/forms/DeleteBulkForm.ts
+++ b/web/src/elements/forms/DeleteBulkForm.ts
@@ -12,29 +12,28 @@ import { Table, TableColumn } from "../table/Table";
 import { AKResponse } from "../../api/Client";
 import { PFSize } from "../Spinner";
 
-export interface AKObject<T extends string | number> {
-    pk: T;
-    slug?: string;
-    name?: string;
-    [key: string]: unknown;
-}
+type BulkDeleteMetadata = { key: string; value: string }[];
 
 @customElement("ak-delete-objects-table")
-export class DeleteObjectsTable<ObjPkT extends string | number> extends Table<AKObject<ObjPkT>> {
+export class DeleteObjectsTable<T> extends Table<T> {
     expandable = true;
     paginated = false;
 
     @property({ attribute: false })
-    objects: AKObject<ObjPkT>[] = [];
+    objects: T[] = [];
 
     @property({ attribute: false })
-    usedBy?: (item: AKObject<ObjPkT>) => Promise<UsedBy[]>;
+    metadata!: (item: T) => BulkDeleteMetadata;
+
+    @property({ attribute: false })
+    usedBy?: (item: T) => Promise<UsedBy[]>;
 
     static get styles(): CSSResult[] {
         return super.styles.concat(PFList);
     }
 
-    apiEndpoint(page: number): Promise<AKResponse<AKObject<ObjPkT>>> {
+    // eslint-disable-next-line @typescript-eslint/no-unused-vars
+    apiEndpoint(page: number): Promise<AKResponse<T>> {
         return Promise.resolve({
             pagination: {
                 count: this.objects.length,
@@ -48,77 +47,93 @@ export class DeleteObjectsTable<ObjPkT extends string | number> extends Table<AK
     }
 
     columns(): TableColumn[] {
-        return [new TableColumn(t`Name`), new TableColumn(t`ID`)];
+        return this.metadata(this.objects[0]).map((element) => {
+            return new TableColumn(element.key);
+        });
     }
 
-    row(item: AKObject<ObjPkT>): TemplateResult[] {
-        return [html`${item.name}`, html`${item.pk}`];
+    row(item: T): TemplateResult[] {
+        return this.metadata(item).map((element) => {
+            return html`${element.value}`;
+        });
     }
 
     renderToolbarContainer(): TemplateResult {
         return html``;
     }
 
-    renderExpanded(item: AKObject<ObjPkT>): TemplateResult {
-        return html`${this.usedBy
-            ? until(
-                  this.usedBy(item).then((usedBy) => {
-                      return this.renderUsedBy(item, usedBy);
-                  }),
-                  html`<ak-spinner size=${PFSize.XLarge}></ak-spinner>`,
-              )
-            : html``}`;
-    }
-
-    renderUsedBy(item: AKObject<ObjPkT>, usedBy: UsedBy[]): TemplateResult {
-        if (usedBy.length < 1) {
-            return html`<td role="cell" colspan="2">
-                <div class="pf-c-table__expandable-row-content">
-                    <span>${t`Not used by any other object.`}</span>
-                </div>
-            </td>`;
-        }
+    renderExpanded(item: T): TemplateResult {
         return html`<td role="cell" colspan="2">
             <div class="pf-c-table__expandable-row-content">
-                <p>${t`The following objects use ${item.name}:`}</p>
-                <ul class="pf-c-list">
-                    ${usedBy.map((ub) => {
-                        let consequence = "";
-                        switch (ub.action) {
-                            case UsedByActionEnum.Cascade:
-                                consequence = t`object will be DELETED`;
-                                break;
-                            case UsedByActionEnum.CascadeMany:
-                                consequence = t`connection will be deleted`;
-                                break;
-                            case UsedByActionEnum.SetDefault:
-                                consequence = t`reference will be reset to default value`;
-                                break;
-                            case UsedByActionEnum.SetNull:
-                                consequence = t`reference will be set to an empty value`;
-                                break;
-                        }
-                        return html`<li>${t`${ub.name} (${consequence})`}</li>`;
-                    })}
-                </ul>
+                ${this.usedBy
+                    ? until(
+                          this.usedBy(item).then((usedBy) => {
+                              return this.renderUsedBy(usedBy);
+                          }),
+                          html`<ak-spinner size=${PFSize.XLarge}></ak-spinner>`,
+                      )
+                    : html``}
             </div>
-        </td> `;
+        </td>`;
+    }
+
+    renderUsedBy(usedBy: UsedBy[]): TemplateResult {
+        if (usedBy.length < 1) {
+            return html` <span>${t`Not used by any other object.`}</span>`;
+        }
+        return html`<ul class="pf-c-list">
+            ${usedBy.map((ub) => {
+                let consequence = "";
+                switch (ub.action) {
+                    case UsedByActionEnum.Cascade:
+                        consequence = t`object will be DELETED`;
+                        break;
+                    case UsedByActionEnum.CascadeMany:
+                        consequence = t`connection will be deleted`;
+                        break;
+                    case UsedByActionEnum.SetDefault:
+                        consequence = t`reference will be reset to default value`;
+                        break;
+                    case UsedByActionEnum.SetNull:
+                        consequence = t`reference will be set to an empty value`;
+                        break;
+                }
+                return html`<li>${t`${ub.name} (${consequence})`}</li>`;
+            })}
+        </ul>`;
     }
 }
 
 @customElement("ak-forms-delete-bulk")
-export class DeleteBulkForm<ObjPkT extends string | number> extends ModalButton {
+export class DeleteBulkForm extends ModalButton {
     @property({ attribute: false })
-    objects: AKObject<ObjPkT>[] = [];
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    objects: any[] = [];
 
     @property()
     objectLabel?: string;
 
     @property({ attribute: false })
-    usedBy?: (itemPk: AKObject<ObjPkT>) => Promise<UsedBy[]>;
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    metadata: (item: any) => BulkDeleteMetadata = (item: any) => {
+        const rec = item as Record<string, unknown>;
+        const meta = [];
+        if (Object.prototype.hasOwnProperty.call(rec, "name")) {
+            meta.push({ key: t`Name`, value: rec.name as string });
+        }
+        if (Object.prototype.hasOwnProperty.call(rec, "pk")) {
+            meta.push({ key: t`ID`, value: rec.pk as string });
+        }
+        return meta;
+    };
 
     @property({ attribute: false })
-    delete!: (itemPk: AKObject<ObjPkT>) => Promise<unknown>;
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    usedBy?: (item: any) => Promise<UsedBy[]>;
+
+    @property({ attribute: false })
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    delete!: (item: any) => Promise<any>;
 
     confirm(): Promise<void> {
         return Promise.all(
@@ -170,7 +185,11 @@ export class DeleteBulkForm<ObjPkT extends string | number> extends ModalButton
                 </form>
             </section>
             <section class="pf-c-page__main-section">
-                <ak-delete-objects-table .objects=${this.objects} .usedBy=${this.usedBy}>
+                <ak-delete-objects-table
+                    .objects=${this.objects}
+                    .usedBy=${this.usedBy}
+                    .metadata=${this.metadata}
+                >
                 </ak-delete-objects-table>
             </section>
             <footer class="pf-c-modal-box__footer">
diff --git a/web/src/elements/oauth/UserCodeList.ts b/web/src/elements/oauth/UserCodeList.ts
index e56b73c84..9a846697f 100644
--- a/web/src/elements/oauth/UserCodeList.ts
+++ b/web/src/elements/oauth/UserCodeList.ts
@@ -3,7 +3,7 @@ import { customElement, html, property, TemplateResult } from "lit-element";
 import { AKResponse } from "../../api/Client";
 import { Table, TableColumn } from "../table/Table";
 
-import "../forms/DeleteForm";
+import "../forms/DeleteBulkForm";
 import { PAGE_SIZE } from "../../constants";
 import { ExpiringBaseGrantModel, Oauth2Api } from "authentik-api";
 import { DEFAULT_CONFIG } from "../../api/Config";
@@ -34,17 +34,16 @@ export class UserOAuthCodeList extends Table<ExpiringBaseGrantModel> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Authorization Code`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Authorization Code(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: ExpiringBaseGrantModel) => {
                 return new Oauth2Api(DEFAULT_CONFIG).oauth2AuthorizationCodesUsedByList({
                     id: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: ExpiringBaseGrantModel) => {
                 return new Oauth2Api(DEFAULT_CONFIG).oauth2AuthorizationCodesDestroy({
                     id: item.pk,
                 });
@@ -53,7 +52,7 @@ export class UserOAuthCodeList extends Table<ExpiringBaseGrantModel> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: ExpiringBaseGrantModel): TemplateResult[] {
diff --git a/web/src/elements/oauth/UserRefreshList.ts b/web/src/elements/oauth/UserRefreshList.ts
index 7e47b58b6..a0fae670b 100644
--- a/web/src/elements/oauth/UserRefreshList.ts
+++ b/web/src/elements/oauth/UserRefreshList.ts
@@ -4,9 +4,9 @@ import { AKResponse } from "../../api/Client";
 import { Table, TableColumn } from "../table/Table";
 import PFFlex from "@patternfly/patternfly/layouts/Flex/flex.css";
 
-import "../forms/DeleteForm";
+import "../forms/DeleteBulkForm";
 import { PAGE_SIZE } from "../../constants";
-import { RefreshTokenModel, Oauth2Api } from "authentik-api";
+import { RefreshTokenModel, Oauth2Api, ExpiringBaseGrantModel } from "authentik-api";
 import { DEFAULT_CONFIG } from "../../api/Config";
 
 @customElement("ak-user-oauth-refresh-list")
@@ -57,17 +57,16 @@ export class UserOAuthRefreshList extends Table<RefreshTokenModel> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Refresh Code`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Refresh Code(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: ExpiringBaseGrantModel) => {
                 return new Oauth2Api(DEFAULT_CONFIG).oauth2RefreshTokensUsedByList({
                     id: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: ExpiringBaseGrantModel) => {
                 return new Oauth2Api(DEFAULT_CONFIG).oauth2RefreshTokensDestroy({
                     id: item.pk,
                 });
@@ -76,7 +75,7 @@ export class UserOAuthRefreshList extends Table<RefreshTokenModel> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: RefreshTokenModel): TemplateResult[] {
diff --git a/web/src/elements/user/SessionList.ts b/web/src/elements/user/SessionList.ts
index e5e0d86c1..16b44545d 100644
--- a/web/src/elements/user/SessionList.ts
+++ b/web/src/elements/user/SessionList.ts
@@ -3,7 +3,7 @@ import { customElement, html, property, TemplateResult } from "lit-element";
 import { AKResponse } from "../../api/Client";
 import { Table, TableColumn } from "../table/Table";
 
-import "../forms/DeleteForm";
+import "../forms/DeleteBulkForm";
 import { PAGE_SIZE } from "../../constants";
 import { CoreApi, AuthenticatedSession } from "authentik-api";
 import { DEFAULT_CONFIG } from "../../api/Config";
@@ -35,26 +35,25 @@ export class AuthenticatedSessionList extends Table<AuthenticatedSession> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Session`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Session(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: AuthenticatedSession) => {
                 return new CoreApi(DEFAULT_CONFIG).coreAuthenticatedSessionsUsedByList({
                     uuid: item.uuid || "",
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: AuthenticatedSession) => {
                 return new CoreApi(DEFAULT_CONFIG).coreAuthenticatedSessionsDestroy({
                     uuid: item.uuid || "",
                 });
             }}
         >
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
-                ${t`Delete Session`}
+                ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: AuthenticatedSession): TemplateResult[] {
diff --git a/web/src/elements/user/UserConsentList.ts b/web/src/elements/user/UserConsentList.ts
index 82b624915..5a8a27ad1 100644
--- a/web/src/elements/user/UserConsentList.ts
+++ b/web/src/elements/user/UserConsentList.ts
@@ -3,7 +3,7 @@ import { customElement, html, property, TemplateResult } from "lit-element";
 import { AKResponse } from "../../api/Client";
 import { Table, TableColumn } from "../table/Table";
 
-import "../forms/DeleteForm";
+import "../forms/DeleteBulkForm";
 import { PAGE_SIZE } from "../../constants";
 import { CoreApi, UserConsent } from "authentik-api";
 import { DEFAULT_CONFIG } from "../../api/Config";
@@ -33,26 +33,25 @@ export class UserConsentList extends Table<UserConsent> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Consent`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Consent(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: UserConsent) => {
                 return new CoreApi(DEFAULT_CONFIG).coreUserConsentUsedByList({
                     id: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: UserConsent) => {
                 return new CoreApi(DEFAULT_CONFIG).coreUserConsentDestroy({
                     id: item.pk,
                 });
             }}
         >
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
-                ${t`Delete Consent`}
+                ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: UserConsent): TemplateResult[] {
diff --git a/web/src/locales/en.po b/web/src/locales/en.po
index 327a2bcb1..36dd86df3 100644
--- a/web/src/locales/en.po
+++ b/web/src/locales/en.po
@@ -284,7 +284,7 @@ msgstr ""
 msgid "Are you sure you want to delete {0} {1}?"
 msgstr "Are you sure you want to delete {0} {1}?"
 
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "Are you sure you want to delete {0} {objName} ?"
 msgstr "Are you sure you want to delete {0} {objName} ?"
 
@@ -487,7 +487,7 @@ msgstr "Browser"
 msgid "Build hash:"
 msgstr "Build hash:"
 
-#: 
+#:
 #~ msgid "Build hash: {0}"
 #~ msgstr "Build hash: {0}"
 
@@ -518,7 +518,7 @@ msgstr "Can be in the format of 'unix://' when connecting to a local docker daem
 
 #: src/elements/forms/ConfirmationForm.ts
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 #: src/elements/forms/ModalForm.ts
 #: src/pages/groups/MemberSelectModal.ts
 #: src/pages/users/GroupSelectModal.ts
@@ -1091,7 +1091,7 @@ msgid "Define how notifications are sent to users, like Email or Webhook."
 msgstr "Define how notifications are sent to users, like Email or Webhook."
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 #: src/elements/oauth/UserCodeList.ts
 #: src/elements/oauth/UserRefreshList.ts
 #: src/pages/applications/ApplicationListPage.ts
@@ -1119,7 +1119,7 @@ msgstr "Define how notifications are sent to users, like Email or Webhook."
 msgid "Delete"
 msgstr "Delete"
 
-#: 
+#:
 #~ msgid "Delete Authorization Code"
 #~ msgstr "Delete Authorization Code"
 
@@ -1132,7 +1132,7 @@ msgstr "Delete Binding"
 msgid "Delete Consent"
 msgstr "Delete Consent"
 
-#: 
+#:
 #~ msgid "Delete Refresh Code"
 #~ msgstr "Delete Refresh Code"
 
@@ -1165,7 +1165,7 @@ msgstr ""
 "confirmation. Use a consent stage to ensure the user is aware of their actions."
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "Delete {0}"
 msgstr "Delete {0}"
 
@@ -1230,8 +1230,8 @@ msgstr "Digest algorithm"
 msgid "Digits"
 msgstr "Digits"
 
-#: 
-#: 
+#:
+#:
 #~ msgid "Disable"
 #~ msgstr "Disable"
 
@@ -1382,8 +1382,8 @@ msgstr "Email: Text field with Email type."
 msgid "Embedded outpost is not configured correctly."
 msgstr "Embedded outpost is not configured correctly."
 
-#: 
-#: 
+#:
+#:
 #~ msgid "Enable"
 #~ msgstr "Enable"
 
@@ -1607,7 +1607,7 @@ msgid "Failed to delete policy cache"
 msgstr "Failed to delete policy cache"
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "Failed to delete {0}: {1}"
 msgstr "Failed to delete {0}: {1}"
 
@@ -2702,7 +2702,7 @@ msgstr "Only fail the policy, don't invalidate user's password."
 msgid "Only send notification once, for example when sending a webhook into a chat channel."
 msgstr "Only send notification once, for example when sending a webhook into a chat channel."
 
-#: 
+#:
 #~ msgid "Open application"
 #~ msgstr "Open application"
 
@@ -2779,7 +2779,7 @@ msgstr "Outpost"
 msgid "Outpost Deployment Info"
 msgstr "Outpost Deployment Info"
 
-#: 
+#:
 #~ msgid "Outpost Service-connection"
 #~ msgstr "Outpost Service-connection"
 
@@ -3419,7 +3419,7 @@ msgstr "Select which transports should be used to notify the user. If none are s
 msgid "Selected policies are executed when the stage is submitted to validate the data."
 msgstr "Selected policies are executed when the stage is submitted to validate the data."
 
-#: 
+#:
 #~ msgid "Selecting a service-connection enables the management of the outpost by authentik."
 #~ msgstr "Selecting a service-connection enables the management of the outpost by authentik."
 
@@ -3476,7 +3476,7 @@ msgstr "Server name for which this provider's certificate is valid for."
 msgid "Server validation of credential failed: {err}"
 msgstr "Server validation of credential failed: {err}"
 
-#: 
+#:
 #~ msgid "Service Connections"
 #~ msgstr "Service Connections"
 
@@ -3484,8 +3484,8 @@ msgstr "Server validation of credential failed: {err}"
 msgid "Service Provider Binding"
 msgstr "Service Provider Binding"
 
-#: 
-#: 
+#:
+#:
 #~ msgid "Service connection"
 #~ msgstr "Service connection"
 
@@ -3804,8 +3804,8 @@ msgstr "Successfully created provider."
 msgid "Successfully created rule."
 msgstr "Successfully created rule."
 
-#: 
-#: 
+#:
+#:
 #~ msgid "Successfully created service-connection."
 #~ msgstr "Successfully created service-connection."
 
@@ -3854,7 +3854,7 @@ msgid "Successfully created user."
 msgstr "Successfully created user."
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "Successfully deleted {0} {1}"
 msgstr "Successfully deleted {0} {1}"
 
@@ -3958,8 +3958,8 @@ msgstr "Successfully updated provider."
 msgid "Successfully updated rule."
 msgstr "Successfully updated rule."
 
-#: 
-#: 
+#:
+#:
 #~ msgid "Successfully updated service-connection."
 #~ msgstr "Successfully updated service-connection."
 
@@ -4151,7 +4151,7 @@ msgstr "The external URL you'll authenticate at. Can be the same domain as authe
 msgid "The following objects use {0}:"
 msgstr "The following objects use {0}:"
 
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "The following objects use {objName}"
 msgstr "The following objects use {objName}"
 
@@ -4396,7 +4396,7 @@ msgstr "Unhealthy outposts"
 msgid "Unknown"
 msgstr "Unknown"
 
-#: 
+#:
 #~ msgid "Unmanaged"
 #~ msgstr "Unmanaged"
 
@@ -4924,7 +4924,7 @@ msgstr "authentik Builtin Database"
 msgid "authentik LDAP Backend"
 msgstr "authentik LDAP Backend"
 
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "connecting object will be deleted"
 msgstr "connecting object will be deleted"
 
@@ -4937,17 +4937,17 @@ msgid "no tabs defined"
 msgstr "no tabs defined"
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "object will be DELETED"
 msgstr "object will be DELETED"
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "reference will be reset to default value"
 msgstr "reference will be reset to default value"
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "reference will be set to an empty value"
 msgstr "reference will be set to an empty value"
 
@@ -4965,7 +4965,7 @@ msgid "{0} ({1})"
 msgstr "{0} ({1})"
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "{0} ({consequence})"
 msgstr "{0} ({consequence})"
 
diff --git a/web/src/locales/pseudo-LOCALE.po b/web/src/locales/pseudo-LOCALE.po
index c49543e06..bb474cebf 100644
--- a/web/src/locales/pseudo-LOCALE.po
+++ b/web/src/locales/pseudo-LOCALE.po
@@ -280,7 +280,7 @@ msgstr ""
 msgid "Are you sure you want to delete {0} {1}?"
 msgstr ""
 
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "Are you sure you want to delete {0} {objName} ?"
 msgstr ""
 
@@ -483,7 +483,7 @@ msgstr ""
 msgid "Build hash:"
 msgstr ""
 
-#: 
+#:
 #~ msgid "Build hash: {0}"
 #~ msgstr ""
 
@@ -514,7 +514,7 @@ msgstr ""
 
 #: src/elements/forms/ConfirmationForm.ts
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 #: src/elements/forms/ModalForm.ts
 #: src/pages/groups/MemberSelectModal.ts
 #: src/pages/users/GroupSelectModal.ts
@@ -1085,7 +1085,7 @@ msgid "Define how notifications are sent to users, like Email or Webhook."
 msgstr ""
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 #: src/elements/oauth/UserCodeList.ts
 #: src/elements/oauth/UserRefreshList.ts
 #: src/pages/applications/ApplicationListPage.ts
@@ -1113,7 +1113,7 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-#: 
+#:
 #~ msgid "Delete Authorization Code"
 #~ msgstr ""
 
@@ -1126,7 +1126,7 @@ msgstr ""
 msgid "Delete Consent"
 msgstr ""
 
-#: 
+#:
 #~ msgid "Delete Refresh Code"
 #~ msgstr ""
 
@@ -1157,7 +1157,7 @@ msgid ""
 msgstr ""
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "Delete {0}"
 msgstr ""
 
@@ -1222,8 +1222,8 @@ msgstr ""
 msgid "Digits"
 msgstr ""
 
-#: 
-#: 
+#:
+#:
 #~ msgid "Disable"
 #~ msgstr ""
 
@@ -1374,8 +1374,8 @@ msgstr ""
 msgid "Embedded outpost is not configured correctly."
 msgstr ""
 
-#: 
-#: 
+#:
+#:
 #~ msgid "Enable"
 #~ msgstr ""
 
@@ -1599,7 +1599,7 @@ msgid "Failed to delete policy cache"
 msgstr ""
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "Failed to delete {0}: {1}"
 msgstr ""
 
@@ -2694,7 +2694,7 @@ msgstr ""
 msgid "Only send notification once, for example when sending a webhook into a chat channel."
 msgstr ""
 
-#: 
+#:
 #~ msgid "Open application"
 #~ msgstr ""
 
@@ -2771,7 +2771,7 @@ msgstr ""
 msgid "Outpost Deployment Info"
 msgstr ""
 
-#: 
+#:
 #~ msgid "Outpost Service-connection"
 #~ msgstr ""
 
@@ -3411,7 +3411,7 @@ msgstr ""
 msgid "Selected policies are executed when the stage is submitted to validate the data."
 msgstr ""
 
-#: 
+#:
 #~ msgid "Selecting a service-connection enables the management of the outpost by authentik."
 #~ msgstr ""
 
@@ -3468,7 +3468,7 @@ msgstr ""
 msgid "Server validation of credential failed: {err}"
 msgstr ""
 
-#: 
+#:
 #~ msgid "Service Connections"
 #~ msgstr ""
 
@@ -3476,8 +3476,8 @@ msgstr ""
 msgid "Service Provider Binding"
 msgstr ""
 
-#: 
-#: 
+#:
+#:
 #~ msgid "Service connection"
 #~ msgstr ""
 
@@ -3796,8 +3796,8 @@ msgstr ""
 msgid "Successfully created rule."
 msgstr ""
 
-#: 
-#: 
+#:
+#:
 #~ msgid "Successfully created service-connection."
 #~ msgstr ""
 
@@ -3846,7 +3846,7 @@ msgid "Successfully created user."
 msgstr ""
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "Successfully deleted {0} {1}"
 msgstr ""
 
@@ -3950,8 +3950,8 @@ msgstr ""
 msgid "Successfully updated rule."
 msgstr ""
 
-#: 
-#: 
+#:
+#:
 #~ msgid "Successfully updated service-connection."
 #~ msgstr ""
 
@@ -4143,7 +4143,7 @@ msgstr ""
 msgid "The following objects use {0}:"
 msgstr ""
 
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "The following objects use {objName}"
 msgstr ""
 
@@ -4381,7 +4381,7 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: 
+#:
 #~ msgid "Unmanaged"
 #~ msgstr ""
 
@@ -4907,7 +4907,7 @@ msgstr ""
 msgid "authentik LDAP Backend"
 msgstr ""
 
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "connecting object will be deleted"
 msgstr ""
 
@@ -4920,17 +4920,17 @@ msgid "no tabs defined"
 msgstr ""
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "object will be DELETED"
 msgstr ""
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "reference will be reset to default value"
 msgstr ""
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "reference will be set to an empty value"
 msgstr ""
 
@@ -4948,7 +4948,7 @@ msgid "{0} ({1})"
 msgstr ""
 
 #: src/elements/forms/DeleteBulkForm.ts
-#: src/elements/forms/DeleteForm.ts
+#: src/elements/forms/DeleteBulkForm.ts
 msgid "{0} ({consequence})"
 msgstr ""
 
diff --git a/web/src/pages/applications/ApplicationListPage.ts b/web/src/pages/applications/ApplicationListPage.ts
index 06c90867c..aec042ae9 100644
--- a/web/src/pages/applications/ApplicationListPage.ts
+++ b/web/src/pages/applications/ApplicationListPage.ts
@@ -5,7 +5,7 @@ import { AKResponse } from "../../api/Client";
 import { TablePage } from "../../elements/table/TablePage";
 
 import "../../elements/forms/ModalForm";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/buttons/SpinnerButton";
 import { TableColumn } from "../../elements/table/Table";
 import { PAGE_SIZE } from "../../constants";
@@ -69,17 +69,16 @@ export class ApplicationListPage extends TablePage<Application> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Application`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Application(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Application) => {
                 return new CoreApi(DEFAULT_CONFIG).coreApplicationsUsedByList({
                     slug: item.slug,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Application) => {
                 return new CoreApi(DEFAULT_CONFIG).coreApplicationsDestroy({
                     slug: item.slug,
                 });
@@ -88,7 +87,7 @@ export class ApplicationListPage extends TablePage<Application> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: Application): TemplateResult[] {
diff --git a/web/src/pages/crypto/CertificateKeyPairListPage.ts b/web/src/pages/crypto/CertificateKeyPairListPage.ts
index dcc77953b..e24189b2e 100644
--- a/web/src/pages/crypto/CertificateKeyPairListPage.ts
+++ b/web/src/pages/crypto/CertificateKeyPairListPage.ts
@@ -8,7 +8,7 @@ import { CryptoApi, CertificateKeyPair } from "authentik-api";
 
 import "../../elements/forms/ModalForm";
 import "../../elements/buttons/SpinnerButton";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "./CertificateKeyPairForm";
 import "./CertificateGenerateForm";
 import { TableColumn } from "../../elements/table/Table";
@@ -59,17 +59,22 @@ export class CertificateKeyPairListPage extends TablePage<CertificateKeyPair> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Certificate-Key Pair`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Certificate-Key Pair(s)`}
+            .objects=${this.selectedElements}
+            .metadata=${(item: CertificateKeyPair) => {
+                return [
+                    { key: t`Name`, value: item.name },
+                    { key: t`Expiry`, value: item.certExpiry.toLocaleString() },
+                ];
+            }}
+            .usedBy=${(item: CertificateKeyPair) => {
                 return new CryptoApi(DEFAULT_CONFIG).cryptoCertificatekeypairsUsedByList({
                     kpUuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: CertificateKeyPair) => {
                 return new CryptoApi(DEFAULT_CONFIG).cryptoCertificatekeypairsDestroy({
                     kpUuid: item.pk,
                 });
@@ -78,7 +83,7 @@ export class CertificateKeyPairListPage extends TablePage<CertificateKeyPair> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: CertificateKeyPair): TemplateResult[] {
diff --git a/web/src/pages/events/RuleListPage.ts b/web/src/pages/events/RuleListPage.ts
index 05f838527..e3bacb7bb 100644
--- a/web/src/pages/events/RuleListPage.ts
+++ b/web/src/pages/events/RuleListPage.ts
@@ -10,7 +10,7 @@ import { TableColumn } from "../../elements/table/Table";
 import { PAGE_SIZE } from "../../constants";
 import { EventsApi, NotificationRule } from "authentik-api";
 import { DEFAULT_CONFIG } from "../../api/Config";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "./RuleForm";
 
 @customElement("ak-event-rule-list")
@@ -53,17 +53,16 @@ export class RuleListPage extends TablePage<NotificationRule> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Notification rule`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Notification rule(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: NotificationRule) => {
                 return new EventsApi(DEFAULT_CONFIG).eventsRulesUsedByList({
                     pbmUuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: NotificationRule) => {
                 return new EventsApi(DEFAULT_CONFIG).eventsRulesDestroy({
                     pbmUuid: item.pk,
                 });
@@ -72,7 +71,7 @@ export class RuleListPage extends TablePage<NotificationRule> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: NotificationRule): TemplateResult[] {
diff --git a/web/src/pages/events/TransportListPage.ts b/web/src/pages/events/TransportListPage.ts
index 68bfa74c1..cc6fba751 100644
--- a/web/src/pages/events/TransportListPage.ts
+++ b/web/src/pages/events/TransportListPage.ts
@@ -10,7 +10,7 @@ import { TableColumn } from "../../elements/table/Table";
 import { PAGE_SIZE } from "../../constants";
 import { EventsApi, NotificationTransport } from "authentik-api";
 import { DEFAULT_CONFIG } from "../../api/Config";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "./TransportForm";
 
 @customElement("ak-event-transport-list")
@@ -51,17 +51,16 @@ export class TransportListPage extends TablePage<NotificationTransport> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Notifications Transport`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Notification transports(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: NotificationTransport) => {
                 return new EventsApi(DEFAULT_CONFIG).eventsTransportsUsedByList({
                     uuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: NotificationTransport) => {
                 return new EventsApi(DEFAULT_CONFIG).eventsTransportsDestroy({
                     uuid: item.pk,
                 });
@@ -70,7 +69,7 @@ export class TransportListPage extends TablePage<NotificationTransport> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: NotificationTransport): TemplateResult[] {
diff --git a/web/src/pages/flows/BoundStagesList.ts b/web/src/pages/flows/BoundStagesList.ts
index 266256e92..35553e476 100644
--- a/web/src/pages/flows/BoundStagesList.ts
+++ b/web/src/pages/flows/BoundStagesList.ts
@@ -3,7 +3,7 @@ import { customElement, html, property, TemplateResult } from "lit-element";
 import { AKResponse } from "../../api/Client";
 import { Table, TableColumn } from "../../elements/table/Table";
 
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/forms/ModalForm";
 import "../../elements/forms/ProxyForm";
 import "./StageBindingForm";
@@ -44,26 +44,25 @@ export class BoundStagesList extends Table<FlowStageBinding> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Stage binding`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Stage binding(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: FlowStageBinding) => {
                 return new FlowsApi(DEFAULT_CONFIG).flowsBindingsUsedByList({
                     fsbUuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: FlowStageBinding) => {
                 return new FlowsApi(DEFAULT_CONFIG).flowsBindingsDestroy({
                     fsbUuid: item.pk,
                 });
             }}
         >
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
-                ${t`Delete Binding`}
+                ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: FlowStageBinding): TemplateResult[] {
diff --git a/web/src/pages/flows/FlowListPage.ts b/web/src/pages/flows/FlowListPage.ts
index ee494abdf..2c7b75415 100644
--- a/web/src/pages/flows/FlowListPage.ts
+++ b/web/src/pages/flows/FlowListPage.ts
@@ -4,7 +4,7 @@ import { AKResponse } from "../../api/Client";
 import { TablePage } from "../../elements/table/TablePage";
 
 import "../../elements/buttons/SpinnerButton";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/forms/ModalForm";
 import "../../elements/forms/ConfirmationForm";
 import "./FlowForm";
@@ -55,17 +55,16 @@ export class FlowListPage extends TablePage<Flow> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Flow`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Flow(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Flow) => {
                 return new FlowsApi(DEFAULT_CONFIG).flowsInstancesUsedByList({
                     slug: item.slug,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Flow) => {
                 return new FlowsApi(DEFAULT_CONFIG).flowsInstancesDestroy({
                     slug: item.slug,
                 });
@@ -74,7 +73,7 @@ export class FlowListPage extends TablePage<Flow> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: Flow): TemplateResult[] {
diff --git a/web/src/pages/groups/GroupListPage.ts b/web/src/pages/groups/GroupListPage.ts
index 7b23abfb4..662811895 100644
--- a/web/src/pages/groups/GroupListPage.ts
+++ b/web/src/pages/groups/GroupListPage.ts
@@ -3,7 +3,7 @@ import { customElement, html, property, TemplateResult } from "lit-element";
 import { AKResponse } from "../../api/Client";
 import { TablePage } from "../../elements/table/TablePage";
 
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/buttons/SpinnerButton";
 import { TableColumn } from "../../elements/table/Table";
 import { PAGE_SIZE } from "../../constants";
@@ -51,17 +51,16 @@ export class GroupListPage extends TablePage<Group> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Group`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Group(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Group) => {
                 return new CoreApi(DEFAULT_CONFIG).coreGroupsUsedByList({
                     groupUuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Group) => {
                 return new CoreApi(DEFAULT_CONFIG).coreGroupsDestroy({
                     groupUuid: item.pk,
                 });
@@ -70,7 +69,7 @@ export class GroupListPage extends TablePage<Group> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: Group): TemplateResult[] {
diff --git a/web/src/pages/outposts/OutpostListPage.ts b/web/src/pages/outposts/OutpostListPage.ts
index 550a207c7..486f428ab 100644
--- a/web/src/pages/outposts/OutpostListPage.ts
+++ b/web/src/pages/outposts/OutpostListPage.ts
@@ -12,7 +12,7 @@ import "./OutpostForm";
 import "./OutpostDeploymentModal";
 import "../../elements/buttons/SpinnerButton";
 import "../../elements/forms/ModalForm";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import { PAGE_SIZE } from "../../constants";
 import { Outpost, OutpostsApi } from "authentik-api";
 import { DEFAULT_CONFIG } from "../../api/Config";
@@ -139,17 +139,16 @@ export class OutpostListPage extends TablePage<Outpost> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Outpost`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Outpost(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Outpost) => {
                 return new OutpostsApi(DEFAULT_CONFIG).outpostsInstancesUsedByList({
                     uuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Outpost) => {
                 return new OutpostsApi(DEFAULT_CONFIG).outpostsInstancesDestroy({
                     uuid: item.pk,
                 });
@@ -158,7 +157,7 @@ export class OutpostListPage extends TablePage<Outpost> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     renderToolbar(): TemplateResult {
diff --git a/web/src/pages/outposts/ServiceConnectionListPage.ts b/web/src/pages/outposts/ServiceConnectionListPage.ts
index bf3cb83f1..8859330c1 100644
--- a/web/src/pages/outposts/ServiceConnectionListPage.ts
+++ b/web/src/pages/outposts/ServiceConnectionListPage.ts
@@ -8,7 +8,7 @@ import { TablePage } from "../../elements/table/TablePage";
 import "./OutpostHealth";
 import "../../elements/buttons/SpinnerButton";
 import "../../elements/buttons/Dropdown";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/forms/ModalForm";
 import "./ServiceConnectionKubernetesForm";
 import "./ServiceConnectionDockerForm";
@@ -102,17 +102,16 @@ export class OutpostServiceConnectionListPage extends TablePage<ServiceConnectio
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Outpost integration`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Outpost integration(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: ServiceConnection) => {
                 return new OutpostsApi(DEFAULT_CONFIG).outpostsServiceConnectionsAllUsedByList({
                     uuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: ServiceConnection) => {
                 return new OutpostsApi(DEFAULT_CONFIG).outpostsServiceConnectionsAllDestroy({
                     uuid: item.pk,
                 });
@@ -121,7 +120,7 @@ export class OutpostServiceConnectionListPage extends TablePage<ServiceConnectio
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     renderToolbar(): TemplateResult {
diff --git a/web/src/pages/policies/BoundPoliciesList.ts b/web/src/pages/policies/BoundPoliciesList.ts
index a18ff347e..5a435b76d 100644
--- a/web/src/pages/policies/BoundPoliciesList.ts
+++ b/web/src/pages/policies/BoundPoliciesList.ts
@@ -4,7 +4,7 @@ import { AKResponse } from "../../api/Client";
 import { Table, TableColumn } from "../../elements/table/Table";
 import { PoliciesApi, PolicyBinding } from "authentik-api";
 
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/Tabs";
 import "../../elements/forms/ProxyForm";
 import "../../elements/buttons/SpinnerButton";
@@ -96,26 +96,25 @@ export class BoundPoliciesList extends Table<PolicyBinding> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Policy binding`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Policy binding(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: PolicyBinding) => {
                 return new PoliciesApi(DEFAULT_CONFIG).policiesBindingsUsedByList({
                     policyBindingUuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: PolicyBinding) => {
                 return new PoliciesApi(DEFAULT_CONFIG).policiesBindingsDestroy({
                     policyBindingUuid: item.pk,
                 });
             }}
         >
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
-                ${t`Delete Binding`}
+                ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: PolicyBinding): TemplateResult[] {
diff --git a/web/src/pages/policies/PolicyListPage.ts b/web/src/pages/policies/PolicyListPage.ts
index 2ddcb5aaf..9723fdd9d 100644
--- a/web/src/pages/policies/PolicyListPage.ts
+++ b/web/src/pages/policies/PolicyListPage.ts
@@ -5,7 +5,7 @@ import { TablePage } from "../../elements/table/TablePage";
 
 import "../../elements/buttons/Dropdown";
 import "../../elements/buttons/SpinnerButton";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/forms/ModalForm";
 import "../../elements/forms/ProxyForm";
 import "../../elements/forms/ConfirmationForm";
@@ -99,31 +99,25 @@ export class PolicyListPage extends TablePage<Policy> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Policy`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Policy / Policies`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Policy) => {
                 return new PoliciesApi(DEFAULT_CONFIG).policiesAllUsedByList({
                     policyUuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Policy) => {
                 return new PoliciesApi(DEFAULT_CONFIG).policiesAllDestroy({
                     policyUuid: item.pk,
                 });
             }}
         >
-            <button
-                ?disabled=${disabled}
-                slot="trigger"
-                type="button"
-                class="pf-c-button pf-m-danger ${disabled && "pf-m-disabled"}"
-            >
+            <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     renderToolbar(): TemplateResult {
diff --git a/web/src/pages/policies/reputation/IPReputationListPage.ts b/web/src/pages/policies/reputation/IPReputationListPage.ts
index 5ba49244d..16cb45e65 100644
--- a/web/src/pages/policies/reputation/IPReputationListPage.ts
+++ b/web/src/pages/policies/reputation/IPReputationListPage.ts
@@ -5,7 +5,7 @@ import { TablePage } from "../../../elements/table/TablePage";
 
 import "../../../elements/buttons/ModalButton";
 import "../../../elements/buttons/SpinnerButton";
-import "../../../elements/forms/DeleteForm";
+import "../../../elements/forms/DeleteBulkForm";
 import "../../../elements/forms/ModalForm";
 import { TableColumn } from "../../../elements/table/Table";
 import { PAGE_SIZE } from "../../../constants";
@@ -50,17 +50,16 @@ export class IPReputationListPage extends TablePage<IPReputation> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
             objectLabel=${t`IP Reputation`}
-            .usedBy=${() => {
+            .objects=${this.selectedElements}
+            .usedBy=${(item: IPReputation) => {
                 return new PoliciesApi(DEFAULT_CONFIG).policiesReputationIpsUsedByList({
                     id: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: IPReputation) => {
                 return new PoliciesApi(DEFAULT_CONFIG).policiesReputationIpsDestroy({
                     id: item.pk,
                 });
@@ -69,7 +68,7 @@ export class IPReputationListPage extends TablePage<IPReputation> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: IPReputation): TemplateResult[] {
diff --git a/web/src/pages/policies/reputation/UserReputationListPage.ts b/web/src/pages/policies/reputation/UserReputationListPage.ts
index e3545116f..f2e972a0f 100644
--- a/web/src/pages/policies/reputation/UserReputationListPage.ts
+++ b/web/src/pages/policies/reputation/UserReputationListPage.ts
@@ -5,7 +5,7 @@ import { TablePage } from "../../../elements/table/TablePage";
 
 import "../../../elements/buttons/ModalButton";
 import "../../../elements/buttons/SpinnerButton";
-import "../../../elements/forms/DeleteForm";
+import "../../../elements/forms/DeleteBulkForm";
 import "../../../elements/forms/ModalForm";
 import { TableColumn } from "../../../elements/table/Table";
 import { PAGE_SIZE } from "../../../constants";
@@ -46,17 +46,16 @@ export class UserReputationListPage extends TablePage<UserReputation> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
             objectLabel=${t`User Reputation`}
-            .usedBy=${() => {
+            .objects=${this.selectedElements}
+            .usedBy=${(item: UserReputation) => {
                 return new PoliciesApi(DEFAULT_CONFIG).policiesReputationUsersUsedByList({
                     id: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: UserReputation) => {
                 return new PoliciesApi(DEFAULT_CONFIG).policiesReputationUsersDestroy({
                     id: item.pk,
                 });
@@ -65,7 +64,7 @@ export class UserReputationListPage extends TablePage<UserReputation> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: UserReputation): TemplateResult[] {
diff --git a/web/src/pages/property-mappings/PropertyMappingListPage.ts b/web/src/pages/property-mappings/PropertyMappingListPage.ts
index e5d4eb634..494198fbb 100644
--- a/web/src/pages/property-mappings/PropertyMappingListPage.ts
+++ b/web/src/pages/property-mappings/PropertyMappingListPage.ts
@@ -5,7 +5,7 @@ import { TablePage } from "../../elements/table/TablePage";
 
 import "../../elements/buttons/Dropdown";
 import "../../elements/buttons/SpinnerButton";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/forms/ModalForm";
 import "../../elements/forms/ProxyForm";
 import "./PropertyMappingTestForm";
@@ -61,17 +61,16 @@ export class PropertyMappingListPage extends TablePage<PropertyMapping> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html` <ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Property Mapping`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Property Mapping(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: PropertyMapping) => {
                 return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsAllUsedByList({
                     pmUuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: PropertyMapping) => {
                 return new PropertymappingsApi(DEFAULT_CONFIG).propertymappingsAllDestroy({
                     pmUuid: item.pk,
                 });
@@ -80,7 +79,7 @@ export class PropertyMappingListPage extends TablePage<PropertyMapping> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: PropertyMapping): TemplateResult[] {
diff --git a/web/src/pages/providers/ProviderListPage.ts b/web/src/pages/providers/ProviderListPage.ts
index fd0ce353d..beb461172 100644
--- a/web/src/pages/providers/ProviderListPage.ts
+++ b/web/src/pages/providers/ProviderListPage.ts
@@ -5,7 +5,7 @@ import { TablePage } from "../../elements/table/TablePage";
 
 import "../../elements/buttons/SpinnerButton";
 import "../../elements/buttons/Dropdown";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/forms/ModalForm";
 import "../../elements/forms/ProxyForm";
 import "./ldap/LDAPProviderForm";
@@ -59,17 +59,16 @@ export class ProviderListPage extends TablePage<Provider> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Provider`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Provider(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Provider) => {
                 return new ProvidersApi(DEFAULT_CONFIG).providersAllUsedByList({
                     id: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Provider) => {
                 return new ProvidersApi(DEFAULT_CONFIG).providersAllDestroy({
                     id: item.pk,
                 });
@@ -78,7 +77,7 @@ export class ProviderListPage extends TablePage<Provider> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: Provider): TemplateResult[] {
diff --git a/web/src/pages/sources/SourcesListPage.ts b/web/src/pages/sources/SourcesListPage.ts
index a2b6ed80f..d952fe0bf 100644
--- a/web/src/pages/sources/SourcesListPage.ts
+++ b/web/src/pages/sources/SourcesListPage.ts
@@ -6,7 +6,7 @@ import { TablePage } from "../../elements/table/TablePage";
 
 import "../../elements/buttons/SpinnerButton";
 import "../../elements/buttons/Dropdown";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/forms/ModalForm";
 import "../../elements/forms/ProxyForm";
 import { until } from "lit-html/directives/until";
@@ -53,17 +53,16 @@ export class SourceListPage extends TablePage<Source> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Source`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Source(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Source) => {
                 return new SourcesApi(DEFAULT_CONFIG).sourcesAllUsedByList({
                     slug: item.slug,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Source) => {
                 return new SourcesApi(DEFAULT_CONFIG).sourcesAllDestroy({
                     slug: item.slug,
                 });
@@ -72,7 +71,7 @@ export class SourceListPage extends TablePage<Source> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: Source): TemplateResult[] {
diff --git a/web/src/pages/stages/StageListPage.ts b/web/src/pages/stages/StageListPage.ts
index 50a76cf9a..560c432af 100644
--- a/web/src/pages/stages/StageListPage.ts
+++ b/web/src/pages/stages/StageListPage.ts
@@ -6,7 +6,7 @@ import { TablePage } from "../../elements/table/TablePage";
 
 import "../../elements/buttons/SpinnerButton";
 import "../../elements/buttons/Dropdown";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/forms/ProxyForm";
 import "../../elements/forms/ModalForm";
 import { until } from "lit-html/directives/until";
@@ -72,17 +72,16 @@ export class StageListPage extends TablePage<Stage> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${item?.verboseName}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Stage(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Stage) => {
                 return new StagesApi(DEFAULT_CONFIG).stagesAllUsedByList({
                     stageUuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Stage) => {
                 return new StagesApi(DEFAULT_CONFIG).stagesAllDestroy({
                     stageUuid: item.pk,
                 });
@@ -91,7 +90,7 @@ export class StageListPage extends TablePage<Stage> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: Stage): TemplateResult[] {
diff --git a/web/src/pages/stages/invitation/InvitationListPage.ts b/web/src/pages/stages/invitation/InvitationListPage.ts
index 1fbf8e9a0..427bd42b6 100644
--- a/web/src/pages/stages/invitation/InvitationListPage.ts
+++ b/web/src/pages/stages/invitation/InvitationListPage.ts
@@ -5,7 +5,7 @@ import { TablePage } from "../../../elements/table/TablePage";
 
 import "../../../elements/buttons/ModalButton";
 import "../../../elements/buttons/SpinnerButton";
-import "../../../elements/forms/DeleteForm";
+import "../../../elements/forms/DeleteBulkForm";
 import "../../../elements/forms/ModalForm";
 import "./InvitationForm";
 import "./InvitationListLink";
@@ -54,17 +54,16 @@ export class InvitationListPage extends TablePage<Invitation> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Invitation`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Invitation(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Invitation) => {
                 return new StagesApi(DEFAULT_CONFIG).stagesInvitationInvitationsUsedByList({
                     inviteUuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Invitation) => {
                 return new StagesApi(DEFAULT_CONFIG).stagesInvitationInvitationsDestroy({
                     inviteUuid: item.pk,
                 });
@@ -73,7 +72,7 @@ export class InvitationListPage extends TablePage<Invitation> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: Invitation): TemplateResult[] {
diff --git a/web/src/pages/stages/prompt/PromptListPage.ts b/web/src/pages/stages/prompt/PromptListPage.ts
index abe2f0400..0d9110b99 100644
--- a/web/src/pages/stages/prompt/PromptListPage.ts
+++ b/web/src/pages/stages/prompt/PromptListPage.ts
@@ -5,7 +5,7 @@ import { TablePage } from "../../../elements/table/TablePage";
 
 import "../../../elements/buttons/ModalButton";
 import "../../../elements/buttons/SpinnerButton";
-import "../../../elements/forms/DeleteForm";
+import "../../../elements/forms/DeleteBulkForm";
 import "../../../elements/forms/ModalForm";
 import "./PromptForm";
 import { TableColumn } from "../../../elements/table/Table";
@@ -54,17 +54,16 @@ export class PromptListPage extends TablePage<Prompt> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Prompt`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Prompt(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Prompt) => {
                 return new StagesApi(DEFAULT_CONFIG).stagesPromptPromptsUsedByList({
                     promptUuid: item.pk,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Prompt) => {
                 return new StagesApi(DEFAULT_CONFIG).stagesPromptPromptsDestroy({
                     promptUuid: item.pk,
                 });
@@ -73,7 +72,7 @@ export class PromptListPage extends TablePage<Prompt> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: Prompt): TemplateResult[] {
diff --git a/web/src/pages/tenants/TenantListPage.ts b/web/src/pages/tenants/TenantListPage.ts
index bf1b5069e..720793b0b 100644
--- a/web/src/pages/tenants/TenantListPage.ts
+++ b/web/src/pages/tenants/TenantListPage.ts
@@ -3,7 +3,7 @@ import { customElement, html, property, TemplateResult } from "lit-element";
 import { AKResponse } from "../../api/Client";
 import { TablePage } from "../../elements/table/TablePage";
 
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import "../../elements/buttons/SpinnerButton";
 import { TableColumn } from "../../elements/table/Table";
 import { PAGE_SIZE } from "../../constants";
@@ -50,17 +50,16 @@ export class TenantListPage extends TablePage<Tenant> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Tenant`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Tenant(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Tenant) => {
                 return new CoreApi(DEFAULT_CONFIG).coreTenantsUsedByList({
                     tenantUuid: item.tenantUuid,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Tenant) => {
                 return new CoreApi(DEFAULT_CONFIG).coreTenantsDestroy({
                     tenantUuid: item.tenantUuid,
                 });
@@ -69,7 +68,7 @@ export class TenantListPage extends TablePage<Tenant> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: Tenant): TemplateResult[] {
diff --git a/web/src/pages/tokens/TokenListPage.ts b/web/src/pages/tokens/TokenListPage.ts
index 6277ab2ad..a2f77c3d2 100644
--- a/web/src/pages/tokens/TokenListPage.ts
+++ b/web/src/pages/tokens/TokenListPage.ts
@@ -5,7 +5,7 @@ import { TablePage } from "../../elements/table/TablePage";
 
 import "../../elements/buttons/Dropdown";
 import "../../elements/buttons/TokenCopyButton";
-import "../../elements/forms/DeleteForm";
+import "../../elements/forms/DeleteBulkForm";
 import { TableColumn } from "../../elements/table/Table";
 import { PAGE_SIZE } from "../../constants";
 import { CoreApi, Token } from "authentik-api";
@@ -51,17 +51,16 @@ export class TokenListPage extends TablePage<Token> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Token`}
-            .usedBy=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Token(s)`}
+            .objects=${this.selectedElements}
+            .usedBy=${(item: Token) => {
                 return new CoreApi(DEFAULT_CONFIG).coreTokensUsedByList({
                     identifier: item.identifier,
                 });
             }}
-            .delete=${() => {
+            .delete=${(item: Token) => {
                 return new CoreApi(DEFAULT_CONFIG).coreTokensDestroy({
                     identifier: item.identifier,
                 });
@@ -70,7 +69,7 @@ export class TokenListPage extends TablePage<Token> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: Token): TemplateResult[] {
diff --git a/web/src/pages/user-settings/tokens/UserTokenList.ts b/web/src/pages/user-settings/tokens/UserTokenList.ts
index 168876ce1..81bd4fc90 100644
--- a/web/src/pages/user-settings/tokens/UserTokenList.ts
+++ b/web/src/pages/user-settings/tokens/UserTokenList.ts
@@ -3,7 +3,7 @@ import { CSSResult, customElement, html, property, TemplateResult } from "lit-el
 import { AKResponse } from "../../../api/Client";
 import PFDescriptionList from "@patternfly/patternfly/components/DescriptionList/description-list.css";
 
-import "../../../elements/forms/DeleteForm";
+import "../../../elements/forms/DeleteBulkForm";
 import "../../../elements/forms/ModalForm";
 import "../../../elements/buttons/ModalButton";
 import "../../../elements/buttons/Dropdown";
@@ -96,12 +96,11 @@ export class UserTokenList extends Table<Token> {
     }
 
     renderToolbarSelected(): TemplateResult {
-        const disabled = this.selectedElements.length !== 1;
-        const item = this.selectedElements[0];
-        return html`<ak-forms-delete
-            .obj=${item}
-            objectLabel=${t`Token`}
-            .delete=${() => {
+        const disabled = this.selectedElements.length < 1;
+        return html`<ak-forms-delete-bulk
+            objectLabel=${t`Token(s)`}
+            .objects=${this.selectedElements}
+            .delete=${(item: Token) => {
                 return new CoreApi(DEFAULT_CONFIG).coreTokensDestroy({
                     identifier: item.identifier,
                 });
@@ -110,7 +109,7 @@ export class UserTokenList extends Table<Token> {
             <button ?disabled=${disabled} slot="trigger" class="pf-c-button pf-m-danger">
                 ${t`Delete`}
             </button>
-        </ak-forms-delete>`;
+        </ak-forms-delete-bulk>`;
     }
 
     row(item: Token): TemplateResult[] {
diff --git a/web/src/pages/users/UserListPage.ts b/web/src/pages/users/UserListPage.ts
index 5258d9eab..dfa31640c 100644
--- a/web/src/pages/users/UserListPage.ts
+++ b/web/src/pages/users/UserListPage.ts
@@ -75,14 +75,20 @@ export class UserListPage extends TablePage<User> {
         return html` <ak-forms-delete-bulk
             objectLabel=${t`User(s)`}
             .objects=${this.selectedElements}
-            .usedBy=${(itemPk: number) => {
+            .metadata=${(item: User) => {
+                return [
+                    { key: t`Username`, value: item.username },
+                    { key: t`ID`, value: item.pk.toString() },
+                ];
+            }}
+            .usedBy=${(item: User) => {
                 return new CoreApi(DEFAULT_CONFIG).coreUsersUsedByList({
-                    id: itemPk,
+                    id: item.pk,
                 });
             }}
-            .delete=${(itemPk: number) => {
+            .delete=${(item: User) => {
                 return new CoreApi(DEFAULT_CONFIG).coreUsersDestroy({
-                    id: itemPk,
+                    id: item.pk,
                 });
             }}
         >