diff --git a/.gitignore b/.gitignore
index b7f983def7a1bfd21715a5e2e7d976a28ae586e1..11164f0193906b0be7a568b29a8a04444705ebf7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,3 +53,6 @@ db.sqlite3
 
 # Sphinx
 docs/_build/
+
+# Test
+.tox/
diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py
index 1ed20e8ef9295c73da7bce6aef38be6583d976f5..167a73dbc378e01b1189db08508a4d1828fc6ca2 100644
--- a/aleksis/apps/alsijil/forms.py
+++ b/aleksis/apps/alsijil/forms.py
@@ -11,7 +11,7 @@ from material import Layout, Row
 from aleksis.apps.chronos.managers import TimetableType
 from aleksis.core.models import Group, Person
 
-from .models import ExcuseType, LessonDocumentation, PersonalNote, PersonalNoteFilter
+from .models import ExcuseType, ExtraMark, LessonDocumentation, PersonalNote
 
 
 class LessonDocumentationForm(forms.ModelForm):
@@ -28,7 +28,7 @@ class LessonDocumentationForm(forms.ModelForm):
 class PersonalNoteForm(forms.ModelForm):
     class Meta:
         model = PersonalNote
-        fields = ["absent", "late", "excused", "excuse_type", "remarks"]
+        fields = ["absent", "late", "excused", "excuse_type", "extra_marks", "remarks"]
 
     person_name = forms.CharField(disabled=True)
 
@@ -109,12 +109,12 @@ class RegisterAbsenceForm(forms.Form):
     remarks = forms.CharField(label=_("Remarks"), max_length=30, required=False)
 
 
-class PersonalNoteFilterForm(forms.ModelForm):
-    layout = Layout(Row("identifier", "description"), Row("regex"))
+class ExtraMarkForm(forms.ModelForm):
+    layout = Layout("short_name", "name")
 
     class Meta:
-        model = PersonalNoteFilter
-        fields = ["identifier", "description", "regex"]
+        model = ExtraMark
+        fields = ["short_name", "name"]
 
 
 class ExcuseTypeForm(forms.ModelForm):
diff --git a/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po
index 075f3e3ab07c2dbfead9a64998c893280beb29e0..47031832edd1744334295f9182a01b121c9153c3 100644
--- a/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/ar/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-01 13:20+0200\n"
+"POT-Creation-Date: 2020-08-03 20:03+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,53 +16,62 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
-"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
 
-#: forms.py:41
+#: forms.py:25
+msgid "Homework for the next lesson"
+msgstr ""
+
+#: forms.py:50 templates/alsijil/print/full_register.html:199
 msgid "Group"
 msgstr ""
 
-#: forms.py:49 templates/alsijil/print/full_register.html:101
+#: forms.py:56 templates/alsijil/print/full_register.html:170
+#: templates/alsijil/print/full_register.html:201
 msgid "Teacher"
 msgstr ""
 
-#: forms.py:57
-msgid "Room"
+#: forms.py:73
+msgid "You can't select a group and a teacher both."
 msgstr ""
 
-#: forms.py:70
+#: forms.py:101
 msgid "Start date"
 msgstr ""
 
-#: forms.py:73
+#: forms.py:102
 msgid "End date"
 msgstr ""
 
-#: forms.py:75
+#: forms.py:103
 msgid "From period"
 msgstr ""
 
-#: forms.py:77 templates/alsijil/lesson.html:58
+#: forms.py:105 templates/alsijil/class_register/lesson.html:163
 msgid "Person"
 msgstr ""
 
-#: forms.py:79 templates/alsijil/lesson.html:59
-#: templates/alsijil/print/full_register.html:223
-#: templates/alsijil/week_view.html:96
+#: forms.py:107 templates/alsijil/class_register/lesson.html:164
+#: templates/alsijil/class_register/week_view.html:109
+#: templates/alsijil/print/full_register.html:75
+#: templates/alsijil/print/full_register.html:312
 msgid "Absent"
 msgstr ""
 
-#: forms.py:80 templates/alsijil/lesson.html:61
+#: forms.py:108 templates/alsijil/class_register/lesson.html:166
+#: templates/alsijil/print/full_register.html:84
+#: templates/alsijil/print/full_register.html:275
 msgid "Excused"
 msgstr ""
 
-#: forms.py:81 templates/alsijil/lesson.html:62
-#: templates/alsijil/print/full_register.html:225
+#: forms.py:109 templates/alsijil/class_register/lesson.html:170
+#: templates/alsijil/class_register/lesson.html:223
+#: templates/alsijil/class_register/lesson.html:231
+#: templates/alsijil/print/full_register.html:314
 msgid "Remarks"
 msgstr ""
 
-#: menus.py:6 templates/alsijil/print/full_register.html:16
+#: menus.py:6 preferences.py:8 templates/alsijil/print/full_register.html:16
 msgid "Class register"
 msgstr ""
 
@@ -78,306 +87,484 @@ msgstr ""
 msgid "Register absence"
 msgstr ""
 
-#: menus.py:34
-msgid "Personal note filters"
+#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8
+#: templates/alsijil/excuse_type/list.html:9
+msgid "Excuse types"
+msgstr ""
+
+#: menus.py:40 models.py:66 models.py:138
+#: templates/alsijil/class_register/lesson.html:168
+#: templates/alsijil/extra_mark/list.html:8
+#: templates/alsijil/extra_mark/list.html:9
+#: templates/alsijil/print/full_register.html:293
+msgid "Extra marks"
+msgstr ""
+
+#: models.py:18 models.py:124
+msgid "Short name"
+msgstr ""
+
+#: models.py:20 models.py:126
+msgid "Name"
+msgstr ""
+
+#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167
+#: templates/alsijil/class_register/lesson.html:202
+msgid "Excuse type"
 msgstr ""
 
-#: models.py:51 templates/alsijil/print/full_register.html:271
+#: models.py:75
+msgid "Personal note"
+msgstr ""
+
+#: models.py:76 templates/alsijil/class_register/lesson.html:64
+#: templates/alsijil/class_register/lesson.html:156
+#: templates/alsijil/class_register/week_view.html:104
+msgid "Personal notes"
+msgstr ""
+
+#: models.py:99 templates/alsijil/class_register/week_view.html:56
+#: templates/alsijil/print/full_register.html:371
 msgid "Lesson topic"
 msgstr ""
 
-#: models.py:52 templates/alsijil/print/full_register.html:272
+#: models.py:100 templates/alsijil/print/full_register.html:372
 msgid "Homework"
 msgstr ""
 
-#: models.py:68
-msgid "Identifier"
+#: models.py:102
+msgid "Group note"
+msgstr ""
+
+#: models.py:106 templates/alsijil/class_register/lesson.html:60
+#: templates/alsijil/class_register/lesson.html:143
+msgid "Lesson documentation"
+msgstr ""
+
+#: models.py:107
+msgid "Lesson documentations"
 msgstr ""
 
-#: models.py:71 templates/alsijil/print/full_register.html:178
-msgid "Description"
+#: models.py:137
+msgid "Extra mark"
 msgstr ""
 
-#: models.py:74
-msgid "Match expression"
+#: preferences.py:16
+msgid "Block adding personal notes for cancelled lessons"
 msgstr ""
 
-#: tables.py:14
+#: tables.py:16 tables.py:36
 msgid "Edit"
 msgstr ""
 
-#: templates/alsijil/lesson.html:5
+#: tables.py:22 tables.py:42
+msgid "Delete"
+msgstr ""
+
+#: templates/alsijil/absences/register.html:5
+#: templates/alsijil/absences/register.html:6
+msgid "Manage absence"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:6
 msgid "Lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:34
-msgid "Lesson documentation"
+#: templates/alsijil/class_register/lesson.html:14
+#: templates/alsijil/class_register/lesson.html:83
+#, python-format
+msgid "%(period)s. period"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:38
+msgid "Previous lesson"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:46
+msgid "Next lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:43
+#: templates/alsijil/class_register/lesson.html:68
+#: templates/alsijil/class_register/lesson.html:249
 msgid "Change history"
 msgstr ""
 
-#: templates/alsijil/lesson.html:52 templates/alsijil/week_view.html:91
-msgid "Personal notes"
+#: templates/alsijil/class_register/lesson.html:82
+msgid "Overview: Previous lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:60
-#: templates/alsijil/print/full_register.html:202
+#: templates/alsijil/class_register/lesson.html:89
+msgid "Lesson topic of previous lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:96
+msgid "Homework for this lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:103
+msgid "Group notes for previous lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:110
+msgid "Absent persons:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:117
+msgid "Late persons:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:165
+#: templates/alsijil/print/full_register.html:287
 msgid "Tardiness"
 msgstr ""
 
-#: templates/alsijil/manage_personal_note_filter.html:5
-#: templates/alsijil/manage_personal_note_filter.html:6
-msgid "Manage personal note filter"
+#: templates/alsijil/class_register/lesson.html:188
+msgid "Tardiness (in m)"
 msgstr ""
 
-#: templates/alsijil/manage_personal_note_filter.html:11
-msgid "Delete filter"
+#: templates/alsijil/class_register/week_view.html:6
+msgid "Week view"
 msgstr ""
 
-#: templates/alsijil/personal_note_filters.html:7
-#: templates/alsijil/personal_note_filters.html:8
-msgid "List of all personal note filters"
+#: templates/alsijil/class_register/week_view.html:27
+msgid "Select"
 msgstr ""
 
-#: templates/alsijil/personal_note_filters.html:12
-msgid "Add filter"
+#: templates/alsijil/class_register/week_view.html:33
+#, python-format
+msgid "CW %(week)s: %(instance)s"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:22
-#: templates/alsijil/print/full_register.html:54
-msgid "Owners"
+#: templates/alsijil/class_register/week_view.html:50
+msgid "Period"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:52
+msgid "Groups"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:54
+#: templates/alsijil/print/full_register.html:169
+#: templates/alsijil/print/full_register.html:200
+msgid "Subject"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:55
+msgid "Teachers"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:110
+msgid "unexcused"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:113
+msgid "Summed up tardiness"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:142
+msgid "No lessons available"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:145
+msgid ""
+"\n"
+"            There are no lessons for the selected group or teacher in this week.\n"
+"          "
+msgstr ""
+
+#: templates/alsijil/excuse_type/create.html:6
+#: templates/alsijil/excuse_type/create.html:7
+#: templates/alsijil/excuse_type/list.html:16
+msgid "Create excuse type"
+msgstr ""
+
+#: templates/alsijil/excuse_type/edit.html:6
+#: templates/alsijil/excuse_type/edit.html:7
+msgid "Edit excuse type"
+msgstr ""
+
+#: templates/alsijil/excuse_type/warning.html:5
+msgid ""
+"\n"
+"      This function should only be used to define alternatives to the default excuse which also will be counted extra.\n"
+"      Don't use this to create a default excuse or if you don't divide between different types of excuse.\n"
+"    "
+msgstr ""
+
+#: templates/alsijil/extra_mark/create.html:6
+#: templates/alsijil/extra_mark/create.html:7
+#: templates/alsijil/extra_mark/list.html:14
+msgid "Create extra mark"
+msgstr ""
+
+#: templates/alsijil/extra_mark/edit.html:6
+#: templates/alsijil/extra_mark/edit.html:7
+msgid "Edit extra mark"
+msgstr ""
+
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:126
+msgid "(e)"
+msgstr ""
+
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:130
+msgid "(u)"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:6
+msgid "Data complete"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:12
+#: templates/alsijil/print/full_register.html:406
+msgid "Lesson cancelled"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:14
+msgid "Missing data"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:16
+msgid "Pending"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:18
+msgid "Substitution"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:6
+msgid "Class register:"
 msgstr ""
 
 #: templates/alsijil/print/full_register.html:26
+#: templates/alsijil/print/full_register.html:59
+msgid "Owners"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:30
 msgid "Printed on"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:34
+#: templates/alsijil/print/full_register.html:38
 msgid ""
 "\n"
-"            This printout is intended for archival purposes. The main copy "
-"of\n"
-"            the class register is stored in the AlekSIS School Information\n"
-"            System.\n"
-"          "
+"        This printout is intended for archival purposes. The main copy of\n"
+"        the class register is stored in the AlekSIS School Information\n"
+"        System.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:41
+#: templates/alsijil/print/full_register.html:45
 msgid ""
 "\n"
-"            Copies of the class register, both digital and as printout, "
-"must\n"
-"            only be kept inside the school and/or on devices authorised by "
-"the\n"
-"            school.\n"
-"          "
+"        Copies of the class register, both digital and as printout, must\n"
+"        only be kept inside the school and/or on devices authorised by the\n"
+"        school.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:48
+#: templates/alsijil/print/full_register.html:52
 msgid ""
 "\n"
-"            The owner of the group and the headteacher confirm the above, "
-"as\n"
-"            well as the correctness of this printout.\n"
-"          "
+"        The owner of the group and the headteacher confirm the above, as\n"
+"        well as the correctness of this printout.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:55
+#: templates/alsijil/print/full_register.html:62
 msgid "Headteacher"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:61
+#: templates/alsijil/print/full_register.html:69
+msgid "Abbreviations"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:71
+msgid "General"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:78
+msgid "Late"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:81
+#: templates/alsijil/print/full_register.html:283
+msgid "Unexcused"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:89
+msgid "Custom excuse types"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:101
+msgid "Available extra marks"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:115
 msgid "Persons in group"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:66
+#: templates/alsijil/print/full_register.html:120
 msgid "No."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:67
+#: templates/alsijil/print/full_register.html:121
 msgid "Last name"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:68
+#: templates/alsijil/print/full_register.html:122
 msgid "First name"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:69
+#: templates/alsijil/print/full_register.html:123
 msgid "Sex"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:70
+#: templates/alsijil/print/full_register.html:124
 msgid "Date of birth"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:71
-#: templates/alsijil/print/full_register.html:200
-msgid "Absences"
+#: templates/alsijil/print/full_register.html:125
+msgid "(a)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:72
-#: templates/alsijil/print/full_register.html:201
-msgid "Unexcused"
+#: templates/alsijil/print/full_register.html:131
+msgid "(b)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:73
-#: templates/alsijil/print/full_register.html:224
-msgid "Tard."
-msgstr ""
-
-#: templates/alsijil/print/full_register.html:95
+#: templates/alsijil/print/full_register.html:164
 msgid "Teachers and lessons in group"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:100
-#: templates/alsijil/week_view.html:48
-msgid "Subject"
-msgstr ""
-
-#: templates/alsijil/print/full_register.html:102
+#: templates/alsijil/print/full_register.html:171
+#: templates/alsijil/print/full_register.html:202
 msgid "Lesson start"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:103
+#: templates/alsijil/print/full_register.html:172
+#: templates/alsijil/print/full_register.html:203
 msgid "Lesson end"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:104
+#: templates/alsijil/print/full_register.html:173
+#: templates/alsijil/print/full_register.html:204
 msgid "Per week"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:124
+#: templates/alsijil/print/full_register.html:194
+msgid "Teachers and lessons in child groups"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:227
 msgid "Personal overview"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:126
+#: templates/alsijil/print/full_register.html:229
 msgid "Contact details"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:174
-msgid "Statistics on remarks"
+#: templates/alsijil/print/full_register.html:266
+msgid "Absences and tardiness"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:179
-msgid "Count"
+#: templates/alsijil/print/full_register.html:269
+msgid "Absences"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:196
-msgid "Absences and tardiness"
+#: templates/alsijil/print/full_register.html:274
+msgid "thereof"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:215
+#: templates/alsijil/print/full_register.html:304
 msgid "Relevant personal notes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:219
+#: templates/alsijil/print/full_register.html:308
 msgid "Date"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:220
-#: templates/alsijil/print/full_register.html:268
+#: templates/alsijil/print/full_register.html:309
+#: templates/alsijil/print/full_register.html:369
 msgid "Pe."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:221
-#: templates/alsijil/print/full_register.html:269
+#: templates/alsijil/print/full_register.html:310
+#: templates/alsijil/print/full_register.html:370
 msgid "Subj."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:222
-#: templates/alsijil/print/full_register.html:274
+#: templates/alsijil/print/full_register.html:311
+#: templates/alsijil/print/full_register.html:374
 msgid "Te."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:240
-msgid "Yes"
+#: templates/alsijil/print/full_register.html:313
+msgid "Tard."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:242
-#: templates/alsijil/print/full_register.html:314
-#: templates/alsijil/print/full_register.html:324
-msgid "e"
+#: templates/alsijil/print/full_register.html:330
+msgid "Yes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:262
-msgid "Lesson documentation for calendar week"
+#: templates/alsijil/print/full_register.html:335
+#: templates/alsijil/print/full_register.html:424
+#: templates/alsijil/print/full_register.html:439
+msgid "e"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:270
-msgid "Subs."
+#: templates/alsijil/print/full_register.html:363
+msgid "Lesson documentation for week"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:273
+#: templates/alsijil/print/full_register.html:373
 msgid "Notes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:301
-msgid "Lesson cancelled"
+#: views.py:76
+msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr ""
 
-#: templates/alsijil/register_absence.html:5
-#: templates/alsijil/register_absence.html:6
-msgid "Manage absence"
+#: views.py:90
+msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr ""
 
-#: templates/alsijil/week_view.html:6
-msgid "Week view"
+#: views.py:116
+msgid "The lesson documentation has been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:21
-msgid "Select"
+#: views.py:136
+msgid "The personal notes have been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:47
-msgid "Period"
-msgstr ""
-
-#: templates/alsijil/week_view.html:49
-msgid "Teachers"
-msgstr ""
-
-#: templates/alsijil/week_view.html:97
-msgid "unexcused"
+#: views.py:327
+msgid "There is no current school term."
 msgstr ""
 
-#: templates/alsijil/week_view.html:100
-msgid "Summed up tardiness"
-msgstr ""
-
-#: templates/alsijil/week_view.html:122
-msgid "No group selected"
+#: views.py:463
+msgid "The absence has been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:125
-msgid ""
-"\n"
-"            There are no lessons for the selected group, teacher, room or "
-"time.\n"
-"          "
+#: views.py:488
+msgid "The extra mark has been created."
 msgstr ""
 
-#: views.py:56
-msgid ""
-"You either selected an invalid lesson or there is currently no lesson in "
-"progress."
+#: views.py:499
+msgid "The extra mark has been saved."
 msgstr ""
 
-#: views.py:68
-msgid ""
-"You are not allowed to create a lesson documentation for a lesson in the "
-"future."
+#: views.py:509
+msgid "The extra mark has been deleted."
 msgstr ""
 
-#: views.py:306
-msgid "The absence has been saved."
+#: views.py:529
+msgid "The excuse type has been created."
 msgstr ""
 
-#: views.py:344
-msgid "The filter has been saved"
+#: views.py:540
+msgid "The excuse type has been saved."
 msgstr ""
 
-#: views.py:360
-msgid "The filter has been deleted."
+#: views.py:550
+msgid "The excuse type has been deleted."
 msgstr ""
diff --git a/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po
index c91388c7ee373d3a0177a63f06b675a46ad8ed0d..a300bb6d6672106860d862c639afcaf6e254b753 100644
--- a/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/de_DE/LC_MESSAGES/django.po
@@ -7,62 +7,72 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-01 13:20+0200\n"
-"PO-Revision-Date: 2019-11-24 21:56+0000\n"
-"Last-Translator: Tom Teichler <tom.teichler@teckids.org>\n"
-"Language-Team: German <https://translate.edugit.org/projects/aleksis-sis/"
+"POT-Creation-Date: 2020-08-03 20:03+0200\n"
+"PO-Revision-Date: 2020-08-03 18:41+0000\n"
+"Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
+"Language-Team: German <https://translate.edugit.org/projects/aleksis/"
 "aleksis-app-alsijil/de/>\n"
 "Language: de_DE\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.8\n"
+"X-Generator: Weblate 4.0.1\n"
 
-#: forms.py:41
+#: forms.py:25
+msgid "Homework for the next lesson"
+msgstr "Hausaufgabe zur nächsten Stunde"
+
+#: forms.py:50 templates/alsijil/print/full_register.html:199
 msgid "Group"
 msgstr "Gruppe"
 
-#: forms.py:49 templates/alsijil/print/full_register.html:101
+#: forms.py:56 templates/alsijil/print/full_register.html:170
+#: templates/alsijil/print/full_register.html:201
 msgid "Teacher"
 msgstr "Lehrkraft"
 
-#: forms.py:57
-msgid "Room"
-msgstr "Raum"
+#: forms.py:73
+msgid "You can't select a group and a teacher both."
+msgstr "Es kann nur entweder eine Gruppe oder eine Lehrkraft ausgewählt werden."
 
-#: forms.py:70
+#: forms.py:101
 msgid "Start date"
 msgstr "Startdatum"
 
-#: forms.py:73
+#: forms.py:102
 msgid "End date"
 msgstr "Enddatum"
 
-#: forms.py:75
+#: forms.py:103
 msgid "From period"
 msgstr "Ab Stunde"
 
-#: forms.py:77 templates/alsijil/lesson.html:58
+#: forms.py:105 templates/alsijil/class_register/lesson.html:163
 msgid "Person"
 msgstr "Person"
 
-#: forms.py:79 templates/alsijil/lesson.html:59
-#: templates/alsijil/print/full_register.html:223
-#: templates/alsijil/week_view.html:96
+#: forms.py:107 templates/alsijil/class_register/lesson.html:164
+#: templates/alsijil/class_register/week_view.html:109
+#: templates/alsijil/print/full_register.html:75
+#: templates/alsijil/print/full_register.html:312
 msgid "Absent"
 msgstr "Abwesend"
 
-#: forms.py:80 templates/alsijil/lesson.html:61
+#: forms.py:108 templates/alsijil/class_register/lesson.html:166
+#: templates/alsijil/print/full_register.html:84
+#: templates/alsijil/print/full_register.html:275
 msgid "Excused"
 msgstr "Entschuldigt"
 
-#: forms.py:81 templates/alsijil/lesson.html:62
-#: templates/alsijil/print/full_register.html:225
+#: forms.py:109 templates/alsijil/class_register/lesson.html:170
+#: templates/alsijil/class_register/lesson.html:223
+#: templates/alsijil/class_register/lesson.html:231
+#: templates/alsijil/print/full_register.html:314
 msgid "Remarks"
 msgstr "Bemerkungen"
 
-#: menus.py:6 templates/alsijil/print/full_register.html:16
+#: menus.py:6 preferences.py:8 templates/alsijil/print/full_register.html:16
 msgid "Class register"
 msgstr "Klassenbuch"
 
@@ -78,341 +88,558 @@ msgstr "Aktuelle Woche"
 msgid "Register absence"
 msgstr "Abwesenheit eintragen"
 
-#: menus.py:34
-msgid "Personal note filters"
-msgstr "Filter für persönliche Notizen"
+#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8
+#: templates/alsijil/excuse_type/list.html:9
+msgid "Excuse types"
+msgstr "Entschuldigungsarten"
+
+#: menus.py:40 models.py:66 models.py:138
+#: templates/alsijil/class_register/lesson.html:168
+#: templates/alsijil/extra_mark/list.html:8
+#: templates/alsijil/extra_mark/list.html:9
+#: templates/alsijil/print/full_register.html:293
+msgid "Extra marks"
+msgstr "Zusätzliche Markierungen"
+
+#: models.py:18 models.py:124
+msgid "Short name"
+msgstr "Kurzname"
+
+#: models.py:20 models.py:126
+msgid "Name"
+msgstr "Name"
+
+#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167
+#: templates/alsijil/class_register/lesson.html:202
+msgid "Excuse type"
+msgstr "Entschuldigungsart"
+
+#: models.py:75
+msgid "Personal note"
+msgstr "Persönliche Notiz"
+
+#: models.py:76 templates/alsijil/class_register/lesson.html:64
+#: templates/alsijil/class_register/lesson.html:156
+#: templates/alsijil/class_register/week_view.html:104
+msgid "Personal notes"
+msgstr "Persönliche Notizen"
 
-#: models.py:51 templates/alsijil/print/full_register.html:271
+#: models.py:99 templates/alsijil/class_register/week_view.html:56
+#: templates/alsijil/print/full_register.html:371
 msgid "Lesson topic"
 msgstr "Stundenthema"
 
-#: models.py:52 templates/alsijil/print/full_register.html:272
+#: models.py:100 templates/alsijil/print/full_register.html:372
 msgid "Homework"
 msgstr "Hausaufgaben"
 
-#: models.py:68
-msgid "Identifier"
-msgstr "Kennung"
+#: models.py:102
+msgid "Group note"
+msgstr "Gruppennotiz"
+
+#: models.py:106 templates/alsijil/class_register/lesson.html:60
+#: templates/alsijil/class_register/lesson.html:143
+msgid "Lesson documentation"
+msgstr "Stunden-Dokumentation"
+
+#: models.py:107
+msgid "Lesson documentations"
+msgstr "Stunden-Dokumentationen"
 
-#: models.py:71 templates/alsijil/print/full_register.html:178
-msgid "Description"
-msgstr "Beschreibung"
+#: models.py:137
+msgid "Extra mark"
+msgstr "Zusätzliche Markierung"
 
-#: models.py:74
-msgid "Match expression"
-msgstr "Suchausdruck"
+#: preferences.py:16
+msgid "Block adding personal notes for cancelled lessons"
+msgstr ""
+"Blockiere das Hinzufügen von persönlichen Notizen für ausgefallene Stunden"
 
-#: tables.py:14
+#: tables.py:16 tables.py:36
 msgid "Edit"
 msgstr "Bearbeiten"
 
-#: templates/alsijil/lesson.html:5
-#, fuzzy
-#| msgid "Lessons"
+#: tables.py:22 tables.py:42
+msgid "Delete"
+msgstr "Löschen"
+
+#: templates/alsijil/absences/register.html:5
+#: templates/alsijil/absences/register.html:6
+msgid "Manage absence"
+msgstr "Abwesenheiten verwalten"
+
+#: templates/alsijil/class_register/lesson.html:6
 msgid "Lesson"
-msgstr "Unterrichtsstunden"
+msgstr "Unterrichtsstunde"
 
-#: templates/alsijil/lesson.html:34
-msgid "Lesson documentation"
-msgstr "Stunden-Dokumentation"
+#: templates/alsijil/class_register/lesson.html:14
+#: templates/alsijil/class_register/lesson.html:83
+#, python-format
+msgid "%(period)s. period"
+msgstr "%(period)s. Stunde"
+
+#: templates/alsijil/class_register/lesson.html:38
+msgid "Previous lesson"
+msgstr "Vorherige Unterrichtsstunde"
 
-#: templates/alsijil/lesson.html:43
+#: templates/alsijil/class_register/lesson.html:46
+msgid "Next lesson"
+msgstr "Nächste Unterrichtsstunde"
+
+#: templates/alsijil/class_register/lesson.html:68
+#: templates/alsijil/class_register/lesson.html:249
 msgid "Change history"
 msgstr "Veränderungen"
 
-#: templates/alsijil/lesson.html:52 templates/alsijil/week_view.html:91
-msgid "Personal notes"
-msgstr "Persönliche Notizen"
+#: templates/alsijil/class_register/lesson.html:82
+msgid "Overview: Previous lesson"
+msgstr "Ãœbersicht: Vorherige Stunde"
 
-#: templates/alsijil/lesson.html:60
-#: templates/alsijil/print/full_register.html:202
+#: templates/alsijil/class_register/lesson.html:89
+msgid "Lesson topic of previous lesson:"
+msgstr "Stundenthema der vorherigen Stunde:"
+
+#: templates/alsijil/class_register/lesson.html:96
+msgid "Homework for this lesson:"
+msgstr "Hausaufgaben zu dieser Stunde:"
+
+#: templates/alsijil/class_register/lesson.html:103
+msgid "Group notes for previous lesson:"
+msgstr "Gruppennotizen für die vorherige Stunde:"
+
+#: templates/alsijil/class_register/lesson.html:110
+msgid "Absent persons:"
+msgstr "Abwesende Personen:"
+
+#: templates/alsijil/class_register/lesson.html:117
+msgid "Late persons:"
+msgstr "Verspätete Personen:"
+
+#: templates/alsijil/class_register/lesson.html:165
+#: templates/alsijil/print/full_register.html:287
 msgid "Tardiness"
 msgstr "Verspätung"
 
-#: templates/alsijil/manage_personal_note_filter.html:5
-#: templates/alsijil/manage_personal_note_filter.html:6
-msgid "Manage personal note filter"
-msgstr "Filter für persönliche Notizen verwalten"
+#: templates/alsijil/class_register/lesson.html:188
+msgid "Tardiness (in m)"
+msgstr "Verspätung (in m)"
 
-#: templates/alsijil/manage_personal_note_filter.html:11
-#, fuzzy
-#| msgid "Personal note filters"
-msgid "Delete filter"
-msgstr "Filter für persönliche Notizen"
+#: templates/alsijil/class_register/week_view.html:6
+msgid "Week view"
+msgstr "Wochenansicht"
+
+#: templates/alsijil/class_register/week_view.html:27
+msgid "Select"
+msgstr "Auswählen"
+
+#: templates/alsijil/class_register/week_view.html:33
+#, python-format
+msgid "CW %(week)s: %(instance)s"
+msgstr "KW %(week)s: %(instance)s"
+
+#: templates/alsijil/class_register/week_view.html:50
+msgid "Period"
+msgstr "Stunde"
+
+#: templates/alsijil/class_register/week_view.html:52
+msgid "Groups"
+msgstr "Gruppen"
+
+#: templates/alsijil/class_register/week_view.html:54
+#: templates/alsijil/print/full_register.html:169
+#: templates/alsijil/print/full_register.html:200
+msgid "Subject"
+msgstr "Fach"
 
-#: templates/alsijil/personal_note_filters.html:7
-#: templates/alsijil/personal_note_filters.html:8
-msgid "List of all personal note filters"
-msgstr "Liste aller Filter für persönliche Notizen"
+#: templates/alsijil/class_register/week_view.html:55
+msgid "Teachers"
+msgstr "Lehrkräfte"
+
+#: templates/alsijil/class_register/week_view.html:110
+msgid "unexcused"
+msgstr "unentschuldigt"
+
+#: templates/alsijil/class_register/week_view.html:113
+msgid "Summed up tardiness"
+msgstr "Summierte Verspätung"
+
+#: templates/alsijil/class_register/week_view.html:142
+msgid "No lessons available"
+msgstr "Keine Stunden verfügbar"
+
+#: templates/alsijil/class_register/week_view.html:145
+msgid ""
+"\n"
+"            There are no lessons for the selected group or teacher in this week.\n"
+"          "
+msgstr ""
+"\n"
+"            Es gibt keine Stunden für die ausgewählte Gruppe oder Lehrkraft in dieser Woche.\n"
+"          "
+
+#: templates/alsijil/excuse_type/create.html:6
+#: templates/alsijil/excuse_type/create.html:7
+#: templates/alsijil/excuse_type/list.html:16
+msgid "Create excuse type"
+msgstr "Entschuldigungsart erstellen"
 
-#: templates/alsijil/personal_note_filters.html:12
-msgid "Add filter"
+#: templates/alsijil/excuse_type/edit.html:6
+#: templates/alsijil/excuse_type/edit.html:7
+msgid "Edit excuse type"
+msgstr "Entschuldigungsart bearbeiten"
+
+#: templates/alsijil/excuse_type/warning.html:5
+msgid ""
+"\n"
+"      This function should only be used to define alternatives to the default excuse which also will be counted extra.\n"
+"      Don't use this to create a default excuse or if you don't divide between different types of excuse.\n"
+"    "
 msgstr ""
+"\n"
+"      Diese Funktion sollte nur benutzt werden, um Alternativen zur normalen Entschuldigung, welche von sich aus extra gezählt wird, zu definieren.\n"
+"Benutzen Sie diese Funktion nicht, um eine Entschuldigungsart für normale Entschuldigungen zu erstellen oder wenn Sie nicht zwischen verschiedenen Entschuldigungsarten unterscheiden möchten.\n"
+"    "
+
+#: templates/alsijil/extra_mark/create.html:6
+#: templates/alsijil/extra_mark/create.html:7
+#: templates/alsijil/extra_mark/list.html:14
+msgid "Create extra mark"
+msgstr "Zusätzliche Markierung erstellen"
+
+#: templates/alsijil/extra_mark/edit.html:6
+#: templates/alsijil/extra_mark/edit.html:7
+msgid "Edit extra mark"
+msgstr "Zusätzliche Markierung bearbeiten"
+
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:126
+msgid "(e)"
+msgstr "(e)"
 
-#: templates/alsijil/print/full_register.html:22
-#: templates/alsijil/print/full_register.html:54
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:130
+msgid "(u)"
+msgstr "(u)"
+
+#: templates/alsijil/partials/lesson_status_icon.html:6
+msgid "Data complete"
+msgstr "Daten vollständig"
+
+#: templates/alsijil/partials/lesson_status_icon.html:12
+#: templates/alsijil/print/full_register.html:406
+msgid "Lesson cancelled"
+msgstr "Stunde ist ausgefallen"
+
+#: templates/alsijil/partials/lesson_status_icon.html:14
+msgid "Missing data"
+msgstr "Fehlende Daten"
+
+#: templates/alsijil/partials/lesson_status_icon.html:16
+msgid "Pending"
+msgstr "Findet gerade statt"
+
+#: templates/alsijil/partials/lesson_status_icon.html:18
+msgid "Substitution"
+msgstr "Vertretung"
+
+#: templates/alsijil/print/full_register.html:6
+msgid "Class register:"
+msgstr "Klassenbuch:"
+
+#: templates/alsijil/print/full_register.html:26
+#: templates/alsijil/print/full_register.html:59
 msgid "Owners"
 msgstr "Leiter/-innen"
 
-#: templates/alsijil/print/full_register.html:26
+#: templates/alsijil/print/full_register.html:30
 msgid "Printed on"
 msgstr "Gedruckt am"
 
-#: templates/alsijil/print/full_register.html:34
+#: templates/alsijil/print/full_register.html:38
 msgid ""
 "\n"
-"            This printout is intended for archival purposes. The main copy "
-"of\n"
-"            the class register is stored in the AlekSIS School Information\n"
-"            System.\n"
-"          "
+"        This printout is intended for archival purposes. The main copy of\n"
+"        the class register is stored in the AlekSIS School Information\n"
+"        System.\n"
+"      "
 msgstr ""
 "\n"
-"            Dieser Ausdruck ist für Archivierungszwecke gedacht. Die "
-"Hauptkopie\n"
-"            des Klassenbusches ist im AlekSIS-Schul-Informations-System "
-"gespeichert.\n"
-"          "
+"        Dieser Ausdruck ist für Archivierungszwecke gedacht. Die Hauptkopie\n"
+"            des Klassenbuches ist im AlekSIS-Schul-Informations-System gespeichert.\n"
+"      "
 
-#: templates/alsijil/print/full_register.html:41
+#: templates/alsijil/print/full_register.html:45
 msgid ""
 "\n"
-"            Copies of the class register, both digital and as printout, "
-"must\n"
-"            only be kept inside the school and/or on devices authorised by "
-"the\n"
-"            school.\n"
-"          "
+"        Copies of the class register, both digital and as printout, must\n"
+"        only be kept inside the school and/or on devices authorised by the\n"
+"        school.\n"
+"      "
 msgstr ""
 "\n"
-"            Kopien des Klassenbuches, sowohl digital als auch als Ausdruck, "
-"dürfen\n"
-"            ausschließlich in der Schule und/oder auf vonder Schule "
-"autorisierten Geräten\n"
+"        Kopien des Klassenbuches, sowohl digital als auch als Ausdruck, dürfen\n"
+"            ausschließlich in der Schule und/oder auf von der Schule autorisierten Geräten\n"
 "            gespeichert werden.\n"
-"          "
+"      "
 
-#: templates/alsijil/print/full_register.html:48
+#: templates/alsijil/print/full_register.html:52
 msgid ""
 "\n"
-"            The owner of the group and the headteacher confirm the above, "
-"as\n"
-"            well as the correctness of this printout.\n"
-"          "
+"        The owner of the group and the headteacher confirm the above, as\n"
+"        well as the correctness of this printout.\n"
+"      "
 msgstr ""
 "\n"
-"            Die Leitung der Gruppe sowie die Schulleitung bestätigen die "
-"obigen Hinweise sowie\n"
+"        Die Leitung der Gruppe sowie die Schulleitung bestätigen die obigen Hinweise sowie\n"
 "            die Richtigkeit des Ausdrucks.\n"
-"          "
+"      "
 
-#: templates/alsijil/print/full_register.html:55
+#: templates/alsijil/print/full_register.html:62
 msgid "Headteacher"
 msgstr "Schulleitung"
 
-#: templates/alsijil/print/full_register.html:61
+#: templates/alsijil/print/full_register.html:69
+msgid "Abbreviations"
+msgstr "Abkürzungen"
+
+#: templates/alsijil/print/full_register.html:71
+msgid "General"
+msgstr "Allgemein"
+
+#: templates/alsijil/print/full_register.html:78
+msgid "Late"
+msgstr "Verspätet"
+
+#: templates/alsijil/print/full_register.html:81
+#: templates/alsijil/print/full_register.html:283
+msgid "Unexcused"
+msgstr "Unentschuldigt"
+
+#: templates/alsijil/print/full_register.html:89
+msgid "Custom excuse types"
+msgstr "Benutzerdefinierte Entschuldigunsarten"
+
+#: templates/alsijil/print/full_register.html:101
+msgid "Available extra marks"
+msgstr "Verfügbare zusätzliche Markierungen"
+
+#: templates/alsijil/print/full_register.html:115
 msgid "Persons in group"
 msgstr "Personen in der Gruppe"
 
-#: templates/alsijil/print/full_register.html:66
+#: templates/alsijil/print/full_register.html:120
 msgid "No."
 msgstr "Nr."
 
-#: templates/alsijil/print/full_register.html:67
+#: templates/alsijil/print/full_register.html:121
 msgid "Last name"
 msgstr "Nachname"
 
-#: templates/alsijil/print/full_register.html:68
+#: templates/alsijil/print/full_register.html:122
 msgid "First name"
 msgstr "Vorname"
 
-#: templates/alsijil/print/full_register.html:69
+#: templates/alsijil/print/full_register.html:123
 msgid "Sex"
 msgstr "Geschlecht"
 
-#: templates/alsijil/print/full_register.html:70
+#: templates/alsijil/print/full_register.html:124
 msgid "Date of birth"
 msgstr "Geburtsdatum"
 
-#: templates/alsijil/print/full_register.html:71
-#: templates/alsijil/print/full_register.html:200
-msgid "Absences"
-msgstr "Abwesenheiten"
-
-#: templates/alsijil/print/full_register.html:72
-#: templates/alsijil/print/full_register.html:201
-msgid "Unexcused"
-msgstr "Unentschuldigt"
+#: templates/alsijil/print/full_register.html:125
+msgid "(a)"
+msgstr "(a)"
 
-#: templates/alsijil/print/full_register.html:73
-#: templates/alsijil/print/full_register.html:224
-msgid "Tard."
-msgstr "Verspät."
+#: templates/alsijil/print/full_register.html:131
+msgid "(b)"
+msgstr "(b)"
 
-#: templates/alsijil/print/full_register.html:95
+#: templates/alsijil/print/full_register.html:164
 msgid "Teachers and lessons in group"
 msgstr "Lehrkräfte und Fächer der Gruppe"
 
-#: templates/alsijil/print/full_register.html:100
-#: templates/alsijil/week_view.html:48
-msgid "Subject"
-msgstr "Fach"
-
-#: templates/alsijil/print/full_register.html:102
+#: templates/alsijil/print/full_register.html:171
+#: templates/alsijil/print/full_register.html:202
 msgid "Lesson start"
 msgstr "Unterrichtsbeginn"
 
-#: templates/alsijil/print/full_register.html:103
+#: templates/alsijil/print/full_register.html:172
+#: templates/alsijil/print/full_register.html:203
 msgid "Lesson end"
 msgstr "Unterrichtsende"
 
-#: templates/alsijil/print/full_register.html:104
+#: templates/alsijil/print/full_register.html:173
+#: templates/alsijil/print/full_register.html:204
 msgid "Per week"
 msgstr "Pro Woche"
 
-#: templates/alsijil/print/full_register.html:124
+#: templates/alsijil/print/full_register.html:194
+msgid "Teachers and lessons in child groups"
+msgstr "Lehrkräfte und Fächer von Untergruppen"
+
+#: templates/alsijil/print/full_register.html:227
 msgid "Personal overview"
 msgstr "Persönliche Übersicht"
 
-#: templates/alsijil/print/full_register.html:126
+#: templates/alsijil/print/full_register.html:229
 msgid "Contact details"
 msgstr "Kontaktdetails"
 
-#: templates/alsijil/print/full_register.html:174
-msgid "Statistics on remarks"
-msgstr "Statistiken zu Bemerkungen"
-
-#: templates/alsijil/print/full_register.html:179
-msgid "Count"
-msgstr "Anzahl"
-
-#: templates/alsijil/print/full_register.html:196
+#: templates/alsijil/print/full_register.html:266
 msgid "Absences and tardiness"
 msgstr "Abwesenheiten und Verspätungen"
 
-#: templates/alsijil/print/full_register.html:215
+#: templates/alsijil/print/full_register.html:269
+msgid "Absences"
+msgstr "Absenzen"
+
+#: templates/alsijil/print/full_register.html:274
+msgid "thereof"
+msgstr "davon"
+
+#: templates/alsijil/print/full_register.html:304
 msgid "Relevant personal notes"
 msgstr "Relevante persönliche Notizen"
 
-#: templates/alsijil/print/full_register.html:219
+#: templates/alsijil/print/full_register.html:308
 msgid "Date"
 msgstr "Datum"
 
-#: templates/alsijil/print/full_register.html:220
-#: templates/alsijil/print/full_register.html:268
+#: templates/alsijil/print/full_register.html:309
+#: templates/alsijil/print/full_register.html:369
 msgid "Pe."
 msgstr "Std."
 
-#: templates/alsijil/print/full_register.html:221
-#: templates/alsijil/print/full_register.html:269
+#: templates/alsijil/print/full_register.html:310
+#: templates/alsijil/print/full_register.html:370
 msgid "Subj."
 msgstr "Fa."
 
-#: templates/alsijil/print/full_register.html:222
-#: templates/alsijil/print/full_register.html:274
+#: templates/alsijil/print/full_register.html:311
+#: templates/alsijil/print/full_register.html:374
 msgid "Te."
 msgstr "Lk."
 
-#: templates/alsijil/print/full_register.html:240
+#: templates/alsijil/print/full_register.html:313
+msgid "Tard."
+msgstr "Verspät."
+
+#: templates/alsijil/print/full_register.html:330
 msgid "Yes"
 msgstr "Ja"
 
-#: templates/alsijil/print/full_register.html:242
-#: templates/alsijil/print/full_register.html:314
-#: templates/alsijil/print/full_register.html:324
+#: templates/alsijil/print/full_register.html:335
+#: templates/alsijil/print/full_register.html:424
+#: templates/alsijil/print/full_register.html:439
 msgid "e"
 msgstr "e"
 
-#: templates/alsijil/print/full_register.html:262
-msgid "Lesson documentation for calendar week"
-msgstr "Unterrichtsdokumentation für Kalenderwoche"
-
-#: templates/alsijil/print/full_register.html:270
-msgid "Subs."
-msgstr "Vertr."
+#: templates/alsijil/print/full_register.html:363
+msgid "Lesson documentation for week"
+msgstr "Unterrichtsdokumentation für Woche"
 
-#: templates/alsijil/print/full_register.html:273
+#: templates/alsijil/print/full_register.html:373
 msgid "Notes"
 msgstr "Notizen"
 
-#: templates/alsijil/print/full_register.html:301
-msgid "Lesson cancelled"
-msgstr "Stunde ist ausgefallen"
+#: views.py:76
+msgid "You either selected an invalid lesson or there is currently no lesson in progress."
+msgstr ""
+"Sie haben eine ungültige Stunde ausgewählt oder es\n"
+"      läuft momentan keine Stunde."
 
-#: templates/alsijil/register_absence.html:5
-#: templates/alsijil/register_absence.html:6
-msgid "Manage absence"
-msgstr "Abwesenheiten verwalten"
+#: views.py:90
+msgid "You are not allowed to create a lesson documentation for a lesson in the future."
+msgstr "Ihnen ist es nicht erlaubt, eine Eintragung für eine Unterrichtsstunde in der Zukunft vorzunehmen."
 
-#: templates/alsijil/week_view.html:6
-#, fuzzy
-#| msgid "Week"
-msgid "Week view"
-msgstr "Woche"
+#: views.py:116
+msgid "The lesson documentation has been saved."
+msgstr "Die Stunden-Dokumentation wurde gespeichert."
 
-#: templates/alsijil/week_view.html:21
-msgid "Select"
-msgstr "Auswählen"
+#: views.py:136
+msgid "The personal notes have been saved."
+msgstr "Die persönlichen Notizen wurden gespeichert."
 
-#: templates/alsijil/week_view.html:47
-msgid "Period"
-msgstr "Stunde"
+#: views.py:327
+msgid "There is no current school term."
+msgstr "Es gibt aktuell kein Schuljahr."
 
-#: templates/alsijil/week_view.html:49
-msgid "Teachers"
-msgstr "Lehrkräfte"
+#: views.py:463
+msgid "The absence has been saved."
+msgstr "Die Abwesenheit wurde gespeichert."
 
-#: templates/alsijil/week_view.html:97
-msgid "unexcused"
-msgstr "unentschuldigt"
+#: views.py:488
+msgid "The extra mark has been created."
+msgstr "Die zusätzliche Markierung wurde erstellt."
 
-#: templates/alsijil/week_view.html:100
-msgid "Summed up tardiness"
-msgstr "Summierte Verspätung"
+#: views.py:499
+msgid "The extra mark has been saved."
+msgstr "Die zusätzliche Markierung wurde gespeichert."
 
-#: templates/alsijil/week_view.html:122
-msgid "No group selected"
-msgstr "Keine Gruppe ausgewählt"
+#: views.py:509
+msgid "The extra mark has been deleted."
+msgstr "Die zusätzliche Markierung wurde gelöscht."
 
-#: templates/alsijil/week_view.html:125
-msgid ""
-"\n"
-"            There are no lessons for the selected group, teacher, room or "
-"time.\n"
-"          "
-msgstr ""
-"\n"
-"            Es gibt keine Stunden für die ausgewählte Gruppe, den Lehrer "
-"oder Raum.\n"
-"          "
+#: views.py:529
+msgid "The excuse type has been created."
+msgstr "Die Entschuldigungsart wurde erstellt."
 
-#: views.py:56
-msgid ""
-"You either selected an invalid lesson or there is currently no lesson in "
-"progress."
-msgstr ""
-"Sie haben eine ungültige Stunde ausgewählt oder es\n"
-"      läuft momentan keine Stunde."
+#: views.py:540
+msgid "The excuse type has been saved."
+msgstr "Die Entschuldigunsart wurde gespeichert."
 
-#: views.py:68
-msgid ""
-"You are not allowed to create a lesson documentation for a lesson in the "
-"future."
-msgstr ""
-"Ihnen ist es nicht erlaubt, eine Eintragung für eine Unterrichtsstunde in "
-"der Zukunft vorzunehmen."
+#: views.py:550
+msgid "The excuse type has been deleted."
+msgstr "Die Entschuldigungsart wurde gelöscht."
 
-#: views.py:306
-msgid "The absence has been saved."
-msgstr "Die Abwesenheit wurde gespeichert."
+#~ msgid "Personal note filters"
+#~ msgstr "Filter für persönliche Notizen"
+
+#~ msgid "Identifier"
+#~ msgstr "Kennung"
+
+#~ msgid "Description"
+#~ msgstr "Beschreibung"
+
+#~ msgid "Match expression"
+#~ msgstr "Suchausdruck"
+
+#~ msgid "Personal note filter"
+#~ msgstr "Filter für persönliche Notizen"
+
+#~ msgid "All personal note filters"
+#~ msgstr "Alle Filter für persönliche Notizen"
+
+#~ msgid "Add filter"
+#~ msgstr "Filter hinzufügen"
+
+#~ msgid "Update personal note filter"
+#~ msgstr "Filter für persönliche Notizen aktualisieren"
+
+#~ msgid "Create personal note filter"
+#~ msgstr "Filter für persönliche Notizen erstellen"
+
+#~ msgid "Delete filter"
+#~ msgstr "Filter löschen"
+
+#~ msgid "Statistics on remarks"
+#~ msgstr "Statistiken zu Bemerkungen"
+
+#~ msgid "Count"
+#~ msgstr "Anzahl"
+
+#~ msgid "Room"
+#~ msgstr "Raum"
+
+#~ msgid "List of all personal note filters"
+#~ msgstr "Liste aller Filter für persönliche Notizen"
 
-#: views.py:344
-msgid "The filter has been saved"
-msgstr "Der Filter wurde gespeichert"
+#~ msgid "Subs."
+#~ msgstr "Vertr."
 
-#: views.py:360
-msgid "The filter has been deleted."
-msgstr "Der Filter wurde gespeichert."
+#~ msgid "No group selected"
+#~ msgstr "Keine Gruppe ausgewählt"
 
 #~ msgid "Save"
 #~ msgstr "Speichern"
diff --git a/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po
index c491f8a74e0717b777be7d612eed4eade787bcf7..fa8b44b705f77e077073e91f7c27d6deb92aee7f 100644
--- a/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/fr/LC_MESSAGES/django.po
@@ -3,380 +3,649 @@
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-01 13:20+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
+"POT-Creation-Date: 2020-08-03 20:03+0200\n"
+"PO-Revision-Date: 2020-07-26 14:08+0000\n"
+"Last-Translator: Marlene Grundey <grundema@katharineum.de>\n"
+"Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/fr/>\n"
+"Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.0.1\n"
 
-#: forms.py:41
-msgid "Group"
+#: forms.py:25
+msgid "Homework for the next lesson"
 msgstr ""
 
-#: forms.py:49 templates/alsijil/print/full_register.html:101
+#: forms.py:50 templates/alsijil/print/full_register.html:199
+msgid "Group"
+msgstr "Groupe"
+
+#: forms.py:56 templates/alsijil/print/full_register.html:170
+#: templates/alsijil/print/full_register.html:201
 msgid "Teacher"
-msgstr ""
+msgstr "Profs"
 
-#: forms.py:57
-msgid "Room"
+#: forms.py:73
+msgid "You can't select a group and a teacher both."
 msgstr ""
 
-#: forms.py:70
+#: forms.py:101
 msgid "Start date"
-msgstr ""
+msgstr "Date de début"
 
-#: forms.py:73
+#: forms.py:102
 msgid "End date"
-msgstr ""
+msgstr "Date de fin"
 
-#: forms.py:75
+#: forms.py:103
 msgid "From period"
-msgstr ""
+msgstr "De la période"
 
-#: forms.py:77 templates/alsijil/lesson.html:58
+#: forms.py:105 templates/alsijil/class_register/lesson.html:163
 msgid "Person"
-msgstr ""
+msgstr "Personne"
 
-#: forms.py:79 templates/alsijil/lesson.html:59
-#: templates/alsijil/print/full_register.html:223
-#: templates/alsijil/week_view.html:96
+#: forms.py:107 templates/alsijil/class_register/lesson.html:164
+#: templates/alsijil/class_register/week_view.html:109
+#: templates/alsijil/print/full_register.html:75
+#: templates/alsijil/print/full_register.html:312
 msgid "Absent"
-msgstr ""
+msgstr "Absent(e)"
 
-#: forms.py:80 templates/alsijil/lesson.html:61
+#: forms.py:108 templates/alsijil/class_register/lesson.html:166
+#: templates/alsijil/print/full_register.html:84
+#: templates/alsijil/print/full_register.html:275
 msgid "Excused"
-msgstr ""
+msgstr "Excusé"
 
-#: forms.py:81 templates/alsijil/lesson.html:62
-#: templates/alsijil/print/full_register.html:225
+#: forms.py:109 templates/alsijil/class_register/lesson.html:170
+#: templates/alsijil/class_register/lesson.html:223
+#: templates/alsijil/class_register/lesson.html:231
+#: templates/alsijil/print/full_register.html:314
 msgid "Remarks"
-msgstr ""
+msgstr "Remarque"
 
-#: menus.py:6 templates/alsijil/print/full_register.html:16
+#: menus.py:6 preferences.py:8 templates/alsijil/print/full_register.html:16
 msgid "Class register"
-msgstr ""
+msgstr "Registre de la classe"
 
 #: menus.py:16
 msgid "Current lesson"
-msgstr ""
+msgstr "Lecon actuelle"
 
 #: menus.py:22
 msgid "Current week"
-msgstr ""
+msgstr "Semaine actuelle"
 
 #: menus.py:28
 msgid "Register absence"
+msgstr "Registre de Absence"
+
+#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8
+#: templates/alsijil/excuse_type/list.html:9
+#, fuzzy
+#| msgid "Excused"
+msgid "Excuse types"
+msgstr "Excusé"
+
+#: menus.py:40 models.py:66 models.py:138
+#: templates/alsijil/class_register/lesson.html:168
+#: templates/alsijil/extra_mark/list.html:8
+#: templates/alsijil/extra_mark/list.html:9
+#: templates/alsijil/print/full_register.html:293
+msgid "Extra marks"
 msgstr ""
 
-#: menus.py:34
-msgid "Personal note filters"
+#: models.py:18 models.py:124
+#, fuzzy
+#| msgid "First name"
+msgid "Short name"
+msgstr "Prénom"
+
+#: models.py:20 models.py:126
+msgid "Name"
 msgstr ""
 
-#: models.py:51 templates/alsijil/print/full_register.html:271
+#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167
+#: templates/alsijil/class_register/lesson.html:202
+#, fuzzy
+#| msgid "Excused"
+msgid "Excuse type"
+msgstr "Excusé"
+
+#: models.py:75
+#, fuzzy
+#| msgid "Personal notes"
+msgid "Personal note"
+msgstr "Notes personnelles"
+
+#: models.py:76 templates/alsijil/class_register/lesson.html:64
+#: templates/alsijil/class_register/lesson.html:156
+#: templates/alsijil/class_register/week_view.html:104
+msgid "Personal notes"
+msgstr "Notes personnelles"
+
+#: models.py:99 templates/alsijil/class_register/week_view.html:56
+#: templates/alsijil/print/full_register.html:371
 msgid "Lesson topic"
-msgstr ""
+msgstr "Sujet de cours"
 
-#: models.py:52 templates/alsijil/print/full_register.html:272
+#: models.py:100 templates/alsijil/print/full_register.html:372
 msgid "Homework"
-msgstr ""
+msgstr "Devoirs"
 
-#: models.py:68
-msgid "Identifier"
-msgstr ""
+#: models.py:102
+#, fuzzy
+#| msgid "Group"
+msgid "Group note"
+msgstr "Groupe"
 
-#: models.py:71 templates/alsijil/print/full_register.html:178
-msgid "Description"
+#: models.py:106 templates/alsijil/class_register/lesson.html:60
+#: templates/alsijil/class_register/lesson.html:143
+msgid "Lesson documentation"
+msgstr "Documentation de cours"
+
+#: models.py:107
+#, fuzzy
+#| msgid "Lesson documentation"
+msgid "Lesson documentations"
+msgstr "Documentation de cours"
+
+#: models.py:137
+msgid "Extra mark"
 msgstr ""
 
-#: models.py:74
-msgid "Match expression"
+#: preferences.py:16
+msgid "Block adding personal notes for cancelled lessons"
 msgstr ""
 
-#: tables.py:14
+#: tables.py:16 tables.py:36
 msgid "Edit"
 msgstr ""
 
-#: templates/alsijil/lesson.html:5
-msgid "Lesson"
+#: tables.py:22 tables.py:42
+msgid "Delete"
 msgstr ""
 
-#: templates/alsijil/lesson.html:34
-msgid "Lesson documentation"
+#: templates/alsijil/absences/register.html:5
+#: templates/alsijil/absences/register.html:6
+msgid "Manage absence"
 msgstr ""
 
-#: templates/alsijil/lesson.html:43
+#: templates/alsijil/class_register/lesson.html:6
+msgid "Lesson"
+msgstr "Cours"
+
+#: templates/alsijil/class_register/lesson.html:14
+#: templates/alsijil/class_register/lesson.html:83
+#, fuzzy, python-format
+#| msgid "From period"
+msgid "%(period)s. period"
+msgstr "De la période"
+
+#: templates/alsijil/class_register/lesson.html:38
+#, fuzzy
+#| msgid "Current lesson"
+msgid "Previous lesson"
+msgstr "Lecon actuelle"
+
+#: templates/alsijil/class_register/lesson.html:46
+#, fuzzy
+#| msgid "Current lesson"
+msgid "Next lesson"
+msgstr "Lecon actuelle"
+
+#: templates/alsijil/class_register/lesson.html:68
+#: templates/alsijil/class_register/lesson.html:249
 msgid "Change history"
-msgstr ""
+msgstr "Changement d' histoire"
 
-#: templates/alsijil/lesson.html:52 templates/alsijil/week_view.html:91
-msgid "Personal notes"
+#: templates/alsijil/class_register/lesson.html:82
+msgid "Overview: Previous lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:60
-#: templates/alsijil/print/full_register.html:202
-msgid "Tardiness"
+#: templates/alsijil/class_register/lesson.html:89
+msgid "Lesson topic of previous lesson:"
 msgstr ""
 
-#: templates/alsijil/manage_personal_note_filter.html:5
-#: templates/alsijil/manage_personal_note_filter.html:6
-msgid "Manage personal note filter"
+#: templates/alsijil/class_register/lesson.html:96
+msgid "Homework for this lesson:"
 msgstr ""
 
-#: templates/alsijil/manage_personal_note_filter.html:11
-msgid "Delete filter"
+#: templates/alsijil/class_register/lesson.html:103
+msgid "Group notes for previous lesson:"
 msgstr ""
 
-#: templates/alsijil/personal_note_filters.html:7
-#: templates/alsijil/personal_note_filters.html:8
-msgid "List of all personal note filters"
-msgstr ""
+#: templates/alsijil/class_register/lesson.html:110
+#, fuzzy
+#| msgid "Absences"
+msgid "Absent persons:"
+msgstr "Absences"
 
-#: templates/alsijil/personal_note_filters.html:12
-msgid "Add filter"
+#: templates/alsijil/class_register/lesson.html:117
+msgid "Late persons:"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:22
-#: templates/alsijil/print/full_register.html:54
-msgid "Owners"
+#: templates/alsijil/class_register/lesson.html:165
+#: templates/alsijil/print/full_register.html:287
+msgid "Tardiness"
+msgstr "Retard"
+
+#: templates/alsijil/class_register/lesson.html:188
+#, fuzzy
+#| msgid "Tardiness"
+msgid "Tardiness (in m)"
+msgstr "Retard"
+
+#: templates/alsijil/class_register/week_view.html:6
+msgid "Week view"
+msgstr "Vue de semaine"
+
+#: templates/alsijil/class_register/week_view.html:27
+msgid "Select"
+msgstr "Sélectionner"
+
+#: templates/alsijil/class_register/week_view.html:33
+#, python-format
+msgid "CW %(week)s: %(instance)s"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:26
-msgid "Printed on"
+#: templates/alsijil/class_register/week_view.html:50
+msgid "Period"
+msgstr "Période"
+
+#: templates/alsijil/class_register/week_view.html:52
+#, fuzzy
+#| msgid "Group"
+msgid "Groups"
+msgstr "Groupe"
+
+#: templates/alsijil/class_register/week_view.html:54
+#: templates/alsijil/print/full_register.html:169
+#: templates/alsijil/print/full_register.html:200
+msgid "Subject"
+msgstr "Sujet"
+
+#: templates/alsijil/class_register/week_view.html:55
+msgid "Teachers"
+msgstr "Profs"
+
+#: templates/alsijil/class_register/week_view.html:110
+msgid "unexcused"
+msgstr "Injustifié(e)"
+
+#: templates/alsijil/class_register/week_view.html:113
+msgid "Summed up tardiness"
+msgstr "Résumé des retards"
+
+#: templates/alsijil/class_register/week_view.html:142
+msgid "No lessons available"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:34
+#: templates/alsijil/class_register/week_view.html:145
+#, fuzzy
+#| msgid ""
+#| "\n"
+#| "            There are no lessons for the selected group, teacher, room or time.\n"
+#| "          "
 msgid ""
 "\n"
-"            This printout is intended for archival purposes. The main copy "
-"of\n"
-"            the class register is stored in the AlekSIS School Information\n"
-"            System.\n"
+"            There are no lessons for the selected group or teacher in this week.\n"
 "          "
 msgstr ""
-
-#: templates/alsijil/print/full_register.html:41
-msgid ""
 "\n"
-"            Copies of the class register, both digital and as printout, "
-"must\n"
-"            only be kept inside the school and/or on devices authorised by "
-"the\n"
-"            school.\n"
+"            Il n' y a pas des cours pour le groupe sélectionné, les profs, le salle ou le temps.\n"
 "          "
+
+#: templates/alsijil/excuse_type/create.html:6
+#: templates/alsijil/excuse_type/create.html:7
+#: templates/alsijil/excuse_type/list.html:16
+msgid "Create excuse type"
+msgstr ""
+
+#: templates/alsijil/excuse_type/edit.html:6
+#: templates/alsijil/excuse_type/edit.html:7
+msgid "Edit excuse type"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:48
+#: templates/alsijil/excuse_type/warning.html:5
 msgid ""
 "\n"
-"            The owner of the group and the headteacher confirm the above, "
-"as\n"
-"            well as the correctness of this printout.\n"
-"          "
+"      This function should only be used to define alternatives to the default excuse which also will be counted extra.\n"
+"      Don't use this to create a default excuse or if you don't divide between different types of excuse.\n"
+"    "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:55
-msgid "Headteacher"
+#: templates/alsijil/extra_mark/create.html:6
+#: templates/alsijil/extra_mark/create.html:7
+#: templates/alsijil/extra_mark/list.html:14
+msgid "Create extra mark"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:61
-msgid "Persons in group"
+#: templates/alsijil/extra_mark/edit.html:6
+#: templates/alsijil/extra_mark/edit.html:7
+msgid "Edit extra mark"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:66
-msgid "No."
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:126
+msgid "(e)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:67
-msgid "Last name"
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:130
+msgid "(u)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:68
-msgid "First name"
+#: templates/alsijil/partials/lesson_status_icon.html:6
+msgid "Data complete"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:69
-msgid "Sex"
-msgstr ""
+#: templates/alsijil/partials/lesson_status_icon.html:12
+#: templates/alsijil/print/full_register.html:406
+msgid "Lesson cancelled"
+msgstr "Cours annulés"
 
-#: templates/alsijil/print/full_register.html:70
-msgid "Date of birth"
+#: templates/alsijil/partials/lesson_status_icon.html:14
+msgid "Missing data"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:71
-#: templates/alsijil/print/full_register.html:200
-msgid "Absences"
+#: templates/alsijil/partials/lesson_status_icon.html:16
+msgid "Pending"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:72
-#: templates/alsijil/print/full_register.html:201
-msgid "Unexcused"
+#: templates/alsijil/partials/lesson_status_icon.html:18
+msgid "Substitution"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:73
-#: templates/alsijil/print/full_register.html:224
-msgid "Tard."
+#: templates/alsijil/print/full_register.html:6
+#, fuzzy
+#| msgid "Class register"
+msgid "Class register:"
+msgstr "Registre de la classe"
+
+#: templates/alsijil/print/full_register.html:26
+#: templates/alsijil/print/full_register.html:59
+msgid "Owners"
+msgstr "Propriétaires"
+
+#: templates/alsijil/print/full_register.html:30
+msgid "Printed on"
+msgstr "Imprimé sur"
+
+#: templates/alsijil/print/full_register.html:38
+msgid ""
+"\n"
+"        This printout is intended for archival purposes. The main copy of\n"
+"        the class register is stored in the AlekSIS School Information\n"
+"        System.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:95
-msgid "Teachers and lessons in group"
+#: templates/alsijil/print/full_register.html:45
+msgid ""
+"\n"
+"        Copies of the class register, both digital and as printout, must\n"
+"        only be kept inside the school and/or on devices authorised by the\n"
+"        school.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:100
-#: templates/alsijil/week_view.html:48
-msgid "Subject"
+#: templates/alsijil/print/full_register.html:52
+msgid ""
+"\n"
+"        The owner of the group and the headteacher confirm the above, as\n"
+"        well as the correctness of this printout.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:102
-msgid "Lesson start"
+#: templates/alsijil/print/full_register.html:62
+msgid "Headteacher"
+msgstr "Prof principale"
+
+#: templates/alsijil/print/full_register.html:69
+msgid "Abbreviations"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:103
-msgid "Lesson end"
+#: templates/alsijil/print/full_register.html:71
+msgid "General"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:104
-msgid "Per week"
+#: templates/alsijil/print/full_register.html:78
+msgid "Late"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:124
-msgid "Personal overview"
+#: templates/alsijil/print/full_register.html:81
+#: templates/alsijil/print/full_register.html:283
+msgid "Unexcused"
+msgstr "injustifié(e)"
+
+#: templates/alsijil/print/full_register.html:89
+msgid "Custom excuse types"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:126
-msgid "Contact details"
+#: templates/alsijil/print/full_register.html:101
+msgid "Available extra marks"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:174
-msgid "Statistics on remarks"
+#: templates/alsijil/print/full_register.html:115
+msgid "Persons in group"
+msgstr "Personnes en groupe"
+
+#: templates/alsijil/print/full_register.html:120
+msgid "No."
+msgstr "Non."
+
+#: templates/alsijil/print/full_register.html:121
+msgid "Last name"
+msgstr "Nom de famille"
+
+#: templates/alsijil/print/full_register.html:122
+msgid "First name"
+msgstr "Prénom"
+
+#: templates/alsijil/print/full_register.html:123
+msgid "Sex"
+msgstr "Sexe"
+
+#: templates/alsijil/print/full_register.html:124
+msgid "Date of birth"
+msgstr "Date d'anniversaire"
+
+#: templates/alsijil/print/full_register.html:125
+msgid "(a)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:179
-msgid "Count"
+#: templates/alsijil/print/full_register.html:131
+msgid "(b)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:196
+#: templates/alsijil/print/full_register.html:164
+msgid "Teachers and lessons in group"
+msgstr "Profs et cours en groupe"
+
+#: templates/alsijil/print/full_register.html:171
+#: templates/alsijil/print/full_register.html:202
+msgid "Lesson start"
+msgstr "Début de cours"
+
+#: templates/alsijil/print/full_register.html:172
+#: templates/alsijil/print/full_register.html:203
+msgid "Lesson end"
+msgstr "Fin de cours"
+
+#: templates/alsijil/print/full_register.html:173
+#: templates/alsijil/print/full_register.html:204
+msgid "Per week"
+msgstr "Par semaine"
+
+#: templates/alsijil/print/full_register.html:194
+#, fuzzy
+#| msgid "Teachers and lessons in group"
+msgid "Teachers and lessons in child groups"
+msgstr "Profs et cours en groupe"
+
+#: templates/alsijil/print/full_register.html:227
+msgid "Personal overview"
+msgstr "Vue d'ensemble personnelle"
+
+#: templates/alsijil/print/full_register.html:229
+msgid "Contact details"
+msgstr "Détails de contact"
+
+#: templates/alsijil/print/full_register.html:266
 msgid "Absences and tardiness"
+msgstr "Absences et retards"
+
+#: templates/alsijil/print/full_register.html:269
+msgid "Absences"
+msgstr "Absences"
+
+#: templates/alsijil/print/full_register.html:274
+msgid "thereof"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:215
+#: templates/alsijil/print/full_register.html:304
 msgid "Relevant personal notes"
-msgstr ""
+msgstr "Notes personnelles importantes"
 
-#: templates/alsijil/print/full_register.html:219
+#: templates/alsijil/print/full_register.html:308
 msgid "Date"
-msgstr ""
+msgstr "Date"
 
-#: templates/alsijil/print/full_register.html:220
-#: templates/alsijil/print/full_register.html:268
+#: templates/alsijil/print/full_register.html:309
+#: templates/alsijil/print/full_register.html:369
 msgid "Pe."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:221
-#: templates/alsijil/print/full_register.html:269
+#: templates/alsijil/print/full_register.html:310
+#: templates/alsijil/print/full_register.html:370
 msgid "Subj."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:222
-#: templates/alsijil/print/full_register.html:274
+#: templates/alsijil/print/full_register.html:311
+#: templates/alsijil/print/full_register.html:374
 msgid "Te."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:240
-msgid "Yes"
+#: templates/alsijil/print/full_register.html:313
+msgid "Tard."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:242
-#: templates/alsijil/print/full_register.html:314
-#: templates/alsijil/print/full_register.html:324
-msgid "e"
-msgstr ""
+#: templates/alsijil/print/full_register.html:330
+msgid "Yes"
+msgstr "Oui"
 
-#: templates/alsijil/print/full_register.html:262
-msgid "Lesson documentation for calendar week"
-msgstr ""
+#: templates/alsijil/print/full_register.html:335
+#: templates/alsijil/print/full_register.html:424
+#: templates/alsijil/print/full_register.html:439
+msgid "e"
+msgstr "e"
 
-#: templates/alsijil/print/full_register.html:270
-msgid "Subs."
-msgstr ""
+#: templates/alsijil/print/full_register.html:363
+#, fuzzy
+#| msgid "Lesson documentation for calendar week"
+msgid "Lesson documentation for week"
+msgstr "Documentation de cours pour la semaine calendrier"
 
-#: templates/alsijil/print/full_register.html:273
+#: templates/alsijil/print/full_register.html:373
 msgid "Notes"
-msgstr ""
+msgstr "Notes"
 
-#: templates/alsijil/print/full_register.html:301
-msgid "Lesson cancelled"
+#: views.py:76
+msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr ""
 
-#: templates/alsijil/register_absence.html:5
-#: templates/alsijil/register_absence.html:6
-msgid "Manage absence"
+#: views.py:90
+msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr ""
 
-#: templates/alsijil/week_view.html:6
-msgid "Week view"
-msgstr ""
+#: views.py:116
+#, fuzzy
+#| msgid "Lesson documentation for calendar week"
+msgid "The lesson documentation has been saved."
+msgstr "Documentation de cours pour la semaine calendrier"
 
-#: templates/alsijil/week_view.html:21
-msgid "Select"
+#: views.py:136
+msgid "The personal notes have been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:47
-msgid "Period"
+#: views.py:327
+msgid "There is no current school term."
 msgstr ""
 
-#: templates/alsijil/week_view.html:49
-msgid "Teachers"
+#: views.py:463
+msgid "The absence has been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:97
-msgid "unexcused"
-msgstr ""
+#: views.py:488
+#, fuzzy
+#| msgid "Lesson documentation for calendar week"
+msgid "The extra mark has been created."
+msgstr "Documentation de cours pour la semaine calendrier"
 
-#: templates/alsijil/week_view.html:100
-msgid "Summed up tardiness"
-msgstr ""
+#: views.py:499
+#, fuzzy
+#| msgid "Lesson documentation for calendar week"
+msgid "The extra mark has been saved."
+msgstr "Documentation de cours pour la semaine calendrier"
 
-#: templates/alsijil/week_view.html:122
-msgid "No group selected"
+#: views.py:509
+msgid "The extra mark has been deleted."
 msgstr ""
 
-#: templates/alsijil/week_view.html:125
-msgid ""
-"\n"
-"            There are no lessons for the selected group, teacher, room or "
-"time.\n"
-"          "
+#: views.py:529
+msgid "The excuse type has been created."
 msgstr ""
 
-#: views.py:56
-msgid ""
-"You either selected an invalid lesson or there is currently no lesson in "
-"progress."
+#: views.py:540
+msgid "The excuse type has been saved."
 msgstr ""
 
-#: views.py:68
-msgid ""
-"You are not allowed to create a lesson documentation for a lesson in the "
-"future."
+#: views.py:550
+msgid "The excuse type has been deleted."
 msgstr ""
 
-#: views.py:306
-msgid "The absence has been saved."
-msgstr ""
+#~ msgid "Personal note filters"
+#~ msgstr "Filtres de notes personnelles"
 
-#: views.py:344
-msgid "The filter has been saved"
-msgstr ""
+#~ msgid "Identifier"
+#~ msgstr "Identificateur"
 
-#: views.py:360
-msgid "The filter has been deleted."
-msgstr ""
+#~ msgid "Description"
+#~ msgstr "Description"
+
+#, fuzzy
+#~| msgid "Personal note filters"
+#~ msgid "Personal note filter"
+#~ msgstr "Filtres de notes personnelles"
+
+#, fuzzy
+#~| msgid "Personal note filters"
+#~ msgid "All personal note filters"
+#~ msgstr "Filtres de notes personnelles"
+
+#, fuzzy
+#~| msgid "Personal note filters"
+#~ msgid "Update personal note filter"
+#~ msgstr "Filtres de notes personnelles"
+
+#, fuzzy
+#~| msgid "Personal note filters"
+#~ msgid "Create personal note filter"
+#~ msgstr "Filtres de notes personnelles"
+
+#~ msgid "Count"
+#~ msgstr "Compter"
+
+#~ msgid "Room"
+#~ msgstr "Salle"
+
+#~ msgid "List of all personal note filters"
+#~ msgstr "Liste de filtres de notes personnelles"
diff --git a/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po
index 1b9dbace2c6602f12f716c93ba7b9853400790d4..8d23b91ba87783c3e16698f4626b6949de23f1f1 100644
--- a/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/la/LC_MESSAGES/django.po
@@ -3,64 +3,75 @@
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-01 13:20+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
+"POT-Creation-Date: 2020-08-03 20:03+0200\n"
+"PO-Revision-Date: 2020-07-26 14:08+0000\n"
+"Last-Translator: Julian <leuckerj@gmail.com>\n"
+"Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis-app-alsijil/la/>\n"
+"Language: la\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.0.1\n"
 
-#: forms.py:41
-msgid "Group"
+#: forms.py:25
+msgid "Homework for the next lesson"
 msgstr ""
 
-#: forms.py:49 templates/alsijil/print/full_register.html:101
+#: forms.py:50 templates/alsijil/print/full_register.html:199
+msgid "Group"
+msgstr "Grex"
+
+#: forms.py:56 templates/alsijil/print/full_register.html:170
+#: templates/alsijil/print/full_register.html:201
 msgid "Teacher"
 msgstr ""
 
-#: forms.py:57
-msgid "Room"
+#: forms.py:73
+msgid "You can't select a group and a teacher both."
 msgstr ""
 
-#: forms.py:70
+#: forms.py:101
 msgid "Start date"
 msgstr ""
 
-#: forms.py:73
+#: forms.py:102
 msgid "End date"
 msgstr ""
 
-#: forms.py:75
+#: forms.py:103
 msgid "From period"
 msgstr ""
 
-#: forms.py:77 templates/alsijil/lesson.html:58
+#: forms.py:105 templates/alsijil/class_register/lesson.html:163
 msgid "Person"
-msgstr ""
+msgstr "Persona"
 
-#: forms.py:79 templates/alsijil/lesson.html:59
-#: templates/alsijil/print/full_register.html:223
-#: templates/alsijil/week_view.html:96
+#: forms.py:107 templates/alsijil/class_register/lesson.html:164
+#: templates/alsijil/class_register/week_view.html:109
+#: templates/alsijil/print/full_register.html:75
+#: templates/alsijil/print/full_register.html:312
 msgid "Absent"
 msgstr ""
 
-#: forms.py:80 templates/alsijil/lesson.html:61
+#: forms.py:108 templates/alsijil/class_register/lesson.html:166
+#: templates/alsijil/print/full_register.html:84
+#: templates/alsijil/print/full_register.html:275
 msgid "Excused"
 msgstr ""
 
-#: forms.py:81 templates/alsijil/lesson.html:62
-#: templates/alsijil/print/full_register.html:225
+#: forms.py:109 templates/alsijil/class_register/lesson.html:170
+#: templates/alsijil/class_register/lesson.html:223
+#: templates/alsijil/class_register/lesson.html:231
+#: templates/alsijil/print/full_register.html:314
 msgid "Remarks"
 msgstr ""
 
-#: menus.py:6 templates/alsijil/print/full_register.html:16
+#: menus.py:6 preferences.py:8 templates/alsijil/print/full_register.html:16
 msgid "Class register"
 msgstr ""
 
@@ -76,306 +87,495 @@ msgstr ""
 msgid "Register absence"
 msgstr ""
 
-#: menus.py:34
-msgid "Personal note filters"
+#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8
+#: templates/alsijil/excuse_type/list.html:9
+msgid "Excuse types"
 msgstr ""
 
-#: models.py:51 templates/alsijil/print/full_register.html:271
+#: menus.py:40 models.py:66 models.py:138
+#: templates/alsijil/class_register/lesson.html:168
+#: templates/alsijil/extra_mark/list.html:8
+#: templates/alsijil/extra_mark/list.html:9
+#: templates/alsijil/print/full_register.html:293
+msgid "Extra marks"
+msgstr ""
+
+#: models.py:18 models.py:124
+#, fuzzy
+#| msgid "First name"
+msgid "Short name"
+msgstr "Primus nomen"
+
+#: models.py:20 models.py:126
+msgid "Name"
+msgstr ""
+
+#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167
+#: templates/alsijil/class_register/lesson.html:202
+msgid "Excuse type"
+msgstr ""
+
+#: models.py:75
+#, fuzzy
+#| msgid "Person"
+msgid "Personal note"
+msgstr "Persona"
+
+#: models.py:76 templates/alsijil/class_register/lesson.html:64
+#: templates/alsijil/class_register/lesson.html:156
+#: templates/alsijil/class_register/week_view.html:104
+msgid "Personal notes"
+msgstr ""
+
+#: models.py:99 templates/alsijil/class_register/week_view.html:56
+#: templates/alsijil/print/full_register.html:371
 msgid "Lesson topic"
 msgstr ""
 
-#: models.py:52 templates/alsijil/print/full_register.html:272
+#: models.py:100 templates/alsijil/print/full_register.html:372
 msgid "Homework"
 msgstr ""
 
-#: models.py:68
-msgid "Identifier"
+#: models.py:102
+#, fuzzy
+#| msgid "Group"
+msgid "Group note"
+msgstr "Grex"
+
+#: models.py:106 templates/alsijil/class_register/lesson.html:60
+#: templates/alsijil/class_register/lesson.html:143
+msgid "Lesson documentation"
+msgstr ""
+
+#: models.py:107
+msgid "Lesson documentations"
 msgstr ""
 
-#: models.py:71 templates/alsijil/print/full_register.html:178
-msgid "Description"
+#: models.py:137
+msgid "Extra mark"
 msgstr ""
 
-#: models.py:74
-msgid "Match expression"
+#: preferences.py:16
+msgid "Block adding personal notes for cancelled lessons"
 msgstr ""
 
-#: tables.py:14
+#: tables.py:16 tables.py:36
 msgid "Edit"
 msgstr ""
 
-#: templates/alsijil/lesson.html:5
+#: tables.py:22 tables.py:42
+msgid "Delete"
+msgstr ""
+
+#: templates/alsijil/absences/register.html:5
+#: templates/alsijil/absences/register.html:6
+msgid "Manage absence"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:6
 msgid "Lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:34
-msgid "Lesson documentation"
+#: templates/alsijil/class_register/lesson.html:14
+#: templates/alsijil/class_register/lesson.html:83
+#, python-format
+msgid "%(period)s. period"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:38
+msgid "Previous lesson"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:46
+msgid "Next lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:43
+#: templates/alsijil/class_register/lesson.html:68
+#: templates/alsijil/class_register/lesson.html:249
 msgid "Change history"
 msgstr ""
 
-#: templates/alsijil/lesson.html:52 templates/alsijil/week_view.html:91
-msgid "Personal notes"
+#: templates/alsijil/class_register/lesson.html:82
+msgid "Overview: Previous lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:60
-#: templates/alsijil/print/full_register.html:202
+#: templates/alsijil/class_register/lesson.html:89
+msgid "Lesson topic of previous lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:96
+msgid "Homework for this lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:103
+msgid "Group notes for previous lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:110
+msgid "Absent persons:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:117
+msgid "Late persons:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:165
+#: templates/alsijil/print/full_register.html:287
 msgid "Tardiness"
 msgstr ""
 
-#: templates/alsijil/manage_personal_note_filter.html:5
-#: templates/alsijil/manage_personal_note_filter.html:6
-msgid "Manage personal note filter"
+#: templates/alsijil/class_register/lesson.html:188
+msgid "Tardiness (in m)"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:6
+msgid "Week view"
 msgstr ""
 
-#: templates/alsijil/manage_personal_note_filter.html:11
-msgid "Delete filter"
+#: templates/alsijil/class_register/week_view.html:27
+msgid "Select"
 msgstr ""
 
-#: templates/alsijil/personal_note_filters.html:7
-#: templates/alsijil/personal_note_filters.html:8
-msgid "List of all personal note filters"
+#: templates/alsijil/class_register/week_view.html:33
+#, python-format
+msgid "CW %(week)s: %(instance)s"
 msgstr ""
 
-#: templates/alsijil/personal_note_filters.html:12
-msgid "Add filter"
+#: templates/alsijil/class_register/week_view.html:50
+msgid "Period"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:22
-#: templates/alsijil/print/full_register.html:54
-msgid "Owners"
+#: templates/alsijil/class_register/week_view.html:52
+#, fuzzy
+#| msgid "Group"
+msgid "Groups"
+msgstr "Grex"
+
+#: templates/alsijil/class_register/week_view.html:54
+#: templates/alsijil/print/full_register.html:169
+#: templates/alsijil/print/full_register.html:200
+msgid "Subject"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:55
+msgid "Teachers"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:110
+msgid "unexcused"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:113
+msgid "Summed up tardiness"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:142
+msgid "No lessons available"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:145
+msgid ""
+"\n"
+"            There are no lessons for the selected group or teacher in this week.\n"
+"          "
+msgstr ""
+
+#: templates/alsijil/excuse_type/create.html:6
+#: templates/alsijil/excuse_type/create.html:7
+#: templates/alsijil/excuse_type/list.html:16
+msgid "Create excuse type"
+msgstr ""
+
+#: templates/alsijil/excuse_type/edit.html:6
+#: templates/alsijil/excuse_type/edit.html:7
+msgid "Edit excuse type"
+msgstr ""
+
+#: templates/alsijil/excuse_type/warning.html:5
+msgid ""
+"\n"
+"      This function should only be used to define alternatives to the default excuse which also will be counted extra.\n"
+"      Don't use this to create a default excuse or if you don't divide between different types of excuse.\n"
+"    "
+msgstr ""
+
+#: templates/alsijil/extra_mark/create.html:6
+#: templates/alsijil/extra_mark/create.html:7
+#: templates/alsijil/extra_mark/list.html:14
+msgid "Create extra mark"
+msgstr ""
+
+#: templates/alsijil/extra_mark/edit.html:6
+#: templates/alsijil/extra_mark/edit.html:7
+msgid "Edit extra mark"
+msgstr ""
+
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:126
+msgid "(e)"
+msgstr ""
+
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:130
+msgid "(u)"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:6
+msgid "Data complete"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:12
+#: templates/alsijil/print/full_register.html:406
+msgid "Lesson cancelled"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:14
+msgid "Missing data"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:16
+msgid "Pending"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:18
+msgid "Substitution"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:6
+msgid "Class register:"
 msgstr ""
 
 #: templates/alsijil/print/full_register.html:26
+#: templates/alsijil/print/full_register.html:59
+msgid "Owners"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:30
 msgid "Printed on"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:34
+#: templates/alsijil/print/full_register.html:38
 msgid ""
 "\n"
-"            This printout is intended for archival purposes. The main copy "
-"of\n"
-"            the class register is stored in the AlekSIS School Information\n"
-"            System.\n"
-"          "
+"        This printout is intended for archival purposes. The main copy of\n"
+"        the class register is stored in the AlekSIS School Information\n"
+"        System.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:41
+#: templates/alsijil/print/full_register.html:45
 msgid ""
 "\n"
-"            Copies of the class register, both digital and as printout, "
-"must\n"
-"            only be kept inside the school and/or on devices authorised by "
-"the\n"
-"            school.\n"
-"          "
+"        Copies of the class register, both digital and as printout, must\n"
+"        only be kept inside the school and/or on devices authorised by the\n"
+"        school.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:48
+#: templates/alsijil/print/full_register.html:52
 msgid ""
 "\n"
-"            The owner of the group and the headteacher confirm the above, "
-"as\n"
-"            well as the correctness of this printout.\n"
-"          "
+"        The owner of the group and the headteacher confirm the above, as\n"
+"        well as the correctness of this printout.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:55
+#: templates/alsijil/print/full_register.html:62
 msgid "Headteacher"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:61
-msgid "Persons in group"
+#: templates/alsijil/print/full_register.html:69
+msgid "Abbreviations"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:66
-msgid "No."
+#: templates/alsijil/print/full_register.html:71
+msgid "General"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:67
-msgid "Last name"
+#: templates/alsijil/print/full_register.html:78
+msgid "Late"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:68
-msgid "First name"
+#: templates/alsijil/print/full_register.html:81
+#: templates/alsijil/print/full_register.html:283
+msgid "Unexcused"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:69
-msgid "Sex"
+#: templates/alsijil/print/full_register.html:89
+msgid "Custom excuse types"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:70
-msgid "Date of birth"
+#: templates/alsijil/print/full_register.html:101
+msgid "Available extra marks"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:71
-#: templates/alsijil/print/full_register.html:200
-msgid "Absences"
+#: templates/alsijil/print/full_register.html:115
+msgid "Persons in group"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:72
-#: templates/alsijil/print/full_register.html:201
-msgid "Unexcused"
+#: templates/alsijil/print/full_register.html:120
+msgid "No."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:73
-#: templates/alsijil/print/full_register.html:224
-msgid "Tard."
+#: templates/alsijil/print/full_register.html:121
+msgid "Last name"
+msgstr "Secondus nomen"
+
+#: templates/alsijil/print/full_register.html:122
+msgid "First name"
+msgstr "Primus nomen"
+
+#: templates/alsijil/print/full_register.html:123
+msgid "Sex"
+msgstr "Genus"
+
+#: templates/alsijil/print/full_register.html:124
+msgid "Date of birth"
+msgstr "Dies natalis"
+
+#: templates/alsijil/print/full_register.html:125
+msgid "(a)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:95
-msgid "Teachers and lessons in group"
+#: templates/alsijil/print/full_register.html:131
+msgid "(b)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:100
-#: templates/alsijil/week_view.html:48
-msgid "Subject"
+#: templates/alsijil/print/full_register.html:164
+msgid "Teachers and lessons in group"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:102
+#: templates/alsijil/print/full_register.html:171
+#: templates/alsijil/print/full_register.html:202
 msgid "Lesson start"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:103
+#: templates/alsijil/print/full_register.html:172
+#: templates/alsijil/print/full_register.html:203
 msgid "Lesson end"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:104
+#: templates/alsijil/print/full_register.html:173
+#: templates/alsijil/print/full_register.html:204
 msgid "Per week"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:124
+#: templates/alsijil/print/full_register.html:194
+msgid "Teachers and lessons in child groups"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:227
 msgid "Personal overview"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:126
+#: templates/alsijil/print/full_register.html:229
 msgid "Contact details"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:174
-msgid "Statistics on remarks"
+#: templates/alsijil/print/full_register.html:266
+msgid "Absences and tardiness"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:179
-msgid "Count"
+#: templates/alsijil/print/full_register.html:269
+msgid "Absences"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:196
-msgid "Absences and tardiness"
+#: templates/alsijil/print/full_register.html:274
+msgid "thereof"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:215
+#: templates/alsijil/print/full_register.html:304
 msgid "Relevant personal notes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:219
+#: templates/alsijil/print/full_register.html:308
 msgid "Date"
-msgstr ""
+msgstr "dies"
 
-#: templates/alsijil/print/full_register.html:220
-#: templates/alsijil/print/full_register.html:268
+#: templates/alsijil/print/full_register.html:309
+#: templates/alsijil/print/full_register.html:369
 msgid "Pe."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:221
-#: templates/alsijil/print/full_register.html:269
+#: templates/alsijil/print/full_register.html:310
+#: templates/alsijil/print/full_register.html:370
 msgid "Subj."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:222
-#: templates/alsijil/print/full_register.html:274
+#: templates/alsijil/print/full_register.html:311
+#: templates/alsijil/print/full_register.html:374
 msgid "Te."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:240
-msgid "Yes"
+#: templates/alsijil/print/full_register.html:313
+msgid "Tard."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:242
-#: templates/alsijil/print/full_register.html:314
-#: templates/alsijil/print/full_register.html:324
-msgid "e"
+#: templates/alsijil/print/full_register.html:330
+msgid "Yes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:262
-msgid "Lesson documentation for calendar week"
+#: templates/alsijil/print/full_register.html:335
+#: templates/alsijil/print/full_register.html:424
+#: templates/alsijil/print/full_register.html:439
+msgid "e"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:270
-msgid "Subs."
+#: templates/alsijil/print/full_register.html:363
+msgid "Lesson documentation for week"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:273
+#: templates/alsijil/print/full_register.html:373
 msgid "Notes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:301
-msgid "Lesson cancelled"
+#: views.py:76
+msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr ""
 
-#: templates/alsijil/register_absence.html:5
-#: templates/alsijil/register_absence.html:6
-msgid "Manage absence"
+#: views.py:90
+msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr ""
 
-#: templates/alsijil/week_view.html:6
-msgid "Week view"
-msgstr ""
-
-#: templates/alsijil/week_view.html:21
-msgid "Select"
-msgstr ""
-
-#: templates/alsijil/week_view.html:47
-msgid "Period"
+#: views.py:116
+msgid "The lesson documentation has been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:49
-msgid "Teachers"
+#: views.py:136
+msgid "The personal notes have been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:97
-msgid "unexcused"
+#: views.py:327
+msgid "There is no current school term."
 msgstr ""
 
-#: templates/alsijil/week_view.html:100
-msgid "Summed up tardiness"
+#: views.py:463
+msgid "The absence has been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:122
-msgid "No group selected"
+#: views.py:488
+msgid "The extra mark has been created."
 msgstr ""
 
-#: templates/alsijil/week_view.html:125
-msgid ""
-"\n"
-"            There are no lessons for the selected group, teacher, room or "
-"time.\n"
-"          "
+#: views.py:499
+msgid "The extra mark has been saved."
 msgstr ""
 
-#: views.py:56
-msgid ""
-"You either selected an invalid lesson or there is currently no lesson in "
-"progress."
+#: views.py:509
+msgid "The extra mark has been deleted."
 msgstr ""
 
-#: views.py:68
-msgid ""
-"You are not allowed to create a lesson documentation for a lesson in the "
-"future."
+#: views.py:529
+msgid "The excuse type has been created."
 msgstr ""
 
-#: views.py:306
-msgid "The absence has been saved."
+#: views.py:540
+msgid "The excuse type has been saved."
 msgstr ""
 
-#: views.py:344
-msgid "The filter has been saved"
+#: views.py:550
+msgid "The excuse type has been deleted."
 msgstr ""
 
-#: views.py:360
-msgid "The filter has been deleted."
-msgstr ""
+#~ msgid "Description"
+#~ msgstr "Descriptio"
diff --git a/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po
index 1b9dbace2c6602f12f716c93ba7b9853400790d4..6c135ee070af949f1a52f1eef843fdf53d28047c 100644
--- a/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/nb_NO/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-01 13:20+0200\n"
+"POT-Creation-Date: 2020-08-03 20:03+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,50 +17,60 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: forms.py:41
+#: forms.py:25
+msgid "Homework for the next lesson"
+msgstr ""
+
+#: forms.py:50 templates/alsijil/print/full_register.html:199
 msgid "Group"
 msgstr ""
 
-#: forms.py:49 templates/alsijil/print/full_register.html:101
+#: forms.py:56 templates/alsijil/print/full_register.html:170
+#: templates/alsijil/print/full_register.html:201
 msgid "Teacher"
 msgstr ""
 
-#: forms.py:57
-msgid "Room"
+#: forms.py:73
+msgid "You can't select a group and a teacher both."
 msgstr ""
 
-#: forms.py:70
+#: forms.py:101
 msgid "Start date"
 msgstr ""
 
-#: forms.py:73
+#: forms.py:102
 msgid "End date"
 msgstr ""
 
-#: forms.py:75
+#: forms.py:103
 msgid "From period"
 msgstr ""
 
-#: forms.py:77 templates/alsijil/lesson.html:58
+#: forms.py:105 templates/alsijil/class_register/lesson.html:163
 msgid "Person"
 msgstr ""
 
-#: forms.py:79 templates/alsijil/lesson.html:59
-#: templates/alsijil/print/full_register.html:223
-#: templates/alsijil/week_view.html:96
+#: forms.py:107 templates/alsijil/class_register/lesson.html:164
+#: templates/alsijil/class_register/week_view.html:109
+#: templates/alsijil/print/full_register.html:75
+#: templates/alsijil/print/full_register.html:312
 msgid "Absent"
 msgstr ""
 
-#: forms.py:80 templates/alsijil/lesson.html:61
+#: forms.py:108 templates/alsijil/class_register/lesson.html:166
+#: templates/alsijil/print/full_register.html:84
+#: templates/alsijil/print/full_register.html:275
 msgid "Excused"
 msgstr ""
 
-#: forms.py:81 templates/alsijil/lesson.html:62
-#: templates/alsijil/print/full_register.html:225
+#: forms.py:109 templates/alsijil/class_register/lesson.html:170
+#: templates/alsijil/class_register/lesson.html:223
+#: templates/alsijil/class_register/lesson.html:231
+#: templates/alsijil/print/full_register.html:314
 msgid "Remarks"
 msgstr ""
 
-#: menus.py:6 templates/alsijil/print/full_register.html:16
+#: menus.py:6 preferences.py:8 templates/alsijil/print/full_register.html:16
 msgid "Class register"
 msgstr ""
 
@@ -76,306 +86,484 @@ msgstr ""
 msgid "Register absence"
 msgstr ""
 
-#: menus.py:34
-msgid "Personal note filters"
+#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8
+#: templates/alsijil/excuse_type/list.html:9
+msgid "Excuse types"
+msgstr ""
+
+#: menus.py:40 models.py:66 models.py:138
+#: templates/alsijil/class_register/lesson.html:168
+#: templates/alsijil/extra_mark/list.html:8
+#: templates/alsijil/extra_mark/list.html:9
+#: templates/alsijil/print/full_register.html:293
+msgid "Extra marks"
+msgstr ""
+
+#: models.py:18 models.py:124
+msgid "Short name"
+msgstr ""
+
+#: models.py:20 models.py:126
+msgid "Name"
+msgstr ""
+
+#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167
+#: templates/alsijil/class_register/lesson.html:202
+msgid "Excuse type"
 msgstr ""
 
-#: models.py:51 templates/alsijil/print/full_register.html:271
+#: models.py:75
+msgid "Personal note"
+msgstr ""
+
+#: models.py:76 templates/alsijil/class_register/lesson.html:64
+#: templates/alsijil/class_register/lesson.html:156
+#: templates/alsijil/class_register/week_view.html:104
+msgid "Personal notes"
+msgstr ""
+
+#: models.py:99 templates/alsijil/class_register/week_view.html:56
+#: templates/alsijil/print/full_register.html:371
 msgid "Lesson topic"
 msgstr ""
 
-#: models.py:52 templates/alsijil/print/full_register.html:272
+#: models.py:100 templates/alsijil/print/full_register.html:372
 msgid "Homework"
 msgstr ""
 
-#: models.py:68
-msgid "Identifier"
+#: models.py:102
+msgid "Group note"
+msgstr ""
+
+#: models.py:106 templates/alsijil/class_register/lesson.html:60
+#: templates/alsijil/class_register/lesson.html:143
+msgid "Lesson documentation"
+msgstr ""
+
+#: models.py:107
+msgid "Lesson documentations"
 msgstr ""
 
-#: models.py:71 templates/alsijil/print/full_register.html:178
-msgid "Description"
+#: models.py:137
+msgid "Extra mark"
 msgstr ""
 
-#: models.py:74
-msgid "Match expression"
+#: preferences.py:16
+msgid "Block adding personal notes for cancelled lessons"
 msgstr ""
 
-#: tables.py:14
+#: tables.py:16 tables.py:36
 msgid "Edit"
 msgstr ""
 
-#: templates/alsijil/lesson.html:5
+#: tables.py:22 tables.py:42
+msgid "Delete"
+msgstr ""
+
+#: templates/alsijil/absences/register.html:5
+#: templates/alsijil/absences/register.html:6
+msgid "Manage absence"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:6
 msgid "Lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:34
-msgid "Lesson documentation"
+#: templates/alsijil/class_register/lesson.html:14
+#: templates/alsijil/class_register/lesson.html:83
+#, python-format
+msgid "%(period)s. period"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:38
+msgid "Previous lesson"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:46
+msgid "Next lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:43
+#: templates/alsijil/class_register/lesson.html:68
+#: templates/alsijil/class_register/lesson.html:249
 msgid "Change history"
 msgstr ""
 
-#: templates/alsijil/lesson.html:52 templates/alsijil/week_view.html:91
-msgid "Personal notes"
+#: templates/alsijil/class_register/lesson.html:82
+msgid "Overview: Previous lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:60
-#: templates/alsijil/print/full_register.html:202
+#: templates/alsijil/class_register/lesson.html:89
+msgid "Lesson topic of previous lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:96
+msgid "Homework for this lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:103
+msgid "Group notes for previous lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:110
+msgid "Absent persons:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:117
+msgid "Late persons:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:165
+#: templates/alsijil/print/full_register.html:287
 msgid "Tardiness"
 msgstr ""
 
-#: templates/alsijil/manage_personal_note_filter.html:5
-#: templates/alsijil/manage_personal_note_filter.html:6
-msgid "Manage personal note filter"
+#: templates/alsijil/class_register/lesson.html:188
+msgid "Tardiness (in m)"
 msgstr ""
 
-#: templates/alsijil/manage_personal_note_filter.html:11
-msgid "Delete filter"
+#: templates/alsijil/class_register/week_view.html:6
+msgid "Week view"
 msgstr ""
 
-#: templates/alsijil/personal_note_filters.html:7
-#: templates/alsijil/personal_note_filters.html:8
-msgid "List of all personal note filters"
+#: templates/alsijil/class_register/week_view.html:27
+msgid "Select"
 msgstr ""
 
-#: templates/alsijil/personal_note_filters.html:12
-msgid "Add filter"
+#: templates/alsijil/class_register/week_view.html:33
+#, python-format
+msgid "CW %(week)s: %(instance)s"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:22
-#: templates/alsijil/print/full_register.html:54
-msgid "Owners"
+#: templates/alsijil/class_register/week_view.html:50
+msgid "Period"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:52
+msgid "Groups"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:54
+#: templates/alsijil/print/full_register.html:169
+#: templates/alsijil/print/full_register.html:200
+msgid "Subject"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:55
+msgid "Teachers"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:110
+msgid "unexcused"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:113
+msgid "Summed up tardiness"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:142
+msgid "No lessons available"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:145
+msgid ""
+"\n"
+"            There are no lessons for the selected group or teacher in this week.\n"
+"          "
+msgstr ""
+
+#: templates/alsijil/excuse_type/create.html:6
+#: templates/alsijil/excuse_type/create.html:7
+#: templates/alsijil/excuse_type/list.html:16
+msgid "Create excuse type"
+msgstr ""
+
+#: templates/alsijil/excuse_type/edit.html:6
+#: templates/alsijil/excuse_type/edit.html:7
+msgid "Edit excuse type"
+msgstr ""
+
+#: templates/alsijil/excuse_type/warning.html:5
+msgid ""
+"\n"
+"      This function should only be used to define alternatives to the default excuse which also will be counted extra.\n"
+"      Don't use this to create a default excuse or if you don't divide between different types of excuse.\n"
+"    "
+msgstr ""
+
+#: templates/alsijil/extra_mark/create.html:6
+#: templates/alsijil/extra_mark/create.html:7
+#: templates/alsijil/extra_mark/list.html:14
+msgid "Create extra mark"
+msgstr ""
+
+#: templates/alsijil/extra_mark/edit.html:6
+#: templates/alsijil/extra_mark/edit.html:7
+msgid "Edit extra mark"
+msgstr ""
+
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:126
+msgid "(e)"
+msgstr ""
+
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:130
+msgid "(u)"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:6
+msgid "Data complete"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:12
+#: templates/alsijil/print/full_register.html:406
+msgid "Lesson cancelled"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:14
+msgid "Missing data"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:16
+msgid "Pending"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:18
+msgid "Substitution"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:6
+msgid "Class register:"
 msgstr ""
 
 #: templates/alsijil/print/full_register.html:26
+#: templates/alsijil/print/full_register.html:59
+msgid "Owners"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:30
 msgid "Printed on"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:34
+#: templates/alsijil/print/full_register.html:38
 msgid ""
 "\n"
-"            This printout is intended for archival purposes. The main copy "
-"of\n"
-"            the class register is stored in the AlekSIS School Information\n"
-"            System.\n"
-"          "
+"        This printout is intended for archival purposes. The main copy of\n"
+"        the class register is stored in the AlekSIS School Information\n"
+"        System.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:41
+#: templates/alsijil/print/full_register.html:45
 msgid ""
 "\n"
-"            Copies of the class register, both digital and as printout, "
-"must\n"
-"            only be kept inside the school and/or on devices authorised by "
-"the\n"
-"            school.\n"
-"          "
+"        Copies of the class register, both digital and as printout, must\n"
+"        only be kept inside the school and/or on devices authorised by the\n"
+"        school.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:48
+#: templates/alsijil/print/full_register.html:52
 msgid ""
 "\n"
-"            The owner of the group and the headteacher confirm the above, "
-"as\n"
-"            well as the correctness of this printout.\n"
-"          "
+"        The owner of the group and the headteacher confirm the above, as\n"
+"        well as the correctness of this printout.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:55
+#: templates/alsijil/print/full_register.html:62
 msgid "Headteacher"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:61
+#: templates/alsijil/print/full_register.html:69
+msgid "Abbreviations"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:71
+msgid "General"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:78
+msgid "Late"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:81
+#: templates/alsijil/print/full_register.html:283
+msgid "Unexcused"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:89
+msgid "Custom excuse types"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:101
+msgid "Available extra marks"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:115
 msgid "Persons in group"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:66
+#: templates/alsijil/print/full_register.html:120
 msgid "No."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:67
+#: templates/alsijil/print/full_register.html:121
 msgid "Last name"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:68
+#: templates/alsijil/print/full_register.html:122
 msgid "First name"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:69
+#: templates/alsijil/print/full_register.html:123
 msgid "Sex"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:70
+#: templates/alsijil/print/full_register.html:124
 msgid "Date of birth"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:71
-#: templates/alsijil/print/full_register.html:200
-msgid "Absences"
+#: templates/alsijil/print/full_register.html:125
+msgid "(a)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:72
-#: templates/alsijil/print/full_register.html:201
-msgid "Unexcused"
+#: templates/alsijil/print/full_register.html:131
+msgid "(b)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:73
-#: templates/alsijil/print/full_register.html:224
-msgid "Tard."
-msgstr ""
-
-#: templates/alsijil/print/full_register.html:95
+#: templates/alsijil/print/full_register.html:164
 msgid "Teachers and lessons in group"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:100
-#: templates/alsijil/week_view.html:48
-msgid "Subject"
-msgstr ""
-
-#: templates/alsijil/print/full_register.html:102
+#: templates/alsijil/print/full_register.html:171
+#: templates/alsijil/print/full_register.html:202
 msgid "Lesson start"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:103
+#: templates/alsijil/print/full_register.html:172
+#: templates/alsijil/print/full_register.html:203
 msgid "Lesson end"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:104
+#: templates/alsijil/print/full_register.html:173
+#: templates/alsijil/print/full_register.html:204
 msgid "Per week"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:124
+#: templates/alsijil/print/full_register.html:194
+msgid "Teachers and lessons in child groups"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:227
 msgid "Personal overview"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:126
+#: templates/alsijil/print/full_register.html:229
 msgid "Contact details"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:174
-msgid "Statistics on remarks"
+#: templates/alsijil/print/full_register.html:266
+msgid "Absences and tardiness"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:179
-msgid "Count"
+#: templates/alsijil/print/full_register.html:269
+msgid "Absences"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:196
-msgid "Absences and tardiness"
+#: templates/alsijil/print/full_register.html:274
+msgid "thereof"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:215
+#: templates/alsijil/print/full_register.html:304
 msgid "Relevant personal notes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:219
+#: templates/alsijil/print/full_register.html:308
 msgid "Date"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:220
-#: templates/alsijil/print/full_register.html:268
+#: templates/alsijil/print/full_register.html:309
+#: templates/alsijil/print/full_register.html:369
 msgid "Pe."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:221
-#: templates/alsijil/print/full_register.html:269
+#: templates/alsijil/print/full_register.html:310
+#: templates/alsijil/print/full_register.html:370
 msgid "Subj."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:222
-#: templates/alsijil/print/full_register.html:274
+#: templates/alsijil/print/full_register.html:311
+#: templates/alsijil/print/full_register.html:374
 msgid "Te."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:240
-msgid "Yes"
+#: templates/alsijil/print/full_register.html:313
+msgid "Tard."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:242
-#: templates/alsijil/print/full_register.html:314
-#: templates/alsijil/print/full_register.html:324
-msgid "e"
+#: templates/alsijil/print/full_register.html:330
+msgid "Yes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:262
-msgid "Lesson documentation for calendar week"
+#: templates/alsijil/print/full_register.html:335
+#: templates/alsijil/print/full_register.html:424
+#: templates/alsijil/print/full_register.html:439
+msgid "e"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:270
-msgid "Subs."
+#: templates/alsijil/print/full_register.html:363
+msgid "Lesson documentation for week"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:273
+#: templates/alsijil/print/full_register.html:373
 msgid "Notes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:301
-msgid "Lesson cancelled"
+#: views.py:76
+msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr ""
 
-#: templates/alsijil/register_absence.html:5
-#: templates/alsijil/register_absence.html:6
-msgid "Manage absence"
+#: views.py:90
+msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr ""
 
-#: templates/alsijil/week_view.html:6
-msgid "Week view"
+#: views.py:116
+msgid "The lesson documentation has been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:21
-msgid "Select"
+#: views.py:136
+msgid "The personal notes have been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:47
-msgid "Period"
-msgstr ""
-
-#: templates/alsijil/week_view.html:49
-msgid "Teachers"
-msgstr ""
-
-#: templates/alsijil/week_view.html:97
-msgid "unexcused"
+#: views.py:327
+msgid "There is no current school term."
 msgstr ""
 
-#: templates/alsijil/week_view.html:100
-msgid "Summed up tardiness"
-msgstr ""
-
-#: templates/alsijil/week_view.html:122
-msgid "No group selected"
+#: views.py:463
+msgid "The absence has been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:125
-msgid ""
-"\n"
-"            There are no lessons for the selected group, teacher, room or "
-"time.\n"
-"          "
+#: views.py:488
+msgid "The extra mark has been created."
 msgstr ""
 
-#: views.py:56
-msgid ""
-"You either selected an invalid lesson or there is currently no lesson in "
-"progress."
+#: views.py:499
+msgid "The extra mark has been saved."
 msgstr ""
 
-#: views.py:68
-msgid ""
-"You are not allowed to create a lesson documentation for a lesson in the "
-"future."
+#: views.py:509
+msgid "The extra mark has been deleted."
 msgstr ""
 
-#: views.py:306
-msgid "The absence has been saved."
+#: views.py:529
+msgid "The excuse type has been created."
 msgstr ""
 
-#: views.py:344
-msgid "The filter has been saved"
+#: views.py:540
+msgid "The excuse type has been saved."
 msgstr ""
 
-#: views.py:360
-msgid "The filter has been deleted."
+#: views.py:550
+msgid "The excuse type has been deleted."
 msgstr ""
diff --git a/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po
index 1b9dbace2c6602f12f716c93ba7b9853400790d4..6c135ee070af949f1a52f1eef843fdf53d28047c 100644
--- a/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po
+++ b/aleksis/apps/alsijil/locale/tr_TR/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-01 13:20+0200\n"
+"POT-Creation-Date: 2020-08-03 20:03+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,50 +17,60 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: forms.py:41
+#: forms.py:25
+msgid "Homework for the next lesson"
+msgstr ""
+
+#: forms.py:50 templates/alsijil/print/full_register.html:199
 msgid "Group"
 msgstr ""
 
-#: forms.py:49 templates/alsijil/print/full_register.html:101
+#: forms.py:56 templates/alsijil/print/full_register.html:170
+#: templates/alsijil/print/full_register.html:201
 msgid "Teacher"
 msgstr ""
 
-#: forms.py:57
-msgid "Room"
+#: forms.py:73
+msgid "You can't select a group and a teacher both."
 msgstr ""
 
-#: forms.py:70
+#: forms.py:101
 msgid "Start date"
 msgstr ""
 
-#: forms.py:73
+#: forms.py:102
 msgid "End date"
 msgstr ""
 
-#: forms.py:75
+#: forms.py:103
 msgid "From period"
 msgstr ""
 
-#: forms.py:77 templates/alsijil/lesson.html:58
+#: forms.py:105 templates/alsijil/class_register/lesson.html:163
 msgid "Person"
 msgstr ""
 
-#: forms.py:79 templates/alsijil/lesson.html:59
-#: templates/alsijil/print/full_register.html:223
-#: templates/alsijil/week_view.html:96
+#: forms.py:107 templates/alsijil/class_register/lesson.html:164
+#: templates/alsijil/class_register/week_view.html:109
+#: templates/alsijil/print/full_register.html:75
+#: templates/alsijil/print/full_register.html:312
 msgid "Absent"
 msgstr ""
 
-#: forms.py:80 templates/alsijil/lesson.html:61
+#: forms.py:108 templates/alsijil/class_register/lesson.html:166
+#: templates/alsijil/print/full_register.html:84
+#: templates/alsijil/print/full_register.html:275
 msgid "Excused"
 msgstr ""
 
-#: forms.py:81 templates/alsijil/lesson.html:62
-#: templates/alsijil/print/full_register.html:225
+#: forms.py:109 templates/alsijil/class_register/lesson.html:170
+#: templates/alsijil/class_register/lesson.html:223
+#: templates/alsijil/class_register/lesson.html:231
+#: templates/alsijil/print/full_register.html:314
 msgid "Remarks"
 msgstr ""
 
-#: menus.py:6 templates/alsijil/print/full_register.html:16
+#: menus.py:6 preferences.py:8 templates/alsijil/print/full_register.html:16
 msgid "Class register"
 msgstr ""
 
@@ -76,306 +86,484 @@ msgstr ""
 msgid "Register absence"
 msgstr ""
 
-#: menus.py:34
-msgid "Personal note filters"
+#: menus.py:34 models.py:32 templates/alsijil/excuse_type/list.html:8
+#: templates/alsijil/excuse_type/list.html:9
+msgid "Excuse types"
+msgstr ""
+
+#: menus.py:40 models.py:66 models.py:138
+#: templates/alsijil/class_register/lesson.html:168
+#: templates/alsijil/extra_mark/list.html:8
+#: templates/alsijil/extra_mark/list.html:9
+#: templates/alsijil/print/full_register.html:293
+msgid "Extra marks"
+msgstr ""
+
+#: models.py:18 models.py:124
+msgid "Short name"
+msgstr ""
+
+#: models.py:20 models.py:126
+msgid "Name"
+msgstr ""
+
+#: models.py:31 models.py:60 templates/alsijil/class_register/lesson.html:167
+#: templates/alsijil/class_register/lesson.html:202
+msgid "Excuse type"
 msgstr ""
 
-#: models.py:51 templates/alsijil/print/full_register.html:271
+#: models.py:75
+msgid "Personal note"
+msgstr ""
+
+#: models.py:76 templates/alsijil/class_register/lesson.html:64
+#: templates/alsijil/class_register/lesson.html:156
+#: templates/alsijil/class_register/week_view.html:104
+msgid "Personal notes"
+msgstr ""
+
+#: models.py:99 templates/alsijil/class_register/week_view.html:56
+#: templates/alsijil/print/full_register.html:371
 msgid "Lesson topic"
 msgstr ""
 
-#: models.py:52 templates/alsijil/print/full_register.html:272
+#: models.py:100 templates/alsijil/print/full_register.html:372
 msgid "Homework"
 msgstr ""
 
-#: models.py:68
-msgid "Identifier"
+#: models.py:102
+msgid "Group note"
+msgstr ""
+
+#: models.py:106 templates/alsijil/class_register/lesson.html:60
+#: templates/alsijil/class_register/lesson.html:143
+msgid "Lesson documentation"
+msgstr ""
+
+#: models.py:107
+msgid "Lesson documentations"
 msgstr ""
 
-#: models.py:71 templates/alsijil/print/full_register.html:178
-msgid "Description"
+#: models.py:137
+msgid "Extra mark"
 msgstr ""
 
-#: models.py:74
-msgid "Match expression"
+#: preferences.py:16
+msgid "Block adding personal notes for cancelled lessons"
 msgstr ""
 
-#: tables.py:14
+#: tables.py:16 tables.py:36
 msgid "Edit"
 msgstr ""
 
-#: templates/alsijil/lesson.html:5
+#: tables.py:22 tables.py:42
+msgid "Delete"
+msgstr ""
+
+#: templates/alsijil/absences/register.html:5
+#: templates/alsijil/absences/register.html:6
+msgid "Manage absence"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:6
 msgid "Lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:34
-msgid "Lesson documentation"
+#: templates/alsijil/class_register/lesson.html:14
+#: templates/alsijil/class_register/lesson.html:83
+#, python-format
+msgid "%(period)s. period"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:38
+msgid "Previous lesson"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:46
+msgid "Next lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:43
+#: templates/alsijil/class_register/lesson.html:68
+#: templates/alsijil/class_register/lesson.html:249
 msgid "Change history"
 msgstr ""
 
-#: templates/alsijil/lesson.html:52 templates/alsijil/week_view.html:91
-msgid "Personal notes"
+#: templates/alsijil/class_register/lesson.html:82
+msgid "Overview: Previous lesson"
 msgstr ""
 
-#: templates/alsijil/lesson.html:60
-#: templates/alsijil/print/full_register.html:202
+#: templates/alsijil/class_register/lesson.html:89
+msgid "Lesson topic of previous lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:96
+msgid "Homework for this lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:103
+msgid "Group notes for previous lesson:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:110
+msgid "Absent persons:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:117
+msgid "Late persons:"
+msgstr ""
+
+#: templates/alsijil/class_register/lesson.html:165
+#: templates/alsijil/print/full_register.html:287
 msgid "Tardiness"
 msgstr ""
 
-#: templates/alsijil/manage_personal_note_filter.html:5
-#: templates/alsijil/manage_personal_note_filter.html:6
-msgid "Manage personal note filter"
+#: templates/alsijil/class_register/lesson.html:188
+msgid "Tardiness (in m)"
 msgstr ""
 
-#: templates/alsijil/manage_personal_note_filter.html:11
-msgid "Delete filter"
+#: templates/alsijil/class_register/week_view.html:6
+msgid "Week view"
 msgstr ""
 
-#: templates/alsijil/personal_note_filters.html:7
-#: templates/alsijil/personal_note_filters.html:8
-msgid "List of all personal note filters"
+#: templates/alsijil/class_register/week_view.html:27
+msgid "Select"
 msgstr ""
 
-#: templates/alsijil/personal_note_filters.html:12
-msgid "Add filter"
+#: templates/alsijil/class_register/week_view.html:33
+#, python-format
+msgid "CW %(week)s: %(instance)s"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:22
-#: templates/alsijil/print/full_register.html:54
-msgid "Owners"
+#: templates/alsijil/class_register/week_view.html:50
+msgid "Period"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:52
+msgid "Groups"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:54
+#: templates/alsijil/print/full_register.html:169
+#: templates/alsijil/print/full_register.html:200
+msgid "Subject"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:55
+msgid "Teachers"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:110
+msgid "unexcused"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:113
+msgid "Summed up tardiness"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:142
+msgid "No lessons available"
+msgstr ""
+
+#: templates/alsijil/class_register/week_view.html:145
+msgid ""
+"\n"
+"            There are no lessons for the selected group or teacher in this week.\n"
+"          "
+msgstr ""
+
+#: templates/alsijil/excuse_type/create.html:6
+#: templates/alsijil/excuse_type/create.html:7
+#: templates/alsijil/excuse_type/list.html:16
+msgid "Create excuse type"
+msgstr ""
+
+#: templates/alsijil/excuse_type/edit.html:6
+#: templates/alsijil/excuse_type/edit.html:7
+msgid "Edit excuse type"
+msgstr ""
+
+#: templates/alsijil/excuse_type/warning.html:5
+msgid ""
+"\n"
+"      This function should only be used to define alternatives to the default excuse which also will be counted extra.\n"
+"      Don't use this to create a default excuse or if you don't divide between different types of excuse.\n"
+"    "
+msgstr ""
+
+#: templates/alsijil/extra_mark/create.html:6
+#: templates/alsijil/extra_mark/create.html:7
+#: templates/alsijil/extra_mark/list.html:14
+msgid "Create extra mark"
+msgstr ""
+
+#: templates/alsijil/extra_mark/edit.html:6
+#: templates/alsijil/extra_mark/edit.html:7
+msgid "Edit extra mark"
+msgstr ""
+
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:126
+msgid "(e)"
+msgstr ""
+
+#: templates/alsijil/partials/absences.html:4
+#: templates/alsijil/print/full_register.html:130
+msgid "(u)"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:6
+msgid "Data complete"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:12
+#: templates/alsijil/print/full_register.html:406
+msgid "Lesson cancelled"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:14
+msgid "Missing data"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:16
+msgid "Pending"
+msgstr ""
+
+#: templates/alsijil/partials/lesson_status_icon.html:18
+msgid "Substitution"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:6
+msgid "Class register:"
 msgstr ""
 
 #: templates/alsijil/print/full_register.html:26
+#: templates/alsijil/print/full_register.html:59
+msgid "Owners"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:30
 msgid "Printed on"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:34
+#: templates/alsijil/print/full_register.html:38
 msgid ""
 "\n"
-"            This printout is intended for archival purposes. The main copy "
-"of\n"
-"            the class register is stored in the AlekSIS School Information\n"
-"            System.\n"
-"          "
+"        This printout is intended for archival purposes. The main copy of\n"
+"        the class register is stored in the AlekSIS School Information\n"
+"        System.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:41
+#: templates/alsijil/print/full_register.html:45
 msgid ""
 "\n"
-"            Copies of the class register, both digital and as printout, "
-"must\n"
-"            only be kept inside the school and/or on devices authorised by "
-"the\n"
-"            school.\n"
-"          "
+"        Copies of the class register, both digital and as printout, must\n"
+"        only be kept inside the school and/or on devices authorised by the\n"
+"        school.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:48
+#: templates/alsijil/print/full_register.html:52
 msgid ""
 "\n"
-"            The owner of the group and the headteacher confirm the above, "
-"as\n"
-"            well as the correctness of this printout.\n"
-"          "
+"        The owner of the group and the headteacher confirm the above, as\n"
+"        well as the correctness of this printout.\n"
+"      "
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:55
+#: templates/alsijil/print/full_register.html:62
 msgid "Headteacher"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:61
+#: templates/alsijil/print/full_register.html:69
+msgid "Abbreviations"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:71
+msgid "General"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:78
+msgid "Late"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:81
+#: templates/alsijil/print/full_register.html:283
+msgid "Unexcused"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:89
+msgid "Custom excuse types"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:101
+msgid "Available extra marks"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:115
 msgid "Persons in group"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:66
+#: templates/alsijil/print/full_register.html:120
 msgid "No."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:67
+#: templates/alsijil/print/full_register.html:121
 msgid "Last name"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:68
+#: templates/alsijil/print/full_register.html:122
 msgid "First name"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:69
+#: templates/alsijil/print/full_register.html:123
 msgid "Sex"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:70
+#: templates/alsijil/print/full_register.html:124
 msgid "Date of birth"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:71
-#: templates/alsijil/print/full_register.html:200
-msgid "Absences"
+#: templates/alsijil/print/full_register.html:125
+msgid "(a)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:72
-#: templates/alsijil/print/full_register.html:201
-msgid "Unexcused"
+#: templates/alsijil/print/full_register.html:131
+msgid "(b)"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:73
-#: templates/alsijil/print/full_register.html:224
-msgid "Tard."
-msgstr ""
-
-#: templates/alsijil/print/full_register.html:95
+#: templates/alsijil/print/full_register.html:164
 msgid "Teachers and lessons in group"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:100
-#: templates/alsijil/week_view.html:48
-msgid "Subject"
-msgstr ""
-
-#: templates/alsijil/print/full_register.html:102
+#: templates/alsijil/print/full_register.html:171
+#: templates/alsijil/print/full_register.html:202
 msgid "Lesson start"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:103
+#: templates/alsijil/print/full_register.html:172
+#: templates/alsijil/print/full_register.html:203
 msgid "Lesson end"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:104
+#: templates/alsijil/print/full_register.html:173
+#: templates/alsijil/print/full_register.html:204
 msgid "Per week"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:124
+#: templates/alsijil/print/full_register.html:194
+msgid "Teachers and lessons in child groups"
+msgstr ""
+
+#: templates/alsijil/print/full_register.html:227
 msgid "Personal overview"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:126
+#: templates/alsijil/print/full_register.html:229
 msgid "Contact details"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:174
-msgid "Statistics on remarks"
+#: templates/alsijil/print/full_register.html:266
+msgid "Absences and tardiness"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:179
-msgid "Count"
+#: templates/alsijil/print/full_register.html:269
+msgid "Absences"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:196
-msgid "Absences and tardiness"
+#: templates/alsijil/print/full_register.html:274
+msgid "thereof"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:215
+#: templates/alsijil/print/full_register.html:304
 msgid "Relevant personal notes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:219
+#: templates/alsijil/print/full_register.html:308
 msgid "Date"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:220
-#: templates/alsijil/print/full_register.html:268
+#: templates/alsijil/print/full_register.html:309
+#: templates/alsijil/print/full_register.html:369
 msgid "Pe."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:221
-#: templates/alsijil/print/full_register.html:269
+#: templates/alsijil/print/full_register.html:310
+#: templates/alsijil/print/full_register.html:370
 msgid "Subj."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:222
-#: templates/alsijil/print/full_register.html:274
+#: templates/alsijil/print/full_register.html:311
+#: templates/alsijil/print/full_register.html:374
 msgid "Te."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:240
-msgid "Yes"
+#: templates/alsijil/print/full_register.html:313
+msgid "Tard."
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:242
-#: templates/alsijil/print/full_register.html:314
-#: templates/alsijil/print/full_register.html:324
-msgid "e"
+#: templates/alsijil/print/full_register.html:330
+msgid "Yes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:262
-msgid "Lesson documentation for calendar week"
+#: templates/alsijil/print/full_register.html:335
+#: templates/alsijil/print/full_register.html:424
+#: templates/alsijil/print/full_register.html:439
+msgid "e"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:270
-msgid "Subs."
+#: templates/alsijil/print/full_register.html:363
+msgid "Lesson documentation for week"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:273
+#: templates/alsijil/print/full_register.html:373
 msgid "Notes"
 msgstr ""
 
-#: templates/alsijil/print/full_register.html:301
-msgid "Lesson cancelled"
+#: views.py:76
+msgid "You either selected an invalid lesson or there is currently no lesson in progress."
 msgstr ""
 
-#: templates/alsijil/register_absence.html:5
-#: templates/alsijil/register_absence.html:6
-msgid "Manage absence"
+#: views.py:90
+msgid "You are not allowed to create a lesson documentation for a lesson in the future."
 msgstr ""
 
-#: templates/alsijil/week_view.html:6
-msgid "Week view"
+#: views.py:116
+msgid "The lesson documentation has been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:21
-msgid "Select"
+#: views.py:136
+msgid "The personal notes have been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:47
-msgid "Period"
-msgstr ""
-
-#: templates/alsijil/week_view.html:49
-msgid "Teachers"
-msgstr ""
-
-#: templates/alsijil/week_view.html:97
-msgid "unexcused"
+#: views.py:327
+msgid "There is no current school term."
 msgstr ""
 
-#: templates/alsijil/week_view.html:100
-msgid "Summed up tardiness"
-msgstr ""
-
-#: templates/alsijil/week_view.html:122
-msgid "No group selected"
+#: views.py:463
+msgid "The absence has been saved."
 msgstr ""
 
-#: templates/alsijil/week_view.html:125
-msgid ""
-"\n"
-"            There are no lessons for the selected group, teacher, room or "
-"time.\n"
-"          "
+#: views.py:488
+msgid "The extra mark has been created."
 msgstr ""
 
-#: views.py:56
-msgid ""
-"You either selected an invalid lesson or there is currently no lesson in "
-"progress."
+#: views.py:499
+msgid "The extra mark has been saved."
 msgstr ""
 
-#: views.py:68
-msgid ""
-"You are not allowed to create a lesson documentation for a lesson in the "
-"future."
+#: views.py:509
+msgid "The extra mark has been deleted."
 msgstr ""
 
-#: views.py:306
-msgid "The absence has been saved."
+#: views.py:529
+msgid "The excuse type has been created."
 msgstr ""
 
-#: views.py:344
-msgid "The filter has been saved"
+#: views.py:540
+msgid "The excuse type has been saved."
 msgstr ""
 
-#: views.py:360
-msgid "The filter has been deleted."
+#: views.py:550
+msgid "The excuse type has been deleted."
 msgstr ""
diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py
index c5fea59e3790fba0407d55d760434ac2e3dd0d3d..a3ec5e9cc443a951ca5ddf4803361bd29e0637f9 100644
--- a/aleksis/apps/alsijil/menus.py
+++ b/aleksis/apps/alsijil/menus.py
@@ -31,14 +31,14 @@ MENUS = {
                     "validators": ["menu_generator.validators.is_superuser"],
                 },
                 {
-                    "name": _("Personal note filters"),
-                    "url": "list_personal_note_filters",
-                    "icon": "filter_list",
+                    "name": _("Excuse types"),
+                    "url": "excuse_types",
+                    "icon": "label",
                     "validators": ["menu_generator.validators.is_superuser"],
                 },
                 {
-                    "name": _("Excuse types"),
-                    "url": "excuse_types",
+                    "name": _("Extra marks"),
+                    "url": "extra_marks",
                     "icon": "label",
                     "validators": ["menu_generator.validators.is_superuser"],
                 },
diff --git a/aleksis/apps/alsijil/migrations/0003_extra_mark.py b/aleksis/apps/alsijil/migrations/0003_extra_mark.py
new file mode 100644
index 0000000000000000000000000000000000000000..307d9168a296661c8b520b55a1b5cd400b5e6df3
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0003_extra_mark.py
@@ -0,0 +1,72 @@
+# Generated by Django 3.0.8 on 2020-07-12 12:43
+
+import django.contrib.postgres.fields.jsonb
+import django.contrib.sites.managers
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("sites", "0002_alter_domain_unique"),
+        ("alsijil", "0002_excuse_type"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="ExtraMark",
+            fields=[
+                (
+                    "id",
+                    models.AutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "extended_data",
+                    django.contrib.postgres.fields.jsonb.JSONField(
+                        default=dict, editable=False
+                    ),
+                ),
+                (
+                    "short_name",
+                    models.CharField(
+                        max_length=255, unique=True, verbose_name="Short name"
+                    ),
+                ),
+                (
+                    "name",
+                    models.CharField(max_length=255, unique=True, verbose_name="Name"),
+                ),
+                (
+                    "site",
+                    models.ForeignKey(
+                        default=1,
+                        editable=False,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to="sites.Site",
+                    ),
+                ),
+            ],
+            options={
+                "verbose_name": "Extra mark",
+                "verbose_name_plural": "Extra marks",
+                "ordering": ["short_name"],
+            },
+            managers=[("objects", django.contrib.sites.managers.CurrentSiteManager()),],
+        ),
+        migrations.AddField(
+            model_name="personalnote",
+            name="extra_marks",
+            field=models.ManyToManyField(
+                blank=True,
+                null=True,
+                to="alsijil.ExtraMark",
+                verbose_name="Extra marks",
+            ),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/migrations/0003_group_notes.py b/aleksis/apps/alsijil/migrations/0003_group_notes.py
deleted file mode 100644
index 312eab9f68fa2070e44319ba96eeca4888f463f1..0000000000000000000000000000000000000000
--- a/aleksis/apps/alsijil/migrations/0003_group_notes.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Generated by Django 3.0.8 on 2020-07-10 16:16
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('alsijil', '0002_excuse_type'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='lessondocumentation',
-            name='group_note',
-            field=models.CharField(blank=True, max_length=200, verbose_name='Group note'),
-        ),
-    ]
diff --git a/aleksis/apps/alsijil/migrations/0004_group_notes.py b/aleksis/apps/alsijil/migrations/0004_group_notes.py
new file mode 100644
index 0000000000000000000000000000000000000000..dbbb2edc3770e0edc573d47afbf26c5cd439eb0b
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0004_group_notes.py
@@ -0,0 +1,20 @@
+# Generated by Django 3.0.8 on 2020-07-10 16:16
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("alsijil", "0003_extra_mark"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="lessondocumentation",
+            name="group_note",
+            field=models.CharField(
+                blank=True, max_length=200, verbose_name="Group note"
+            ),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/migrations/0005_groups_of_person.py b/aleksis/apps/alsijil/migrations/0005_groups_of_person.py
new file mode 100644
index 0000000000000000000000000000000000000000..5f6a5ef1d74f2af102be9db597d55ae734d5d73d
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0005_groups_of_person.py
@@ -0,0 +1,33 @@
+# Generated by Django 3.0.8 on 2020-07-22 17:29
+
+from django.db import migrations, models
+
+
+def add_groups(apps, schema_editor):
+    PersonalNote = apps.get_model("alsijil", "PersonalNote")
+
+    db_alias = schema_editor.connection.alias
+
+    for personal_note in PersonalNote.objects.using(db_alias).all():
+        groups = list(personal_note.person.member_of.using(db_alias).all())
+        personal_note.groups_of_person.set(groups)
+        personal_note.save()
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("core", "0003_drop_image_cropping"),
+        ("alsijil", "0004_group_notes"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="personalnote",
+            name="groups_of_person",
+            field=models.ManyToManyField(
+                related_name="_personalnote_groups_of_person_+", to="core.Group"
+            ),
+        ),
+        migrations.RunPython(add_groups),
+    ]
diff --git a/aleksis/apps/alsijil/migrations/0006_delete_personal_notes_filter.py b/aleksis/apps/alsijil/migrations/0006_delete_personal_notes_filter.py
new file mode 100644
index 0000000000000000000000000000000000000000..723dda8ec898e69d60e9b065d9bb157395ad5dff
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0006_delete_personal_notes_filter.py
@@ -0,0 +1,14 @@
+# Generated by Django 3.0.8 on 2020-07-18 15:23
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("alsijil", "0005_groups_of_person"),
+    ]
+
+    operations = [
+        migrations.DeleteModel(name="PersonalNoteFilter",),
+    ]
diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py
index a09aa38c9be47c6a73e5d1e86caf6f375c9045e1..ecba9f773f54ba1343fbf86ab2cd2fc7003a760b 100644
--- a/aleksis/apps/alsijil/model_extensions.py
+++ b/aleksis/apps/alsijil/model_extensions.py
@@ -1,5 +1,5 @@
 from datetime import date
-from typing import Optional, Union
+from typing import Dict, Optional, Union
 
 from django.db.models import Exists, OuterRef, QuerySet
 
@@ -8,7 +8,7 @@ from calendarweek import CalendarWeek
 from aleksis.apps.chronos.models import LessonPeriod
 from aleksis.core.models import Group, Person
 
-from .models import ExcuseType, LessonDocumentation, PersonalNote
+from .models import ExcuseType, ExtraMark, LessonDocumentation, PersonalNote
 
 
 @Person.method
@@ -151,3 +151,20 @@ def get_tardinesses(self, week: Optional[CalendarWeek] = None) -> QuerySet:
     if not week:
         week = self.week
     return self.personal_notes.filter(week=week.week, late__gt=0)
+
+
+@LessonPeriod.method
+def get_extra_marks(
+    self, week: Optional[CalendarWeek] = None
+) -> Dict[ExtraMark, QuerySet]:
+    """Get all statistics on extra marks for this lesson."""
+    if not week:
+        week = self.week
+
+    stats = {}
+    for extra_mark in ExtraMark.objects.all():
+        qs = self.personal_notes.filter(week=week.week, extra_marks=extra_mark)
+        if qs:
+            stats[extra_mark] = qs
+
+    return stats
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index b8491bf6dcd3def3c8bb399fbc4e9721171db274..0f0e72bb864590684c8eab5e90eed5eb5f444546 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -42,6 +42,7 @@ class PersonalNote(ExtensibleModel):
     person = models.ForeignKey(
         "core.Person", models.CASCADE, related_name="personal_notes"
     )
+    groups_of_person = models.ManyToManyField("core.Group", related_name="+")
 
     week = models.IntegerField()
     lesson_period = models.ForeignKey(
@@ -61,6 +62,10 @@ class PersonalNote(ExtensibleModel):
 
     remarks = models.CharField(max_length=200, blank=True)
 
+    extra_marks = models.ManyToManyField(
+        "ExtraMark", null=True, blank=True, verbose_name=_("Extra marks")
+    )
+
     def save(self, *args, **kwargs):
         if self.excuse_type:
             self.excused = True
@@ -93,7 +98,9 @@ class LessonDocumentation(ExtensibleModel):
 
     topic = models.CharField(verbose_name=_("Lesson topic"), max_length=200, blank=True)
     homework = models.CharField(verbose_name=_("Homework"), max_length=200, blank=True)
-    group_note = models.CharField(verbose_name=_("Group note"), max_length=200, blank=True)
+    group_note = models.CharField(
+        verbose_name=_("Group note"), max_length=200, blank=True
+    )
 
     class Meta:
         verbose_name = _("Lesson documentation")
@@ -107,24 +114,25 @@ class LessonDocumentation(ExtensibleModel):
         ]
 
 
-class PersonalNoteFilter(ExtensibleModel):
-    """A filter definition that can generate statistics on personal note texts."""
+class ExtraMark(ExtensibleModel):
+    """A model for extra marks.
 
-    identifier = models.CharField(
-        verbose_name=_("Identifier"),
-        max_length=30,
-        validators=[isidentifier],
-        unique=True,
-    )
-    description = models.CharField(
-        verbose_name=_("Description"), max_length=60, blank=True, unique=True
-    )
+    Can be used for lesson-based counting of things (like forgotten homework).
+    """
 
-    regex = models.CharField(
-        verbose_name=_("Match expression"), max_length=100, unique=True
+    short_name = models.CharField(
+        max_length=255, unique=True, verbose_name=_("Short name")
     )
+    name = models.CharField(max_length=255, unique=True, verbose_name=_("Name"))
+
+    def __str__(self):
+        return f"{self.name}"
+
+    @property
+    def count_label(self):
+        return f"{self.short_name}_count"
 
     class Meta:
-        verbose_name = _("Personal note filter")
-        verbose_name_plural = _("Personal note filters")
-        ordering = ["identifier"]
+        ordering = ["short_name"]
+        verbose_name = _("Extra mark")
+        verbose_name_plural = _("Extra marks")
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/static/css/alsijil/lesson.css b/aleksis/apps/alsijil/static/css/alsijil/lesson.css
index 83b7db8e90d35891d0106f73ebf6176b36d32262..6d57c7e9910063dc8dfe359c643e65765cb6ad9c 100644
--- a/aleksis/apps/alsijil/static/css/alsijil/lesson.css
+++ b/aleksis/apps/alsijil/static/css/alsijil/lesson.css
@@ -1,3 +1,11 @@
+.alsijil-check-box {
+    margin-right: 10px;
+}
+
+.alsijil-check-box [type="checkbox"] {
+    padding-left: 30px;
+}
+
 .alsijil-lesson-cancelled {
     text-decoration: line-through;
 }
diff --git a/aleksis/apps/alsijil/tables.py b/aleksis/apps/alsijil/tables.py
index 3a6762c3744ead9d02e9917aa975b530b5e448f0..bd6b47a73f34c5e4343138993ee70162cd19b847 100644
--- a/aleksis/apps/alsijil/tables.py
+++ b/aleksis/apps/alsijil/tables.py
@@ -4,18 +4,23 @@ import django_tables2 as tables
 from django_tables2.utils import A
 
 
-class PersonalNoteFilterTable(tables.Table):
+class ExtraMarkTable(tables.Table):
     class Meta:
         attrs = {"class": "highlight"}
 
-    identifier = tables.Column()
-    description = tables.Column()
-    regex = tables.Column()
-    edit_filter = tables.LinkColumn(
-        "edit_personal_note_filter",
+    name = tables.LinkColumn("edit_extra_mark", args=[A("id")])
+    short_name = tables.Column()
+    edit = tables.LinkColumn(
+        "edit_extra_mark",
         args=[A("id")],
         text=_("Edit"),
-        attrs={"a": {"class": "btn-flat waves-effect waves-orange"}},
+        attrs={"a": {"class": "btn-flat waves-effect waves-orange orange-text"}},
+    )
+    delete = tables.LinkColumn(
+        "delete_extra_mark",
+        args=[A("id")],
+        text=_("Delete"),
+        attrs={"a": {"class": "btn-flat waves-effect waves-red red-text"}},
     )
 
 
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
index b2914f2bf5f841875d7d6a413af75d4d7a8d4866..9fca5de56fc8bd6316a4db3728ae449cd3882cbb 100644
--- a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
@@ -1,6 +1,6 @@
 {# -*- engine:django -*- #}
 {% extends "core/base.html" %}
-{% load week_helpers %}
+{% load week_helpers material_form_internal %}
 {% load material_form i18n static %}
 
 {% block browser_title %}{% blocktrans %}Lesson{% endblocktrans %}{% endblock %}
@@ -50,17 +50,29 @@
   </div>
 
   <form method="post">
+    <p>{% include "core/partials/save_button.html" %}</p>
+    {% csrf_token %}
+
     <div class="row">
       <div class="col s12">
-        {% include "core/partials/save_button.html" %}
+        <ul class="tabs">
+          <li class="tab">
+            <a href="#lesson-documentation">{% trans "Lesson documentation" %}</a>
+          </li>
+          {% 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>
+          {% endif %}
+          <li class="tab">
+            <a href="#version-history">{% trans "Change history" %}</a>
+          </li>
+        </ul>
       </div>
-    </div>
-    {% csrf_token %}
 
-    <div class="row">
-      <div class="col s12 m12 l6 xl8">
+      <div class="col s12" id="lesson-documentation">
         {% with prev_lesson=lesson_period.prev prev_doc=prev_lesson.get_lesson_documentation %}
-          {% with prev_doc=prev_lesson.get_lesson_documentation absences=prev_lesson.get_absences tardinesses=prev_lesson.get_tardinesses %}
+          {% with prev_doc=prev_lesson.get_lesson_documentation absences=prev_lesson.get_absences tardinesses=prev_lesson.get_tardinesses extra_marks=prev_lesson.get_extra_marks %}
             {% if prev_doc %}
               {% weekday_to_date prev_lesson.week prev_lesson.period.weekday as prev_date %}
 
@@ -106,6 +118,18 @@
                         <td>{% include "alsijil/partials/tardinesses.html" with notes=tardinesses %}</td>
                       </tr>
                     {% endif %}
+
+                    {% for extra_mark, notes in extra_marks.items %}
+                      <tr>
+                        <th>{{ extra_mark.name }}</th>
+                        <td>
+                          {% for note in notes %}
+                            <span>{{ note.person }}{% if not forloop.last %},{% endif %}</span>
+                          {% endfor %}
+                        </td>
+                      </tr>
+                    {% endfor %}
+
                   </table>
                 </div>
               </div>
@@ -123,92 +147,113 @@
           </div>
         </div>
       </div>
-      <div class="col s12 m12 l6 xl4">
-        <div class="card">
-          <div class="card-content">
-          <span class="card-title">
-            {% blocktrans %}Change history{% endblocktrans %}
-          </span>
-            {% include 'core/partials/crud_events.html' with obj=lesson_documentation %}
-          </div>
-        </div>
-      </div>
-    </div>
 
-    <div class="row">
-      <div class="col s12">
-        <div class="card">
-          <div class="card-content">
+      {% 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">
       <span class="card-title">
         {% blocktrans %}Personal notes{% endblocktrans %}
       </span>
-            {% form form=personal_note_formset.management_form %}{% endform %}
-
-            <table class="striped responsive-table alsijil-table">
-              <thead>
-              <tr>
-                <th>{% blocktrans %}Person{% endblocktrans %}</th>
-                <th>{% blocktrans %}Absent{% endblocktrans %}</th>
-                <th>{% blocktrans %}Tardiness{% endblocktrans %}</th>
-                <th>{% blocktrans %}Excused{% endblocktrans %}</th>
-                <th>{% blocktrans %}Excuse type{% endblocktrans %}</th>
-                <th>{% blocktrans %}Remarks{% endblocktrans %}</th>
-              </tr>
-              </thead>
-              <tbody>
-              {% for form in personal_note_formset %}
+              {% form form=personal_note_formset.management_form %}{% endform %}
+
+              <table class="striped responsive-table alsijil-table">
+                <thead>
                 <tr>
-                  {{ form.id }}
-                  <td>{{ form.person_name }}{{ form.person_name.value }}</td>
-                  <td class="center-align">
-                    <label>
-                      {{ form.absent }}
-                      <span></span>
-                    </label>
-                  </td>
-                  <td>
-                    <div class="input-field">
-                      {{ form.late }}
-                      <label for="{{ form.absent.id_for_label }}">
-                        {% trans "Tardiness (in m)" %}
-                      </label>
-                    </div>
-                  </td>
-                  <td class="center-align">
-                    <label>
-                      {{ form.excused }}
-                      <span></span>
-                    </label>
-                  </td>
-                  <td>
-                    <div class="input-field">
-                      {{ form.excuse_type }}
-                      <label for="{{ form.excuse_type.id_for_label }}">
-                        {% trans "Excuse type" %}
+                  <th>{% blocktrans %}Person{% endblocktrans %}</th>
+                  <th>{% blocktrans %}Absent{% endblocktrans %}</th>
+                  <th>{% blocktrans %}Tardiness{% endblocktrans %}</th>
+                  <th>{% blocktrans %}Excused{% endblocktrans %}</th>
+                  <th>{% blocktrans %}Excuse type{% endblocktrans %}</th>
+                  <th>{% blocktrans %}Extra marks{% endblocktrans %}</th>
+
+                  <th>{% blocktrans %}Remarks{% endblocktrans %}</th>
+                </tr>
+                </thead>
+                <tbody>
+                {% for form in personal_note_formset %}
+                  <tr>
+                    {{ form.id }}
+                    <td>{{ form.person_name }}{{ form.person_name.value }}</td>
+                    <td class="center-align">
+                      <label>
+                        {{ form.absent }}
+                        <span></span>
                       </label>
-                    </div>
-                  </td>
-                  <td>
-                    <div class="input-field">
-                      {{ form.remarks }}
-                      <label for="{{ form.absent.id_for_label }}">
-                        {% trans "Remarks" %}
+                    </td>
+                    <td>
+                      <div class="input-field">
+                        {{ form.late }}
+                        <label for="{{ form.absent.id_for_label }}">
+                          {% trans "Tardiness (in m)" %}
+                        </label>
+                      </div>
+                    </td>
+                    <td class="center-align">
+                      <label>
+                        {{ form.excused }}
+                        <span></span>
                       </label>
-                    </div>
-                  </td>
-                </tr>
-              {% endfor %}
-              </tbody>
-            </table>
+                    </td>
+                    <td>
+                      <div class="input-field">
+                        {{ form.excuse_type }}
+                        <label for="{{ form.excuse_type.id_for_label }}">
+                          {% trans "Excuse type" %}
+                        </label>
+                      </div>
+                    </td>
+                    <td>
+                      {% for group, items in form.extra_marks|select_options %}
+                        {% for choice, value, selected in items %}
+                          <label class="{% if selected %} active{% endif %} alsijil-check-box">
+                            <input type="checkbox"
+                                   {% if value == None or value == '' %}disabled{% else %}value="{{ value }}"{% endif %}
+                                    {% if selected %} checked="checked"{% endif %}
+                                   name="{{ form.extra_marks.html_name }}">
+                            <span>{{ choice }}</span>
+                          </label>
+                        {% endfor %}
+                      {% endfor %}
+                    </td>
+                    <td>
+                      <div class="input-field">
+                        {{ form.remarks }}
+                        <label for="{{ form.absent.id_for_label }}">
+                          {% trans "Remarks" %}
+                        </label>
+                      </div>
+                    </td>
+                    <td>
+                      <div class="input-field">
+                        {{ form.remarks }}
+                        <label for="{{ form.absent.id_for_label }}">
+                          {% trans "Remarks" %}
+                        </label>
+                      </div>
+                    </td>
+                  </tr>
+                {% endfor %}
+                </tbody>
+              </table>
+            </div>
           </div>
         </div>
-      </div>
-    </div>
 
-    <div class="row">
-      <div class="col s12">
-        {% include "core/partials/save_button.html" %}
+      {% endif %}
+
+      <div class="col s12" id="version-history">
+        <div class="card">
+          <div class="card-content">
+          <span class="card-title">
+            {% blocktrans %}Change history{% endblocktrans %}
+          </span>
+            {% include 'core/partials/crud_events.html' with obj=lesson_documentation %}
+          </div>
+        </div>
       </div>
     </div>
+
+    <p>{% include "core/partials/save_button.html" %}</p>
   </form>
 {% endblock %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
index 82584e53de8b53eefdf513b05f6dc09adddc54d7..d0761f8102f60e1ea899a8b1ba1d11c1e2402535 100644
--- a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
@@ -1,7 +1,7 @@
 {# -*- engine:django -*- #}
 
 {% extends "core/base.html" %}
-{% load material_form i18n week_helpers static %}
+{% load material_form i18n week_helpers static data_helpers %}
 
 {% block browser_title %}{% blocktrans %}Week view{% endblocktrans %}{% endblock %}
 
@@ -55,8 +55,12 @@
                 <tr>
                   <th></th>
                   <th>{% blocktrans %}Period{% endblocktrans %}</th>
+                  {% if not group %}
+                    <th>{% blocktrans %}Groups{% endblocktrans %}</th>
+                  {% endif %}
                   <th>{% blocktrans %}Subject{% endblocktrans %}</th>
                   <th>{% blocktrans %}Teachers{% endblocktrans %}</th>
+                  <th>{% blocktrans %}Lesson topic{% endblocktrans %}</th>
                 </tr>
                 </thead>
                 <tbody>
@@ -70,6 +74,13 @@
                         {{ period.period.period }}.
                       </a>
                     </td>
+                    {% if not group %}
+                      <td>
+                        <a class="tr-link" href="{% url 'lesson_by_week_and_period' week.year week.week period.id %}">
+                          {{ period.lesson.group_names }}
+                        </a>
+                      </td>
+                    {% endif %}
                     <td>
                       <a class="tr-link" href="{% url 'lesson_by_week_and_period' week.year week.week period.id %}">
                         {{ period.get_subject.name }}
@@ -80,6 +91,11 @@
                         {{ period.get_teacher_names }}
                       </a>
                     </td>
+                    <td>
+                      <a class="tr-link" href="{% url 'lesson_by_week_and_period' week.year week.week period.id %}">
+                        {{ period.get_lesson_documentation.topic }}
+                      </a>
+                    </td>
                   </tr>
                 {% endfor %}
                 </tbody>
@@ -103,6 +119,11 @@
               <p class="card-text">
                 {% trans "Summed up tardiness" %}: {{ person.person.tardiness_sum }}'
               </p>
+              {% for extra_mark in extra_marks %}
+                <p class="card-text">
+                  {{ extra_mark.name }}: {{ person.person|get_dict:extra_mark.count_label }}
+                </p>
+              {% endfor %}
               {% for note in person.personal_notes %}
                 {% if note.remarks %}
                   <blockquote>
diff --git a/aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html b/aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html
new file mode 100644
index 0000000000000000000000000000000000000000..d0ee3a9055561df1f468692f79d794404a60c1d1
--- /dev/null
+++ b/aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html
@@ -0,0 +1,17 @@
+	{# -*- engine:django -*- #}
+
+	{% extends "core/base.html" %}
+	{% load material_form i18n %}
+
+	{% block browser_title %}{% blocktrans %}Create extra mark{% endblocktrans %}{% endblock %}
+	{% block page_title %}{% blocktrans %}Create extra mark{% endblocktrans %}{% endblock %}
+
+	{% block content %}
+
+	  <form method="post">
+	    {% csrf_token %}
+	    {% form form=form %}{% endform %}
+	    {% include "core/partials/save_button.html" %}
+	  </form>
+
+	{% endblock %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/extra_mark/edit.html b/aleksis/apps/alsijil/templates/alsijil/extra_mark/edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..7adee30a1cfd30256d70b2a823827384de331e05
--- /dev/null
+++ b/aleksis/apps/alsijil/templates/alsijil/extra_mark/edit.html
@@ -0,0 +1,17 @@
+{# -*- engine:django -*- #}
+
+{% extends "core/base.html" %}
+{% load material_form i18n %}
+
+{% block browser_title %}{% blocktrans %}Edit extra mark{% endblocktrans %}{% endblock %}
+{% block page_title %}{% blocktrans %}Edit extra mark{% endblocktrans %}{% endblock %}
+
+{% block content %}
+
+  <form method="post">
+    {% csrf_token %}
+    {% form form=form %}{% endform %}
+    {% include "core/partials/save_button.html" %}
+  </form>
+
+{% endblock %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html b/aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html
new file mode 100644
index 0000000000000000000000000000000000000000..a1a12b38096de60bae34d61425a1da9c688ab9d6
--- /dev/null
+++ b/aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html
@@ -0,0 +1,18 @@
+{# -*- engine:django -*- #}
+
+{% extends "core/base.html" %}
+
+{% load i18n %}
+{% load render_table from django_tables2 %}
+
+{% block browser_title %}{% blocktrans %}Extra marks{% endblocktrans %}{% endblock %}
+{% block page_title %}{% blocktrans %}Extra marks{% endblocktrans %}{% endblock %}
+
+{% block content %}
+  <a class="btn green waves-effect waves-light" href="{% url 'create_extra_mark' %}">
+    <i class="material-icons left">add</i>
+    {% trans "Create extra mark" %}
+  </a>
+
+  {% render_table table %}
+{% endblock %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/lesson_status_icon.html b/aleksis/apps/alsijil/templates/alsijil/partials/lesson_status_icon.html
index 08746b5c9791b1b3f118387b3835dd4cbc4eec03..57b71b661994baf0f2b37a71678098d564cc88ed 100644
--- a/aleksis/apps/alsijil/templates/alsijil/partials/lesson_status_icon.html
+++ b/aleksis/apps/alsijil/templates/alsijil/partials/lesson_status_icon.html
@@ -8,17 +8,13 @@
   {% period_to_time_start week period.period as time_start %}
   {% period_to_time_end week period.period as time_end %}
 
-  {% if now_dt > time_end %}
+  {% if period.get_substitution.cancelled %}
+    <i class="material-icons red-text tooltipped {{ css_class }}"  data-position="bottom" data-tooltip="{% trans "Lesson cancelled" %}" title="{% trans "Lesson cancelled" %}">cancel</i>
+  {% elif now_dt > time_end %}
     <i class="material-icons red-text tooltipped {{ css_class }}"  data-position="bottom" data-tooltip="{% trans "Missing data" %}" title="{% trans "Missing data" %}">history</i>
   {% elif now_dt > time_start and now_dt < time_end %}
     <i class="material-icons orange-text tooltipped {{ css_class }}"  data-position="bottom" data-tooltip="{% trans "Pending" %}" title="{% trans "Pending" %}">more_horiz</i>
-  {% else %}
-    {% if period.get_substitution %}
-      {% if period.get_substitution.cancelled %}
-        <i class="material-icons red-text tooltipped {{ css_class }}"  data-position="bottom" data-tooltip="{% trans "Lesson cancelled" %}" title="{% trans "Lesson cancelled" %}">cancel</i>
-      {% else %}
-        <i class="material-icons orange-text tooltipped {{ css_class }}"  data-position="bottom" data-tooltip="{% trans "Substitution" %}" title="{% trans "Substitution" %}">update</i>
-      {% endif %}
-    {% endif %}
+  {% elif period.get_substitution %}
+    <i class="material-icons orange-text tooltipped {{ css_class }}"  data-position="bottom" data-tooltip="{% trans "Substitution" %}" title="{% trans "Substitution" %}">update</i>
   {% endif %}
 {% endif %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/list.html b/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/list.html
deleted file mode 100644
index 3673e60abb2395a368d6721320dbf654d139d953..0000000000000000000000000000000000000000
--- a/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/list.html
+++ /dev/null
@@ -1,16 +0,0 @@
-{# -*- engine:django -*- #}
-
-{% extends "core/base.html" %}
-{% load i18n %}
-{% load render_table from django_tables2 %}
-
-{% block browser_title %}{% blocktrans %}All personal note filters{% endblocktrans %}{% endblock %}
-{% block page_title %}{% blocktrans %}Personal note filters{% endblocktrans %}{% endblock %}
-
-{% block content %}
-  <a href="{% url 'create_personal_note_filter' %}" class="waves-effect waves-light green btn">
-    <i class="material-icons left">add</i>{% blocktrans %}Add filter{% endblocktrans %}
-  </a>
-
-  {% render_table personal_note_filters_table %}
-{% endblock %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/manage.html b/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/manage.html
deleted file mode 100644
index 427777439d73975a0cf3434bd507d27077cb9a2a..0000000000000000000000000000000000000000
--- a/aleksis/apps/alsijil/templates/alsijil/personal_note_filter/manage.html
+++ /dev/null
@@ -1,34 +0,0 @@
-{# -*- engine:django -*- #}
-{% extends "core/base.html" %}
-{% load material_form i18n static %}
-
-{% block browser_title %}
-  {% if personal_note_filter %}
-    {% trans "Update personal note filter" %}
-  {% else %}
-    {% trans "Create personal note filter" %}
-  {% endif %}
-{% endblock %}
-{% block page_title %}
-  {% if personal_note_filter %}
-    {% trans "Update personal note filter" %}
-  {% else %}
-    {% trans "Create personal note filter" %}
-  {% endif %}
-{% endblock %}
-
-
-{% block content %}
-  <form method="post">
-    {% csrf_token %}
-    {% form form=personal_note_filter_form %}{% endform %}
-    {% include "core/partials/save_button.html" %}
-    {% if personal_note_filter %}
-      <a href="{% url 'delete_personal_note_filter' personal_note_filter.id %}"
-         class="waves-effect waves-light btn red">
-        <i class="material-icons left">delete</i>{% blocktrans %}Delete filter{% endblocktrans %}
-      </a>
-    {% endif %}
-  </form>
-
-{% endblock %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html
index 432f8e655a3026a3faa8518e472eeb9152a94d8f..373ae6a88f6f42953dfa0b4ffeceb8a26716104b 100644
--- a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html
+++ b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html
@@ -97,6 +97,18 @@
     </ul>
   {% endif %}
 
+  {% if extra_marks %}
+    <h5>{% trans "Available extra marks" %}</h5>
+
+    <ul class="collection">
+      {% for extra_mark in extra_marks %}
+        <li class="collection-item">
+          <strong>{{ extra_mark.short_name }}</strong> {{ extra_mark.name }}
+        </li>
+      {% endfor %}
+    </ul>
+  {% endif %}
+
   <div class="page-break">&nbsp;</div>
 
 
@@ -117,6 +129,9 @@
       {% endfor %}
       <th>{% trans '(u)' %}</th>
       <th>{% trans '(b)' %}</th>
+      {% for extra_mark in extra_marks %}
+        <th>{{ extra_mark.short_name }}</th>
+      {% endfor %}
     </tr>
     </thead>
 
@@ -135,6 +150,9 @@
         {% endfor %}
         <td>{{ person.unexcused }}</td>
         <td>{{ person.tardiness }}'</td>
+        {% for extra_mark in extra_marks %}
+          <td>{{ person|get_dict:extra_mark.count_label }}</td>
+        {% endfor %}
       </tr>
     {% endfor %}
     </tbody>
@@ -245,29 +263,6 @@
       </tr>
     </table>
 
-    {% if personal_note_filters %}
-      <h5>{% trans 'Statistics on remarks' %}</h5>
-      <table>
-        <thead>
-        <tr>
-          <th>{% trans 'Description' %}</th>
-          <th>{% trans 'Count' %}</th>
-        </tr>
-        </thead>
-
-        <tbody>
-        {% for note_filter in personal_note_filters %}
-          <tr>
-            <td>{{ note_filter.description }}</td>
-            {% with "_personal_notes_with_"|add:note_filter.identifier as identifier %}
-              <td>{{ person|get_dict:identifier }}</td>
-            {% endwith %}
-          </tr>
-        {% endfor %}
-        </tbody>
-      </table>
-    {% endif %}
-
     <h5>{% trans 'Absences and tardiness' %}</h5>
     <table>
       <tr>
@@ -294,6 +289,18 @@
       </tr>
     </table>
 
+    {% if extra_marks %}
+      <h5>{% trans 'Extra marks' %}</h5>
+      <table>
+        {% for extra_mark in extra_marks %}
+          <tr>
+            <th>{{ extra_mark.name }}</th>
+            <td>{{ person|get_dict:extra_mark.count_label }}</td>
+          </tr>
+        {% endfor %}
+      </table>
+    {% endif %}
+
     <h5>{% trans 'Relevant personal notes' %}</h5>
     <table class="small-print">
       <thead>
@@ -304,38 +311,45 @@
         <th>{% trans 'Te.' %}</th>
         <th>{% trans 'Absent' %}</th>
         <th>{% trans 'Tard.' %}</th>
-        <th>{% trans 'Remarks' %}</th>
+        <th colspan="2">{% trans 'Remarks' %}</th>
       </tr>
       </thead>
 
       <tbody>
       {% for note in person.personal_notes.all %}
-        {% if note.absent or note.late or note.remarks %}
-          {% period_to_date note.week note.lesson_period.period as note_date %}
-          <tr>
-            <td>{{ note_date }}</td>
-            <td>{{ note.lesson_period.period.period }}</td>
-            <td>{{ note.lesson_period.get_subject.short_name }} </td>
-            <td>{{ note.lesson_period.get_teachers.first.short_name }}</td>
-            <td>
-              {% if note.absent %}
-                {% trans 'Yes' %}
-                {% if note.excused %}
-                  {% if note.excuse_type %}
-                    ({{ note.excuse_type.short_name }})
-                  {% else %}
-                    ({% trans 'e' %})
+        {% if note.lesson_period in lesson_periods %}
+          {% if note.absent or note.late or note.remarks or note.extra_marks.all %}
+            {% period_to_date note.week note.lesson_period.period as note_date %}
+            <tr>
+              <td>{{ note_date }}</td>
+              <td>{{ note.lesson_period.period.period }}</td>
+              <td>{{ note.lesson_period.get_subject.short_name }} </td>
+              <td>{{ note.lesson_period.get_teachers.first.short_name }}</td>
+              <td>
+                {% if note.absent %}
+                  {% trans 'Yes' %}
+                  {% if note.excused %}
+                    {% if note.excuse_type %}
+                      ({{ note.excuse_type.short_name }})
+                    {% else %}
+                      ({% trans 'e' %})
+                    {% endif %}
                   {% endif %}
                 {% endif %}
-              {% endif %}
-            </td>
-            <td>
-              {% if note.late %}
-                {{ note.late }}'
-              {% endif %}
-            </td>
-            <td>{{ note.remarks }}</td>
-          </tr>
+              </td>
+              <td>
+                {% if note.late %}
+                  {{ note.late }}'
+                {% endif %}
+              </td>
+              <td>
+                {% for extra_mark in note.extra_marks.all %}
+                  {{ extra_mark.short_name }}{% if not forloop.last %},{% endif %}
+                {% endfor %}
+              </td>
+              <td>{{ note.remarks }}</td>
+            </tr>
+          {% endif %}
         {% endif %}
       {% endfor %}
       </tbody>
@@ -398,35 +412,43 @@
               <td class="lesson-notes">
                 {{ documentations.0.group_note }}
                 {% for note in notes %}
-                  {% if note.absent %}
-                    <span class="lesson-note-absent">
-                      {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}.
-                      {% if note.excused %}
-                        <span class="lesson-note-excused">
-                          {% if note.excuse_type %}
-                            ({{ note.excuse_type.short_name }})
-                          {% else %}
-                            ({% trans 'e' %})
-                          {% endif %}
-                        </span>
-                      {% endif %}
+                  {% if group in note.groups_of_person.all %}
+                    {% if note.absent %}
+                      <span class="lesson-note-absent">
+                        {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}.
+                        {% if note.excused %}
+                          <span class="lesson-note-excused">
+                            {% if note.excuse_type %}
+                              ({{ note.excuse_type.short_name }})
+                            {% else %}
+                              ({% trans 'e' %})
+                            {% endif %}
+                          </span>
+                        {% endif %}
                       </span>
-                  {% endif %}
-                  {% if note.late %}
-                    <span class="lesson-note-late">
-                      {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}.
-                      ({{ note.late }}′)
-                      {% if note.excused %}
-                        <span class="lesson-note-excused">
-                          {% if note.excuse_type %}
-                            ({{ note.excuse_type.short_name }})
-                          {% else %}
-                            ({% trans 'e' %})
-                          {% endif %}
-                        </span>
-                      {% endif %}
+                    {% endif %}
+                    {% if note.late %}
+                      <span class="lesson-note-late">
+                        {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}.
+                        ({{ note.late }}′)
+                        {% if note.excused %}
+                          <span class="lesson-note-excused">
+                            {% if note.excuse_type %}
+                              ({{ note.excuse_type.short_name }})
+                            {% else %}
+                              ({% trans 'e' %})
+                            {% endif %}
+                          </span>
+                        {% endif %}
                       </span>
+                    {% endif %}
                   {% endif %}
+                  {% for extra_mark in note.extra_marks.all %}
+                    <span>
+                      {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}.
+                      ({{ extra_mark.short_name }})
+                    </span>
+                  {% endfor %}
                 {% endfor %}
               </td>
               <td class="lesson-te">
diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py
index 3e33dda9f967909fed36c7208e2af5c00d796316..49ccfd90cbac2799fa1dd46af975c935bcfd8beb 100644
--- a/aleksis/apps/alsijil/urls.py
+++ b/aleksis/apps/alsijil/urls.py
@@ -21,25 +21,21 @@ urlpatterns = [
         "print/group/<int:id_>", views.full_register_group, name="full_register_group"
     ),
     path("absence/new", views.register_absence, name="register_absence"),
+    path("extra_marks/", views.ExtraMarkListView.as_view(), name="extra_marks"),
     path(
-        "filters/list",
-        views.list_personal_note_filters,
-        name="list_personal_note_filters",
+        "extra_marks/create/",
+        views.ExtraMarkCreateView.as_view(),
+        name="create_extra_mark",
     ),
     path(
-        "filters/create",
-        views.edit_personal_note_filter,
-        name="create_personal_note_filter",
+        "extra_marks/<int:pk>/edit/",
+        views.ExtraMarkEditView.as_view(),
+        name="edit_extra_mark",
     ),
     path(
-        "filters/edit/<int:id_>",
-        views.edit_personal_note_filter,
-        name="edit_personal_note_filter",
-    ),
-    path(
-        "filters/delete/<int:id_>",
-        views.delete_personal_note_filter,
-        name="delete_personal_note_filter",
+        "extra_marks/<int:pk>/delete/",
+        views.ExtraMarkDeleteView.as_view(),
+        name="delete_extra_mark",
     ),
     path("excuse_types/", views.ExcuseTypeListView.as_view(), name="excuse_types"),
     path(
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index 9e0167c31c415e7eb4fbcfa3ab25f5c848e18845..96a620785de88ba4b7a0b00aa65d65a466eb4487 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -14,23 +14,25 @@ from reversion.views import RevisionMixin
 from rules.contrib.views import PermissionRequiredMixin
 
 from aleksis.apps.chronos.managers import TimetableType
-from aleksis.apps.chronos.models import LessonPeriod
+from aleksis.apps.chronos.models import LessonPeriod, LessonSubstitution
 from aleksis.apps.chronos.util.chronos_helpers import get_el_by_pk
+from aleksis.apps.chronos.util.date import week_weekday_to_date
 from aleksis.apps.chronos.util.date import get_weeks_for_year
 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,
+    ExtraMarkForm,
     LessonDocumentationForm,
-    PersonalNoteFilterForm,
     PersonalNoteFormSet,
     RegisterAbsenceForm,
     SelectForm,
 )
-from .models import ExcuseType, LessonDocumentation, PersonalNoteFilter
-from .tables import ExcuseTypeTable, PersonalNoteFilterTable
+from .models import ExcuseType, ExtraMark, LessonDocumentation
+from .tables import ExcuseTypeTable, ExtraMarkTable
 
 
 def lesson(
@@ -47,6 +49,14 @@ def lesson(
         lesson_period = LessonPeriod.objects.annotate_week(wanted_week).get(
             pk=period_id
         )
+
+        date_of_lesson = week_weekday_to_date(wanted_week, lesson_period.period.weekday)
+
+        if (
+            date_of_lesson < lesson_period.lesson.validity.date_start
+            or date_of_lesson > lesson_period.lesson.validity.date_end
+        ):
+            return HttpResponseNotFound()
     else:
         # Determine current lesson by current date and time
         lesson_period = (
@@ -106,18 +116,23 @@ def lesson(
 
             messages.success(request, _("The lesson documentation has been saved."))
 
-        if personal_note_formset.is_valid():
-            instances = personal_note_formset.save()
-
-            # Iterate over personal notes and carry changed absences to following lessons
-            for instance in instances:
-                instance.person.mark_absent(
-                    wanted_week[lesson_period.period.weekday],
-                    lesson_period.period.period + 1,
-                    instance.absent,
-                    instance.excused,
-                    instance.excuse_type,
-                )
+        substitution = lesson_period.get_substitution()
+        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()
+
+                # Iterate over personal notes and carry changed absences to following lessons
+                for instance in instances:
+                    instance.person.mark_absent(
+                        wanted_week[lesson_period.period.weekday],
+                        lesson_period.period.period + 1,
+                        instance.absent,
+                        instance.excused,
+                        instance.excuse_type,
+                    )
 
             messages.success(request, _("The personal notes have been saved."))
 
@@ -247,6 +262,21 @@ def week_view(
             )
         )
 
+        for extra_mark in ExtraMark.objects.all():
+            persons_qs = persons_qs.annotate(
+                **{
+                    extra_mark.count_label: Count(
+                        "personal_notes",
+                        filter=Q(
+                            personal_notes__lesson_period__in=lesson_periods_pk,
+                            personal_notes__week=wanted_week.week,
+                            personal_notes__extra_marks=extra_mark,
+                        ),
+                        distinct=True,
+                    )
+                }
+            )
+
         persons = []
         for person in persons_qs:
             persons.append(
@@ -270,6 +300,7 @@ def week_view(
             for a in args:
                 iterable.append(a)
 
+    context["extra_marks"] = ExtraMark.objects.all()
     context["week"] = wanted_week
     context["weeks"] = get_weeks_for_year(year=wanted_week.year)
     context["lesson_periods"] = lesson_periods
@@ -307,18 +338,19 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
 
     group = get_object_or_404(Group, pk=id_)
 
+    current_school_term = SchoolTerm.current
+
+    if not current_school_term:
+        return HttpResponseNotFound(_("There is no current school term."))
+
     # Get all lesson periods for the selected group
     lesson_periods = (
         LessonPeriod.objects.filter_group(group)
+        .filter(lesson__validity__school_term=current_school_term)
         .distinct()
         .prefetch_related("documentations", "personal_notes")
     )
 
-    current_school_term = SchoolTerm.current
-
-    if not current_school_term:
-        return HttpResponseNotFound(_("There is no current school term."))
-
     weeks = CalendarWeek.weeks_within(
         current_school_term.date_start, current_school_term.date_end,
     )
@@ -351,9 +383,16 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
                     (lesson_period, documentations, notes, substitution)
                 )
 
-    persons = group.members.annotate(
+    persons = Person.objects.filter(
+        personal_notes__groups_of_person=group,
+        personal_notes__lesson_period__lesson__validity__school_term=current_school_term,
+    ).annotate(
         absences_count=Count(
-            "personal_notes__absent", filter=Q(personal_notes__absent=True)
+            "personal_notes__absent",
+            filter=Q(
+                personal_notes__absent=True,
+                personal_notes__lesson_period__lesson__validity__school_term=current_school_term,
+            ),
         ),
         excused=Count(
             "personal_notes__absent",
@@ -361,38 +400,42 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
                 personal_notes__absent=True,
                 personal_notes__excused=True,
                 personal_notes__excuse_type__isnull=True,
+                personal_notes__lesson_period__lesson__validity__school_term=current_school_term,
             ),
         ),
         unexcused=Count(
             "personal_notes__absent",
-            filter=Q(personal_notes__absent=True, personal_notes__excused=False),
+            filter=Q(
+                personal_notes__absent=True,
+                personal_notes__excused=False,
+                personal_notes__lesson_period__lesson__validity__school_term=current_school_term,
+            ),
         ),
         tardiness=Sum("personal_notes__late"),
     )
 
-    for excuse_type in ExcuseType.objects.all():
+    for extra_mark in ExtraMark.objects.all():
         persons = persons.annotate(
             **{
-                excuse_type.count_label: Count(
-                    "personal_notes__absent",
+                extra_mark.count_label: Count(
+                    "personal_notes",
                     filter=Q(
-                        personal_notes__absent=True,
-                        personal_notes__excuse_type=excuse_type,
+                        personal_notes__extra_marks=extra_mark,
+                        personal_notes__lesson_period__lesson__validity__school_term=current_school_term,
                     ),
                 )
             }
         )
 
-    # FIXME Move to manager
-    personal_note_filters = PersonalNoteFilter.objects.all()
-    for personal_note_filter in personal_note_filters:
+    for excuse_type in ExcuseType.objects.all():
         persons = persons.annotate(
             **{
-                "_personal_notes_with_%s"
-                % personal_note_filter.identifier: Count(
-                    "personal_notes__remarks",
+                excuse_type.count_label: Count(
+                    "personal_notes__absent",
                     filter=Q(
-                        personal_notes__remarks__iregex=personal_note_filter.regex
+                        personal_notes__absent=True,
+                        personal_notes__excuse_type=excuse_type,
+                        personal_notes__lesson_period__lesson__validity__school_term=current_school_term,
                     ),
                 )
             }
@@ -400,11 +443,12 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
 
     context["school_term"] = current_school_term
     context["persons"] = persons
-    context["personal_note_filters"] = personal_note_filters
     context["excuse_types"] = ExcuseType.objects.all()
+    context["extra_marks"] = ExtraMark.objects.all()
     context["group"] = group
     context["weeks"] = weeks
     context["periods_by_day"] = periods_by_day
+    context["lesson_periods"] = lesson_periods
     context["today"] = date.today()
 
     return render(request, "alsijil/print/full_register.html", context)
@@ -441,57 +485,45 @@ def register_absence(request: HttpRequest) -> HttpResponse:
     return render(request, "alsijil/absences/register.html", context)
 
 
-def list_personal_note_filters(request: HttpRequest) -> HttpResponse:
-    context = {}
-
-    personal_note_filters = PersonalNoteFilter.objects.all()
-
-    # Prepare table
-    personal_note_filters_table = PersonalNoteFilterTable(personal_note_filters)
-    RequestConfig(request).configure(personal_note_filters_table)
+class ExtraMarkListView(SingleTableView, PermissionRequiredMixin):
+    """Table of all extra marks."""
 
-    context["personal_note_filters_table"] = personal_note_filters_table
+    model = ExtraMark
+    table_class = ExtraMarkTable
+    permission_required = "core.view_extramark"
+    template_name = "alsijil/extra_mark/list.html"
 
-    return render(request, "alsijil/personal_note_filter/list.html", context)
 
+class ExtraMarkCreateView(AdvancedCreateView, PermissionRequiredMixin):
+    """Create view for extra marks."""
 
-def edit_personal_note_filter(
-    request: HttpRequest, id_: Optional["int"] = None
-) -> HttpResponse:
-    context = {}
+    model = ExtraMark
+    form_class = ExtraMarkForm
+    permission_required = "core.create_extramark"
+    template_name = "alsijil/extra_mark/create.html"
+    success_url = reverse_lazy("extra_marks")
+    success_message = _("The extra mark has been created.")
 
-    if id_:
-        personal_note_filter = PersonalNoteFilter.objects.get(id=id_)
-        context["personal_note_filter"] = personal_note_filter
-        personal_note_filter_form = PersonalNoteFilterForm(
-            request.POST or None, instance=personal_note_filter
-        )
-    else:
-        personal_note_filter_form = PersonalNoteFilterForm(request.POST or None)
-
-    if request.method == "POST":
-        if personal_note_filter_form.is_valid():
-            personal_note_filter_form.save(commit=True)
 
-            messages.success(request, _("The filter has been saved"))
-            return redirect("list_personal_note_filters")
+class ExtraMarkEditView(AdvancedEditView, PermissionRequiredMixin):
+    """Edit view for extra marks."""
 
-    context["personal_note_filter_form"] = personal_note_filter_form
+    model = ExtraMark
+    form_class = ExtraMarkForm
+    permission_required = "core.edit_extramark"
+    template_name = "alsijil/extra_mark/edit.html"
+    success_url = reverse_lazy("extra_marks")
+    success_message = _("The extra mark has been saved.")
 
-    return render(request, "alsijil/personal_note_filter/manage.html", context)
 
+class ExtraMarkDeleteView(AdvancedDeleteView, PermissionRequiredMixin, RevisionMixin):
+    """Delete view for extra marks"""
 
-def delete_personal_note_filter(request: HttpRequest, id_: int) -> HttpResponse:
-    context = {}
-
-    personal_note_filter = get_object_or_404(PersonalNoteFilter, pk=id_)
-
-    PersonalNoteFilter.objects.filter(pk=id_).delete()
-
-    messages.success(request, _("The filter has been deleted."))
-
-    context["personal_note_filter"] = personal_note_filter
-    return redirect("list_personal_note_filters")
+    model = ExtraMark
+    permission_required = "core.delete_extramark"
+    template_name = "core/pages/delete.html"
+    success_url = reverse_lazy("extra_marks")
+    success_message = _("The extra mark has been deleted.")
 
 
 class ExcuseTypeListView(SingleTableView, PermissionRequiredMixin):
diff --git a/poetry.lock b/poetry.lock
index d0ecccb2126253bc14e4e9b40f71c0371e045768..978de725f9360d5c85e23b370ac282a33a793243 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -68,11 +68,11 @@ extras = ["phonenumbers"]
 version = ">=3.0,<4.0"
 
 [package.dependencies.django-two-factor-auth]
-extras = ["sms", "phonenumbers", "call", "yubikey"]
+extras = ["phonenumbers", "sms", "call", "yubikey"]
 version = ">=1.11.0,<2.0.0"
 
 [package.dependencies.dynaconf]
-extras = ["yaml", "toml", "ini"]
+extras = ["toml", "yaml", "ini"]
 version = ">=2.0,<3.0"
 
 [package.extras]
@@ -287,7 +287,7 @@ description = "Code coverage measurement for Python"
 name = "coverage"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
-version = "5.1"
+version = "5.2.1"
 
 [package.extras]
 toml = ["toml"]
@@ -390,7 +390,7 @@ description = "simple color field for your models with a nice color-picker in th
 name = "django-colorfield"
 optional = false
 python-versions = "*"
-version = "0.3.1"
+version = "0.3.2"
 
 [[package]]
 category = "main"
@@ -436,7 +436,7 @@ description = "Yet another Django audit log app, hopefully the simplest one."
 name = "django-easy-audit"
 optional = false
 python-versions = "*"
-version = "1.2.3"
+version = "1.3.0a3"
 
 [package.dependencies]
 beautifulsoup4 = "*"
@@ -628,12 +628,11 @@ description = "A django-otp plugin that verifies YubiKey OTP tokens."
 name = "django-otp-yubikey"
 optional = false
 python-versions = "*"
-version = "0.5.2"
+version = "0.6.0"
 
 [package.dependencies]
 YubiOTP = ">=0.2.2"
 django-otp = ">=0.5.0"
-six = ">=1.10.0"
 
 [[package]]
 category = "main"
@@ -678,11 +677,11 @@ category = "main"
 description = "Render a particular block from a template to a string."
 name = "django-render-block"
 optional = false
-python-versions = "*"
-version = "0.6"
+python-versions = ">=3.5"
+version = "0.7"
 
 [package.dependencies]
-django = ">=1.11"
+django = ">=2.2"
 
 [[package]]
 category = "main"
@@ -775,10 +774,10 @@ description = "Complete Two-Factor Authentication for Django"
 name = "django-two-factor-auth"
 optional = false
 python-versions = "*"
-version = "1.11.0"
+version = "1.12.1"
 
 [package.dependencies]
-Django = ">=1.11"
+Django = ">=2.2"
 django-formtools = "*"
 django-otp = ">=0.6.0,<0.99"
 django-phonenumber-field = ">=1.1.0,<3.99"
@@ -939,7 +938,7 @@ description = "flake8 plugin to call black as a code style validator"
 name = "flake8-black"
 optional = false
 python-versions = "*"
-version = "0.2.0"
+version = "0.2.1"
 
 [package.dependencies]
 black = "*"
@@ -1062,7 +1061,7 @@ description = "Python Git Library"
 name = "gitpython"
 optional = false
 python-versions = ">=3.4"
-version = "3.1.3"
+version = "3.1.7"
 
 [package.dependencies]
 gitdb = ">=4.0.1,<5"
@@ -1113,9 +1112,10 @@ description = "A Python utility / library to sort Python imports."
 name = "isort"
 optional = false
 python-versions = ">=3.6,<4.0"
-version = "5.0.3"
+version = "5.2.2"
 
 [package.extras]
+colors = ["colorama (>=0.4.3,<0.5.0)"]
 pipfile_deprecated_finder = ["pipreqs", "requirementslib", "tomlkit (>=0.5.3)"]
 requirements_deprecated_finder = ["pipreqs", "pip-api"]
 
@@ -1245,7 +1245,7 @@ description = "PostgreSQL interface library"
 name = "pg8000"
 optional = false
 python-versions = ">=3.5"
-version = "1.15.3"
+version = "1.16.3"
 
 [package.dependencies]
 scramp = "1.2.0"
@@ -1256,7 +1256,7 @@ description = "Python version of Google's common library for parsing, formatting
 name = "phonenumbers"
 optional = false
 python-versions = "*"
-version = "8.12.6"
+version = "8.12.7"
 
 [[package]]
 category = "main"
@@ -1436,7 +1436,7 @@ description = "pytest-sugar is a plugin for pytest that changes the default look
 name = "pytest-sugar"
 optional = false
 python-versions = "*"
-version = "0.9.3"
+version = "0.9.4"
 
 [package.dependencies]
 packaging = ">=14.1"
@@ -1527,7 +1527,7 @@ description = "Alternative regular expression module, to replace re."
 name = "regex"
 optional = false
 python-versions = "*"
-version = "2020.6.8"
+version = "2020.7.14"
 
 [[package]]
 category = "main"
@@ -1780,11 +1780,15 @@ description = "Manage dynamic plugins for Python applications"
 name = "stevedore"
 optional = false
 python-versions = ">=3.6"
-version = "2.0.1"
+version = "3.2.0"
 
 [package.dependencies]
 pbr = ">=2.0.0,<2.1.0 || >2.1.0"
 
+[package.dependencies.importlib-metadata]
+python = "<3.8"
+version = ">=1.7.0"
+
 [[package]]
 category = "dev"
 description = "ANSII Color formatting for output in terminal."
@@ -1854,7 +1858,7 @@ description = "Fast, Extensible Progress Meter"
 name = "tqdm"
 optional = false
 python-versions = ">=2.6, !=3.0.*, !=3.1.*"
-version = "4.47.0"
+version = "4.48.0"
 
 [package.extras]
 dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"]
@@ -1865,7 +1869,7 @@ description = "Twilio API client and TwiML generator"
 name = "twilio"
 optional = false
 python-versions = "*"
-version = "6.43.0"
+version = "6.44.1"
 
 [package.dependencies]
 PyJWT = ">=1.4.2"
@@ -1898,7 +1902,7 @@ description = "HTTP library with thread-safe connection pooling, file post, and
 name = "urllib3"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
-version = "1.25.9"
+version = "1.25.10"
 
 [package.extras]
 brotli = ["brotlipy (>=0.6.0)"]
@@ -2032,37 +2036,40 @@ configobj = [
     {file = "configobj-5.0.6.tar.gz", hash = "sha256:a2f5650770e1c87fb335af19a9b7eb73fc05ccf22144eb68db7d00cd2bcb0902"},
 ]
 coverage = [
-    {file = "coverage-5.1-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:0cb4be7e784dcdc050fc58ef05b71aa8e89b7e6636b99967fadbdba694cf2b65"},
-    {file = "coverage-5.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:c317eaf5ff46a34305b202e73404f55f7389ef834b8dbf4da09b9b9b37f76dd2"},
-    {file = "coverage-5.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b83835506dfc185a319031cf853fa4bb1b3974b1f913f5bb1a0f3d98bdcded04"},
-    {file = "coverage-5.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5f2294dbf7875b991c381e3d5af2bcc3494d836affa52b809c91697449d0eda6"},
-    {file = "coverage-5.1-cp27-cp27m-win32.whl", hash = "sha256:de807ae933cfb7f0c7d9d981a053772452217df2bf38e7e6267c9cbf9545a796"},
-    {file = "coverage-5.1-cp27-cp27m-win_amd64.whl", hash = "sha256:bf9cb9a9fd8891e7efd2d44deb24b86d647394b9705b744ff6f8261e6f29a730"},
-    {file = "coverage-5.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:acf3763ed01af8410fc36afea23707d4ea58ba7e86a8ee915dfb9ceff9ef69d0"},
-    {file = "coverage-5.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:dec5202bfe6f672d4511086e125db035a52b00f1648d6407cc8e526912c0353a"},
-    {file = "coverage-5.1-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:7a5bdad4edec57b5fb8dae7d3ee58622d626fd3a0be0dfceda162a7035885ecf"},
-    {file = "coverage-5.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1601e480b9b99697a570cea7ef749e88123c04b92d84cedaa01e117436b4a0a9"},
-    {file = "coverage-5.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:dbe8c6ae7534b5b024296464f387d57c13caa942f6d8e6e0346f27e509f0f768"},
-    {file = "coverage-5.1-cp35-cp35m-win32.whl", hash = "sha256:a027ef0492ede1e03a8054e3c37b8def89a1e3c471482e9f046906ba4f2aafd2"},
-    {file = "coverage-5.1-cp35-cp35m-win_amd64.whl", hash = "sha256:0e61d9803d5851849c24f78227939c701ced6704f337cad0a91e0972c51c1ee7"},
-    {file = "coverage-5.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:2d27a3f742c98e5c6b461ee6ef7287400a1956c11421eb574d843d9ec1f772f0"},
-    {file = "coverage-5.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66460ab1599d3cf894bb6baee8c684788819b71a5dc1e8fa2ecc152e5d752019"},
-    {file = "coverage-5.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5c542d1e62eece33c306d66fe0a5c4f7f7b3c08fecc46ead86d7916684b36d6c"},
-    {file = "coverage-5.1-cp36-cp36m-win32.whl", hash = "sha256:2742c7515b9eb368718cd091bad1a1b44135cc72468c731302b3d641895b83d1"},
-    {file = "coverage-5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:dead2ddede4c7ba6cb3a721870f5141c97dc7d85a079edb4bd8d88c3ad5b20c7"},
-    {file = "coverage-5.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:01333e1bd22c59713ba8a79f088b3955946e293114479bbfc2e37d522be03355"},
-    {file = "coverage-5.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e1ea316102ea1e1770724db01998d1603ed921c54a86a2efcb03428d5417e489"},
-    {file = "coverage-5.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:adeb4c5b608574a3d647011af36f7586811a2c1197c861aedb548dd2453b41cd"},
-    {file = "coverage-5.1-cp37-cp37m-win32.whl", hash = "sha256:782caea581a6e9ff75eccda79287daefd1d2631cc09d642b6ee2d6da21fc0a4e"},
-    {file = "coverage-5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:00f1d23f4336efc3b311ed0d807feb45098fc86dee1ca13b3d6768cdab187c8a"},
-    {file = "coverage-5.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:402e1744733df483b93abbf209283898e9f0d67470707e3c7516d84f48524f55"},
-    {file = "coverage-5.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a3f3654d5734a3ece152636aad89f58afc9213c6520062db3978239db122f03c"},
-    {file = "coverage-5.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6402bd2fdedabbdb63a316308142597534ea8e1895f4e7d8bf7476c5e8751fef"},
-    {file = "coverage-5.1-cp38-cp38-win32.whl", hash = "sha256:8fa0cbc7ecad630e5b0f4f35b0f6ad419246b02bc750de7ac66db92667996d24"},
-    {file = "coverage-5.1-cp38-cp38-win_amd64.whl", hash = "sha256:79a3cfd6346ce6c13145731d39db47b7a7b859c0272f02cdb89a3bdcbae233a0"},
-    {file = "coverage-5.1-cp39-cp39-win32.whl", hash = "sha256:a82b92b04a23d3c8a581fc049228bafde988abacba397d57ce95fe95e0338ab4"},
-    {file = "coverage-5.1-cp39-cp39-win_amd64.whl", hash = "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e"},
-    {file = "coverage-5.1.tar.gz", hash = "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052"},
+    {file = "coverage-5.2.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:40f70f81be4d34f8d491e55936904db5c527b0711b2a46513641a5729783c2e4"},
+    {file = "coverage-5.2.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:675192fca634f0df69af3493a48224f211f8db4e84452b08d5fcebb9167adb01"},
+    {file = "coverage-5.2.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2fcc8b58953d74d199a1a4d633df8146f0ac36c4e720b4a1997e9b6327af43a8"},
+    {file = "coverage-5.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:64c4f340338c68c463f1b56e3f2f0423f7b17ba6c3febae80b81f0e093077f59"},
+    {file = "coverage-5.2.1-cp27-cp27m-win32.whl", hash = "sha256:52f185ffd3291196dc1aae506b42e178a592b0b60a8610b108e6ad892cfc1bb3"},
+    {file = "coverage-5.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:30bc103587e0d3df9e52cd9da1dd915265a22fad0b72afe54daf840c984b564f"},
+    {file = "coverage-5.2.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:9ea749fd447ce7fb1ac71f7616371f04054d969d412d37611716721931e36efd"},
+    {file = "coverage-5.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ce7866f29d3025b5b34c2e944e66ebef0d92e4a4f2463f7266daa03a1332a651"},
+    {file = "coverage-5.2.1-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:4869ab1c1ed33953bb2433ce7b894a28d724b7aa76c19b11e2878034a4e4680b"},
+    {file = "coverage-5.2.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a3ee9c793ffefe2944d3a2bd928a0e436cd0ac2d9e3723152d6fd5398838ce7d"},
+    {file = "coverage-5.2.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:28f42dc5172ebdc32622a2c3f7ead1b836cdbf253569ae5673f499e35db0bac3"},
+    {file = "coverage-5.2.1-cp35-cp35m-win32.whl", hash = "sha256:e26c993bd4b220429d4ec8c1468eca445a4064a61c74ca08da7429af9bc53bb0"},
+    {file = "coverage-5.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4186fc95c9febeab5681bc3248553d5ec8c2999b8424d4fc3a39c9cba5796962"},
+    {file = "coverage-5.2.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:b360d8fd88d2bad01cb953d81fd2edd4be539df7bfec41e8753fe9f4456a5082"},
+    {file = "coverage-5.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1adb6be0dcef0cf9434619d3b892772fdb48e793300f9d762e480e043bd8e716"},
+    {file = "coverage-5.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:098a703d913be6fbd146a8c50cc76513d726b022d170e5e98dc56d958fd592fb"},
+    {file = "coverage-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:962c44070c281d86398aeb8f64e1bf37816a4dfc6f4c0f114756b14fc575621d"},
+    {file = "coverage-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1ed2bdb27b4c9fc87058a1cb751c4df8752002143ed393899edb82b131e0546"},
+    {file = "coverage-5.2.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:c890728a93fffd0407d7d37c1e6083ff3f9f211c83b4316fae3778417eab9811"},
+    {file = "coverage-5.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:538f2fd5eb64366f37c97fdb3077d665fa946d2b6d95447622292f38407f9258"},
+    {file = "coverage-5.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:27ca5a2bc04d68f0776f2cdcb8bbd508bbe430a7bf9c02315cd05fb1d86d0034"},
+    {file = "coverage-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:aab75d99f3f2874733946a7648ce87a50019eb90baef931698f96b76b6769a46"},
+    {file = "coverage-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c2ff24df02a125b7b346c4c9078c8936da06964cc2d276292c357d64378158f8"},
+    {file = "coverage-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:304fbe451698373dc6653772c72c5d5e883a4aadaf20343592a7abb2e643dae0"},
+    {file = "coverage-5.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c96472b8ca5dc135fb0aa62f79b033f02aa434fb03a8b190600a5ae4102df1fd"},
+    {file = "coverage-5.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8505e614c983834239f865da2dd336dcf9d72776b951d5dfa5ac36b987726e1b"},
+    {file = "coverage-5.2.1-cp38-cp38-win32.whl", hash = "sha256:700997b77cfab016533b3e7dbc03b71d33ee4df1d79f2463a318ca0263fc29dd"},
+    {file = "coverage-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:46794c815e56f1431c66d81943fa90721bb858375fb36e5903697d5eef88627d"},
+    {file = "coverage-5.2.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:16042dc7f8e632e0dcd5206a5095ebd18cb1d005f4c89694f7f8aafd96dd43a3"},
+    {file = "coverage-5.2.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c1bbb628ed5192124889b51204de27c575b3ffc05a5a91307e7640eff1d48da4"},
+    {file = "coverage-5.2.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4f6428b55d2916a69f8d6453e48a505c07b2245653b0aa9f0dee38785939f5e4"},
+    {file = "coverage-5.2.1-cp39-cp39-win32.whl", hash = "sha256:9e536783a5acee79a9b308be97d3952b662748c4037b6a24cbb339dc7ed8eb89"},
+    {file = "coverage-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:b8f58c7db64d8f27078cbf2a4391af6aa4e4767cc08b37555c4ae064b8558d9b"},
+    {file = "coverage-5.2.1.tar.gz", hash = "sha256:a34cb28e0747ea15e82d13e14de606747e9e484fb28d63c999483f5d5188e89b"},
 ]
 dj-database-url = [
     {file = "dj-database-url-0.5.0.tar.gz", hash = "sha256:4aeaeb1f573c74835b0686a2b46b85990571159ffc21aa57ecd4d1e1cb334163"},
@@ -2096,8 +2103,8 @@ django-ckeditor = [
     {file = "django_ckeditor-5.9.0-py2.py3-none-any.whl", hash = "sha256:71c3c7bb46b0cbfb9712ef64af0d2a406eab233f44ecd7c42c24bdfa39ae3bde"},
 ]
 django-colorfield = [
-    {file = "django-colorfield-0.3.1.tar.gz", hash = "sha256:5e3a720fd8dd46878b62d8d06b9ec81927d5ba8d2bc828ebaba49e7775f8393f"},
-    {file = "django_colorfield-0.3.1-py2-none-any.whl", hash = "sha256:5830fcc4b1ab3111e2e6c8a2d75e25c09e404cea80d9f50002b09f068c8854df"},
+    {file = "django-colorfield-0.3.2.tar.gz", hash = "sha256:f5dde281f4db8871eb5845aee614b4f1a47e7fd5b20476238793f519cd7bdf41"},
+    {file = "django_colorfield-0.3.2-py2-none-any.whl", hash = "sha256:e435ec31712f5e8b955cc7633aef1e49cc3b409c21dfcefeb2f6ef0e1cb69533"},
 ]
 django-dbbackup = [
     {file = "django-dbbackup-3.3.0.tar.gz", hash = "sha256:bb109735cae98b64ad084e5b461b7aca2d7b39992f10c9ed9435e3ebb6fb76c8"},
@@ -2111,8 +2118,8 @@ django-dynamic-preferences = [
     {file = "django_dynamic_preferences-1.10-py2.py3-none-any.whl", hash = "sha256:d5852c720c1989a67d87669035e11f6c033e7a507de6ec9bd28941cba24a2dc4"},
 ]
 django-easy-audit = [
-    {file = "django-easy-audit-1.2.3.tar.gz", hash = "sha256:9e0baae1cc06a9b7766bc6743695ff5e199129577649ce8f6e7c7c8904943a30"},
-    {file = "django_easy_audit-1.2.3-py3-none-any.whl", hash = "sha256:425d4e9c03a48916e309675d520639ff9ce9c5c4d561eabd595b2b42f1a97a89"},
+    {file = "django-easy-audit-1.3.0a3.tar.gz", hash = "sha256:80e9ed3f11d8927ecd5fa7e03e3aeebd87729d6feba60f9b26b554237dbe3508"},
+    {file = "django_easy_audit-1.3.0a3-py3-none-any.whl", hash = "sha256:2b3d067d81392bb18d2b6bb09e67ce4367e73f767d3f4e067af010d496dc657c"},
 ]
 django-favicon-plus-reloaded = [
     {file = "django-favicon-plus-reloaded-1.0.4.tar.gz", hash = "sha256:90c761c636a338e6e9fb1d086649d82095085f92cff816c9cf074607f28c85a5"},
@@ -2178,8 +2185,8 @@ django-otp = [
     {file = "django_otp-0.9.0-py3-none-any.whl", hash = "sha256:334e2a0ece7e5d9de3263e17bd3b6aee2809d1f8d70555408d5bf8f0c33b13fb"},
 ]
 django-otp-yubikey = [
-    {file = "django-otp-yubikey-0.5.2.tar.gz", hash = "sha256:f0b1881562fb42ee9f12c28d284cbdb90d1f0383f2d53a595373b080a19bc261"},
-    {file = "django_otp_yubikey-0.5.2-py2.py3-none-any.whl", hash = "sha256:26b12c763b37e99b95b8b8a54d06d8d54c3774eb26133a452f54558033de732b"},
+    {file = "django-otp-yubikey-0.6.0.tar.gz", hash = "sha256:6961f16cfec1dddfa3f3c794ec5967cbb4d412f488de1d7d14441df462ba9843"},
+    {file = "django_otp_yubikey-0.6.0-py2.py3-none-any.whl", hash = "sha256:0dd73c2145afc66f43d537d2789a7068a99bc05b5ffa33d2ad73a49e4c4c7dcb"},
 ]
 django-phonenumber-field = [
     {file = "django-phonenumber-field-3.0.1.tar.gz", hash = "sha256:794ebbc3068a7af75aa72a80cb0cec67e714ff8409a965968040f1fd210b2d97"},
@@ -2194,7 +2201,7 @@ django-pwa = [
     {file = "django_pwa-1.0.10-py3-none-any.whl", hash = "sha256:b1a2057b1e72c40c3a14beb90b958482da185f1d40a141fcae3d76580984b930"},
 ]
 django-render-block = [
-    {file = "django_render_block-0.6-py2.py3-none-any.whl", hash = "sha256:95c7dc9610378a10e0c4a10d8364ec7307210889afccd6a67a6aaa0fd599bd4d"},
+    {file = "django_render_block-0.7-py3-none-any.whl", hash = "sha256:3e5963a2332727ca0db2bb8ca031404fba3ac9024702446eed5b7fb02209f7f3"},
 ]
 django-reversion = [
     {file = "django-reversion-3.0.7.tar.gz", hash = "sha256:72fc53580a6b538f0cfff10f27f42333f67d79c406399289c94ec5a193cfb3e1"},
@@ -2222,8 +2229,8 @@ django-templated-email = [
     {file = "django-templated-email-2.3.0.tar.gz", hash = "sha256:536c4e5ae099eabfb9aab36087d4d7799948c654e73da55a744213d086d5bb33"},
 ]
 django-two-factor-auth = [
-    {file = "django-two-factor-auth-1.11.0.tar.gz", hash = "sha256:637bd96e76907d044206c3b038bf4b5eb4769e9e3a4718da755fafc97db38b26"},
-    {file = "django_two_factor_auth-1.11.0-py2.py3-none-any.whl", hash = "sha256:f1835e5368448d1b3d826ce7a36c590b3e39cd536523d372cfc5f9fbdc9731f4"},
+    {file = "django-two-factor-auth-1.12.1.tar.gz", hash = "sha256:8e698d548a5a7c02c7ba343bc5376a7bbdc4e59c20ef13223743fe42fa4a1281"},
+    {file = "django_two_factor_auth-1.12.1-py2.py3-none-any.whl", hash = "sha256:612adb0dd6e9ed3b4ecd6763f2e3f56358d7b5afb843a3a49994d1d3bc91ffc2"},
 ]
 django-widget-tweaks = [
     {file = "django-widget-tweaks-1.4.8.tar.gz", hash = "sha256:9f91ca4217199b7671971d3c1f323a2bec71a0c27dec6260b3c006fa541bc489"},
@@ -2259,7 +2266,7 @@ flake8-bandit = [
     {file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"},
 ]
 flake8-black = [
-    {file = "flake8-black-0.2.0.tar.gz", hash = "sha256:10e7ff9f81f637a9471684e5624d6a32b11cba362b38df4e20fc8f761184440b"},
+    {file = "flake8-black-0.2.1.tar.gz", hash = "sha256:f26651bc10db786c03f4093414f7c9ea982ed8a244cec323c984feeffdf4c118"},
 ]
 flake8-builtins = [
     {file = "flake8-builtins-1.5.3.tar.gz", hash = "sha256:09998853b2405e98e61d2ff3027c47033adbdc17f9fe44ca58443d876eb00f3b"},
@@ -2297,8 +2304,8 @@ gitdb = [
     {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"},
 ]
 gitpython = [
-    {file = "GitPython-3.1.3-py3-none-any.whl", hash = "sha256:ef1d60b01b5ce0040ad3ec20bc64f783362d41fa0822a2742d3586e1f49bb8ac"},
-    {file = "GitPython-3.1.3.tar.gz", hash = "sha256:e107af4d873daed64648b4f4beb89f89f0cfbe3ef558fc7821ed2331c2f8da1a"},
+    {file = "GitPython-3.1.7-py3-none-any.whl", hash = "sha256:fa3b92da728a457dd75d62bb5f3eb2816d99a7fe6c67398e260637a40e3fafb5"},
+    {file = "GitPython-3.1.7.tar.gz", hash = "sha256:2db287d71a284e22e5c2846042d0602465c7434d910406990d5b74df4afb0858"},
 ]
 html2text = [
     {file = "html2text-2020.1.16-py3-none-any.whl", hash = "sha256:c7c629882da0cf377d66f073329ccf34a12ed2adf0169b9285ae4e63ef54c82b"},
@@ -2317,8 +2324,8 @@ importlib-metadata = [
     {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"},
 ]
 isort = [
-    {file = "isort-5.0.3-py3-none-any.whl", hash = "sha256:3fbfad425b0a08a2969c5e1821d88785c210a08656c029c28931a1620f2d0f12"},
-    {file = "isort-5.0.3.tar.gz", hash = "sha256:4c48d4cd773a6226baaaa176839e6f7ff82ef7c7842f6c54374fe2b14df4024b"},
+    {file = "isort-5.2.2-py3-none-any.whl", hash = "sha256:aea484023188ef1c38256dd24afa96e914adafe3a911a1786800a74e433006d1"},
+    {file = "isort-5.2.2.tar.gz", hash = "sha256:96b27045e3187b9bdde001143b79f9b10a462f372bff7062302818013b6c86f3"},
 ]
 jinja2 = [
     {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"},
@@ -2422,12 +2429,12 @@ persisting-theory = [
     {file = "persisting-theory-0.2.1.tar.gz", hash = "sha256:00ff7dcc8f481ff75c770ca5797d968e8725b6df1f77fe0cf7d20fa1e5790c0a"},
 ]
 pg8000 = [
-    {file = "pg8000-1.15.3-py3-none-any.whl", hash = "sha256:79d2e761343e582dec6698cf7c06d49c33255cbafba29ff298dd4690fffb7d80"},
-    {file = "pg8000-1.15.3.tar.gz", hash = "sha256:af97353076b8e5d271d91c64c8ca806e2157d11b7862c90ff6f0e23be0fc217d"},
+    {file = "pg8000-1.16.3-py3-none-any.whl", hash = "sha256:cac9e40c4c978034f09dfc3bc7e8bd3df40215c9207affe1991a0310a14bc71b"},
+    {file = "pg8000-1.16.3.tar.gz", hash = "sha256:91b1584f25c84c2d0fe408bd44466cc16e1db9b9e95f454ff7c334edf3fe650c"},
 ]
 phonenumbers = [
-    {file = "phonenumbers-8.12.6-py2.py3-none-any.whl", hash = "sha256:e49b8e21c557f0dafee966ddd55fb2bd3d6db155451999b75fb1b012e8d2016c"},
-    {file = "phonenumbers-8.12.6.tar.gz", hash = "sha256:d332078fe71c6153b5a263ac87283618b2afe514a248a14f06a0d39ce1f5ce0b"},
+    {file = "phonenumbers-8.12.7-py2.py3-none-any.whl", hash = "sha256:772d69e620f85bb089d27c4e2bbf718c49ad327459accf9463ac65dbab67695c"},
+    {file = "phonenumbers-8.12.7.tar.gz", hash = "sha256:652c418f8e97c8438f227a524ddf8d7d325c4a47e4924ce865b827c24ec3194d"},
 ]
 pillow = [
     {file = "Pillow-7.2.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae"},
@@ -2553,7 +2560,7 @@ pytest-django-testing-postgresql = [
     {file = "pytest_django_testing_postgresql-0.1.post0-py3-none-any.whl", hash = "sha256:78e52e3d1b0ef5f906d5d69247dd6ac7dfb10d840bd81abab92f3f8c30872cd3"},
 ]
 pytest-sugar = [
-    {file = "pytest-sugar-0.9.3.tar.gz", hash = "sha256:1630b5b7ea3624919b73fde37cffb87965c5087a4afab8a43074ff44e0d810c4"},
+    {file = "pytest-sugar-0.9.4.tar.gz", hash = "sha256:b1b2186b0a72aada6859bea2a5764145e3aaa2c1cfbb23c3a19b5f7b697563d3"},
 ]
 python-box = [
     {file = "python-box-3.4.6.tar.gz", hash = "sha256:694a7555e3ff9fbbce734bbaef3aad92b8e4ed0659d3ed04d56b6a0a0eff26a9"},
@@ -2593,27 +2600,26 @@ qrcode = [
     {file = "qrcode-6.1.tar.gz", hash = "sha256:505253854f607f2abf4d16092c61d4e9d511a3b4392e60bff957a68592b04369"},
 ]
 regex = [
-    {file = "regex-2020.6.8-cp27-cp27m-win32.whl", hash = "sha256:fbff901c54c22425a5b809b914a3bfaf4b9570eee0e5ce8186ac71eb2025191c"},
-    {file = "regex-2020.6.8-cp27-cp27m-win_amd64.whl", hash = "sha256:112e34adf95e45158c597feea65d06a8124898bdeac975c9087fe71b572bd938"},
-    {file = "regex-2020.6.8-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:92d8a043a4241a710c1cf7593f5577fbb832cf6c3a00ff3fc1ff2052aff5dd89"},
-    {file = "regex-2020.6.8-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bae83f2a56ab30d5353b47f9b2a33e4aac4de9401fb582b55c42b132a8ac3868"},
-    {file = "regex-2020.6.8-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b2ba0f78b3ef375114856cbdaa30559914d081c416b431f2437f83ce4f8b7f2f"},
-    {file = "regex-2020.6.8-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:95fa7726d073c87141f7bbfb04c284901f8328e2d430eeb71b8ffdd5742a5ded"},
-    {file = "regex-2020.6.8-cp36-cp36m-win32.whl", hash = "sha256:e3cdc9423808f7e1bb9c2e0bdb1c9dc37b0607b30d646ff6faf0d4e41ee8fee3"},
-    {file = "regex-2020.6.8-cp36-cp36m-win_amd64.whl", hash = "sha256:c78e66a922de1c95a208e4ec02e2e5cf0bb83a36ceececc10a72841e53fbf2bd"},
-    {file = "regex-2020.6.8-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:08997a37b221a3e27d68ffb601e45abfb0093d39ee770e4257bd2f5115e8cb0a"},
-    {file = "regex-2020.6.8-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2f6f211633ee8d3f7706953e9d3edc7ce63a1d6aad0be5dcee1ece127eea13ae"},
-    {file = "regex-2020.6.8-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:55b4c25cbb3b29f8d5e63aeed27b49fa0f8476b0d4e1b3171d85db891938cc3a"},
-    {file = "regex-2020.6.8-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:89cda1a5d3e33ec9e231ece7307afc101b5217523d55ef4dc7fb2abd6de71ba3"},
-    {file = "regex-2020.6.8-cp37-cp37m-win32.whl", hash = "sha256:690f858d9a94d903cf5cada62ce069b5d93b313d7d05456dbcd99420856562d9"},
-    {file = "regex-2020.6.8-cp37-cp37m-win_amd64.whl", hash = "sha256:1700419d8a18c26ff396b3b06ace315b5f2a6e780dad387e4c48717a12a22c29"},
-    {file = "regex-2020.6.8-cp38-cp38-manylinux1_i686.whl", hash = "sha256:654cb773b2792e50151f0e22be0f2b6e1c3a04c5328ff1d9d59c0398d37ef610"},
-    {file = "regex-2020.6.8-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:52e1b4bef02f4040b2fd547357a170fc1146e60ab310cdbdd098db86e929b387"},
-    {file = "regex-2020.6.8-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:cf59bbf282b627130f5ba68b7fa3abdb96372b24b66bdf72a4920e8153fc7910"},
-    {file = "regex-2020.6.8-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5aaa5928b039ae440d775acea11d01e42ff26e1561c0ffcd3d805750973c6baf"},
-    {file = "regex-2020.6.8-cp38-cp38-win32.whl", hash = "sha256:97712e0d0af05febd8ab63d2ef0ab2d0cd9deddf4476f7aa153f76feef4b2754"},
-    {file = "regex-2020.6.8-cp38-cp38-win_amd64.whl", hash = "sha256:6ad8663c17db4c5ef438141f99e291c4d4edfeaacc0ce28b5bba2b0bf273d9b5"},
-    {file = "regex-2020.6.8.tar.gz", hash = "sha256:e9b64e609d37438f7d6e68c2546d2cb8062f3adb27e6336bc129b51be20773ac"},
+    {file = "regex-2020.7.14-cp27-cp27m-win32.whl", hash = "sha256:e46d13f38cfcbb79bfdb2964b0fe12561fe633caf964a77a5f8d4e45fe5d2ef7"},
+    {file = "regex-2020.7.14-cp27-cp27m-win_amd64.whl", hash = "sha256:6961548bba529cac7c07af2fd4d527c5b91bb8fe18995fed6044ac22b3d14644"},
+    {file = "regex-2020.7.14-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c50a724d136ec10d920661f1442e4a8b010a4fe5aebd65e0c2241ea41dbe93dc"},
+    {file = "regex-2020.7.14-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8a51f2c6d1f884e98846a0a9021ff6861bdb98457879f412fdc2b42d14494067"},
+    {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9c568495e35599625f7b999774e29e8d6b01a6fb684d77dee1f56d41b11b40cd"},
+    {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:51178c738d559a2d1071ce0b0f56e57eb315bcf8f7d4cf127674b533e3101f88"},
+    {file = "regex-2020.7.14-cp36-cp36m-win32.whl", hash = "sha256:9eddaafb3c48e0900690c1727fba226c4804b8e6127ea409689c3bb492d06de4"},
+    {file = "regex-2020.7.14-cp36-cp36m-win_amd64.whl", hash = "sha256:14a53646369157baa0499513f96091eb70382eb50b2c82393d17d7ec81b7b85f"},
+    {file = "regex-2020.7.14-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1269fef3167bb52631ad4fa7dd27bf635d5a0790b8e6222065d42e91bede4162"},
+    {file = "regex-2020.7.14-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d0a5095d52b90ff38592bbdc2644f17c6d495762edf47d876049cfd2968fbccf"},
+    {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4c037fd14c5f4e308b8370b447b469ca10e69427966527edcab07f52d88388f7"},
+    {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bc3d98f621898b4a9bc7fecc00513eec8f40b5b83913d74ccb445f037d58cd89"},
+    {file = "regex-2020.7.14-cp37-cp37m-win32.whl", hash = "sha256:46bac5ca10fb748d6c55843a931855e2727a7a22584f302dd9bb1506e69f83f6"},
+    {file = "regex-2020.7.14-cp37-cp37m-win_amd64.whl", hash = "sha256:0dc64ee3f33cd7899f79a8d788abfbec168410be356ed9bd30bbd3f0a23a7204"},
+    {file = "regex-2020.7.14-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5ea81ea3dbd6767873c611687141ec7b06ed8bab43f68fad5b7be184a920dc99"},
+    {file = "regex-2020.7.14-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bbb332d45b32df41200380fff14712cb6093b61bd142272a10b16778c418e98e"},
+    {file = "regex-2020.7.14-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c11d6033115dc4887c456565303f540c44197f4fc1a2bfb192224a301534888e"},
+    {file = "regex-2020.7.14-cp38-cp38-win32.whl", hash = "sha256:d6cff2276e502b86a25fd10c2a96973fdb45c7a977dca2138d661417f3728341"},
+    {file = "regex-2020.7.14-cp38-cp38-win_amd64.whl", hash = "sha256:7a2dd66d2d4df34fa82c9dc85657c5e019b87932019947faece7983f2089a840"},
+    {file = "regex-2020.7.14.tar.gz", hash = "sha256:3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb"},
 ]
 requests = [
     {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"},
@@ -2698,8 +2704,8 @@ sqlparse = [
     {file = "sqlparse-0.3.1.tar.gz", hash = "sha256:e162203737712307dfe78860cc56c8da8a852ab2ee33750e33aeadf38d12c548"},
 ]
 stevedore = [
-    {file = "stevedore-2.0.1-py3-none-any.whl", hash = "sha256:c4724f8d7b8f6be42130663855d01a9c2414d6046055b5a65ab58a0e38637688"},
-    {file = "stevedore-2.0.1.tar.gz", hash = "sha256:609912b87df5ad338ff8e44d13eaad4f4170a65b79ae9cb0aa5632598994a1b7"},
+    {file = "stevedore-3.2.0-py3-none-any.whl", hash = "sha256:c8f4f0ebbc394e52ddf49de8bcc3cf8ad2b4425ebac494106bbc5e3661ac7633"},
+    {file = "stevedore-3.2.0.tar.gz", hash = "sha256:38791aa5bed922b0a844513c5f9ed37774b68edc609e5ab8ab8d8fe0ce4315e5"},
 ]
 termcolor = [
     {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"},
@@ -2725,11 +2731,11 @@ toml = [
     {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"},
 ]
 tqdm = [
-    {file = "tqdm-4.47.0-py2.py3-none-any.whl", hash = "sha256:7810e627bcf9d983a99d9ff8a0c09674400fd2927eddabeadf153c14a2ec8656"},
-    {file = "tqdm-4.47.0.tar.gz", hash = "sha256:63ef7a6d3eb39f80d6b36e4867566b3d8e5f1fe3d6cb50c5e9ede2b3198ba7b7"},
+    {file = "tqdm-4.48.0-py2.py3-none-any.whl", hash = "sha256:fcb7cb5b729b60a27f300b15c1ffd4744f080fb483b88f31dc8654b082cc8ea5"},
+    {file = "tqdm-4.48.0.tar.gz", hash = "sha256:6baa75a88582b1db6d34ce4690da5501d2a1cb65c34664840a456b2c9f794d29"},
 ]
 twilio = [
-    {file = "twilio-6.43.0.tar.gz", hash = "sha256:1ff3b66992ebb59411794f669eab7f11bcfaacc5549eec1afb47af1c755872ac"},
+    {file = "twilio-6.44.1.tar.gz", hash = "sha256:a84b6a4e8f6c739cf3fa429033ad522d07c78e3788800e68fe5195d83db4f03a"},
 ]
 typed-ast = [
     {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"},
@@ -2760,8 +2766,8 @@ typing-extensions = [
     {file = "typing_extensions-3.7.4.2.tar.gz", hash = "sha256:79ee589a3caca649a9bfd2a8de4709837400dfa00b6cc81962a1e6a1815969ae"},
 ]
 urllib3 = [
-    {file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"},
-    {file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"},
+    {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"},
+    {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"},
 ]
 wcwidth = [
     {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},