diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationDialog.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationDialog.vue
index 4a4195af85c474c90e24bc7b48974066d2eb37b7..6ea3a7e723c91e45aca01faf1af82991d84cfcbf 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationDialog.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationDialog.vue
@@ -41,6 +41,7 @@
       :persons="persons"
       :start-date="startDate"
       :end-date="endDate"
+      @loading="handleLoading"
     />
     </template>
     <template #actions>
@@ -74,6 +75,7 @@ import AbsenceCreationSummary from "./AbsenceCreationSummary.vue";
 import CreateButton from "aleksis.core/components/generic/buttons/CreateButton.vue";
 import CancelButton from "aleksis.core/components/generic/buttons/CancelButton.vue";
 import SaveButton from "aleksis.core/components/generic/buttons/SaveButton.vue";
+import loadingMixin from "aleksis.core/mixins/loadingMixin.js";
 import { createAbsences } from "./absenceCreation.graphql";
 
 export default {
@@ -86,11 +88,11 @@ export default {
     CancelButton,
     SaveButton,
   },
+  mixins: [loadingMixin],
   data() {
     return {
       popup: false,
       form: true,
-      loading: false,
       // TODO: All needed? Check if sensible defaults.
       persons: [],
       startDate: "",
@@ -105,6 +107,7 @@ export default {
       this.form = true;
     },
     confirm() {
+      this.handleLoading(true);
       this.$apollo.mutate( {
         mutation: createAbsences,
         variables: {
@@ -127,8 +130,10 @@ export default {
         .catch((error) => {
           popup = false;
           this.handleError(error);
+        })
+        .finally(() => {
+          this.handleLoading(false);
         });
-      // finally for loading
     },
   },
 };
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationSummary.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationSummary.vue
index b4e356275346b1b4ef52e92c62c082c8432994c7..52f74d51a81844c7434393f07125d2afe3e8b101 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationSummary.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationSummary.vue
@@ -11,7 +11,8 @@
     :elevated="false"
     disable-pagination
     hide-default-footer
-    >
+    @loading="handleLoading"
+  >
     <template #default="{ items }">
       <v-expansion-panels>
         <v-expansion-panel
@@ -67,6 +68,7 @@ import CRUDIterator from "aleksis.core/components/generic/CRUDIterator.vue";
 import SubjectChip from "aleksis.apps.cursus/components/SubjectChip.vue";
 import { lessonsForPersons } from "./absenceCreation.graphql";
 import { DateTime } from "luxon";
+import loadingMixin from "aleksis.core/mixins/loadingMixin.js";
 
 export default {
   name: "AbsenceCreationSummary",
@@ -74,6 +76,7 @@ export default {
     CRUDIterator,
     SubjectChip,
   },
+  mixins: [loadingMixin],
   props: {
     persons: {
       type: Array,