diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
index 5814088f6211ae52373776001ad52749e9452696..8444f9e35af335080026b221424fda598068c6fc 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/coursebook.graphql
@@ -37,7 +37,7 @@ query documentationsForCoursebook(
       id
       name
     }
-    lessonEvent {
+    amends {
       id
       amends {
         id
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationStatus.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationStatus.vue
index 5c6cb5f5c0ed9170736e2fbf6dcd73a81bab917a..ad214b49da74fcab14fd39f456b9e24e2e620c47 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationStatus.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationStatus.vue
@@ -78,13 +78,13 @@ export default {
   },
   methods: {
     updateStatus() {
-      if (this.documentation?.lessonEvent.cancelled) {
+      if (this.documentation?.amends.cancelled) {
         this.currentStatusName = "cancelled";
       } else if (this.documentation.topic) {
         this.currentStatusName = "available";
       } else if (DateTime.now() > this.documentationDateTimeEnd) {
         this.currentStatusName = "missing";
-      } else if (this.documentation?.lessonEvent.amends) {
+      } else if (this.documentation?.amends.amends) {
         this.currentStatusName = "substitution";
       } else if (
         DateTime.now() > this.documentationDateTimeStart &&
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
index a07172dc5834feb68eeab69cd522774c52279256..09a04bcb67c6ae618fa0b1546a0171af30323885 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
+++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/LessonInformation.vue
@@ -41,11 +41,10 @@ import PersonChip from "aleksis.core/components/person/PersonChip.vue";
       />
       <subject-chip
         v-if="
-          documentation?.lessonEvent?.amends?.subject &&
-          documentation.lessonEvent.amends.subject.id !==
-            documentation.subject.id
+          documentation?.amends?.amends?.subject &&
+          documentation.amends.amends.subject.id !== documentation.subject.id
         "
-        :subject="documentation.lessonEvent.amends.subject"
+        :subject="documentation.amends.amends.subject"
         v-bind="compact ? dialogActivator.attrs : {}"
         v-on="compact ? dialogActivator.on : {}"
         class="text-decoration-line-through"
@@ -102,10 +101,10 @@ export default {
     },
     amendedTeachers() {
       if (
-        this.documentation?.lessonEvent?.amends?.teachers &&
-        this.documentation.lessonEvent.amends.teachers.length
+        this.documentation?.amends?.amends?.teachers &&
+        this.documentation.amends.amends.teachers.length
       ) {
-        return this.documentation.lessonEvent.amends.teachers.filter(
+        return this.documentation.amends.amends.teachers.filter(
           (at) => !this.documentation.teachers.includes((t) => t.id === at.id),
         );
       }
diff --git a/aleksis/apps/alsijil/migrations/0020_add_documentation_and_participation.py b/aleksis/apps/alsijil/migrations/0020_add_documentation_and_participation.py
deleted file mode 100644
index 4d910b912e038f5e65f2ba9e5b0947e52297f199..0000000000000000000000000000000000000000
--- a/aleksis/apps/alsijil/migrations/0020_add_documentation_and_participation.py
+++ /dev/null
@@ -1,148 +0,0 @@
-# Generated by Django 4.2.4 on 2023-08-13 14:53
-
-import aleksis.apps.alsijil.models
-import aleksis.core.managers
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ("chronos", "0016_lessonevent"),
-        ("core", "0052_site_related_name"),
-        ("cursus", "0001_initial"),
-        ("alsijil", "0019_drop_sites"),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name="Documentation",
-            fields=[
-                (
-                    "calendarevent_ptr",
-                    models.OneToOneField(
-                        auto_created=True,
-                        on_delete=django.db.models.deletion.CASCADE,
-                        parent_link=True,
-                        primary_key=True,
-                        serialize=False,
-                        to="core.calendarevent",
-                    ),
-                ),
-                (
-                    "topic",
-                    models.CharField(blank=True, max_length=255, verbose_name="Lesson topic"),
-                ),
-                ("homework", models.CharField(blank=True, max_length=255, verbose_name="Homework")),
-                (
-                    "group_note",
-                    models.CharField(blank=True, max_length=255, verbose_name="Group note"),
-                ),
-                (
-                    "course",
-                    models.ForeignKey(
-                        blank=True,
-                        null=True,
-                        on_delete=django.db.models.deletion.CASCADE,
-                        related_name="documentations",
-                        to="cursus.course",
-                    ),
-                ),
-                (
-                    "lesson_event",
-                    models.ForeignKey(
-                        blank=True,
-                        null=True,
-                        on_delete=django.db.models.deletion.CASCADE,
-                        related_name="documentation",
-                        to="chronos.lessonevent",
-                    ),
-                ),
-                (
-                    "subject",
-                    models.ForeignKey(
-                        blank=True,
-                        null=True,
-                        on_delete=django.db.models.deletion.CASCADE,
-                        related_name="+",
-                        to="cursus.subject",
-                    ),
-                ),
-            ],
-            options={
-                "verbose_name": "Documentation",
-                "verbose_name_plural": "Documentations",
-            },
-            bases=("core.calendarevent",),
-        ),
-        migrations.CreateModel(
-            name="Participation",
-            fields=[
-                (
-                    "id",
-                    models.BigAutoField(
-                        auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
-                    ),
-                ),
-                (
-                    "managed_by_app_label",
-                    models.CharField(
-                        blank=True,
-                        editable=False,
-                        max_length=255,
-                        verbose_name="App label of app responsible for managing this instance",
-                    ),
-                ),
-                ("extended_data", models.JSONField(default=dict, editable=False)),
-                ("remarks", models.CharField(blank=True, max_length=255)),
-                (
-                    "documentation",
-                    models.ForeignKey(
-                        on_delete=django.db.models.deletion.CASCADE,
-                        related_name="participations",
-                        to="alsijil.documentation",
-                    ),
-                ),
-                (
-                    "extra_marks",
-                    models.ManyToManyField(
-                        blank=True, to="alsijil.extramark", verbose_name="Extra marks"
-                    ),
-                ),
-                ("groups_of_person", models.ManyToManyField(related_name="+", to="core.group")),
-                (
-                    "person",
-                    models.ForeignKey(
-                        on_delete=django.db.models.deletion.CASCADE,
-                        related_name="participations",
-                        to="core.person",
-                    ),
-                ),
-            ],
-            options={
-                "verbose_name": "Participation note",
-                "verbose_name_plural": "Participation notes",
-                "ordering": ["documentation", "person__last_name", "person__first_name"],
-            },
-            bases=(aleksis.apps.alsijil.models.RegisterObjectRelatedMixin, models.Model),
-            managers=[
-                ("objects", aleksis.core.managers.AlekSISBaseManager()),
-            ],
-        ),
-        migrations.AddConstraint(
-            model_name="participation",
-            constraint=models.UniqueConstraint(
-                fields=("documentation", "person"), name="unique_participation_per_documentation"
-            ),
-        ),
-        migrations.AddConstraint(
-            model_name="documentation",
-            constraint=models.CheckConstraint(
-                check=models.Q(
-                    ("course__isnull", True), ("lesson_event__isnull", True), _negated=True
-                ),
-                name="either_course_or_lesson_event",
-            ),
-        ),
-    ]
diff --git a/aleksis/apps/alsijil/migrations/0020_documentation_extramark_colour_bg_and_more.py b/aleksis/apps/alsijil/migrations/0020_documentation_extramark_colour_bg_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..e83ef5e2205280af85df6b5674caf32e10152ee9
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0020_documentation_extramark_colour_bg_and_more.py
@@ -0,0 +1,92 @@
+# Generated by Django 4.2.10 on 2024-04-18 14:48
+
+import colorfield.fields
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0061_remove_group_additional_fields'),
+        ('kolego', '0003_refactor_absence'),
+        ('cursus', '0003_drop_site'),
+        ('alsijil', '0019_drop_sites'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Documentation',
+            fields=[
+                ('calendarevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.calendarevent')),
+                ('topic', models.CharField(blank=True, max_length=255, verbose_name='Lesson Topic')),
+                ('homework', models.CharField(blank=True, max_length=255, verbose_name='Homework')),
+                ('group_note', models.CharField(blank=True, max_length=255, verbose_name='Group Note')),
+                ('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='documentations', to='cursus.course', verbose_name='Course')),
+                ('subject', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='cursus.subject', verbose_name='Subject')),
+                ('teachers', models.ManyToManyField(blank=True, null=True, related_name='documentations_as_teacher', to='core.person', verbose_name='Teachers')),
+            ],
+            options={
+                'verbose_name': 'Documentation',
+                'verbose_name_plural': 'Documentations',
+            },
+            bases=('core.calendarevent',),
+        ),
+        migrations.AddField(
+            model_name='extramark',
+            name='colour_bg',
+            field=colorfield.fields.ColorField(blank=True, default='', image_field=None, max_length=25, samples=None, verbose_name='Background colour'),
+        ),
+        migrations.AddField(
+            model_name='extramark',
+            name='colour_fg',
+            field=colorfield.fields.ColorField(blank=True, default='', image_field=None, max_length=25, samples=None, verbose_name='Foreground colour'),
+        ),
+        migrations.AddField(
+            model_name='extramark',
+            name='show_in_coursebook',
+            field=models.BooleanField(default=True, verbose_name='Show in coursebook'),
+        ),
+        migrations.CreateModel(
+            name='ParticipationStatus',
+            fields=[
+                ('calendarevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.calendarevent')),
+                ('absent', models.BooleanField(verbose_name='Absent')),
+                ('absence_reason', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='kolego.absencereason', verbose_name='Absence Reason')),
+                ('base_absence', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='absences', to='kolego.absence', verbose_name='Base Absence')),
+                ('groups_of_person', models.ManyToManyField(related_name='+', to='core.group', verbose_name='Groups of Person')),
+                ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participations', to='core.person', verbose_name='Person')),
+                ('related_documentation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participations', to='alsijil.documentation', verbose_name='Documentation')),
+            ],
+            options={
+                'verbose_name': 'Participation Status',
+                'verbose_name_plural': 'Participation Status',
+                'ordering': ['related_documentation', 'person__last_name', 'person__first_name'],
+            },
+            bases=('core.calendarevent',),
+        ),
+        migrations.CreateModel(
+            name='NewPersonalNote',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('managed_by_app_label', models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance')),
+                ('extended_data', models.JSONField(default=dict, editable=False)),
+                ('note', models.TextField(blank=True, verbose_name='Note')),
+                ('documentation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='personal_notes', to='alsijil.documentation', verbose_name='Documentation')),
+                ('extra_mark', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='alsijil.extramark', verbose_name='Extra Mark')),
+                ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='new_personal_notes', to='core.person', verbose_name='Person')),
+            ],
+            options={
+                'verbose_name': 'Personal Note',
+                'verbose_name_plural': 'Personal Notes',
+            },
+        ),
+        migrations.AddConstraint(
+            model_name='participationstatus',
+            constraint=models.UniqueConstraint(fields=('related_documentation', 'person'), name='unique_participation_status_per_documentation'),
+        ),
+        migrations.AddConstraint(
+            model_name='newpersonalnote',
+            constraint=models.CheckConstraint(check=models.Q(models.Q(('note', ''), _negated=True), ('extra_mark__isnull', False), _connector='OR'), name='unique_absence_per_documentation'),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/migrations/0021_participationstatus.py b/aleksis/apps/alsijil/migrations/0021_participationstatus.py
deleted file mode 100644
index 5f3a7225f0301609a424aed6354bde13f97b086a..0000000000000000000000000000000000000000
--- a/aleksis/apps/alsijil/migrations/0021_participationstatus.py
+++ /dev/null
@@ -1,113 +0,0 @@
-# Generated by Django 4.2.9 on 2024-01-11 20:43
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('cursus', '0001_initial'),
-        ('core', '0052_site_related_name'),
-        ('chronos', '0016_lessonevent'),
-        ('kolego', '0003_refactor_absence'),
-        ('alsijil', '0020_add_documentation_and_participation'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='NewPersonalNote',
-            fields=[
-                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('managed_by_app_label', models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance')),
-                ('extended_data', models.JSONField(default=dict, editable=False)),
-                ('note', models.TextField(blank=True, verbose_name='Note')),
-            ],
-            options={
-                'verbose_name': 'Personal Note',
-                'verbose_name_plural': 'Personal Notes',
-            },
-        ),
-        migrations.CreateModel(
-            name='ParticipationStatus',
-            fields=[
-                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('managed_by_app_label', models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance')),
-                ('extended_data', models.JSONField(default=dict, editable=False)),
-                ('absent', models.BooleanField(verbose_name='Absent')),
-                ('absence_reason', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='kolego.absencereason', verbose_name='Absence Reason')),
-                ('base_absence', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='absences', to='kolego.absence', verbose_name='Base Absence')),
-            ],
-            options={
-                'verbose_name': 'Participation Status',
-                'verbose_name_plural': 'Participation Status',
-                'ordering': ['documentation', 'person__last_name', 'person__first_name'],
-            },
-        ),
-        migrations.AlterField(
-            model_name='documentation',
-            name='course',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='documentations', to='cursus.course', verbose_name='Course'),
-        ),
-        migrations.AlterField(
-            model_name='documentation',
-            name='group_note',
-            field=models.CharField(blank=True, max_length=255, verbose_name='Group Note'),
-        ),
-        migrations.AlterField(
-            model_name='documentation',
-            name='lesson_event',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='documentation', to='chronos.lessonevent', verbose_name='Lesson Event'),
-        ),
-        migrations.AlterField(
-            model_name='documentation',
-            name='subject',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='cursus.subject', verbose_name='Subject'),
-        ),
-        migrations.AlterField(
-            model_name='documentation',
-            name='topic',
-            field=models.CharField(blank=True, max_length=255, verbose_name='Lesson Topic'),
-        ),
-        migrations.DeleteModel(
-            name='Participation',
-        ),
-        migrations.AddField(
-            model_name='participationstatus',
-            name='documentation',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participations', to='alsijil.documentation', verbose_name='Documentation'),
-        ),
-        migrations.AddField(
-            model_name='participationstatus',
-            name='groups_of_person',
-            field=models.ManyToManyField(related_name='+', to='core.group', verbose_name='Groups of Person'),
-        ),
-        migrations.AddField(
-            model_name='participationstatus',
-            name='person',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participations', to='core.person', verbose_name='Person'),
-        ),
-        migrations.AddField(
-            model_name='newpersonalnote',
-            name='documentation',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='personal_notes', to='alsijil.documentation', verbose_name='Documentation'),
-        ),
-        migrations.AddField(
-            model_name='newpersonalnote',
-            name='extra_mark',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='alsijil.extramark', verbose_name='Extra Mark'),
-        ),
-        migrations.AddField(
-            model_name='newpersonalnote',
-            name='person',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='new_personal_notes', to='core.person', verbose_name='Person'),
-        ),
-        migrations.AddConstraint(
-            model_name='participationstatus',
-            constraint=models.UniqueConstraint(fields=('documentation', 'person'), name='unique_participation_status_per_documentation'),
-        ),
-        migrations.AddConstraint(
-            model_name='newpersonalnote',
-            constraint=models.CheckConstraint(check=models.Q(models.Q(('note', ''), _negated=True), ('extra_mark__isnull', False), _connector='OR'), name='unique_absence_per_documentation'),
-        ),
-    ]
diff --git a/aleksis/apps/alsijil/migrations/0022_documentation_teachers.py b/aleksis/apps/alsijil/migrations/0022_documentation_teachers.py
deleted file mode 100644
index 8e6c30bd98de76e717727c92c9d0d8735791514b..0000000000000000000000000000000000000000
--- a/aleksis/apps/alsijil/migrations/0022_documentation_teachers.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Generated by Django 4.2.9 on 2024-03-16 00:59
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-    dependencies = [
-        ("core", "0061_remove_group_additional_fields"),
-        ("alsijil", "0021_participationstatus"),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name="documentation",
-            name="teachers",
-            field=models.ManyToManyField(
-                blank=True,
-                null=True,
-                related_name="documentations_as_teacher",
-                to="core.person",
-                verbose_name="Teachers",
-            ),
-        ),
-    ]
diff --git a/aleksis/apps/alsijil/migrations/0023_extramark_colour_bg_extramark_colour_fg_and_more.py b/aleksis/apps/alsijil/migrations/0023_extramark_colour_bg_extramark_colour_fg_and_more.py
deleted file mode 100644
index e47867577007ee4d853863ba2dfab157235f6068..0000000000000000000000000000000000000000
--- a/aleksis/apps/alsijil/migrations/0023_extramark_colour_bg_extramark_colour_fg_and_more.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Generated by Django 4.2.9 on 2024-03-16 01:05
-
-import colorfield.fields
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-    dependencies = [
-        ("alsijil", "0022_documentation_teachers"),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name="extramark",
-            name="colour_bg",
-            field=colorfield.fields.ColorField(
-                blank=True,
-                default="",
-                image_field=None,
-                max_length=25,
-                samples=None,
-                verbose_name="Background colour",
-            ),
-        ),
-        migrations.AddField(
-            model_name="extramark",
-            name="colour_fg",
-            field=colorfield.fields.ColorField(
-                blank=True,
-                default="",
-                image_field=None,
-                max_length=25,
-                samples=None,
-                verbose_name="Foreground colour",
-            ),
-        ),
-        migrations.AddField(
-            model_name="extramark",
-            name="show_in_coursebook",
-            field=models.BooleanField(default=True, verbose_name="Show in coursebook"),
-        ),
-    ]
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 32cbe12f4971b2676e119807367bc718504d0524..332c428fa7eff2095dc3ec83eb013ee759bab42b 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -467,15 +467,6 @@ class Documentation(CalendarEvent):
         verbose_name=_("Course"),
     )
 
-    lesson_event = models.ForeignKey(
-        LessonEvent,
-        models.PROTECT,
-        related_name="documentation",
-        blank=True,
-        null=True,
-        verbose_name=_("Lesson Event"),
-    )
-
     subject = models.ForeignKey(
         Subject, models.PROTECT, related_name="+", blank=True, null=True, verbose_name=_("Subject")
     )
@@ -495,17 +486,17 @@ class Documentation(CalendarEvent):
     def get_subject(self) -> str:
         if self.subject:
             return self.subject
-        if self.lesson_event:
-            if self.lesson_event.subject:
-                return self.lesson_event.subject
-            if self.lesson_event.course:
-                return self.lesson_event.course.subject
+        if self.amends:
+            if self.amends.subject:
+                return self.amends.subject
+            if self.amends.course:
+                return self.amends.course.subject
         if self.course:
             return self.course.subject
 
     def get_groups(self) -> QuerySet[Group]:
-        if self.lesson_event:
-            return self.lesson_event.actual_groups
+        if self.amends:
+            return self.amends.actual_groups
         if self.course:
             return self.course.groups.all()
 
@@ -520,12 +511,8 @@ class Documentation(CalendarEvent):
     class Meta:
         verbose_name = _("Documentation")
         verbose_name_plural = _("Documentations")
-        constraints = [
-            models.CheckConstraint(
-                check=~Q(course__isnull=True, lesson_event__isnull=True),
-                name="either_course_or_lesson_event",
-            ),
-        ]
+        # should check if object has either course or amends,
+        # which is not possible via constraint, because amends is not local to Documentation
 
     @classmethod
     def get_for_coursebook(
@@ -571,7 +558,7 @@ class Documentation(CalendarEvent):
                 continue
 
             event_reference_obj = event["REFERENCE_OBJECT"]
-            existing_documentations = event_reference_obj.documentation.filter(
+            existing_documentations = event_reference_obj.amended_by.filter(
                 datetime_start=event["DTSTART"].dt,
                 datetime_end=event["DTEND"].dt,
             )
@@ -598,7 +585,7 @@ class Documentation(CalendarEvent):
                 docs.append(
                     cls(
                         pk=f"DUMMY;{event_reference_obj.id};{event['DTSTART'].dt.isoformat()};{event['DTEND'].dt.isoformat()}",
-                        lesson_event=event_reference_obj,
+                        amends=event_reference_obj,
                         course=course,
                         subject=subject,
                         datetime_start=event["DTSTART"].dt,
@@ -609,7 +596,7 @@ class Documentation(CalendarEvent):
         return docs
 
 
-class ParticipationStatus(ExtensibleModel):
+class ParticipationStatus(CalendarEvent):
     """A participation or absence record about a single person.
 
     Used in the class register to note participation or absence of a student
@@ -625,7 +612,7 @@ class ParticipationStatus(ExtensibleModel):
         "core.Group", related_name="+", verbose_name=_("Groups of Person")
     )
 
-    documentation = models.ForeignKey(
+    related_documentation = models.ForeignKey(
         Documentation,
         models.CASCADE,
         related_name="participations",
@@ -648,19 +635,19 @@ class ParticipationStatus(ExtensibleModel):
     )
 
     def __str__(self) -> str:
-        return f"{self.documentation}, {self.person}"
+        return f"{self.related_documentation}, {self.person}"
 
     class Meta:
         verbose_name = _("Participation Status")
         verbose_name_plural = _("Participation Status")
         ordering = [
-            "documentation",
+            "related_documentation",
             "person__last_name",
             "person__first_name",
         ]
         constraints = [
             models.UniqueConstraint(
-                fields=("documentation", "person"),
+                fields=("related_documentation", "person"),
                 name="unique_participation_status_per_documentation",
             ),
         ]
diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index d762a9874e9ad85f98de86a2adff2fdd4af388fd..aae1b70603f0b0e5c738d81467d31f3844f13a86 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -39,7 +39,7 @@ class Query(graphene.ObjectType):
 
     def resolve_documentations_by_course_id(root, info, course_id, **kwargs):
         documentations = Documentation.objects.filter(
-            Q(course__pk=course_id) | Q(lesson_event__course__pk=course_id)
+            Q(course__pk=course_id) | Q(amends__course__pk=course_id)
         )
         return documentations
 
diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py
index 52b92549ffe5a6baba40a2c8976bcd7ab0d9dd56..3225db34e7c146c4eadcf34efcc11936f5df7311 100644
--- a/aleksis/apps/alsijil/schema/documentation.py
+++ b/aleksis/apps/alsijil/schema/documentation.py
@@ -10,6 +10,7 @@ from reversion import create_revision, set_comment, set_user
 
 from aleksis.apps.alsijil.util.predicates import can_edit_documentation, is_in_allowed_time_range
 from aleksis.apps.chronos.models import LessonEvent
+from aleksis.apps.chronos.schema import LessonEventType
 from aleksis.apps.cursus.models import Subject
 from aleksis.apps.cursus.schema import CourseType, SubjectType
 from aleksis.core.models import Person
@@ -28,7 +29,7 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
         fields = (
             "id",
             "course",
-            "lesson_event",
+            "amends",
             "subject",
             "topic",
             "homework",
@@ -45,6 +46,7 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
         }
 
     course = graphene.Field(CourseType, required=False)
+    amends = graphene.Field(lambda: LessonEventType, required=False)
     subject = graphene.Field(SubjectType, required=False)
 
     future_notice = graphene.Boolean(required=False)
@@ -55,12 +57,12 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
     def resolve_teachers(root: Documentation, info, **kwargs):
         if not str(root.pk).startswith("DUMMY") and hasattr(root, "teachers"):
             return root.teachers
-        elif root.lesson_event.amends:
-            if root.lesson_event.teachers:
-                return root.lesson_event.teachers
+        elif root.amends.amends:
+            if root.amends.teachers:
+                return root.amends.teachers
             else:
-                return root.lesson_event.amends.teachers
-        return root.lesson_event.teachers
+                return root.amends.amends.teachers
+        return root.amends.teachers
 
     @staticmethod
     def resolve_future_notice(root: Documentation, info, **kwargs):
@@ -148,7 +150,7 @@ class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation):
                 obj = Documentation.objects.create(
                     datetime_start=datetime_start,
                     datetime_end=datetime_end,
-                    lesson_event=lesson_event,
+                    amends=lesson_event,
                     course=course,
                     subject=subject,
                     topic=doc.topic or "",
diff --git a/aleksis/apps/alsijil/util/predicates.py b/aleksis/apps/alsijil/util/predicates.py
index 33bda1e7d5a586ff759eaf83f4b231ed43bf08c5..fe7746948d807f3afede2a8fd3a11b41358965f5 100644
--- a/aleksis/apps/alsijil/util/predicates.py
+++ b/aleksis/apps/alsijil/util/predicates.py
@@ -390,13 +390,10 @@ def is_documentation_teacher(user: User, obj: Documentation):
     if obj:
         if not str(obj.pk).startswith("DUMMY") and hasattr(obj, "teachers"):
             teachers = obj.teachers
-        elif obj.lesson_event.amends:
-            if obj.lesson_event.teachers:
-                teachers = obj.lesson_event.teachers
-            else:
-                teachers = obj.lesson_event.amends.teachers
+        elif obj.amends.amends:
+            teachers = obj.amends.teachers if obj.amends.teachers else obj.amends.amends.teachers
         else:
-            teachers = obj.lesson_event.teachers
+            teachers = obj.amends.teachers
         return user.person in teachers.all()
     return False
 
@@ -407,11 +404,11 @@ def can_view_documentation(user: User, obj: Documentation):
     if obj:
         if is_documentation_teacher(user, obj):
             return True
-        if obj.lesson_event:
+        if obj.amends:
             return (
-                is_lesson_event_teacher(user, obj.lesson_event)
-                | is_lesson_event_member(user, obj.lesson_event)
-                | is_lesson_event_group_owner(user, obj.lesson_event)
+                is_lesson_event_teacher(user, obj.amends)
+                | is_lesson_event_member(user, obj.amends)
+                | is_lesson_event_group_owner(user, obj.amends)
             )
         if obj.course:
             return is_course_teacher(user, obj.course)
@@ -425,7 +422,7 @@ def can_view_any_documentation(user: User):
 
     return Documentation.objects.filter(
         Q(teachers=user.person)
-        | Q(lesson_event__in=allowed_lesson_events)
+        | Q(amends__in=allowed_lesson_events)
         | Q(course__teachers=user.person)
     ).exists()
 
@@ -436,9 +433,9 @@ def can_edit_documentation(user: User, obj: Documentation):
     if obj:
         if is_documentation_teacher(user, obj):
             return True
-        if obj.lesson_event:
-            return is_lesson_event_teacher(user, obj.lesson_event) | is_lesson_event_group_owner(
-                user, obj.lesson_event
+        if obj.amends:
+            return is_lesson_event_teacher(user, obj.amends) | is_lesson_event_group_owner(
+                user, obj.amends
             )
     return False