diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
index 0d769e9243184d36ce5089ab2879de17e3a0a8ad..c46a9fbc38ee14d94968b6ca5523751092140815 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue
@@ -19,7 +19,7 @@
         <v-card
           outlined
           class="full-width"
-          v-show="pageType === 'absences' && selectedParticipations.length"
+          v-show="pageType === 'absences' && combinedSelectedParticipations.length"
         >
           <v-card-text>
             <v-row align="center">
@@ -27,7 +27,7 @@
                 {{
                   $tc(
                     "alsijil.coursebook.absences.action_for_selected",
-                    selectedParticipations.length,
+                    combinedSelectedParticipations.length,
                   )
                 }}
               </v-col>
@@ -49,8 +49,8 @@
         :is="itemComponent"
         :documentation="item"
         :affectedQuery="lastQuery"
-        @select="addSelectedParticipation"
-        @deselect="removeSelectedParticipation"
+        :value="selectedParticipations[item.id] ??= []"
+        @input="selectParticipation(item.id, $event)"
       />
     </template>
 
@@ -157,7 +157,7 @@ export default {
       initDate: false,
       currentDate: "",
       hashUpdater: false,
-      selectedParticipations: [],
+      selectedParticipations: {},
     };
   },
   computed: {
@@ -228,23 +228,18 @@ export default {
         return "DocumentationAbsencesModal";
       }
     },
+    combinedSelectedParticipations() {
+      return Object.values(this.selectedParticipations).flat();
+    },
   },
   methods: {
-    addSelectedParticipation(participation) {
-      this.selectedParticipations = [
-        ...new Set([...this.selectedParticipations, participation]),
-      ];
-    },
-    removeSelectedParticipation(participation) {
-      const index = this.selectedParticipations.indexOf(participation);
-      if (index >= 0) {
-        this.selectedParticipations.splice(index, 1);
-      }
+    selectParticipation(id, value) {
+      this.selectedParticipations = Object.assign({}, this.selectedParticipations, { [id]: value });
     },
     handleMultipleAction(absenceReasonId) {
       this.loadSelectedParticiptions = true;
       this.sendToServer(
-        this.selectedParticipations,
+        this.combinedSelectedParticipations,
         "absenceReason",
         absenceReasonId,
       );
@@ -252,7 +247,7 @@ export default {
     },
     resetMultipleAction() {
       this.loadSelectedParticiptions = false;
-      this.$set(this.selectedParticipations, []);
+      this.selectedParticipations = {};
     },
   },
 };
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue
index d9013806dba3bafb5a47dbbc2e39ca255a2d963d..42c7b242c63fe87aede11a9c1304e683145f9e1d 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsences.vue
@@ -18,7 +18,8 @@
         :include-present="false"
         class="participation-list"
         v-bind="documentationPartProps"
-        v-on="selectListeners"
+        :value="value"
+        @input="$emit('input', $event)"
       />
     </v-card-text>
     <v-spacer />
@@ -54,7 +55,6 @@ import CancelButton from "aleksis.core/components/generic/buttons/CancelButton.v
 
 import { createOrUpdateDocumentations } from "../coursebook.graphql";
 
-import selectParticipationMixin from "./selectParticipationMixin.js";
 import documentationPartMixin from "../documentation/documentationPartMixin";
 
 export default {
@@ -67,7 +67,7 @@ export default {
     CancelButton,
   },
   emits: ["open", "close"],
-  mixins: [documentationPartMixin, selectParticipationMixin],
+  mixins: [documentationPartMixin],
   data() {
     return {
       loading: false,
@@ -75,6 +75,12 @@ export default {
       selectedParticipations: [],
     };
   },
+  props: {
+    value: {
+      type: Array,
+      required: true,
+    },
+  },
   methods: {
     save() {
       this.$refs.summary.save();
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue
index 92bd289b5479cc9e0b7a78fb106b51c692b61083..7f337725f6b55511bb047be90e57c2a1434be7b7 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue
@@ -8,7 +8,8 @@
         compact
         v-bind="$attrs"
         :dialog-activator="activator"
-        v-on="selectListeners"
+        :value="value"
+        @input="$emit('input', $event)"
       />
     </template>
     <!-- dialog view -> deactivate dialog -->
@@ -16,7 +17,6 @@
     <documentation-absences
       v-bind="$attrs"
       @close="popup = false"
-      v-on="selectListeners"
     />
   </mobile-fullscreen-dialog>
 </template>
@@ -25,19 +25,22 @@
 import MobileFullscreenDialog from "aleksis.core/components/generic/dialogs/MobileFullscreenDialog.vue";
 import DocumentationAbsences from "./DocumentationAbsences.vue";
 
-import selectParticipationMixin from "./selectParticipationMixin.js";
-
 export default {
   name: "DocumentationAbsencesModal",
   components: {
     MobileFullscreenDialog,
     DocumentationAbsences,
   },
-  mixins: [selectParticipationMixin],
   data() {
     return {
       popup: false,
     };
   },
+  props: {
+    value: {
+      type: Array,
+      required: true,
+    },
+  },
 };
 </script>
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue
index 0e01423be112acf915a9bea52302a4ea70a76231..85e267a63a46e4ff579b9dade07c60aebddf2cfe 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue
@@ -3,45 +3,51 @@ import MobileFullscreenDialog from "aleksis.core/components/generic/dialogs/Mobi
 
 import AbsenceReasonGroupSelect from "aleksis.apps.kolego/components/AbsenceReasonGroupSelect.vue";
 
-import selectParticipationMixin from "./selectParticipationMixin.js";
 import updateParticipationMixin from "./updateParticipationMixin.js";
 </script>
 
 <template>
   <v-list v-if="filteredParticipations.length">
     <v-divider />
-    <v-list-item
-      v-for="(participation, index) in filteredParticipations"
-      :key="`documentation-${documentation.id}-participation-${participation.id}`"
-      :value="participation"
-      v-bind="$attrs"
-      v-on="$listeners"
+
+    <v-list-item-group
+      :value="value"
+      multiple
+      @change="changeSelect"
     >
-      <template #default="{ active }">
-        <v-list-item-action>
-          <v-checkbox
-            :input-value="active"
-            @change="handleParticipationSelect($event, participation)"
-          />
-        </v-list-item-action>
-        <v-list-item-title>
-          {{ participation.person.fullName }}
-        </v-list-item-title>
-        <v-list-item-action v-if="participation.absenceReason" class="full-width">
-          <absence-reason-group-select
-            allow-empty
-            empty-value="present"
-            :loadSelectedChip="loading"
-            :value="participation.absenceReason?.id || 'present'"
-            @input="sendToServer([participation], 'absenceReason', $event)"
-          />
-        </v-list-item-action>
+      <template v-for="(participation, index) in filteredParticipations">
+        <v-list-item
+          :key="`documentation-${documentation.id}-participation-${participation.id}`"
+          :value="participation.id"
+          v-bind="$attrs"
+        >
+          <template #default="{ active }">
+            <v-list-item-action>
+              <v-checkbox
+                :input-value="active"
+              />
+            </v-list-item-action>
+            <v-list-item-title>
+              {{ participation.person.fullName }}
+            </v-list-item-title>
+            <v-list-item-action v-if="participation.absenceReason" class="full-width">
+              <absence-reason-group-select
+                allow-empty
+                empty-value="present"
+                :loadSelectedChip="loading"
+                :value="participation.absenceReason?.id || 'present'"
+                @input="sendToServer([participation], 'absenceReason', $event)"
+              />
+            </v-list-item-action>
+          </template>
+        </v-list-item>
+        <v-divider
+          v-if="index < filteredParticipations.length - 1"
+          :key="index"
+        ></v-divider>
       </template>
-    </v-list-item>
-    <v-divider
-      v-if="index < filteredParticipations.length - 1"
-      :key="index"
-    ></v-divider>
+    </v-list-item-group>
+
     <mobile-fullscreen-dialog v-model="participationDialogs" max-width="500px">
       test
     </mobile-fullscreen-dialog>
@@ -74,7 +80,7 @@ import updateParticipationMixin from "./updateParticipationMixin.js";
 <script>
 export default {
   name: "ParticipationList",
-  mixins: [selectParticipationMixin, updateParticipationMixin],
+  mixins: [updateParticipationMixin],
   data() {
     return {
       loading: false,
@@ -88,6 +94,10 @@ export default {
       required: false,
       default: true,
     },
+    value: {
+      type: Array,
+      required: true,
+    },
   },
   computed: {
     filteredParticipations() {
@@ -101,13 +111,10 @@ export default {
     },
   },
   methods: {
-    handleParticipationSelect(value, participation) {
-      if (value) {
-        this.handleSelect(participation.id);
-      } else {
-        this.handleDeselect(participation.id);
-      }
+    changeSelect(value) {
+      console.log(value);
+      this.$emit("input", value);
     },
-  },
+  }
 };
 </script>