diff --git a/aleksis/apps/alsijil/preferences.py b/aleksis/apps/alsijil/preferences.py
new file mode 100644
index 0000000000000000000000000000000000000000..e2a55de885f3e415d9b4e461ab3192f899af2398
--- /dev/null
+++ b/aleksis/apps/alsijil/preferences.py
@@ -0,0 +1,16 @@
+from django.utils.translation import gettext as _
+
+from dynamic_preferences.preferences import Section
+from dynamic_preferences.types import BooleanPreference
+
+from aleksis.core.registries import site_preferences_registry
+
+alsijil = Section("alsijil", verbose_name=_("Class register"))
+
+
+@site_preferences_registry.register
+class BlockPersonalNotesForCancelled(BooleanPreference):
+    section = alsijil
+    name = "block_personal_notes_for_cancelled"
+    default = True
+    verbose_name = _("Block adding personal notes for cancelled lessons")
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
index 6c3fe8815a34397c7158d6a7bc340693ef4a9883..9fca5de56fc8bd6316a4db3728ae449cd3882cbb 100644
--- a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
@@ -59,7 +59,7 @@
           <li class="tab">
             <a href="#lesson-documentation">{% trans "Lesson documentation" %}</a>
           </li>
-          {% if not lesson_period.get_substitution.cancelled %}
+          {% if not lesson_period.get_substitution.cancelled or not request.site.preferences.alsijil__block_personal_notes_for_cancelled %}
             <li class="tab">
               <a href="#personal-notes">{% trans "Personal notes" %}</a>
             </li>
@@ -148,7 +148,7 @@
         </div>
       </div>
 
-      {% if not lesson_period.get_substitution.cancelled %}
+      {% if not lesson_period.get_substitution.cancelled or not request.site.preferences.alsijil__block_personal_notes_for_cancelled %}
         <div class="col s12" id="personal-notes">
           <div class="card">
             <div class="card-content">
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index ed86040791aa2aaafaf84d24eaf95f305765719c..c5213e5f23aeade67cc70c7dde5471eb32b21696 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -20,6 +20,7 @@ from aleksis.apps.chronos.util.date import week_weekday_to_date
 from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView
 from aleksis.core.models import Group, Person, SchoolTerm
 from aleksis.core.util import messages
+from aleksis.core.util.core_helpers import get_site_preferences
 
 from .forms import (
     ExcuseTypeForm,
@@ -115,7 +116,10 @@ def lesson(
             messages.success(request, _("The lesson documentation has been saved."))
 
         substitution = lesson_period.get_substitution()
-        if not getattr(substitution, "cancelled", False):
+        if (
+            not getattr(substitution, "cancelled", False)
+            or not get_site_preferences()["alsijil__block_personal_notes_for_cancelled"]
+        ):
             if personal_note_formset.is_valid():
                 instances = personal_note_formset.save()