diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
index 7ab16ac1136f5c2c420ca1d3d5f57139c5fc36d5..ecf771d40c7bba48bc9daec58248e853c3379181 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
@@ -38,6 +38,7 @@
                   <absence-reason-buttons
                     allow-empty
                     empty-value="present"
+                    :custom-absence-reasons="absenceReasons"
                     @input="handleMultipleAction"
                   />
                 </v-col>
@@ -51,6 +52,7 @@
         <component
           :is="itemComponent"
           :extra-marks="extraMarks"
+          :absence-reasons="absenceReasons"
           :documentation="item"
           :affected-query="lastQuery"
           :value="(selectedParticipations[item.id] ??= [])"
@@ -84,6 +86,7 @@ import AbsenceCreationDialog from "./absences/AbsenceCreationDialog.vue";
 import { extraMarks } from "../extra_marks/extra_marks.graphql";
 import DocumentationLoader from "./documentation/DocumentationLoader.vue";
 import sendToServerMixin from "./absences/sendToServerMixin";
+import { absenceReasons } from "./absences/absenceReasons.graphql";
 
 export default {
   name: "Coursebook",
@@ -153,6 +156,7 @@ export default {
       currentDate: "",
       hashUpdater: false,
       extraMarks: [],
+      absenceReasons: [],
       selectedParticipations: {},
     };
   },
@@ -161,6 +165,10 @@ export default {
       query: extraMarks,
       update: (data) => data.items,
     },
+    absenceReasons: {
+      query: absenceReasons,
+      update: (data) => data.items,
+    },
   },
   computed: {
     // Assertion: Should only fire on page load or selection change.
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue
index 1e092b4ee14c410f5f5a0f04cc8bec9e57c2a6c3..f639e731da82cd400c1d2b5cbba8dbc90da8d70e 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue
@@ -7,6 +7,8 @@
       <documentation-absences
         compact
         v-bind="$attrs"
+        :extra-marks="extraMarks"
+        :absence-reasons="absenceReasons"
         :dialog-activator="activator"
         :value="value"
         @input="$emit('input', $event)"
@@ -14,7 +16,12 @@
     </template>
     <!-- dialog view -> deactivate dialog -->
     <!-- cancel | save (through lesson-summary) -->
-    <documentation v-bind="$attrs" @close="popup = false" />
+    <documentation
+      v-bind="$attrs"
+      :extra-marks="extraMarks"
+      :absence-reasons="absenceReasons"
+      @close="popup = false"
+    />
   </mobile-fullscreen-dialog>
 </template>
 
@@ -40,6 +47,14 @@ export default {
       type: Array,
       required: true,
     },
+    extraMarks: {
+      type: Array,
+      required: true,
+    },
+    absenceReasons: {
+      type: Array,
+      required: true,
+    },
   },
 };
 </script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue
index d8f001d31df8c67833ab2c43f3aaefbf71b40e4d..7f96c23967989239d6440071ed1a6fc55d4d1052 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue
@@ -179,9 +179,9 @@ export default {
           <v-card-text>
             <absence-reason-group-select
               allow-empty
-              empty-value="present"
               :load-selected-chip="loading"
               :value="item.absenceReason?.id || 'present'"
+              :custom-absence-reasons="absenceReasons"
               @input="sendToServer([item], 'absenceReason', $event)"
             />
             <tardiness-field
@@ -212,6 +212,7 @@ export default {
           <absence-reason-buttons
             allow-empty
             empty-value="present"
+            :custom-absence-reasons="absenceReasons"
             @input="handleMultipleAction"
           />
         </div>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue
index 1c941b8dd3cb362232dd0c79080e5237d632c7c2..dd84e644a78059284cdc338b6cd899f96a36066c 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue
@@ -26,8 +26,8 @@ import AbsenceReasonGroupSelect from "aleksis.apps.kolego/components/AbsenceReas
                 v-if="participation.absenceReason && !compact"
                 class="full-width"
                 allow-empty
-                empty-value="present"
                 :load-selected-chip="loading"
+                :custom-absence-reasons="absenceReasons"
                 :value="participation.absenceReason?.id || 'present'"
                 @input="sendToServer([participation], 'absenceReason', $event)"
               />
@@ -35,8 +35,8 @@ import AbsenceReasonGroupSelect from "aleksis.apps.kolego/components/AbsenceReas
             <v-list-item-action v-if="participation.absenceReason && compact">
               <absence-reason-group-select
                 allow-empty
-                empty-value="present"
                 :load-selected-chip="loading"
+                :custom-absence-reasons="absenceReasons"
                 :value="participation.absenceReason?.id || 'present'"
                 @input="sendToServer([participation], 'absenceReason', $event)"
               />
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/absenceReasons.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/absences/absenceReasons.graphql
new file mode 100644
index 0000000000000000000000000000000000000000..2a651a968265d18fa4f35a6550970d14de26885e
--- /dev/null
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/absenceReasons.graphql
@@ -0,0 +1,11 @@
+query absenceReasons($orderBy: [String], $filters: JSONString) {
+  items: absenceReasons(orderBy: $orderBy, filters: $filters) {
+    id
+    shortName
+    name
+    colour
+    default
+    canEdit
+    canDelete
+  }
+}
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue
index a679830c89c0b3fd77a5d712efaea5931b24332c..177e886f5b7d8e73eb66299738366e9cb22f496a 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue
@@ -9,6 +9,7 @@
         v-bind="$attrs"
         :dialog-activator="activator"
         :extra-marks="extraMarks"
+        :absence-reasons="absenceReasons"
       />
     </template>
     <!-- dialog view -> deactivate dialog -->
@@ -16,6 +17,7 @@
     <documentation
       v-bind="$attrs"
       :extra-marks="extraMarks"
+      :absence-reasons="absenceReasons"
       @close="popup = false"
     />
   </mobile-fullscreen-dialog>
@@ -41,6 +43,10 @@ export default {
       type: Array,
       required: true,
     },
+    absenceReasons: {
+      type: Array,
+      required: true,
+    },
   },
 };
 </script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
index 35243ee3ca5e055c0d2fd5375fba614bbbd6e246..886803b433be0a1372cf2bd27620700b49d24f2f 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js
@@ -40,6 +40,13 @@ export default {
       type: Array,
       required: true,
     },
+    /**
+     * Once loaded list of absence reasons to avoid excessive network and database queries
+     */
+    absenceReasons: {
+      type: Array,
+      required: true,
+    },
   },
 
   computed: {
@@ -54,6 +61,7 @@ export default {
         dialogActivator: this.dialogActivator,
         affectedQuery: this.affectedQuery,
         extraMarks: this.extraMarks,
+        absenceReasons: this.absenceReasons,
       };
     },
   },