diff --git a/README.rst b/README.rst
index 1b7d279d7cc7917ac713f01ee3be3741f9bb80c3..f7dbefe98161e5054e16084a6d6bac51a842edff 100644
--- a/README.rst
+++ b/README.rst
@@ -29,13 +29,14 @@ Licence
 
 ::
 
-  Copyright © 2018, 2019, 2020, 2021, 2022 Jonathan Weth <dev@jonathanweth.de>
+  Copyright © 2018, 2019, 2020, 2021, 2022, 2023, 2024 Jonathan Weth <dev@jonathanweth.de>
   Copyright © 2018, 2019 Frank Poetzsch-Heffter <p-h@katharineum.de>
   Copyright © 2019, 2020, 2022 Dominik George <dominik.george@teckids.org>
-  Copyright © 2019, 2021 Hangzhi Yu <yuha@katharineum.de>
-  Copyright © 2019 Julian Leucker <leuckeju@katharineum.de>
+  Copyright © 2019, 2021, 2022, 2023, 2024 Hangzhi Yu <yuha@katharineum.de>
+  Copyright © 2019, 2023, 2024 Julian Leucker <leuckeju@katharineum.de>
   Copyright © 2019 Tom Teichler <tom.teichler@teckids.org>
   Copyright © 2021 Lloyd Meins <meinsll@katharineum.de>
+  Copyright © 2023, 2024 Michael Bauer <michael-bauer@posteo.de>
 
   Licenced under the EUPL, version 1.2 or later, by Teckids e.V. (Bonn, Germany).
 
diff --git a/aleksis/apps/chronos/apps.py b/aleksis/apps/chronos/apps.py
index 254a0a2064e244f95fcfba408017c6fbb7cc86dd..377cefd6c1a90969c1c6c650da75fad34d3f2ae5 100644
--- a/aleksis/apps/chronos/apps.py
+++ b/aleksis/apps/chronos/apps.py
@@ -17,13 +17,14 @@ class ChronosConfig(AppConfig):
     }
     licence = "EUPL-1.2+"
     copyright_info = (
-        ([2018, 2019, 2020, 2021, 2022], "Jonathan Weth", "wethjo@katharineum.de"),
+        ([2018, 2019, 2020, 2021, 2022, 2023, 2024], "Jonathan Weth", "dev@jonathanweth.de"),
         ([2018, 2019], "Frank Poetzsch-Heffter", "p-h@katharineum.de"),
         ([2019, 2020, 2022], "Dominik George", "dominik.george@teckids.org"),
-        ([2019, 2021], "Hangzhi Yu", "yuha@katharineum.de"),
-        ([2019], "Julian Leucker", "leuckeju@katharineum.de"),
+        ([2019, 2021, 2022, 2023, 2024], "Hangzhi Yu", "yuha@katharineum.de"),
+        ([2019, 2023, 2024], "Julian Leucker", "leuckeju@katharineum.de"),
         ([2019], "Tom Teichler", "tom.teichler@teckids.org"),
         ([2021], "Lloyd Meins", "meinsll@katharineum.de"),
+        ([2023, 2024], "Michael Bauer", "michael-bauer@posteo.de"),
     )
 
     def ready(self):
diff --git a/aleksis/apps/chronos/frontend/components/AmendLesson.vue b/aleksis/apps/chronos/frontend/components/AmendLesson.vue
index 2d9f8b4c9d2798ba0afcedeb4711debbfa1ae0fc..7f06f71bbf16b7c5f55b310c13dd087d58833f11 100644
--- a/aleksis/apps/chronos/frontend/components/AmendLesson.vue
+++ b/aleksis/apps/chronos/frontend/components/AmendLesson.vue
@@ -157,12 +157,15 @@ export default {
       return {
         ...item,
         amends: this.selectedEvent.meta.id,
-        datetimeStart: this.selectedEvent.startDateTime.toUTC().toISO(),
-        datetimeEnd: this.selectedEvent.endDateTime.toUTC().toISO(),
+        datetimeStart: this.$toUTCISO(this.selectedEvent.startDateTime),
+        datetimeEnd: this.$toUTCISO(this.selectedEvent.endDateTime),
+        // Normalize cancelled, v-checkbox returns null & does not
+        // honor false-value.
+        cancelled: item.cancelled ? true : false,
       };
     },
     transformPatchData(item) {
-      let { id, __typename, cancelled, ...patchItem } = item;
+      let { __typename, cancelled, ...patchItem } = item;
       return {
         ...patchItem,
         // Normalize cancelled, v-checkbox returns null & does not
diff --git a/aleksis/apps/chronos/frontend/components/Timetable.vue b/aleksis/apps/chronos/frontend/components/Timetable.vue
index fbbaaddbb90d8912d0271c0d4ff1f8d97696b0af..5c0f66811aa7fc88098863b7fb71f53975e272b0 100644
--- a/aleksis/apps/chronos/frontend/components/Timetable.vue
+++ b/aleksis/apps/chronos/frontend/components/Timetable.vue
@@ -11,7 +11,11 @@ export default {
   <timetable-wrapper>
     <template #default="{ selected }">
       <calendar-with-controls
-        :calendar-feeds="[{ name: 'lesson' }, { name: 'supervision' }]"
+        :calendar-feeds="[
+          { name: 'lesson' },
+          { name: 'supervision' },
+          { name: 'holidays' },
+        ]"
         :params="{ type: selected.type, id: selected.objId }"
       />
     </template>
diff --git a/aleksis/apps/chronos/frontend/index.js b/aleksis/apps/chronos/frontend/index.js
index 31d0ebadb15e152afca201679520b1ed48584de8..9aeb78188d6d3993d3b7d04f64fd0d8f087956fc 100644
--- a/aleksis/apps/chronos/frontend/index.js
+++ b/aleksis/apps/chronos/frontend/index.js
@@ -66,5 +66,21 @@ export default {
         },
       ],
     },
+    {
+      path: "substitutions/print/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "chronos.substitutions",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
+    {
+      path: "substitutions/print/:date/",
+      component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),
+      name: "chronos.substitutionsByDate",
+      props: {
+        byTheGreatnessOfTheAlmightyAleksolotlISwearIAmWorthyOfUsingTheLegacyBaseTemplate: true,
+      },
+    },
   ],
 };
diff --git a/aleksis/apps/chronos/locale/ar/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/ar/LC_MESSAGES/django.po
index e58e5abfe555ff77cc0b2d8dd6f04c317fc23fcb..7bfa932f4f871a7787fc4f238c190419a4f07021 100644
--- a/aleksis/apps/chronos/locale/ar/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/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: 2022-06-21 11:32+0200\n"
+"POT-Creation-Date: 2024-08-18 14:23+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"
@@ -18,76 +18,38 @@ msgstr ""
 "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"
 
-#: aleksis/apps/chronos/form_extensions.py:7
-msgid "Options for timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/form_extensions.py:8
-msgid "Optional data for timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
-msgid "Timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:16
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:18
-msgid "My timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:27
-#: aleksis/apps/chronos/templates/chronos/all.html:11
-#: aleksis/apps/chronos/templates/chronos/all.html:12
-msgid "All timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:38
-msgid "Daily lessons"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:49
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:11
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:17
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
-msgid "Substitutions"
-msgstr ""
-
 #: aleksis/apps/chronos/mixins.py:25
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:142
-msgid "Show announcement in timetable views?"
-msgstr ""
-
-#: aleksis/apps/chronos/model_extensions.py:151
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:155
+#: aleksis/apps/chronos/model_extensions.py:149
 msgid "Can view person timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:86
+#: aleksis/apps/chronos/models.py:87
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
+#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:626
+#: aleksis/apps/chronos/models.py:1310
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
-#: aleksis/apps/chronos/models.py:827 aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:676
+#: aleksis/apps/chronos/models.py:747 aleksis/apps/chronos/models.py:979
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
-#: aleksis/apps/chronos/models.py:828 aleksis/apps/chronos/models.py:1062
+#: aleksis/apps/chronos/models.py:93 aleksis/apps/chronos/models.py:677
+#: aleksis/apps/chronos/models.py:748 aleksis/apps/chronos/models.py:980
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:111
+#: aleksis/apps/chronos/models.py:112
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
@@ -107,547 +69,506 @@ msgstr ""
 msgid "Validity ranges"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:150
+#: aleksis/apps/chronos/models.py:149
 msgid "Week day"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:152
+#: aleksis/apps/chronos/models.py:151
 msgid "Number of period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:153
 msgid "Start time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:155
+#: aleksis/apps/chronos/models.py:154
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
-#: aleksis/apps/chronos/models.py:1191
+#: aleksis/apps/chronos/models.py:324 aleksis/apps/chronos/models.py:496
+#: aleksis/apps/chronos/models.py:1122
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:339
+#: aleksis/apps/chronos/models.py:325
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:698 aleksis/apps/chronos/models.py:873
-#: aleksis/apps/chronos/models.py:895
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:625
+#: aleksis/apps/chronos/models.py:793 aleksis/apps/chronos/models.py:810
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
-#: aleksis/apps/chronos/models.py:874 aleksis/apps/chronos/models.py:896
+#: aleksis/apps/chronos/models.py:330 aleksis/apps/chronos/models.py:794
+#: aleksis/apps/chronos/models.py:811
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:332
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:347
+#: aleksis/apps/chronos/models.py:333
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:354 aleksis/apps/chronos/models.py:390
-#: aleksis/apps/chronos/models.py:446 aleksis/apps/chronos/models.py:1198
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:47
+#: aleksis/apps/chronos/models.py:340 aleksis/apps/chronos/models.py:349
+#: aleksis/apps/chronos/models.py:416 aleksis/apps/chronos/models.py:1129
+#: aleksis/apps/chronos/models.py:1345
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:2
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:355
+#: aleksis/apps/chronos/models.py:341
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:374
-msgid "Can view room timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:454
-#: aleksis/apps/chronos/models.py:533 aleksis/apps/chronos/models.py:751
-#: aleksis/apps/chronos/models.py:1213
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:48
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
-msgid "Room"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:377 aleksis/apps/chronos/models.py:1078
-#: aleksis/apps/chronos/templates/chronos/all.html:45
-msgid "Rooms"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:393 aleksis/apps/chronos/models.py:452
-#: aleksis/apps/chronos/models.py:1080 aleksis/apps/chronos/models.py:1206
-#: aleksis/apps/chronos/tables.py:35
-#: aleksis/apps/chronos/templates/chronos/all.html:17
+#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:422
+#: aleksis/apps/chronos/models.py:998 aleksis/apps/chronos/models.py:1137
+#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:3
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:1
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:399
+#: aleksis/apps/chronos/models.py:358
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1077
-#: aleksis/apps/chronos/models.py:1201 aleksis/apps/chronos/tables.py:34
-#: aleksis/apps/chronos/templates/chronos/all.html:31
+#: aleksis/apps/chronos/models.py:360 aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1132 aleksis/apps/chronos/models.py:1326
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:1
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:26
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
-#: aleksis/apps/chronos/models.py:795
+#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:490
+#: aleksis/apps/chronos/models.py:716 aleksis/apps/chronos/models.py:1430
+#: aleksis/apps/chronos/models.py:1454
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:425
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
+#: aleksis/apps/chronos/models.py:395 aleksis/apps/chronos/models.py:1306
 msgid "Lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1185
+#: aleksis/apps/chronos/models.py:403 aleksis/apps/chronos/models.py:1116
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1186
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:1117
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
+#: aleksis/apps/chronos/models.py:407 aleksis/apps/chronos/models.py:620
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:456
+#: aleksis/apps/chronos/models.py:425 aleksis/apps/chronos/models.py:504
+#: aleksis/apps/chronos/models.py:673 aleksis/apps/chronos/models.py:1144
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
+msgid "Room"
+msgstr ""
+
+#: aleksis/apps/chronos/models.py:428
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:458
+#: aleksis/apps/chronos/models.py:430
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
-#: aleksis/apps/chronos/models.py:813 aleksis/apps/chronos/models.py:1216
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:692
+#: aleksis/apps/chronos/models.py:734 aleksis/apps/chronos/models.py:1147
+#: aleksis/apps/chronos/models.py:1357
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:465
+#: aleksis/apps/chronos/models.py:437
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:506
+#: aleksis/apps/chronos/models.py:477
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:507
+#: aleksis/apps/chronos/models.py:478
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:655
+#: aleksis/apps/chronos/models.py:621
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:693
-msgid "Timetable widget"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:694
-msgid "Timetable widgets"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
+#: aleksis/apps/chronos/models.py:635 aleksis/apps/chronos/models.py:648
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:709
+#: aleksis/apps/chronos/models.py:636
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:735 aleksis/apps/chronos/models.py:974
-#: aleksis/apps/chronos/models.py:1025
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:46
+#: aleksis/apps/chronos/models.py:657 aleksis/apps/chronos/models.py:889
+#: aleksis/apps/chronos/models.py:943
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:743
+#: aleksis/apps/chronos/models.py:665
 msgid "Group"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
+#: aleksis/apps/chronos/models.py:681 aleksis/apps/chronos/models.py:723
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:808
+#: aleksis/apps/chronos/models.py:688 aleksis/apps/chronos/models.py:729
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:780
+#: aleksis/apps/chronos/models.py:702
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:786
+#: aleksis/apps/chronos/models.py:707
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:787
+#: aleksis/apps/chronos/models.py:708
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:798
+#: aleksis/apps/chronos/models.py:719
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:812 aleksis/apps/chronos/models.py:826
-#: aleksis/apps/chronos/models.py:1059
+#: aleksis/apps/chronos/models.py:733 aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:977
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:819
+#: aleksis/apps/chronos/models.py:739
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:820
+#: aleksis/apps/chronos/models.py:740
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:829
+#: aleksis/apps/chronos/models.py:749
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:868
+#: aleksis/apps/chronos/models.py:788
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:869
+#: aleksis/apps/chronos/models.py:789
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:883 aleksis/apps/chronos/models.py:964
+#: aleksis/apps/chronos/models.py:803 aleksis/apps/chronos/models.py:879
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:804
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:901
+#: aleksis/apps/chronos/models.py:816
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:909
+#: aleksis/apps/chronos/models.py:824
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:949 aleksis/apps/chronos/models.py:968
+#: aleksis/apps/chronos/models.py:864 aleksis/apps/chronos/models.py:883
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:950
+#: aleksis/apps/chronos/models.py:865
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1005 aleksis/apps/chronos/models.py:1018
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
-#: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
+#: aleksis/apps/chronos/models.py:923 aleksis/apps/chronos/models.py:936
+#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:3
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1006
+#: aleksis/apps/chronos/models.py:924 aleksis/apps/chronos/models.py:1622
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1014
+#: aleksis/apps/chronos/models.py:932
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1048
+#: aleksis/apps/chronos/models.py:966
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1049
+#: aleksis/apps/chronos/models.py:967
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1067
+#: aleksis/apps/chronos/models.py:985
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1073
+#: aleksis/apps/chronos/models.py:991
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:996 aleksis/apps/chronos/models.py:1332
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:4
+msgid "Rooms"
+msgstr ""
+
+#: aleksis/apps/chronos/models.py:1005
 #, python-brace-format
 msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1172
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
+#: aleksis/apps/chronos/models.py:1103
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1173
+#: aleksis/apps/chronos/models.py:1104
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1221
+#: aleksis/apps/chronos/models.py:1152
 msgid "Related exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1251
+#: aleksis/apps/chronos/models.py:1181
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1252
+#: aleksis/apps/chronos/models.py:1182
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1264
+#: aleksis/apps/chronos/models.py:1194
 msgid "Number of days shown in the plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1268
+#: aleksis/apps/chronos/models.py:1198
 msgid "Show header box"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1269 aleksis/apps/chronos/preferences.py:61
+#: aleksis/apps/chronos/models.py:1199 aleksis/apps/chronos/preferences.py:100
 msgid "The header box shows affected teachers/groups."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1276
+#: aleksis/apps/chronos/models.py:1206
 msgid "Revision which triggered the last update"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1337
+#: aleksis/apps/chronos/models.py:1278
 msgid "Automatic plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/models.py:1279
 msgid "Automatic plans"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1352
+#: aleksis/apps/chronos/models.py:1293
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/models.py:1294
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1354
+#: aleksis/apps/chronos/models.py:1295
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1355
+#: aleksis/apps/chronos/models.py:1296
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1356
+#: aleksis/apps/chronos/models.py:1297
 msgid "Can view all lessons per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:18
-msgid "Use parent groups in timetable views"
+#: aleksis/apps/chronos/models.py:1298
+msgid "Can view all supervisions per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:20
-msgid "If an lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
+#: aleksis/apps/chronos/models.py:1313
+msgid "Start slot number"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:31
-msgid "Shorten groups in timetable views"
+#: aleksis/apps/chronos/models.py:1316
+msgid "End slot number"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:32
-msgid "If there are more groups than the set limit, they will be collapsed."
+#: aleksis/apps/chronos/models.py:1320
+msgid "Course"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:40
-msgid "Limit of groups for shortening of groups"
+#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
+msgid "Cancelled"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:42
-msgid "If an user activates shortening of groups,they will be collapsed if there are more groups than this limit."
+#: aleksis/apps/chronos/models.py:1401 aleksis/apps/chronos/models.py:1413
+#: aleksis/apps/chronos/models.py:1425
+msgid "{} (instead of {})"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:52
-msgid "Number of days shown on substitutions print view"
+#: aleksis/apps/chronos/models.py:1614
+msgid "Lesson Event"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:60
-msgid "Show header box in substitution views"
+#: aleksis/apps/chronos/models.py:1615
+msgid "Lesson Events"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:70
-msgid "Show parent groups in header box in substitution views instead of original groups"
+#: aleksis/apps/chronos/models.py:1630
+msgid "Supervision: {}"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:79
-msgid "How many days in advance users should be notified about timetable changes?"
+#: aleksis/apps/chronos/preferences.py:21
+msgid "Timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:87
-msgid "Time for sending notifications about timetable changes"
+#: aleksis/apps/chronos/preferences.py:29
+msgid "Use parent groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:90
-msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
+#: aleksis/apps/chronos/preferences.py:31
+msgid "If a lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:101
-#: aleksis/apps/chronos/preferences.py:109
-msgid "Send notifications for current timetable changes"
+#: aleksis/apps/chronos/preferences.py:42
+msgid "Shorten groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/tables.py:41
-msgid "Substitution"
+#: aleksis/apps/chronos/preferences.py:43
+msgid "If there are more groups than the set limit, they will be collapsed."
 msgstr ""
 
-#: aleksis/apps/chronos/tables.py:43
-msgid "Manage substitution"
+#: aleksis/apps/chronos/preferences.py:51
+msgid "Limit of groups for shortening of groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:25
-msgid "No teachers timetables available."
+#: aleksis/apps/chronos/preferences.py:53
+msgid "If a user activates shortening of groups,they will be collapsed if there are more groups than this limit."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:39
-msgid "No group timetables available."
+#: aleksis/apps/chronos/preferences.py:65
+msgid "Relevant days for substitution plans"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:53
-msgid "No room timetables available."
+#: aleksis/apps/chronos/preferences.py:82
+msgid "Time when substitution plans switch to the next day"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:11
-msgid "Edit substitution."
+#: aleksis/apps/chronos/preferences.py:91
+msgid "Number of days shown on substitutions print view"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:12
-msgid "Edit substitution"
+#: aleksis/apps/chronos/preferences.py:99
+msgid "Show header box in substitution views"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:25
-msgid "Delete"
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Show parent groups in header box in substitution views instead of original groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:50
-msgid "SMART PLAN"
+#: aleksis/apps/chronos/preferences.py:118
+msgid "How many days in advance users should be notified about timetable changes?"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:22
-msgid "Show week timetable for"
+#: aleksis/apps/chronos/preferences.py:126
+msgid "Time for sending notifications about timetable changes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
-msgid "Absent teachers"
+#: aleksis/apps/chronos/preferences.py:129
+msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:22
-msgid "Absent groups"
+#: aleksis/apps/chronos/preferences.py:140
+#: aleksis/apps/chronos/preferences.py:148
+msgid "Send notifications for current timetable changes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:34
-msgid "Affected teachers"
+#: aleksis/apps/chronos/preferences.py:158
+msgid "Group types to show in timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:46
-msgid "Affected groups"
+#: aleksis/apps/chronos/preferences.py:159
+msgid "If you leave it empty, all groups will be shown."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/lesson.html:27
-msgid "Cancelled due to an event"
+#: aleksis/apps/chronos/preferences.py:169
+msgid "Lesson calendar feed color"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
-msgid "Cancelled"
+#: aleksis/apps/chronos/preferences.py:181
+msgid "Supervision calendar feed color"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:6
-msgid "Cancelled for teachers"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
+msgid "Absent teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/today.html:2
-msgid "Today"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:22
+msgid "Absent groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:14
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:25
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:36
-msgid "CW"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:34
+msgid "Affected teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:49
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
-msgid "Notes"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:46
+msgid "Affected groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:57
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
-msgid "No substitutions available."
+#: aleksis/apps/chronos/templates/chronos/partials/subs/period.html:12
+msgid "all day"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
 msgid "Print: Substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:24
-#: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
-#: aleksis/apps/chronos/util/notifications.py:206
-msgid "Timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:29
-msgid "Group teachers:"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:55
-msgid "Show regular timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:63
-#: aleksis/apps/chronos/templates/chronos/timetable.html:84
-msgid "View class register of this week"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
+msgid "Substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:76
-msgid "Show SMART PLAN"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:27
+msgid "Time"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:8
-#, python-format
-msgid ""
-"\n"
-"        My timetable for %(day)s\n"
-"      "
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
+msgid "Notes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:18
-msgid ""
-"\n"
-"          There is no timetable linked to your person.\n"
-"          "
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
+msgid "No substitutions available."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:27
-msgid "Go to smart plan"
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:2
+msgid "Areas"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:50
+#: aleksis/apps/chronos/util/notifications.py:48
 #, python-brace-format
 msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:57
+#: aleksis/apps/chronos/util/notifications.py:55
 #, python-brace-format
 msgid "The {subject} lesson in the {period}. period on {day} has some current changes."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:66
+#: aleksis/apps/chronos/util/notifications.py:64
 #, python-brace-format
 msgid "The teacher {old} is substituted by {new}."
 msgid_plural "The teachers {old} are substituted by {new}."
@@ -658,81 +579,77 @@ msgstr[3] ""
 msgstr[4] ""
 msgstr[5] ""
 
-#: aleksis/apps/chronos/util/notifications.py:78
+#: aleksis/apps/chronos/util/notifications.py:76
 #, python-brace-format
 msgid "The subject is changed to {subject}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:84
+#: aleksis/apps/chronos/util/notifications.py:82
 #, python-brace-format
 msgid "The lesson is moved from {old} to {new}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:93
+#: aleksis/apps/chronos/util/notifications.py:91
 #, python-brace-format
 msgid "There is an additional comment: {comment}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:101
+#: aleksis/apps/chronos/util/notifications.py:99
 #, python-brace-format
 msgid "There is an event that starts on {date_start}, {period_from}. period and ends on {date_end}, {period_to}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:114
+#: aleksis/apps/chronos/util/notifications.py:112
 #, python-brace-format
 msgid "There is an event on {date} from the {period_from}. period to the {period_to}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:125
-#: aleksis/apps/chronos/util/notifications.py:145
+#: aleksis/apps/chronos/util/notifications.py:123
+#: aleksis/apps/chronos/util/notifications.py:143
 #, python-brace-format
 msgid "Groups: {groups}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:127
-#: aleksis/apps/chronos/util/notifications.py:149
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:147
 #, python-brace-format
 msgid "Teachers: {teachers}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:130
+#: aleksis/apps/chronos/util/notifications.py:128
 #, python-brace-format
 msgid "Rooms: {rooms}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:137
+#: aleksis/apps/chronos/util/notifications.py:135
 #, python-brace-format
 msgid "There is an extra lesson on {date} in the {period}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:147
+#: aleksis/apps/chronos/util/notifications.py:145
 #, python-brace-format
 msgid "Subject: {subject}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:151
+#: aleksis/apps/chronos/util/notifications.py:149
 #, python-brace-format
 msgid "Room: {room}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:153
+#: aleksis/apps/chronos/util/notifications.py:151
 #, python-brace-format
 msgid "Comment: {comment}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:156
+#: aleksis/apps/chronos/util/notifications.py:154
 #, python-brace-format
 msgid "The supervision of {old} on {date} between the {period_from}. period and the {period_to}. period in the area {area} is substituted by {new}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:207
-msgid "There are current changes to your timetable."
-msgstr ""
-
-#: aleksis/apps/chronos/views.py:270
-msgid "The substitution has been saved."
+#: aleksis/apps/chronos/util/notifications.py:204
+msgid "Timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/views.py:291
-msgid "The substitution has been deleted."
+#: aleksis/apps/chronos/util/notifications.py:205
+msgid "There are current changes to your timetable."
 msgstr ""
diff --git a/aleksis/apps/chronos/locale/de_DE/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/de_DE/LC_MESSAGES/django.po
index 7d60974cc959b0b54c7f753f2eb40b1404e13f6f..6cc74cf61d93a9433e0182e2955f670f4c7bbec7 100644
--- a/aleksis/apps/chronos/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/locale/de_DE/LC_MESSAGES/django.po
@@ -7,87 +7,56 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-21 11:32+0200\n"
-"PO-Revision-Date: 2023-01-25 05:57+0000\n"
-"Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
+"POT-Creation-Date: 2024-08-18 14:23+0200\n"
+"PO-Revision-Date: 2024-08-18 13:31+0000\n"
+"Last-Translator: magicfelix <felix@felix-zauberer.de>\n"
 "Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-app-chronos/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 4.12.1\n"
-
-#: aleksis/apps/chronos/form_extensions.py:7
-msgid "Options for timetables"
-msgstr "Einstellungen für Stundenpläne"
-
-#: aleksis/apps/chronos/form_extensions.py:8
-msgid "Optional data for timetables"
-msgstr "Optionale Daten für Stundenpläne"
-
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
-msgid "Timetables"
-msgstr "Stundenpläne"
-
-#: aleksis/apps/chronos/menus.py:16
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:18
-msgid "My timetable"
-msgstr "Mein Plan"
-
-#: aleksis/apps/chronos/menus.py:27
-#: aleksis/apps/chronos/templates/chronos/all.html:11
-#: aleksis/apps/chronos/templates/chronos/all.html:12
-msgid "All timetables"
-msgstr "Alle Stundenpläne"
-
-#: aleksis/apps/chronos/menus.py:38
-msgid "Daily lessons"
-msgstr "Tagesstunden"
-
-#: aleksis/apps/chronos/menus.py:49
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:11
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:17
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
-msgid "Substitutions"
-msgstr "Vertretungen"
+"X-Generator: Weblate 5.0.2\n"
 
 #: aleksis/apps/chronos/mixins.py:25
 msgid "Linked validity range"
 msgstr "Zugeordneter Gültigkeitsbereich"
 
-#: aleksis/apps/chronos/model_extensions.py:142
-msgid "Show announcement in timetable views?"
-msgstr "Ankündigungen in Stundenplanansichten anzeigen?"
-
+#: aleksis/apps/chronos/model_extensions.py:145
 #: aleksis/apps/chronos/model_extensions.py:151
 msgid "Can view group timetable"
 msgstr "Kann Gruppenstundenpläne sehen"
 
+#: aleksis/apps/chronos/model_extensions.py:149
 #: aleksis/apps/chronos/model_extensions.py:155
 msgid "Can view person timetable"
 msgstr "Kann Personenstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:86
+#: aleksis/apps/chronos/models.py:87 aleksis/apps/chronos/models.py:86
 msgid "School term"
 msgstr "Schuljahr"
 
-#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
+#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:626
+#: aleksis/apps/chronos/models.py:1310 aleksis/apps/chronos/models.py:89
+#: aleksis/apps/chronos/models.py:699
 msgid "Name"
 msgstr "Name"
 
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:676
+#: aleksis/apps/chronos/models.py:747 aleksis/apps/chronos/models.py:979
 #: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
 #: aleksis/apps/chronos/models.py:827 aleksis/apps/chronos/models.py:1061
 msgid "Start date"
 msgstr "Startdatum"
 
+#: aleksis/apps/chronos/models.py:93 aleksis/apps/chronos/models.py:677
+#: aleksis/apps/chronos/models.py:748 aleksis/apps/chronos/models.py:980
 #: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
 #: aleksis/apps/chronos/models.py:828 aleksis/apps/chronos/models.py:1062
 msgid "End date"
 msgstr "Enddatum"
 
-#: aleksis/apps/chronos/models.py:111
+#: aleksis/apps/chronos/models.py:112 aleksis/apps/chronos/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr "Das Startdatum muss vor dem Enddatum liegen."
 
@@ -97,7 +66,9 @@ msgstr "Der Gültigkeitsbereich muss innerhalb des Schuljahres liegen."
 
 #: aleksis/apps/chronos/models.py:125
 msgid "There is already a validity range for this time or a part of this time."
-msgstr "Es gibt bereits einen Gültigkeitsbereich für diesen Zeitraum oder einen Teil diesen Zeitraumes."
+msgstr ""
+"Es gibt bereits einen Gültigkeitsbereich für diesen Zeitraum oder einen Teil "
+"diesen Zeitraumes."
 
 #: aleksis/apps/chronos/models.py:132
 msgid "Validity range"
@@ -107,440 +78,530 @@ msgstr "Gültigkeitsbereich"
 msgid "Validity ranges"
 msgstr "Gültigkeitsbereiche"
 
-#: aleksis/apps/chronos/models.py:150
+#: aleksis/apps/chronos/models.py:149 aleksis/apps/chronos/models.py:150
 msgid "Week day"
 msgstr "Wochentag"
 
-#: aleksis/apps/chronos/models.py:152
+#: aleksis/apps/chronos/models.py:151 aleksis/apps/chronos/models.py:152
 msgid "Number of period"
 msgstr "Nummer der Stunde"
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:153 aleksis/apps/chronos/models.py:154
 msgid "Start time"
 msgstr "Startzeit"
 
-#: aleksis/apps/chronos/models.py:155
+#: aleksis/apps/chronos/models.py:154 aleksis/apps/chronos/models.py:155
 msgid "End time"
 msgstr "Endzeit"
 
-#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
-#: aleksis/apps/chronos/models.py:1191
+#: aleksis/apps/chronos/models.py:324 aleksis/apps/chronos/models.py:496
+#: aleksis/apps/chronos/models.py:1122 aleksis/apps/chronos/models.py:338
+#: aleksis/apps/chronos/models.py:525 aleksis/apps/chronos/models.py:1191
 msgid "Time period"
 msgstr "Stunde"
 
-#: aleksis/apps/chronos/models.py:339
+#: aleksis/apps/chronos/models.py:325 aleksis/apps/chronos/models.py:339
 msgid "Time periods"
 msgstr "Stunden"
 
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:625
+#: aleksis/apps/chronos/models.py:793 aleksis/apps/chronos/models.py:810
 #: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
 #: aleksis/apps/chronos/models.py:698 aleksis/apps/chronos/models.py:873
 #: aleksis/apps/chronos/models.py:895
 msgid "Short name"
 msgstr "Kurzname"
 
-#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
-#: aleksis/apps/chronos/models.py:874 aleksis/apps/chronos/models.py:896
+#: aleksis/apps/chronos/models.py:330 aleksis/apps/chronos/models.py:794
+#: aleksis/apps/chronos/models.py:811 aleksis/apps/chronos/models.py:344
+#: aleksis/apps/chronos/models.py:365 aleksis/apps/chronos/models.py:874
+#: aleksis/apps/chronos/models.py:896
 msgid "Long name"
 msgstr "Langname"
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:332 aleksis/apps/chronos/models.py:346
 msgid "Foreground colour"
 msgstr "Vordergrundfarbe"
 
-#: aleksis/apps/chronos/models.py:347
+#: aleksis/apps/chronos/models.py:333 aleksis/apps/chronos/models.py:347
 msgid "Background colour"
 msgstr "Hintergrundfarbe"
 
+#: aleksis/apps/chronos/models.py:340 aleksis/apps/chronos/models.py:349
+#: aleksis/apps/chronos/models.py:416 aleksis/apps/chronos/models.py:1129
+#: aleksis/apps/chronos/models.py:1345
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:2
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 #: aleksis/apps/chronos/models.py:354 aleksis/apps/chronos/models.py:390
 #: aleksis/apps/chronos/models.py:446 aleksis/apps/chronos/models.py:1198
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:47
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr "Fach"
 
-#: aleksis/apps/chronos/models.py:355
+#: aleksis/apps/chronos/models.py:341 aleksis/apps/chronos/models.py:355
 msgid "Subjects"
 msgstr "Fächer"
 
-#: aleksis/apps/chronos/models.py:374
-msgid "Can view room timetable"
-msgstr "Kann Raum-Stundenplan sehen"
-
-#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:454
-#: aleksis/apps/chronos/models.py:533 aleksis/apps/chronos/models.py:751
-#: aleksis/apps/chronos/models.py:1213
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:48
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
-msgid "Room"
-msgstr "Raum"
-
-#: aleksis/apps/chronos/models.py:377 aleksis/apps/chronos/models.py:1078
-#: aleksis/apps/chronos/templates/chronos/all.html:45
-msgid "Rooms"
-msgstr "Räume"
-
+#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:422
+#: aleksis/apps/chronos/models.py:998 aleksis/apps/chronos/models.py:1137
+#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:3
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:1
 #: aleksis/apps/chronos/models.py:393 aleksis/apps/chronos/models.py:452
 #: aleksis/apps/chronos/models.py:1080 aleksis/apps/chronos/models.py:1206
 #: aleksis/apps/chronos/tables.py:35
 #: aleksis/apps/chronos/templates/chronos/all.html:17
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr "Lehrkräfte"
 
-#: aleksis/apps/chronos/models.py:399
+#: aleksis/apps/chronos/models.py:358 aleksis/apps/chronos/models.py:399
 msgid "Periods"
 msgstr "Stunden"
 
+#: aleksis/apps/chronos/models.py:360 aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1132 aleksis/apps/chronos/models.py:1326
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:1
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:26
 #: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1077
 #: aleksis/apps/chronos/models.py:1201 aleksis/apps/chronos/tables.py:34
 #: aleksis/apps/chronos/templates/chronos/all.html:31
 msgid "Groups"
 msgstr "Gruppen"
 
-#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
-#: aleksis/apps/chronos/models.py:795
+#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:490
+#: aleksis/apps/chronos/models.py:716 aleksis/apps/chronos/models.py:1430
+#: aleksis/apps/chronos/models.py:1454 aleksis/apps/chronos/models.py:424
+#: aleksis/apps/chronos/models.py:519 aleksis/apps/chronos/models.py:795
 msgid "Lesson"
 msgstr "Unterrichtsstunde"
 
+#: aleksis/apps/chronos/models.py:395 aleksis/apps/chronos/models.py:1306
 #: aleksis/apps/chronos/models.py:425
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
 #: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
 msgid "Lessons"
 msgstr "Unterrichtsstunden"
 
+#: aleksis/apps/chronos/models.py:403 aleksis/apps/chronos/models.py:1116
 #: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1185
 msgid "Week"
 msgstr "KW"
 
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:1117
 #: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1186
 msgid "Year"
 msgstr "Jahr"
 
+#: aleksis/apps/chronos/models.py:407 aleksis/apps/chronos/models.py:620
 #: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
 msgid "Lesson period"
 msgstr "Unterrichtsstunde"
 
-#: aleksis/apps/chronos/models.py:456
+#: aleksis/apps/chronos/models.py:425 aleksis/apps/chronos/models.py:504
+#: aleksis/apps/chronos/models.py:673 aleksis/apps/chronos/models.py:1144
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
+#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:454
+#: aleksis/apps/chronos/models.py:533 aleksis/apps/chronos/models.py:751
+#: aleksis/apps/chronos/models.py:1213
+#: aleksis/apps/chronos/templates/chronos/substitutions.html:48
+msgid "Room"
+msgstr "Raum"
+
+#: aleksis/apps/chronos/models.py:428 aleksis/apps/chronos/models.py:456
 msgid "Cancelled?"
 msgstr "Entfällt?"
 
-#: aleksis/apps/chronos/models.py:458
+#: aleksis/apps/chronos/models.py:430 aleksis/apps/chronos/models.py:458
 msgid "Cancelled for teachers?"
 msgstr "Entfällt für Lehrkräfte?"
 
-#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
-#: aleksis/apps/chronos/models.py:813 aleksis/apps/chronos/models.py:1216
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:692
+#: aleksis/apps/chronos/models.py:734 aleksis/apps/chronos/models.py:1147
+#: aleksis/apps/chronos/models.py:1357 aleksis/apps/chronos/models.py:461
+#: aleksis/apps/chronos/models.py:770 aleksis/apps/chronos/models.py:813
+#: aleksis/apps/chronos/models.py:1216
 msgid "Comment"
 msgstr "Kommentar"
 
-#: aleksis/apps/chronos/models.py:465
+#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:465
 msgid "Lessons can only be either substituted or cancelled."
-msgstr "Unterrichtsstunden können nur entweder vertreten werden oder ausfallen."
+msgstr ""
+"Unterrichtsstunden können nur entweder vertreten werden oder ausfallen."
 
-#: aleksis/apps/chronos/models.py:506
+#: aleksis/apps/chronos/models.py:477 aleksis/apps/chronos/models.py:506
 msgid "Lesson substitution"
 msgstr "Vertretung"
 
-#: aleksis/apps/chronos/models.py:507
+#: aleksis/apps/chronos/models.py:478 aleksis/apps/chronos/models.py:507
 msgid "Lesson substitutions"
 msgstr "Vertretungen"
 
-#: aleksis/apps/chronos/models.py:655
+#: aleksis/apps/chronos/models.py:621 aleksis/apps/chronos/models.py:655
 msgid "Lesson periods"
 msgstr "Unterrichtsstunden"
 
-#: aleksis/apps/chronos/models.py:693
-msgid "Timetable widget"
-msgstr "Stundenplanwidget"
-
-#: aleksis/apps/chronos/models.py:694
-msgid "Timetable widgets"
-msgstr "Stundenplanwidgets"
-
+#: aleksis/apps/chronos/models.py:635 aleksis/apps/chronos/models.py:648
 #: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
 msgid "Absence reason"
-msgstr "Absenzgrund"
+msgstr "Abwesenheitsgrund"
 
-#: aleksis/apps/chronos/models.py:709
+#: aleksis/apps/chronos/models.py:636 aleksis/apps/chronos/models.py:709
 msgid "Absence reasons"
-msgstr "Absenzgründe"
+msgstr "Abwesenheitsgründe"
 
-#: aleksis/apps/chronos/models.py:735 aleksis/apps/chronos/models.py:974
-#: aleksis/apps/chronos/models.py:1025
+#: aleksis/apps/chronos/models.py:657 aleksis/apps/chronos/models.py:889
+#: aleksis/apps/chronos/models.py:943 aleksis/apps/chronos/models.py:735
+#: aleksis/apps/chronos/models.py:974 aleksis/apps/chronos/models.py:1025
 #: aleksis/apps/chronos/templates/chronos/substitutions.html:46
 msgid "Teacher"
 msgstr "Lehrkraft"
 
-#: aleksis/apps/chronos/models.py:743
+#: aleksis/apps/chronos/models.py:665 aleksis/apps/chronos/models.py:743
 msgid "Group"
 msgstr "Gruppe"
 
+#: aleksis/apps/chronos/models.py:681 aleksis/apps/chronos/models.py:723
 #: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
 msgid "Start period"
 msgstr "Startstunde"
 
+#: aleksis/apps/chronos/models.py:688 aleksis/apps/chronos/models.py:729
 #: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:808
 msgid "End period"
 msgstr "Endstunde"
 
-#: aleksis/apps/chronos/models.py:780
+#: aleksis/apps/chronos/models.py:702 aleksis/apps/chronos/models.py:780
 msgid "Unknown absence"
 msgstr "Unbekannte Absenz"
 
-#: aleksis/apps/chronos/models.py:786
+#: aleksis/apps/chronos/models.py:707 aleksis/apps/chronos/models.py:786
 msgid "Absence"
-msgstr "Absenz"
+msgstr "Abwesenheit"
 
-#: aleksis/apps/chronos/models.py:787
+#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:787
 msgid "Absences"
-msgstr "Fehlstunden"
+msgstr "Abwesenheiten"
 
-#: aleksis/apps/chronos/models.py:798
+#: aleksis/apps/chronos/models.py:719 aleksis/apps/chronos/models.py:798
 msgid "Date of exam"
 msgstr "Datum der Klausur"
 
-#: aleksis/apps/chronos/models.py:812 aleksis/apps/chronos/models.py:826
-#: aleksis/apps/chronos/models.py:1059
+#: aleksis/apps/chronos/models.py:733 aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:977 aleksis/apps/chronos/models.py:812
+#: aleksis/apps/chronos/models.py:826 aleksis/apps/chronos/models.py:1059
 msgid "Title"
 msgstr "Titel"
 
-#: aleksis/apps/chronos/models.py:819
+#: aleksis/apps/chronos/models.py:739 aleksis/apps/chronos/models.py:819
 msgid "Exam"
 msgstr "Klausur"
 
-#: aleksis/apps/chronos/models.py:820
+#: aleksis/apps/chronos/models.py:740 aleksis/apps/chronos/models.py:820
 msgid "Exams"
 msgstr "Klausuren"
 
-#: aleksis/apps/chronos/models.py:829
+#: aleksis/apps/chronos/models.py:749 aleksis/apps/chronos/models.py:829
 msgid "Comments"
 msgstr "Kommentare"
 
-#: aleksis/apps/chronos/models.py:868
+#: aleksis/apps/chronos/models.py:788 aleksis/apps/chronos/models.py:868
 msgid "Holiday"
 msgstr "Ferien"
 
-#: aleksis/apps/chronos/models.py:869
+#: aleksis/apps/chronos/models.py:789 aleksis/apps/chronos/models.py:869
 msgid "Holidays"
 msgstr "Ferien"
 
+#: aleksis/apps/chronos/models.py:803 aleksis/apps/chronos/models.py:879
 #: aleksis/apps/chronos/models.py:883 aleksis/apps/chronos/models.py:964
 msgid "Supervision area"
 msgstr "Aufsichtsgebiet"
 
-#: aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:804 aleksis/apps/chronos/models.py:884
 msgid "Supervision areas"
 msgstr "Aufsichtsgebiete"
 
-#: aleksis/apps/chronos/models.py:901
+#: aleksis/apps/chronos/models.py:816 aleksis/apps/chronos/models.py:901
 msgid "Time period after break starts"
 msgstr "Stunde, nach der die Pause startet"
 
-#: aleksis/apps/chronos/models.py:909
+#: aleksis/apps/chronos/models.py:824 aleksis/apps/chronos/models.py:909
 msgid "Time period before break ends"
 msgstr "Stunde nach der Pause"
 
+#: aleksis/apps/chronos/models.py:864 aleksis/apps/chronos/models.py:883
 #: aleksis/apps/chronos/models.py:949 aleksis/apps/chronos/models.py:968
 msgid "Break"
 msgstr "Pause"
 
-#: aleksis/apps/chronos/models.py:950
+#: aleksis/apps/chronos/models.py:865 aleksis/apps/chronos/models.py:950
 msgid "Breaks"
 msgstr "Pausen"
 
+#: aleksis/apps/chronos/models.py:923 aleksis/apps/chronos/models.py:936
+#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:3
 #: aleksis/apps/chronos/models.py:1005 aleksis/apps/chronos/models.py:1018
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
 #: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
 msgid "Supervision"
 msgstr "Aufsicht"
 
+#: aleksis/apps/chronos/models.py:924 aleksis/apps/chronos/models.py:1622
 #: aleksis/apps/chronos/models.py:1006
 msgid "Supervisions"
 msgstr "Aufsichten"
 
-#: aleksis/apps/chronos/models.py:1014
+#: aleksis/apps/chronos/models.py:932 aleksis/apps/chronos/models.py:1014
 msgid "Date"
 msgstr "Datum"
 
-#: aleksis/apps/chronos/models.py:1048
+#: aleksis/apps/chronos/models.py:966 aleksis/apps/chronos/models.py:1048
 msgid "Supervision substitution"
 msgstr "Aufsichtsvertretung"
 
-#: aleksis/apps/chronos/models.py:1049
+#: aleksis/apps/chronos/models.py:967 aleksis/apps/chronos/models.py:1049
 msgid "Supervision substitutions"
 msgstr "Aufsichtsvertretungen"
 
-#: aleksis/apps/chronos/models.py:1067
+#: aleksis/apps/chronos/models.py:985 aleksis/apps/chronos/models.py:1067
 msgid "Start time period"
 msgstr "Startstunde"
 
-#: aleksis/apps/chronos/models.py:1073
+#: aleksis/apps/chronos/models.py:991 aleksis/apps/chronos/models.py:1073
 msgid "End time period"
 msgstr "Endstunde"
 
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:996 aleksis/apps/chronos/models.py:1332
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:4
+#: aleksis/apps/chronos/models.py:377 aleksis/apps/chronos/models.py:1078
+#: aleksis/apps/chronos/templates/chronos/all.html:45
+msgid "Rooms"
+msgstr "Räume"
+
+#: aleksis/apps/chronos/models.py:1005 aleksis/apps/chronos/models.py:1087
 #, python-brace-format
 msgid "Event {pk}"
 msgstr "Veranstaltung {pk}"
 
-#: aleksis/apps/chronos/models.py:1172
+#: aleksis/apps/chronos/models.py:1103 aleksis/apps/chronos/models.py:1172
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr "Veranstaltung"
 
-#: aleksis/apps/chronos/models.py:1173
+#: aleksis/apps/chronos/models.py:1104 aleksis/apps/chronos/models.py:1173
 msgid "Events"
 msgstr "Veranstaltungen"
 
-#: aleksis/apps/chronos/models.py:1221
+#: aleksis/apps/chronos/models.py:1152 aleksis/apps/chronos/models.py:1221
 msgid "Related exam"
 msgstr "Zugehörige Klausur"
 
-#: aleksis/apps/chronos/models.py:1251
+#: aleksis/apps/chronos/models.py:1181 aleksis/apps/chronos/models.py:1251
 msgid "Extra lesson"
 msgstr "Sonderstunde"
 
-#: aleksis/apps/chronos/models.py:1252
+#: aleksis/apps/chronos/models.py:1182 aleksis/apps/chronos/models.py:1252
 msgid "Extra lessons"
 msgstr "Sonderstunden"
 
-#: aleksis/apps/chronos/models.py:1264
+#: aleksis/apps/chronos/models.py:1194 aleksis/apps/chronos/models.py:1264
 msgid "Number of days shown in the plan"
 msgstr "Anzahl der Tage, die im Plan angezeigt werden"
 
-#: aleksis/apps/chronos/models.py:1268
+#: aleksis/apps/chronos/models.py:1198 aleksis/apps/chronos/models.py:1268
 msgid "Show header box"
 msgstr "Kopfbox anzeigen"
 
+#: aleksis/apps/chronos/models.py:1199 aleksis/apps/chronos/preferences.py:100
 #: aleksis/apps/chronos/models.py:1269 aleksis/apps/chronos/preferences.py:61
 msgid "The header box shows affected teachers/groups."
 msgstr "Die Kopfbox zeigt betroffene Lehrkräfte/Gruppen."
 
-#: aleksis/apps/chronos/models.py:1276
+#: aleksis/apps/chronos/models.py:1206 aleksis/apps/chronos/models.py:1276
 msgid "Revision which triggered the last update"
 msgstr "Revision, die die letzte Aktualisierung ausgelöst hat"
 
-#: aleksis/apps/chronos/models.py:1337
+#: aleksis/apps/chronos/models.py:1278 aleksis/apps/chronos/models.py:1337
 msgid "Automatic plan"
 msgstr "Automatischer Plan"
 
-#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/models.py:1279 aleksis/apps/chronos/models.py:1338
 msgid "Automatic plans"
 msgstr "Automatische Pläne"
 
-#: aleksis/apps/chronos/models.py:1352
+#: aleksis/apps/chronos/models.py:1293 aleksis/apps/chronos/models.py:1352
 msgid "Can view all room timetables"
 msgstr "Kann alle Raumstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/models.py:1294 aleksis/apps/chronos/models.py:1353
 msgid "Can view all group timetables"
 msgstr "Kann alle Gruppenstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:1354
+#: aleksis/apps/chronos/models.py:1295 aleksis/apps/chronos/models.py:1354
 msgid "Can view all person timetables"
 msgstr "Kann alle Personenstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:1355
+#: aleksis/apps/chronos/models.py:1296 aleksis/apps/chronos/models.py:1355
 msgid "Can view timetable overview"
 msgstr "Kann Stundenplanübersicht sehen"
 
-#: aleksis/apps/chronos/models.py:1356
+#: aleksis/apps/chronos/models.py:1297 aleksis/apps/chronos/models.py:1356
 msgid "Can view all lessons per day"
 msgstr "Kann alle Tagesstunden sehen"
 
+#: aleksis/apps/chronos/models.py:1298
+msgid "Can view all supervisions per day"
+msgstr "Kann alle Tagesaufsichten sehen"
+
+#: aleksis/apps/chronos/models.py:1313
+msgid "Start slot number"
+msgstr "Startzeitfenster-Nummer"
+
+#: aleksis/apps/chronos/models.py:1316
+msgid "End slot number"
+msgstr "Endzeitfenster-Nummer"
+
+#: aleksis/apps/chronos/models.py:1320
+msgid "Course"
+msgstr "Kurs"
+
+#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
+msgid "Cancelled"
+msgstr "Entfall"
+
+#: aleksis/apps/chronos/models.py:1401 aleksis/apps/chronos/models.py:1413
+#: aleksis/apps/chronos/models.py:1425
+msgid "{} (instead of {})"
+msgstr "{} (statt {})"
+
+#: aleksis/apps/chronos/models.py:1614
+msgid "Lesson Event"
+msgstr "Unterrichtsstunde"
+
+#: aleksis/apps/chronos/models.py:1615
+msgid "Lesson Events"
+msgstr "Unterrichtsstunden"
+
+#: aleksis/apps/chronos/models.py:1630
+msgid "Supervision: {}"
+msgstr "Aufsicht: {}"
+
+#: aleksis/apps/chronos/preferences.py:21 aleksis/apps/chronos/menus.py:6
+#: aleksis/apps/chronos/preferences.py:10
+msgid "Timetables"
+msgstr "Stundenpläne"
+
+#: aleksis/apps/chronos/preferences.py:29
 #: aleksis/apps/chronos/preferences.py:18
 msgid "Use parent groups in timetable views"
 msgstr "Elterngruppen in Stundenplanansichten benutzen"
 
-#: aleksis/apps/chronos/preferences.py:20
-msgid "If an lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
+#: aleksis/apps/chronos/preferences.py:31
+msgid ""
+"If a lesson or substitution has only one group and this group has parent "
+"groups, show the parent groups instead of the original group."
 msgstr "Wenn eine Stunde oder Vertretung nur eine Gruppe hat und diese Gruppe Elterngruppen hat, zeige die Elterngruppen anstelle der eigentlichen Gruppe."
 
+#: aleksis/apps/chronos/preferences.py:42
 #: aleksis/apps/chronos/preferences.py:31
 msgid "Shorten groups in timetable views"
 msgstr "Gruppen in Stundenplanansichten kürzen"
 
+#: aleksis/apps/chronos/preferences.py:43
 #: aleksis/apps/chronos/preferences.py:32
 msgid "If there are more groups than the set limit, they will be collapsed."
-msgstr "Wenn es mehr Gruppen als das gesetzte Limit gibt, werden die Gruppenangaben gekürzt."
+msgstr ""
+"Wenn es mehr Gruppen als das gesetzte Limit gibt, werden die Gruppenangaben "
+"gekürzt."
 
+#: aleksis/apps/chronos/preferences.py:51
 #: aleksis/apps/chronos/preferences.py:40
 msgid "Limit of groups for shortening of groups"
 msgstr "Anzahl der Gruppen, ab der gekürzt wird"
 
-#: aleksis/apps/chronos/preferences.py:42
-msgid "If an user activates shortening of groups,they will be collapsed if there are more groups than this limit."
-msgstr "Wenn ein Benutzer die Kürzung von Gruppen aktiviert hat, werden sie ab diesem Limit gekürzt."
+#: aleksis/apps/chronos/preferences.py:53
+msgid ""
+"If a user activates shortening of groups,they will be collapsed if there are "
+"more groups than this limit."
+msgstr "Wenn Benutzer*innen die Kürzung von Gruppen aktiviert hat, werden sie ab diesem Limit gekürzt."
+
+#: aleksis/apps/chronos/preferences.py:65
+msgid "Relevant days for substitution plans"
+msgstr "Relevante Tage für Vertretungspläne"
 
+#: aleksis/apps/chronos/preferences.py:82
+msgid "Time when substitution plans switch to the next day"
+msgstr "Zeit zu der Vertretungspläne zum nächsten Tag wechseln"
+
+#: aleksis/apps/chronos/preferences.py:91
 #: aleksis/apps/chronos/preferences.py:52
 msgid "Number of days shown on substitutions print view"
-msgstr "Anzahl der Tage, die in der Druckansicht des Vertretungsplanes angezeigt werden soll"
+msgstr ""
+"Anzahl der Tage, die in der Druckansicht des Vertretungsplanes angezeigt "
+"werden soll"
 
+#: aleksis/apps/chronos/preferences.py:99
 #: aleksis/apps/chronos/preferences.py:60
 msgid "Show header box in substitution views"
 msgstr "Kopfbox in Vertretungsplänen anzeigen"
 
+#: aleksis/apps/chronos/preferences.py:109
 #: aleksis/apps/chronos/preferences.py:70
-msgid "Show parent groups in header box in substitution views instead of original groups"
-msgstr "Elterngruppen in der Kopfbox in Vertretungsplänen an Stelle der eigentlichen Gruppen anzeigen"
+msgid ""
+"Show parent groups in header box in substitution views instead of original "
+"groups"
+msgstr ""
+"Elterngruppen in der Kopfbox in Vertretungsplänen an Stelle der eigentlichen "
+"Gruppen anzeigen"
 
+#: aleksis/apps/chronos/preferences.py:118
 #: aleksis/apps/chronos/preferences.py:79
-msgid "How many days in advance users should be notified about timetable changes?"
-msgstr "Wie viele Tage im Voraus sollen Benutzer über Stundenplanänderungen benachrichtigt werden?"
+msgid ""
+"How many days in advance users should be notified about timetable changes?"
+msgstr ""
+"Wie viele Tage im Voraus sollen Benutzer über Stundenplanänderungen "
+"benachrichtigt werden?"
 
+#: aleksis/apps/chronos/preferences.py:126
 #: aleksis/apps/chronos/preferences.py:87
 msgid "Time for sending notifications about timetable changes"
 msgstr "Zeitpunkt zum Senden von Benachrichtigungen über Stundenplanänderungen"
 
+#: aleksis/apps/chronos/preferences.py:129
 #: aleksis/apps/chronos/preferences.py:90
-msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
-msgstr "Dies wird nur benutzt, um Benachrichtigungen zu planen, welche nicht den oben konfigurierten Zeitraum betreffen. Alle weiteren Benachrichtigungen, die die nächsten Tage betreffen, werden sofort gesendet."
+msgid ""
+"This is only used for scheduling notifications which doesn't affect the time "
+"period configured above. All other notifications affecting the next days are "
+"sent immediately."
+msgstr ""
+"Dies wird nur benutzt, um Benachrichtigungen zu planen, welche nicht den "
+"oben konfigurierten Zeitraum betreffen. Alle weiteren Benachrichtigungen, "
+"die die nächsten Tage betreffen, werden sofort gesendet."
 
+#: aleksis/apps/chronos/preferences.py:140
+#: aleksis/apps/chronos/preferences.py:148
 #: aleksis/apps/chronos/preferences.py:101
 #: aleksis/apps/chronos/preferences.py:109
 msgid "Send notifications for current timetable changes"
 msgstr "Benachrichtigungen für aktuelle Stundenplanänderungen verschicken"
 
-#: aleksis/apps/chronos/tables.py:41
-msgid "Substitution"
-msgstr "Vertretung"
-
-#: aleksis/apps/chronos/tables.py:43
-msgid "Manage substitution"
-msgstr "Vertretung verwalten"
-
-#: aleksis/apps/chronos/templates/chronos/all.html:25
-msgid "No teachers timetables available."
-msgstr "Keine Stundenpläne von Lehrkräften vorhanden."
-
-#: aleksis/apps/chronos/templates/chronos/all.html:39
-msgid "No group timetables available."
-msgstr "Keine Gruppen-Stundenpläne verfügbar."
-
-#: aleksis/apps/chronos/templates/chronos/all.html:53
-msgid "No room timetables available."
-msgstr "Keine Raum-Stundenpläne verfügbar."
-
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:11
-msgid "Edit substitution."
-msgstr "Vertretung bearbeiten."
-
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:12
-msgid "Edit substitution"
-msgstr "Vertretung bearbeiten"
+#: aleksis/apps/chronos/preferences.py:158
+msgid "Group types to show in timetables"
+msgstr "In Stundenplänen anzuzeigende Gruppentypen"
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:25
-msgid "Delete"
-msgstr "Löschen"
+#: aleksis/apps/chronos/preferences.py:159
+msgid "If you leave it empty, all groups will be shown."
+msgstr "Wenn Sie das Feld frei lassen, werden alle Gruppen angezeigt."
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:50
-msgid "SMART PLAN"
-msgstr "SMART PLAN"
+#: aleksis/apps/chronos/preferences.py:169
+msgid "Lesson calendar feed color"
+msgstr "Unterrichtsstunden-Kalenderfarbe"
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:22
-msgid "Show week timetable for"
-msgstr "Wochenplan anzeigen für"
+#: aleksis/apps/chronos/preferences.py:181
+msgid "Supervision calendar feed color"
+msgstr "Aufsichts-Kalenderfarbe"
 
 #: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
 msgid "Absent teachers"
@@ -558,101 +619,57 @@ msgstr "Betroffene Lehrkräfte"
 msgid "Affected groups"
 msgstr "Betroffene Gruppen"
 
-#: aleksis/apps/chronos/templates/chronos/partials/lesson.html:27
-msgid "Cancelled due to an event"
-msgstr "Fällt wg. einer Veranstaltung aus"
+#: aleksis/apps/chronos/templates/chronos/partials/subs/period.html:12
+msgid "all day"
+msgstr "ganzer Tag"
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
-msgid "Cancelled"
-msgstr "Entfall"
-
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:6
-msgid "Cancelled for teachers"
-msgstr "Entfall für Lehrkräfte"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
+msgid "Print: Substitutions"
+msgstr "Druckansicht: Vertretungen"
 
-#: aleksis/apps/chronos/templates/chronos/partials/today.html:2
-msgid "Today"
-msgstr "Heute"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
+#: aleksis/apps/chronos/menus.py:49
+#: aleksis/apps/chronos/templates/chronos/substitutions.html:11
+#: aleksis/apps/chronos/templates/chronos/substitutions.html:17
+msgid "Substitutions"
+msgstr "Vertretungen"
 
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:14
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:25
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:36
-msgid "CW"
-msgstr "KW"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:27
+msgid "Time"
+msgstr "Zeit"
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:49
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
+#: aleksis/apps/chronos/templates/chronos/substitutions.html:49
 msgid "Notes"
 msgstr "Notizen"
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:57
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
+#: aleksis/apps/chronos/templates/chronos/substitutions.html:57
 msgid "No substitutions available."
 msgstr "Keine Vertretungen vorhanden."
 
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
-msgid "Print: Substitutions"
-msgstr "Druckansicht: Vertretungen"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:24
-#: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
-#: aleksis/apps/chronos/util/notifications.py:206
-msgid "Timetable"
-msgstr "Stundenplan"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:29
-msgid "Group teachers:"
-msgstr "Gruppenlehrkräfte:"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:55
-msgid "Show regular timetable"
-msgstr "Regulären Plan anzeigen"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:63
-#: aleksis/apps/chronos/templates/chronos/timetable.html:84
-msgid "View class register of this week"
-msgstr "Klassenbuch dieser Woche anzeigen"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:76
-msgid "Show SMART PLAN"
-msgstr "SMART PLAN anzeigen"
-
-#: aleksis/apps/chronos/templates/chronos/widget.html:8
-#, python-format
-msgid ""
-"\n"
-"        My timetable for %(day)s\n"
-"      "
-msgstr ""
-"\n"
-"        Mein Stundenplan für %(day)s\n"
-"      "
-
-#: aleksis/apps/chronos/templates/chronos/widget.html:18
-msgid ""
-"\n"
-"          There is no timetable linked to your person.\n"
-"          "
-msgstr ""
-"\n"
-"          Es gibt keine Stundenplan, der Ihrer Person zugeordnet ist.\n"
-"          "
-
-#: aleksis/apps/chronos/templates/chronos/widget.html:27
-msgid "Go to smart plan"
-msgstr "SMART PLAN anzeigen"
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:2
+msgid "Areas"
+msgstr "Bereiche"
 
+#: aleksis/apps/chronos/util/notifications.py:48
 #: aleksis/apps/chronos/util/notifications.py:50
 #, python-brace-format
-msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
+msgid ""
+"The {subject} lesson in the {period}. period on {day} has been cancelled."
 msgstr "Die {subject}-Stunde in der {period}. Stunde am {day} fällt aus."
 
+#: aleksis/apps/chronos/util/notifications.py:55
 #: aleksis/apps/chronos/util/notifications.py:57
 #, python-brace-format
-msgid "The {subject} lesson in the {period}. period on {day} has some current changes."
-msgstr "Die {subject}-Stunde in der {period}. Stunde am {day} hat aktuelle Änderungen."
+msgid ""
+"The {subject} lesson in the {period}. period on {day} has some current "
+"changes."
+msgstr ""
+"Die {subject}-Stunde in der {period}. Stunde am {day} hat aktuelle "
+"Änderungen."
 
+#: aleksis/apps/chronos/util/notifications.py:64
 #: aleksis/apps/chronos/util/notifications.py:66
 #, python-brace-format
 msgid "The teacher {old} is substituted by {new}."
@@ -660,77 +677,254 @@ msgid_plural "The teachers {old} are substituted by {new}."
 msgstr[0] "Die Lehrkraft {old} wird von {new} vertreten."
 msgstr[1] "Die Lehrkräfte {old} werden von {new} vertreten."
 
+#: aleksis/apps/chronos/util/notifications.py:76
 #: aleksis/apps/chronos/util/notifications.py:78
 #, python-brace-format
 msgid "The subject is changed to {subject}."
 msgstr "Das Fach ist zu {subject} geändert."
 
+#: aleksis/apps/chronos/util/notifications.py:82
 #: aleksis/apps/chronos/util/notifications.py:84
 #, python-brace-format
 msgid "The lesson is moved from {old} to {new}."
 msgstr "Die Stunde wurde von {old} nach {new} verschoben."
 
+#: aleksis/apps/chronos/util/notifications.py:91
 #: aleksis/apps/chronos/util/notifications.py:93
 #, python-brace-format
 msgid "There is an additional comment: {comment}."
 msgstr "Es gibt einen zusätzlichen Hinweis: {comment}."
 
+#: aleksis/apps/chronos/util/notifications.py:99
 #: aleksis/apps/chronos/util/notifications.py:101
 #, python-brace-format
-msgid "There is an event that starts on {date_start}, {period_from}. period and ends on {date_end}, {period_to}. period:"
-msgstr "Es gibt eine Veranstaltung, die am {date_start} in der {period_from}. Stunde startet und am {date_end} in der {period_to}. Stunde endet:"
+msgid ""
+"There is an event that starts on {date_start}, {period_from}. period and "
+"ends on {date_end}, {period_to}. period:"
+msgstr ""
+"Es gibt eine Veranstaltung, die am {date_start} in der {period_from}. Stunde "
+"startet und am {date_end} in der {period_to}. Stunde endet:"
 
+#: aleksis/apps/chronos/util/notifications.py:112
 #: aleksis/apps/chronos/util/notifications.py:114
 #, python-brace-format
-msgid "There is an event on {date} from the {period_from}. period to the {period_to}. period:"
-msgstr "Es gibt eine Veranstaltung am {date} von der {period_from}. Stunde bis zur {period_to}. Stunde:"
+msgid ""
+"There is an event on {date} from the {period_from}. period to the "
+"{period_to}. period:"
+msgstr ""
+"Es gibt eine Veranstaltung am {date} von der {period_from}. Stunde bis zur "
+"{period_to}. Stunde:"
 
+#: aleksis/apps/chronos/util/notifications.py:123
+#: aleksis/apps/chronos/util/notifications.py:143
 #: aleksis/apps/chronos/util/notifications.py:125
 #: aleksis/apps/chronos/util/notifications.py:145
 #, python-brace-format
 msgid "Groups: {groups}"
 msgstr "Gruppen: {groups}"
 
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:147
 #: aleksis/apps/chronos/util/notifications.py:127
 #: aleksis/apps/chronos/util/notifications.py:149
 #, python-brace-format
 msgid "Teachers: {teachers}"
 msgstr "Lehrkräfte: {teachers}"
 
+#: aleksis/apps/chronos/util/notifications.py:128
 #: aleksis/apps/chronos/util/notifications.py:130
 #, python-brace-format
 msgid "Rooms: {rooms}"
 msgstr "Räume: {rooms}"
 
+#: aleksis/apps/chronos/util/notifications.py:135
 #: aleksis/apps/chronos/util/notifications.py:137
 #, python-brace-format
 msgid "There is an extra lesson on {date} in the {period}. period:"
 msgstr "Es gibt eine Zusatzstunde am {date} in der {period}. Stunde:"
 
+#: aleksis/apps/chronos/util/notifications.py:145
 #: aleksis/apps/chronos/util/notifications.py:147
 #, python-brace-format
 msgid "Subject: {subject}"
 msgstr "Fach: {subject}"
 
+#: aleksis/apps/chronos/util/notifications.py:149
 #: aleksis/apps/chronos/util/notifications.py:151
 #, python-brace-format
 msgid "Room: {room}"
 msgstr "Raum: {room}"
 
+#: aleksis/apps/chronos/util/notifications.py:151
 #: aleksis/apps/chronos/util/notifications.py:153
 #, python-brace-format
 msgid "Comment: {comment}."
 msgstr "Kommentar: {comment}."
 
+#: aleksis/apps/chronos/util/notifications.py:154
 #: aleksis/apps/chronos/util/notifications.py:156
 #, python-brace-format
-msgid "The supervision of {old} on {date} between the {period_from}. period and the {period_to}. period in the area {area} is substituted by {new}."
-msgstr "Die Aufsicht von {old} am {date} zwischen der {period_from}. Stunde un der {period_to}. Stunde im Gebiet {area} wird von {new} vertreten."
+msgid ""
+"The supervision of {old} on {date} between the {period_from}. period and the "
+"{period_to}. period in the area {area} is substituted by {new}."
+msgstr ""
+"Die Aufsicht von {old} am {date} zwischen der {period_from}. Stunde un der "
+"{period_to}. Stunde im Gebiet {area} wird von {new} vertreten."
+
+#: aleksis/apps/chronos/util/notifications.py:204
+#: aleksis/apps/chronos/templates/chronos/timetable.html:11
+#: aleksis/apps/chronos/templates/chronos/timetable.html:24
+#: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
+#: aleksis/apps/chronos/util/notifications.py:206
+msgid "Timetable"
+msgstr "Stundenplan"
 
+#: aleksis/apps/chronos/util/notifications.py:205
 #: aleksis/apps/chronos/util/notifications.py:207
 msgid "There are current changes to your timetable."
 msgstr "Es gibt aktuelle Änderungen in Ihrem Stundenplan."
 
+#: aleksis/apps/chronos/form_extensions.py:7
+msgid "Options for timetables"
+msgstr "Einstellungen für Stundenpläne"
+
+#: aleksis/apps/chronos/form_extensions.py:8
+msgid "Optional data for timetables"
+msgstr "Optionale Daten für Stundenpläne"
+
+#: aleksis/apps/chronos/menus.py:16
+#: aleksis/apps/chronos/templates/chronos/my_timetable.html:11
+#: aleksis/apps/chronos/templates/chronos/my_timetable.html:18
+msgid "My timetable"
+msgstr "Mein Plan"
+
+#: aleksis/apps/chronos/menus.py:27
+#: aleksis/apps/chronos/templates/chronos/all.html:11
+#: aleksis/apps/chronos/templates/chronos/all.html:12
+msgid "All timetables"
+msgstr "Alle Stundenpläne"
+
+#: aleksis/apps/chronos/menus.py:38
+msgid "Daily lessons"
+msgstr "Tagesstunden"
+
+#: aleksis/apps/chronos/model_extensions.py:142
+msgid "Show announcement in timetable views?"
+msgstr "Ankündigungen in Stundenplanansichten anzeigen?"
+
+#: aleksis/apps/chronos/models.py:374
+msgid "Can view room timetable"
+msgstr "Kann Raum-Stundenplan sehen"
+
+#: aleksis/apps/chronos/models.py:693
+msgid "Timetable widget"
+msgstr "Stundenplanwidget"
+
+#: aleksis/apps/chronos/models.py:694
+msgid "Timetable widgets"
+msgstr "Stundenplanwidgets"
+
+#: aleksis/apps/chronos/tables.py:41
+msgid "Substitution"
+msgstr "Vertretung"
+
+#: aleksis/apps/chronos/tables.py:43
+msgid "Manage substitution"
+msgstr "Vertretung verwalten"
+
+#: aleksis/apps/chronos/templates/chronos/all.html:25
+msgid "No teachers timetables available."
+msgstr "Keine Stundenpläne von Lehrkräften vorhanden."
+
+#: aleksis/apps/chronos/templates/chronos/all.html:39
+msgid "No group timetables available."
+msgstr "Keine Gruppen-Stundenpläne verfügbar."
+
+#: aleksis/apps/chronos/templates/chronos/all.html:53
+msgid "No room timetables available."
+msgstr "Keine Raum-Stundenpläne verfügbar."
+
+#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:11
+msgid "Edit substitution."
+msgstr "Vertretung bearbeiten."
+
+#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:12
+msgid "Edit substitution"
+msgstr "Vertretung bearbeiten"
+
+#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:25
+msgid "Delete"
+msgstr "Löschen"
+
+#: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
+#: aleksis/apps/chronos/templates/chronos/timetable.html:50
+msgid "SMART PLAN"
+msgstr "SMART PLAN"
+
+#: aleksis/apps/chronos/templates/chronos/my_timetable.html:22
+msgid "Show week timetable for"
+msgstr "Wochenplan anzeigen für"
+
+#: aleksis/apps/chronos/templates/chronos/partials/lesson.html:27
+msgid "Cancelled due to an event"
+msgstr "Fällt wg. einer Veranstaltung aus"
+
+#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:6
+msgid "Cancelled for teachers"
+msgstr "Entfall für Lehrkräfte"
+
+#: aleksis/apps/chronos/templates/chronos/partials/today.html:2
+msgid "Today"
+msgstr "Heute"
+
+#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:14
+#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:25
+#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:36
+msgid "CW"
+msgstr "KW"
+
+#: aleksis/apps/chronos/templates/chronos/timetable.html:29
+msgid "Group teachers:"
+msgstr "Gruppenlehrkräfte:"
+
+#: aleksis/apps/chronos/templates/chronos/timetable.html:55
+msgid "Show regular timetable"
+msgstr "Regulären Plan anzeigen"
+
+#: aleksis/apps/chronos/templates/chronos/timetable.html:63
+#: aleksis/apps/chronos/templates/chronos/timetable.html:84
+msgid "View class register of this week"
+msgstr "Klassenbuch dieser Woche anzeigen"
+
+#: aleksis/apps/chronos/templates/chronos/timetable.html:76
+msgid "Show SMART PLAN"
+msgstr "SMART PLAN anzeigen"
+
+#: aleksis/apps/chronos/templates/chronos/widget.html:8
+#, python-format
+msgid ""
+"\n"
+"        My timetable for %(day)s\n"
+"      "
+msgstr ""
+"\n"
+"        Mein Stundenplan für %(day)s\n"
+"      "
+
+#: aleksis/apps/chronos/templates/chronos/widget.html:18
+msgid ""
+"\n"
+"          There is no timetable linked to your person.\n"
+"          "
+msgstr ""
+"\n"
+"          Es gibt keine Stundenplan, der Ihrer Person zugeordnet ist.\n"
+"          "
+
+#: aleksis/apps/chronos/templates/chronos/widget.html:27
+msgid "Go to smart plan"
+msgstr "SMART PLAN anzeigen"
+
 #: aleksis/apps/chronos/views.py:270
 msgid "The substitution has been saved."
 msgstr "Die Vertretung wurde gespeichert."
@@ -739,6 +933,22 @@ msgstr "Die Vertretung wurde gespeichert."
 msgid "The substitution has been deleted."
 msgstr "Die Vertretung wurde gelöscht."
 
+#: aleksis/apps/chronos/preferences.py:20
+msgid ""
+"If an lesson or substitution has only one group and this group has parent "
+"groups, show the parent groups instead of the original group."
+msgstr ""
+"Wenn eine Stunde oder Vertretung nur eine Gruppe hat und diese Gruppe "
+"Elterngruppen hat, zeige die Elterngruppen anstelle der eigentlichen Gruppe."
+
+#: aleksis/apps/chronos/preferences.py:42
+msgid ""
+"If an user activates shortening of groups,they will be collapsed if there "
+"are more groups than this limit."
+msgstr ""
+"Wenn ein Benutzer die Kürzung von Gruppen aktiviert hat, werden sie ab "
+"diesem Limit gekürzt."
+
 #~ msgid "View class register of the current week"
 #~ msgstr "Klassenbuch der aktuellen Woche anzeigen"
 
@@ -811,8 +1021,12 @@ msgstr "Die Vertretung wurde gelöscht."
 #~ msgid "Effective end period of event"
 #~ msgstr "Effektive Endstunde der Veranstaltung"
 
-#~ msgid "If there are more groups than this limit and CHRONOS_SHORTEN_GROUPS is enabled, add text collapsible."
-#~ msgstr "Wenn es mehr Gruppen als dieses Limit gibt und CHRONOS_SHORTEN_GROUPS aktiviert ist, werden die Gruppenangaben gekürzt."
+#~ msgid ""
+#~ "If there are more groups than this limit and CHRONOS_SHORTEN_GROUPS is "
+#~ "enabled, add text collapsible."
+#~ msgstr ""
+#~ "Wenn es mehr Gruppen als dieses Limit gibt und CHRONOS_SHORTEN_GROUPS "
+#~ "aktiviert ist, werden die Gruppenangaben gekürzt."
 
 #~ msgid "Abbreviation of subject in timetable"
 #~ msgstr "Kürzel des Faches im Stundenplan"
@@ -841,9 +1055,6 @@ msgstr "Die Vertretung wurde gelöscht."
 #~ msgid "Select"
 #~ msgstr "Auswählen"
 
-#~ msgid "Times"
-#~ msgstr "Zeiten"
-
 #~ msgid "Calendar Week"
 #~ msgstr "Kalenderwoche"
 
@@ -855,3 +1066,6 @@ msgstr "Die Vertretung wurde gelöscht."
 
 #~ msgid "AlekSIS - Chronos (Timetables)"
 #~ msgstr "AlekSIS - Chronos (Stundenpläne)"
+
+#~ msgid "Times"
+#~ msgstr "Zeiten"
diff --git a/aleksis/apps/chronos/locale/fr/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/fr/LC_MESSAGES/django.po
index 2de6a0f73e58b9d49c4178a9947ad53e61475c72..0efbbcbc0bddc2a0dfd0fc65f2f487e69d5c6532 100644
--- a/aleksis/apps/chronos/locale/fr/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/locale/fr/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-21 11:32+0200\n"
+"POT-Creation-Date: 2024-08-18 14:23+0200\n"
 "PO-Revision-Date: 2021-06-16 11:59+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis-app-chronos/fr/>\n"
@@ -18,76 +18,38 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 4.4\n"
 
-#: aleksis/apps/chronos/form_extensions.py:7
-msgid "Options for timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/form_extensions.py:8
-msgid "Optional data for timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
-msgid "Timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:16
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:18
-msgid "My timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:27
-#: aleksis/apps/chronos/templates/chronos/all.html:11
-#: aleksis/apps/chronos/templates/chronos/all.html:12
-msgid "All timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:38
-msgid "Daily lessons"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:49
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:11
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:17
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
-msgid "Substitutions"
-msgstr ""
-
 #: aleksis/apps/chronos/mixins.py:25
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:142
-msgid "Show announcement in timetable views?"
-msgstr ""
-
-#: aleksis/apps/chronos/model_extensions.py:151
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:155
+#: aleksis/apps/chronos/model_extensions.py:149
 msgid "Can view person timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:86
+#: aleksis/apps/chronos/models.py:87
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
+#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:626
+#: aleksis/apps/chronos/models.py:1310
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
-#: aleksis/apps/chronos/models.py:827 aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:676
+#: aleksis/apps/chronos/models.py:747 aleksis/apps/chronos/models.py:979
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
-#: aleksis/apps/chronos/models.py:828 aleksis/apps/chronos/models.py:1062
+#: aleksis/apps/chronos/models.py:93 aleksis/apps/chronos/models.py:677
+#: aleksis/apps/chronos/models.py:748 aleksis/apps/chronos/models.py:980
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:111
+#: aleksis/apps/chronos/models.py:112
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
@@ -107,441 +69,455 @@ msgstr ""
 msgid "Validity ranges"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:150
+#: aleksis/apps/chronos/models.py:149
 msgid "Week day"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:152
+#: aleksis/apps/chronos/models.py:151
 msgid "Number of period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:153
 msgid "Start time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:155
+#: aleksis/apps/chronos/models.py:154
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
-#: aleksis/apps/chronos/models.py:1191
+#: aleksis/apps/chronos/models.py:324 aleksis/apps/chronos/models.py:496
+#: aleksis/apps/chronos/models.py:1122
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:339
+#: aleksis/apps/chronos/models.py:325
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:698 aleksis/apps/chronos/models.py:873
-#: aleksis/apps/chronos/models.py:895
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:625
+#: aleksis/apps/chronos/models.py:793 aleksis/apps/chronos/models.py:810
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
-#: aleksis/apps/chronos/models.py:874 aleksis/apps/chronos/models.py:896
+#: aleksis/apps/chronos/models.py:330 aleksis/apps/chronos/models.py:794
+#: aleksis/apps/chronos/models.py:811
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:332
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:347
+#: aleksis/apps/chronos/models.py:333
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:354 aleksis/apps/chronos/models.py:390
-#: aleksis/apps/chronos/models.py:446 aleksis/apps/chronos/models.py:1198
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:47
+#: aleksis/apps/chronos/models.py:340 aleksis/apps/chronos/models.py:349
+#: aleksis/apps/chronos/models.py:416 aleksis/apps/chronos/models.py:1129
+#: aleksis/apps/chronos/models.py:1345
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:2
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr "Sujet"
 
-#: aleksis/apps/chronos/models.py:355
+#: aleksis/apps/chronos/models.py:341
 #, fuzzy
 #| msgid "Subject"
 msgid "Subjects"
 msgstr "Sujet"
 
-#: aleksis/apps/chronos/models.py:374
-msgid "Can view room timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:454
-#: aleksis/apps/chronos/models.py:533 aleksis/apps/chronos/models.py:751
-#: aleksis/apps/chronos/models.py:1213
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:48
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
-msgid "Room"
-msgstr "Salle"
-
-#: aleksis/apps/chronos/models.py:377 aleksis/apps/chronos/models.py:1078
-#: aleksis/apps/chronos/templates/chronos/all.html:45
-msgid "Rooms"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:393 aleksis/apps/chronos/models.py:452
-#: aleksis/apps/chronos/models.py:1080 aleksis/apps/chronos/models.py:1206
-#: aleksis/apps/chronos/tables.py:35
-#: aleksis/apps/chronos/templates/chronos/all.html:17
+#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:422
+#: aleksis/apps/chronos/models.py:998 aleksis/apps/chronos/models.py:1137
+#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:3
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:1
 msgid "Teachers"
 msgstr "Profs"
 
-#: aleksis/apps/chronos/models.py:399
+#: aleksis/apps/chronos/models.py:358
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1077
-#: aleksis/apps/chronos/models.py:1201 aleksis/apps/chronos/tables.py:34
-#: aleksis/apps/chronos/templates/chronos/all.html:31
+#: aleksis/apps/chronos/models.py:360 aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1132 aleksis/apps/chronos/models.py:1326
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:1
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:26
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
-#: aleksis/apps/chronos/models.py:795
+#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:490
+#: aleksis/apps/chronos/models.py:716 aleksis/apps/chronos/models.py:1430
+#: aleksis/apps/chronos/models.py:1454
 msgid "Lesson"
 msgstr "Cours"
 
-#: aleksis/apps/chronos/models.py:425
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
+#: aleksis/apps/chronos/models.py:395 aleksis/apps/chronos/models.py:1306
 msgid "Lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1185
+#: aleksis/apps/chronos/models.py:403 aleksis/apps/chronos/models.py:1116
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1186
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:1117
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
+#: aleksis/apps/chronos/models.py:407 aleksis/apps/chronos/models.py:620
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:456
+#: aleksis/apps/chronos/models.py:425 aleksis/apps/chronos/models.py:504
+#: aleksis/apps/chronos/models.py:673 aleksis/apps/chronos/models.py:1144
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
+msgid "Room"
+msgstr "Salle"
+
+#: aleksis/apps/chronos/models.py:428
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:458
+#: aleksis/apps/chronos/models.py:430
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
-#: aleksis/apps/chronos/models.py:813 aleksis/apps/chronos/models.py:1216
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:692
+#: aleksis/apps/chronos/models.py:734 aleksis/apps/chronos/models.py:1147
+#: aleksis/apps/chronos/models.py:1357
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:465
+#: aleksis/apps/chronos/models.py:437
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:506
+#: aleksis/apps/chronos/models.py:477
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:507
+#: aleksis/apps/chronos/models.py:478
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:655
+#: aleksis/apps/chronos/models.py:621
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:693
-msgid "Timetable widget"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:694
-msgid "Timetable widgets"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
+#: aleksis/apps/chronos/models.py:635 aleksis/apps/chronos/models.py:648
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:709
+#: aleksis/apps/chronos/models.py:636
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:735 aleksis/apps/chronos/models.py:974
-#: aleksis/apps/chronos/models.py:1025
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:46
+#: aleksis/apps/chronos/models.py:657 aleksis/apps/chronos/models.py:889
+#: aleksis/apps/chronos/models.py:943
 msgid "Teacher"
 msgstr "prof"
 
-#: aleksis/apps/chronos/models.py:743
+#: aleksis/apps/chronos/models.py:665
 msgid "Group"
 msgstr "groupe"
 
-#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
+#: aleksis/apps/chronos/models.py:681 aleksis/apps/chronos/models.py:723
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:808
+#: aleksis/apps/chronos/models.py:688 aleksis/apps/chronos/models.py:729
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:780
+#: aleksis/apps/chronos/models.py:702
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:786
+#: aleksis/apps/chronos/models.py:707
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:787
+#: aleksis/apps/chronos/models.py:708
 msgid "Absences"
 msgstr "Absences"
 
-#: aleksis/apps/chronos/models.py:798
+#: aleksis/apps/chronos/models.py:719
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:812 aleksis/apps/chronos/models.py:826
-#: aleksis/apps/chronos/models.py:1059
+#: aleksis/apps/chronos/models.py:733 aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:977
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:819
+#: aleksis/apps/chronos/models.py:739
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:820
+#: aleksis/apps/chronos/models.py:740
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:829
+#: aleksis/apps/chronos/models.py:749
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:868
+#: aleksis/apps/chronos/models.py:788
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:869
+#: aleksis/apps/chronos/models.py:789
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:883 aleksis/apps/chronos/models.py:964
+#: aleksis/apps/chronos/models.py:803 aleksis/apps/chronos/models.py:879
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:804
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:901
+#: aleksis/apps/chronos/models.py:816
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:909
+#: aleksis/apps/chronos/models.py:824
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:949 aleksis/apps/chronos/models.py:968
+#: aleksis/apps/chronos/models.py:864 aleksis/apps/chronos/models.py:883
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:950
+#: aleksis/apps/chronos/models.py:865
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1005 aleksis/apps/chronos/models.py:1018
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
-#: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
+#: aleksis/apps/chronos/models.py:923 aleksis/apps/chronos/models.py:936
+#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:3
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1006
+#: aleksis/apps/chronos/models.py:924 aleksis/apps/chronos/models.py:1622
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1014
+#: aleksis/apps/chronos/models.py:932
 msgid "Date"
 msgstr "Date"
 
-#: aleksis/apps/chronos/models.py:1048
+#: aleksis/apps/chronos/models.py:966
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1049
+#: aleksis/apps/chronos/models.py:967
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1067
+#: aleksis/apps/chronos/models.py:985
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1073
+#: aleksis/apps/chronos/models.py:991
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:996 aleksis/apps/chronos/models.py:1332
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:4
+msgid "Rooms"
+msgstr ""
+
+#: aleksis/apps/chronos/models.py:1005
 #, python-brace-format
 msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1172
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
+#: aleksis/apps/chronos/models.py:1103
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1173
+#: aleksis/apps/chronos/models.py:1104
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1221
+#: aleksis/apps/chronos/models.py:1152
 msgid "Related exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1251
+#: aleksis/apps/chronos/models.py:1181
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1252
+#: aleksis/apps/chronos/models.py:1182
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1264
+#: aleksis/apps/chronos/models.py:1194
 msgid "Number of days shown in the plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1268
+#: aleksis/apps/chronos/models.py:1198
 msgid "Show header box"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1269 aleksis/apps/chronos/preferences.py:61
+#: aleksis/apps/chronos/models.py:1199 aleksis/apps/chronos/preferences.py:100
 msgid "The header box shows affected teachers/groups."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1276
+#: aleksis/apps/chronos/models.py:1206
 msgid "Revision which triggered the last update"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1337
+#: aleksis/apps/chronos/models.py:1278
 msgid "Automatic plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/models.py:1279
 msgid "Automatic plans"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1352
+#: aleksis/apps/chronos/models.py:1293
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/models.py:1294
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1354
+#: aleksis/apps/chronos/models.py:1295
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1355
+#: aleksis/apps/chronos/models.py:1296
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1356
+#: aleksis/apps/chronos/models.py:1297
 msgid "Can view all lessons per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:18
-msgid "Use parent groups in timetable views"
+#: aleksis/apps/chronos/models.py:1298
+msgid "Can view all supervisions per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:20
-msgid "If an lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
+#: aleksis/apps/chronos/models.py:1313
+msgid "Start slot number"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:31
-msgid "Shorten groups in timetable views"
+#: aleksis/apps/chronos/models.py:1316
+msgid "End slot number"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:32
-msgid "If there are more groups than the set limit, they will be collapsed."
+#: aleksis/apps/chronos/models.py:1320
+msgid "Course"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:40
-msgid "Limit of groups for shortening of groups"
+#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
+msgid "Cancelled"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:42
-msgid "If an user activates shortening of groups,they will be collapsed if there are more groups than this limit."
+#: aleksis/apps/chronos/models.py:1401 aleksis/apps/chronos/models.py:1413
+#: aleksis/apps/chronos/models.py:1425
+msgid "{} (instead of {})"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:52
-msgid "Number of days shown on substitutions print view"
+#: aleksis/apps/chronos/models.py:1614
+#, fuzzy
+#| msgid "Lesson"
+msgid "Lesson Event"
+msgstr "Cours"
+
+#: aleksis/apps/chronos/models.py:1615
+#, fuzzy
+#| msgid "Lesson"
+msgid "Lesson Events"
+msgstr "Cours"
+
+#: aleksis/apps/chronos/models.py:1630
+msgid "Supervision: {}"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:60
-msgid "Show header box in substitution views"
+#: aleksis/apps/chronos/preferences.py:21
+msgid "Timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:70
-msgid "Show parent groups in header box in substitution views instead of original groups"
+#: aleksis/apps/chronos/preferences.py:29
+msgid "Use parent groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:79
-msgid "How many days in advance users should be notified about timetable changes?"
+#: aleksis/apps/chronos/preferences.py:31
+msgid "If a lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:87
-msgid "Time for sending notifications about timetable changes"
+#: aleksis/apps/chronos/preferences.py:42
+msgid "Shorten groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:90
-msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
+#: aleksis/apps/chronos/preferences.py:43
+msgid "If there are more groups than the set limit, they will be collapsed."
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:101
-#: aleksis/apps/chronos/preferences.py:109
-msgid "Send notifications for current timetable changes"
+#: aleksis/apps/chronos/preferences.py:51
+msgid "Limit of groups for shortening of groups"
+msgstr ""
+
+#: aleksis/apps/chronos/preferences.py:53
+msgid "If a user activates shortening of groups,they will be collapsed if there are more groups than this limit."
 msgstr ""
 
-#: aleksis/apps/chronos/tables.py:41
-msgid "Substitution"
+#: aleksis/apps/chronos/preferences.py:65
+msgid "Relevant days for substitution plans"
+msgstr ""
+
+#: aleksis/apps/chronos/preferences.py:82
+msgid "Time when substitution plans switch to the next day"
+msgstr ""
+
+#: aleksis/apps/chronos/preferences.py:91
+msgid "Number of days shown on substitutions print view"
+msgstr ""
+
+#: aleksis/apps/chronos/preferences.py:99
+msgid "Show header box in substitution views"
 msgstr ""
 
-#: aleksis/apps/chronos/tables.py:43
-msgid "Manage substitution"
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Show parent groups in header box in substitution views instead of original groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:25
-msgid "No teachers timetables available."
+#: aleksis/apps/chronos/preferences.py:118
+msgid "How many days in advance users should be notified about timetable changes?"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:39
-msgid "No group timetables available."
+#: aleksis/apps/chronos/preferences.py:126
+msgid "Time for sending notifications about timetable changes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:53
-msgid "No room timetables available."
+#: aleksis/apps/chronos/preferences.py:129
+msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:11
-msgid "Edit substitution."
+#: aleksis/apps/chronos/preferences.py:140
+#: aleksis/apps/chronos/preferences.py:148
+msgid "Send notifications for current timetable changes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:12
-msgid "Edit substitution"
+#: aleksis/apps/chronos/preferences.py:158
+msgid "Group types to show in timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:25
-msgid "Delete"
+#: aleksis/apps/chronos/preferences.py:159
+msgid "If you leave it empty, all groups will be shown."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:50
-msgid "SMART PLAN"
+#: aleksis/apps/chronos/preferences.py:169
+msgid "Lesson calendar feed color"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:22
-msgid "Show week timetable for"
+#: aleksis/apps/chronos/preferences.py:181
+msgid "Supervision calendar feed color"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
@@ -560,178 +536,123 @@ msgstr ""
 msgid "Affected groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/lesson.html:27
-msgid "Cancelled due to an event"
+#: aleksis/apps/chronos/templates/chronos/partials/subs/period.html:12
+msgid "all day"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
-msgid "Cancelled"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:6
-msgid "Cancelled for teachers"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
+msgid "Print: Substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/today.html:2
-msgid "Today"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
+msgid "Substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:14
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:25
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:36
-msgid "CW"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:27
+msgid "Time"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:49
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
 msgid "Notes"
 msgstr "Notes"
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:57
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
 msgid "No substitutions available."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
-msgid "Print: Substitutions"
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:2
+msgid "Areas"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:24
-#: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
-#: aleksis/apps/chronos/util/notifications.py:206
-msgid "Timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:29
-msgid "Group teachers:"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:55
-msgid "Show regular timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:63
-#: aleksis/apps/chronos/templates/chronos/timetable.html:84
-msgid "View class register of this week"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:76
-msgid "Show SMART PLAN"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/widget.html:8
-#, python-format
-msgid ""
-"\n"
-"        My timetable for %(day)s\n"
-"      "
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/widget.html:18
-msgid ""
-"\n"
-"          There is no timetable linked to your person.\n"
-"          "
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/widget.html:27
-msgid "Go to smart plan"
-msgstr ""
-
-#: aleksis/apps/chronos/util/notifications.py:50
+#: aleksis/apps/chronos/util/notifications.py:48
 #, python-brace-format
 msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:57
+#: aleksis/apps/chronos/util/notifications.py:55
 #, python-brace-format
 msgid "The {subject} lesson in the {period}. period on {day} has some current changes."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:66
+#: aleksis/apps/chronos/util/notifications.py:64
 #, python-brace-format
 msgid "The teacher {old} is substituted by {new}."
 msgid_plural "The teachers {old} are substituted by {new}."
 msgstr[0] ""
 msgstr[1] ""
 
-#: aleksis/apps/chronos/util/notifications.py:78
+#: aleksis/apps/chronos/util/notifications.py:76
 #, python-brace-format
 msgid "The subject is changed to {subject}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:84
+#: aleksis/apps/chronos/util/notifications.py:82
 #, python-brace-format
 msgid "The lesson is moved from {old} to {new}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:93
+#: aleksis/apps/chronos/util/notifications.py:91
 #, python-brace-format
 msgid "There is an additional comment: {comment}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:101
+#: aleksis/apps/chronos/util/notifications.py:99
 #, python-brace-format
 msgid "There is an event that starts on {date_start}, {period_from}. period and ends on {date_end}, {period_to}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:114
+#: aleksis/apps/chronos/util/notifications.py:112
 #, python-brace-format
 msgid "There is an event on {date} from the {period_from}. period to the {period_to}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:125
-#: aleksis/apps/chronos/util/notifications.py:145
+#: aleksis/apps/chronos/util/notifications.py:123
+#: aleksis/apps/chronos/util/notifications.py:143
 #, python-brace-format
 msgid "Groups: {groups}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:127
-#: aleksis/apps/chronos/util/notifications.py:149
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:147
 #, python-brace-format
 msgid "Teachers: {teachers}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:130
+#: aleksis/apps/chronos/util/notifications.py:128
 #, python-brace-format
 msgid "Rooms: {rooms}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:137
+#: aleksis/apps/chronos/util/notifications.py:135
 #, python-brace-format
 msgid "There is an extra lesson on {date} in the {period}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:147
+#: aleksis/apps/chronos/util/notifications.py:145
 #, fuzzy, python-brace-format
 #| msgid "Subject"
 msgid "Subject: {subject}"
 msgstr "Sujet"
 
-#: aleksis/apps/chronos/util/notifications.py:151
+#: aleksis/apps/chronos/util/notifications.py:149
 #, python-brace-format
 msgid "Room: {room}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:153
+#: aleksis/apps/chronos/util/notifications.py:151
 #, python-brace-format
 msgid "Comment: {comment}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:156
+#: aleksis/apps/chronos/util/notifications.py:154
 #, python-brace-format
 msgid "The supervision of {old} on {date} between the {period_from}. period and the {period_to}. period in the area {area} is substituted by {new}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:207
-msgid "There are current changes to your timetable."
-msgstr ""
-
-#: aleksis/apps/chronos/views.py:270
-msgid "The substitution has been saved."
+#: aleksis/apps/chronos/util/notifications.py:204
+msgid "Timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/views.py:291
-msgid "The substitution has been deleted."
+#: aleksis/apps/chronos/util/notifications.py:205
+msgid "There are current changes to your timetable."
 msgstr ""
diff --git a/aleksis/apps/chronos/locale/la/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/la/LC_MESSAGES/django.po
index 64f39ae10f914f1706a38e03dc6bf944a6f71d60..279ead538768dffda25f3cdb31fb9af609117621 100644
--- a/aleksis/apps/chronos/locale/la/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/locale/la/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-21 11:32+0200\n"
+"POT-Creation-Date: 2024-08-18 14:23+0200\n"
 "PO-Revision-Date: 2020-08-23 13:49+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis-app-chronos/la/>\n"
@@ -18,76 +18,38 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.1.1\n"
 
-#: aleksis/apps/chronos/form_extensions.py:7
-msgid "Options for timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/form_extensions.py:8
-msgid "Optional data for timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
-msgid "Timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:16
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:18
-msgid "My timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:27
-#: aleksis/apps/chronos/templates/chronos/all.html:11
-#: aleksis/apps/chronos/templates/chronos/all.html:12
-msgid "All timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:38
-msgid "Daily lessons"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:49
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:11
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:17
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
-msgid "Substitutions"
-msgstr ""
-
 #: aleksis/apps/chronos/mixins.py:25
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:142
-msgid "Show announcement in timetable views?"
-msgstr ""
-
-#: aleksis/apps/chronos/model_extensions.py:151
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:155
+#: aleksis/apps/chronos/model_extensions.py:149
 msgid "Can view person timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:86
+#: aleksis/apps/chronos/models.py:87
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
+#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:626
+#: aleksis/apps/chronos/models.py:1310
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
-#: aleksis/apps/chronos/models.py:827 aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:676
+#: aleksis/apps/chronos/models.py:747 aleksis/apps/chronos/models.py:979
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
-#: aleksis/apps/chronos/models.py:828 aleksis/apps/chronos/models.py:1062
+#: aleksis/apps/chronos/models.py:93 aleksis/apps/chronos/models.py:677
+#: aleksis/apps/chronos/models.py:748 aleksis/apps/chronos/models.py:980
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:111
+#: aleksis/apps/chronos/models.py:112
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
@@ -107,628 +69,583 @@ msgstr ""
 msgid "Validity ranges"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:150
+#: aleksis/apps/chronos/models.py:149
 msgid "Week day"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:152
+#: aleksis/apps/chronos/models.py:151
 msgid "Number of period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:153
 msgid "Start time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:155
+#: aleksis/apps/chronos/models.py:154
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
-#: aleksis/apps/chronos/models.py:1191
+#: aleksis/apps/chronos/models.py:324 aleksis/apps/chronos/models.py:496
+#: aleksis/apps/chronos/models.py:1122
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:339
+#: aleksis/apps/chronos/models.py:325
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:698 aleksis/apps/chronos/models.py:873
-#: aleksis/apps/chronos/models.py:895
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:625
+#: aleksis/apps/chronos/models.py:793 aleksis/apps/chronos/models.py:810
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
-#: aleksis/apps/chronos/models.py:874 aleksis/apps/chronos/models.py:896
+#: aleksis/apps/chronos/models.py:330 aleksis/apps/chronos/models.py:794
+#: aleksis/apps/chronos/models.py:811
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:332
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:347
+#: aleksis/apps/chronos/models.py:333
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:354 aleksis/apps/chronos/models.py:390
-#: aleksis/apps/chronos/models.py:446 aleksis/apps/chronos/models.py:1198
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:47
+#: aleksis/apps/chronos/models.py:340 aleksis/apps/chronos/models.py:349
+#: aleksis/apps/chronos/models.py:416 aleksis/apps/chronos/models.py:1129
+#: aleksis/apps/chronos/models.py:1345
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:2
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:355
+#: aleksis/apps/chronos/models.py:341
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:374
-msgid "Can view room timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:454
-#: aleksis/apps/chronos/models.py:533 aleksis/apps/chronos/models.py:751
-#: aleksis/apps/chronos/models.py:1213
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:48
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
-msgid "Room"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:377 aleksis/apps/chronos/models.py:1078
-#: aleksis/apps/chronos/templates/chronos/all.html:45
-msgid "Rooms"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:393 aleksis/apps/chronos/models.py:452
-#: aleksis/apps/chronos/models.py:1080 aleksis/apps/chronos/models.py:1206
-#: aleksis/apps/chronos/tables.py:35
-#: aleksis/apps/chronos/templates/chronos/all.html:17
+#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:422
+#: aleksis/apps/chronos/models.py:998 aleksis/apps/chronos/models.py:1137
+#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:3
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:1
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:399
+#: aleksis/apps/chronos/models.py:358
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1077
-#: aleksis/apps/chronos/models.py:1201 aleksis/apps/chronos/tables.py:34
-#: aleksis/apps/chronos/templates/chronos/all.html:31
+#: aleksis/apps/chronos/models.py:360 aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1132 aleksis/apps/chronos/models.py:1326
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:1
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:26
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
-#: aleksis/apps/chronos/models.py:795
+#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:490
+#: aleksis/apps/chronos/models.py:716 aleksis/apps/chronos/models.py:1430
+#: aleksis/apps/chronos/models.py:1454
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:425
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
+#: aleksis/apps/chronos/models.py:395 aleksis/apps/chronos/models.py:1306
 msgid "Lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1185
+#: aleksis/apps/chronos/models.py:403 aleksis/apps/chronos/models.py:1116
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1186
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:1117
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
+#: aleksis/apps/chronos/models.py:407 aleksis/apps/chronos/models.py:620
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:456
+#: aleksis/apps/chronos/models.py:425 aleksis/apps/chronos/models.py:504
+#: aleksis/apps/chronos/models.py:673 aleksis/apps/chronos/models.py:1144
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
+msgid "Room"
+msgstr ""
+
+#: aleksis/apps/chronos/models.py:428
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:458
+#: aleksis/apps/chronos/models.py:430
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
-#: aleksis/apps/chronos/models.py:813 aleksis/apps/chronos/models.py:1216
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:692
+#: aleksis/apps/chronos/models.py:734 aleksis/apps/chronos/models.py:1147
+#: aleksis/apps/chronos/models.py:1357
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:465
+#: aleksis/apps/chronos/models.py:437
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:506
+#: aleksis/apps/chronos/models.py:477
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:507
+#: aleksis/apps/chronos/models.py:478
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:655
+#: aleksis/apps/chronos/models.py:621
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:693
-msgid "Timetable widget"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:694
-msgid "Timetable widgets"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
+#: aleksis/apps/chronos/models.py:635 aleksis/apps/chronos/models.py:648
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:709
+#: aleksis/apps/chronos/models.py:636
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:735 aleksis/apps/chronos/models.py:974
-#: aleksis/apps/chronos/models.py:1025
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:46
+#: aleksis/apps/chronos/models.py:657 aleksis/apps/chronos/models.py:889
+#: aleksis/apps/chronos/models.py:943
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:743
+#: aleksis/apps/chronos/models.py:665
 msgid "Group"
 msgstr "Grex"
 
-#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
+#: aleksis/apps/chronos/models.py:681 aleksis/apps/chronos/models.py:723
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:808
+#: aleksis/apps/chronos/models.py:688 aleksis/apps/chronos/models.py:729
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:780
+#: aleksis/apps/chronos/models.py:702
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:786
+#: aleksis/apps/chronos/models.py:707
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:787
+#: aleksis/apps/chronos/models.py:708
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:798
+#: aleksis/apps/chronos/models.py:719
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:812 aleksis/apps/chronos/models.py:826
-#: aleksis/apps/chronos/models.py:1059
+#: aleksis/apps/chronos/models.py:733 aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:977
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:819
+#: aleksis/apps/chronos/models.py:739
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:820
+#: aleksis/apps/chronos/models.py:740
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:829
+#: aleksis/apps/chronos/models.py:749
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:868
+#: aleksis/apps/chronos/models.py:788
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:869
+#: aleksis/apps/chronos/models.py:789
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:883 aleksis/apps/chronos/models.py:964
+#: aleksis/apps/chronos/models.py:803 aleksis/apps/chronos/models.py:879
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:804
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:901
+#: aleksis/apps/chronos/models.py:816
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:909
+#: aleksis/apps/chronos/models.py:824
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:949 aleksis/apps/chronos/models.py:968
+#: aleksis/apps/chronos/models.py:864 aleksis/apps/chronos/models.py:883
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:950
+#: aleksis/apps/chronos/models.py:865
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1005 aleksis/apps/chronos/models.py:1018
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
-#: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
+#: aleksis/apps/chronos/models.py:923 aleksis/apps/chronos/models.py:936
+#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:3
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1006
+#: aleksis/apps/chronos/models.py:924 aleksis/apps/chronos/models.py:1622
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1014
+#: aleksis/apps/chronos/models.py:932
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1048
+#: aleksis/apps/chronos/models.py:966
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1049
+#: aleksis/apps/chronos/models.py:967
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1067
+#: aleksis/apps/chronos/models.py:985
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1073
+#: aleksis/apps/chronos/models.py:991
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:996 aleksis/apps/chronos/models.py:1332
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:4
+msgid "Rooms"
+msgstr ""
+
+#: aleksis/apps/chronos/models.py:1005
 #, python-brace-format
 msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1172
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
+#: aleksis/apps/chronos/models.py:1103
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1173
+#: aleksis/apps/chronos/models.py:1104
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1221
+#: aleksis/apps/chronos/models.py:1152
 msgid "Related exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1251
+#: aleksis/apps/chronos/models.py:1181
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1252
+#: aleksis/apps/chronos/models.py:1182
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1264
+#: aleksis/apps/chronos/models.py:1194
 msgid "Number of days shown in the plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1268
+#: aleksis/apps/chronos/models.py:1198
 msgid "Show header box"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1269 aleksis/apps/chronos/preferences.py:61
+#: aleksis/apps/chronos/models.py:1199 aleksis/apps/chronos/preferences.py:100
 msgid "The header box shows affected teachers/groups."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1276
+#: aleksis/apps/chronos/models.py:1206
 msgid "Revision which triggered the last update"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1337
+#: aleksis/apps/chronos/models.py:1278
 msgid "Automatic plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/models.py:1279
 msgid "Automatic plans"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1352
+#: aleksis/apps/chronos/models.py:1293
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/models.py:1294
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1354
+#: aleksis/apps/chronos/models.py:1295
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1355
+#: aleksis/apps/chronos/models.py:1296
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1356
+#: aleksis/apps/chronos/models.py:1297
 msgid "Can view all lessons per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:18
-msgid "Use parent groups in timetable views"
+#: aleksis/apps/chronos/models.py:1298
+msgid "Can view all supervisions per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:20
-msgid "If an lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
+#: aleksis/apps/chronos/models.py:1313
+msgid "Start slot number"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:31
-msgid "Shorten groups in timetable views"
+#: aleksis/apps/chronos/models.py:1316
+msgid "End slot number"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:32
-msgid "If there are more groups than the set limit, they will be collapsed."
+#: aleksis/apps/chronos/models.py:1320
+msgid "Course"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:40
-msgid "Limit of groups for shortening of groups"
+#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
+msgid "Cancelled"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:42
-msgid "If an user activates shortening of groups,they will be collapsed if there are more groups than this limit."
+#: aleksis/apps/chronos/models.py:1401 aleksis/apps/chronos/models.py:1413
+#: aleksis/apps/chronos/models.py:1425
+msgid "{} (instead of {})"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:52
-msgid "Number of days shown on substitutions print view"
+#: aleksis/apps/chronos/models.py:1614
+msgid "Lesson Event"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:60
-msgid "Show header box in substitution views"
+#: aleksis/apps/chronos/models.py:1615
+msgid "Lesson Events"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:70
-msgid "Show parent groups in header box in substitution views instead of original groups"
+#: aleksis/apps/chronos/models.py:1630
+msgid "Supervision: {}"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:79
-msgid "How many days in advance users should be notified about timetable changes?"
+#: aleksis/apps/chronos/preferences.py:21
+msgid "Timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:87
-msgid "Time for sending notifications about timetable changes"
+#: aleksis/apps/chronos/preferences.py:29
+msgid "Use parent groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:90
-msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
+#: aleksis/apps/chronos/preferences.py:31
+msgid "If a lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:101
-#: aleksis/apps/chronos/preferences.py:109
-msgid "Send notifications for current timetable changes"
+#: aleksis/apps/chronos/preferences.py:42
+msgid "Shorten groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/tables.py:41
-msgid "Substitution"
+#: aleksis/apps/chronos/preferences.py:43
+msgid "If there are more groups than the set limit, they will be collapsed."
 msgstr ""
 
-#: aleksis/apps/chronos/tables.py:43
-msgid "Manage substitution"
+#: aleksis/apps/chronos/preferences.py:51
+msgid "Limit of groups for shortening of groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:25
-msgid "No teachers timetables available."
+#: aleksis/apps/chronos/preferences.py:53
+msgid "If a user activates shortening of groups,they will be collapsed if there are more groups than this limit."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:39
-msgid "No group timetables available."
+#: aleksis/apps/chronos/preferences.py:65
+msgid "Relevant days for substitution plans"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:53
-msgid "No room timetables available."
+#: aleksis/apps/chronos/preferences.py:82
+msgid "Time when substitution plans switch to the next day"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:11
-msgid "Edit substitution."
+#: aleksis/apps/chronos/preferences.py:91
+msgid "Number of days shown on substitutions print view"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:12
-msgid "Edit substitution"
+#: aleksis/apps/chronos/preferences.py:99
+msgid "Show header box in substitution views"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:25
-msgid "Delete"
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Show parent groups in header box in substitution views instead of original groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:50
-msgid "SMART PLAN"
+#: aleksis/apps/chronos/preferences.py:118
+msgid "How many days in advance users should be notified about timetable changes?"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:22
-msgid "Show week timetable for"
+#: aleksis/apps/chronos/preferences.py:126
+msgid "Time for sending notifications about timetable changes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
-msgid "Absent teachers"
+#: aleksis/apps/chronos/preferences.py:129
+msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:22
-msgid "Absent groups"
+#: aleksis/apps/chronos/preferences.py:140
+#: aleksis/apps/chronos/preferences.py:148
+msgid "Send notifications for current timetable changes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:34
-msgid "Affected teachers"
+#: aleksis/apps/chronos/preferences.py:158
+msgid "Group types to show in timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:46
-msgid "Affected groups"
+#: aleksis/apps/chronos/preferences.py:159
+msgid "If you leave it empty, all groups will be shown."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/lesson.html:27
-msgid "Cancelled due to an event"
+#: aleksis/apps/chronos/preferences.py:169
+msgid "Lesson calendar feed color"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
-msgid "Cancelled"
+#: aleksis/apps/chronos/preferences.py:181
+msgid "Supervision calendar feed color"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:6
-msgid "Cancelled for teachers"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
+msgid "Absent teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/today.html:2
-msgid "Today"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:22
+msgid "Absent groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:14
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:25
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:36
-msgid "CW"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:34
+msgid "Affected teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:49
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
-msgid "Notes"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:46
+msgid "Affected groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:57
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
-msgid "No substitutions available."
+#: aleksis/apps/chronos/templates/chronos/partials/subs/period.html:12
+msgid "all day"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
 msgid "Print: Substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:24
-#: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
-#: aleksis/apps/chronos/util/notifications.py:206
-msgid "Timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:29
-msgid "Group teachers:"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:55
-msgid "Show regular timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:63
-#: aleksis/apps/chronos/templates/chronos/timetable.html:84
-msgid "View class register of this week"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
+msgid "Substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:76
-msgid "Show SMART PLAN"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:27
+msgid "Time"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:8
-#, python-format
-msgid ""
-"\n"
-"        My timetable for %(day)s\n"
-"      "
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
+msgid "Notes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:18
-msgid ""
-"\n"
-"          There is no timetable linked to your person.\n"
-"          "
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
+msgid "No substitutions available."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:27
-msgid "Go to smart plan"
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:2
+msgid "Areas"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:50
+#: aleksis/apps/chronos/util/notifications.py:48
 #, python-brace-format
 msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:57
+#: aleksis/apps/chronos/util/notifications.py:55
 #, python-brace-format
 msgid "The {subject} lesson in the {period}. period on {day} has some current changes."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:66
+#: aleksis/apps/chronos/util/notifications.py:64
 #, python-brace-format
 msgid "The teacher {old} is substituted by {new}."
 msgid_plural "The teachers {old} are substituted by {new}."
 msgstr[0] ""
 msgstr[1] ""
 
-#: aleksis/apps/chronos/util/notifications.py:78
+#: aleksis/apps/chronos/util/notifications.py:76
 #, python-brace-format
 msgid "The subject is changed to {subject}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:84
+#: aleksis/apps/chronos/util/notifications.py:82
 #, python-brace-format
 msgid "The lesson is moved from {old} to {new}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:93
+#: aleksis/apps/chronos/util/notifications.py:91
 #, python-brace-format
 msgid "There is an additional comment: {comment}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:101
+#: aleksis/apps/chronos/util/notifications.py:99
 #, python-brace-format
 msgid "There is an event that starts on {date_start}, {period_from}. period and ends on {date_end}, {period_to}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:114
+#: aleksis/apps/chronos/util/notifications.py:112
 #, python-brace-format
 msgid "There is an event on {date} from the {period_from}. period to the {period_to}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:125
-#: aleksis/apps/chronos/util/notifications.py:145
+#: aleksis/apps/chronos/util/notifications.py:123
+#: aleksis/apps/chronos/util/notifications.py:143
 #, python-brace-format
 msgid "Groups: {groups}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:127
-#: aleksis/apps/chronos/util/notifications.py:149
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:147
 #, python-brace-format
 msgid "Teachers: {teachers}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:130
+#: aleksis/apps/chronos/util/notifications.py:128
 #, python-brace-format
 msgid "Rooms: {rooms}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:137
+#: aleksis/apps/chronos/util/notifications.py:135
 #, python-brace-format
 msgid "There is an extra lesson on {date} in the {period}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:147
+#: aleksis/apps/chronos/util/notifications.py:145
 #, python-brace-format
 msgid "Subject: {subject}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:151
+#: aleksis/apps/chronos/util/notifications.py:149
 #, python-brace-format
 msgid "Room: {room}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:153
+#: aleksis/apps/chronos/util/notifications.py:151
 #, python-brace-format
 msgid "Comment: {comment}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:156
+#: aleksis/apps/chronos/util/notifications.py:154
 #, python-brace-format
 msgid "The supervision of {old} on {date} between the {period_from}. period and the {period_to}. period in the area {area} is substituted by {new}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:207
-msgid "There are current changes to your timetable."
-msgstr ""
-
-#: aleksis/apps/chronos/views.py:270
-msgid "The substitution has been saved."
+#: aleksis/apps/chronos/util/notifications.py:204
+msgid "Timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/views.py:291
-msgid "The substitution has been deleted."
+#: aleksis/apps/chronos/util/notifications.py:205
+msgid "There are current changes to your timetable."
 msgstr ""
diff --git a/aleksis/apps/chronos/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/nb_NO/LC_MESSAGES/django.po
index f4190ee2c3668ce8a8a236aa9dbb007292e467a9..cfc760f01b3206aaf7123340eccf529e9e4db354 100644
--- a/aleksis/apps/chronos/locale/nb_NO/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/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: 2022-06-21 11:32+0200\n"
+"POT-Creation-Date: 2024-08-18 14:23+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,76 +17,38 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: aleksis/apps/chronos/form_extensions.py:7
-msgid "Options for timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/form_extensions.py:8
-msgid "Optional data for timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
-msgid "Timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:16
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:18
-msgid "My timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:27
-#: aleksis/apps/chronos/templates/chronos/all.html:11
-#: aleksis/apps/chronos/templates/chronos/all.html:12
-msgid "All timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:38
-msgid "Daily lessons"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:49
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:11
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:17
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
-msgid "Substitutions"
-msgstr ""
-
 #: aleksis/apps/chronos/mixins.py:25
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:142
-msgid "Show announcement in timetable views?"
-msgstr ""
-
-#: aleksis/apps/chronos/model_extensions.py:151
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:155
+#: aleksis/apps/chronos/model_extensions.py:149
 msgid "Can view person timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:86
+#: aleksis/apps/chronos/models.py:87
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
+#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:626
+#: aleksis/apps/chronos/models.py:1310
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
-#: aleksis/apps/chronos/models.py:827 aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:676
+#: aleksis/apps/chronos/models.py:747 aleksis/apps/chronos/models.py:979
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
-#: aleksis/apps/chronos/models.py:828 aleksis/apps/chronos/models.py:1062
+#: aleksis/apps/chronos/models.py:93 aleksis/apps/chronos/models.py:677
+#: aleksis/apps/chronos/models.py:748 aleksis/apps/chronos/models.py:980
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:111
+#: aleksis/apps/chronos/models.py:112
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
@@ -106,628 +68,583 @@ msgstr ""
 msgid "Validity ranges"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:150
+#: aleksis/apps/chronos/models.py:149
 msgid "Week day"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:152
+#: aleksis/apps/chronos/models.py:151
 msgid "Number of period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:153
 msgid "Start time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:155
+#: aleksis/apps/chronos/models.py:154
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
-#: aleksis/apps/chronos/models.py:1191
+#: aleksis/apps/chronos/models.py:324 aleksis/apps/chronos/models.py:496
+#: aleksis/apps/chronos/models.py:1122
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:339
+#: aleksis/apps/chronos/models.py:325
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:698 aleksis/apps/chronos/models.py:873
-#: aleksis/apps/chronos/models.py:895
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:625
+#: aleksis/apps/chronos/models.py:793 aleksis/apps/chronos/models.py:810
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
-#: aleksis/apps/chronos/models.py:874 aleksis/apps/chronos/models.py:896
+#: aleksis/apps/chronos/models.py:330 aleksis/apps/chronos/models.py:794
+#: aleksis/apps/chronos/models.py:811
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:332
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:347
+#: aleksis/apps/chronos/models.py:333
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:354 aleksis/apps/chronos/models.py:390
-#: aleksis/apps/chronos/models.py:446 aleksis/apps/chronos/models.py:1198
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:47
+#: aleksis/apps/chronos/models.py:340 aleksis/apps/chronos/models.py:349
+#: aleksis/apps/chronos/models.py:416 aleksis/apps/chronos/models.py:1129
+#: aleksis/apps/chronos/models.py:1345
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:2
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:355
+#: aleksis/apps/chronos/models.py:341
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:374
-msgid "Can view room timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:454
-#: aleksis/apps/chronos/models.py:533 aleksis/apps/chronos/models.py:751
-#: aleksis/apps/chronos/models.py:1213
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:48
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
-msgid "Room"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:377 aleksis/apps/chronos/models.py:1078
-#: aleksis/apps/chronos/templates/chronos/all.html:45
-msgid "Rooms"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:393 aleksis/apps/chronos/models.py:452
-#: aleksis/apps/chronos/models.py:1080 aleksis/apps/chronos/models.py:1206
-#: aleksis/apps/chronos/tables.py:35
-#: aleksis/apps/chronos/templates/chronos/all.html:17
+#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:422
+#: aleksis/apps/chronos/models.py:998 aleksis/apps/chronos/models.py:1137
+#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:3
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:1
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:399
+#: aleksis/apps/chronos/models.py:358
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1077
-#: aleksis/apps/chronos/models.py:1201 aleksis/apps/chronos/tables.py:34
-#: aleksis/apps/chronos/templates/chronos/all.html:31
+#: aleksis/apps/chronos/models.py:360 aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1132 aleksis/apps/chronos/models.py:1326
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:1
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:26
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
-#: aleksis/apps/chronos/models.py:795
+#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:490
+#: aleksis/apps/chronos/models.py:716 aleksis/apps/chronos/models.py:1430
+#: aleksis/apps/chronos/models.py:1454
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:425
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
+#: aleksis/apps/chronos/models.py:395 aleksis/apps/chronos/models.py:1306
 msgid "Lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1185
+#: aleksis/apps/chronos/models.py:403 aleksis/apps/chronos/models.py:1116
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1186
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:1117
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
+#: aleksis/apps/chronos/models.py:407 aleksis/apps/chronos/models.py:620
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:456
+#: aleksis/apps/chronos/models.py:425 aleksis/apps/chronos/models.py:504
+#: aleksis/apps/chronos/models.py:673 aleksis/apps/chronos/models.py:1144
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
+msgid "Room"
+msgstr ""
+
+#: aleksis/apps/chronos/models.py:428
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:458
+#: aleksis/apps/chronos/models.py:430
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
-#: aleksis/apps/chronos/models.py:813 aleksis/apps/chronos/models.py:1216
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:692
+#: aleksis/apps/chronos/models.py:734 aleksis/apps/chronos/models.py:1147
+#: aleksis/apps/chronos/models.py:1357
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:465
+#: aleksis/apps/chronos/models.py:437
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:506
+#: aleksis/apps/chronos/models.py:477
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:507
+#: aleksis/apps/chronos/models.py:478
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:655
+#: aleksis/apps/chronos/models.py:621
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:693
-msgid "Timetable widget"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:694
-msgid "Timetable widgets"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
+#: aleksis/apps/chronos/models.py:635 aleksis/apps/chronos/models.py:648
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:709
+#: aleksis/apps/chronos/models.py:636
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:735 aleksis/apps/chronos/models.py:974
-#: aleksis/apps/chronos/models.py:1025
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:46
+#: aleksis/apps/chronos/models.py:657 aleksis/apps/chronos/models.py:889
+#: aleksis/apps/chronos/models.py:943
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:743
+#: aleksis/apps/chronos/models.py:665
 msgid "Group"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
+#: aleksis/apps/chronos/models.py:681 aleksis/apps/chronos/models.py:723
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:808
+#: aleksis/apps/chronos/models.py:688 aleksis/apps/chronos/models.py:729
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:780
+#: aleksis/apps/chronos/models.py:702
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:786
+#: aleksis/apps/chronos/models.py:707
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:787
+#: aleksis/apps/chronos/models.py:708
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:798
+#: aleksis/apps/chronos/models.py:719
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:812 aleksis/apps/chronos/models.py:826
-#: aleksis/apps/chronos/models.py:1059
+#: aleksis/apps/chronos/models.py:733 aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:977
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:819
+#: aleksis/apps/chronos/models.py:739
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:820
+#: aleksis/apps/chronos/models.py:740
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:829
+#: aleksis/apps/chronos/models.py:749
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:868
+#: aleksis/apps/chronos/models.py:788
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:869
+#: aleksis/apps/chronos/models.py:789
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:883 aleksis/apps/chronos/models.py:964
+#: aleksis/apps/chronos/models.py:803 aleksis/apps/chronos/models.py:879
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:804
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:901
+#: aleksis/apps/chronos/models.py:816
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:909
+#: aleksis/apps/chronos/models.py:824
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:949 aleksis/apps/chronos/models.py:968
+#: aleksis/apps/chronos/models.py:864 aleksis/apps/chronos/models.py:883
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:950
+#: aleksis/apps/chronos/models.py:865
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1005 aleksis/apps/chronos/models.py:1018
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
-#: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
+#: aleksis/apps/chronos/models.py:923 aleksis/apps/chronos/models.py:936
+#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:3
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1006
+#: aleksis/apps/chronos/models.py:924 aleksis/apps/chronos/models.py:1622
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1014
+#: aleksis/apps/chronos/models.py:932
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1048
+#: aleksis/apps/chronos/models.py:966
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1049
+#: aleksis/apps/chronos/models.py:967
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1067
+#: aleksis/apps/chronos/models.py:985
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1073
+#: aleksis/apps/chronos/models.py:991
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:996 aleksis/apps/chronos/models.py:1332
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:4
+msgid "Rooms"
+msgstr ""
+
+#: aleksis/apps/chronos/models.py:1005
 #, python-brace-format
 msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1172
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
+#: aleksis/apps/chronos/models.py:1103
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1173
+#: aleksis/apps/chronos/models.py:1104
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1221
+#: aleksis/apps/chronos/models.py:1152
 msgid "Related exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1251
+#: aleksis/apps/chronos/models.py:1181
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1252
+#: aleksis/apps/chronos/models.py:1182
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1264
+#: aleksis/apps/chronos/models.py:1194
 msgid "Number of days shown in the plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1268
+#: aleksis/apps/chronos/models.py:1198
 msgid "Show header box"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1269 aleksis/apps/chronos/preferences.py:61
+#: aleksis/apps/chronos/models.py:1199 aleksis/apps/chronos/preferences.py:100
 msgid "The header box shows affected teachers/groups."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1276
+#: aleksis/apps/chronos/models.py:1206
 msgid "Revision which triggered the last update"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1337
+#: aleksis/apps/chronos/models.py:1278
 msgid "Automatic plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/models.py:1279
 msgid "Automatic plans"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1352
+#: aleksis/apps/chronos/models.py:1293
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/models.py:1294
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1354
+#: aleksis/apps/chronos/models.py:1295
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1355
+#: aleksis/apps/chronos/models.py:1296
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1356
+#: aleksis/apps/chronos/models.py:1297
 msgid "Can view all lessons per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:18
-msgid "Use parent groups in timetable views"
+#: aleksis/apps/chronos/models.py:1298
+msgid "Can view all supervisions per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:20
-msgid "If an lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
+#: aleksis/apps/chronos/models.py:1313
+msgid "Start slot number"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:31
-msgid "Shorten groups in timetable views"
+#: aleksis/apps/chronos/models.py:1316
+msgid "End slot number"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:32
-msgid "If there are more groups than the set limit, they will be collapsed."
+#: aleksis/apps/chronos/models.py:1320
+msgid "Course"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:40
-msgid "Limit of groups for shortening of groups"
+#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
+msgid "Cancelled"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:42
-msgid "If an user activates shortening of groups,they will be collapsed if there are more groups than this limit."
+#: aleksis/apps/chronos/models.py:1401 aleksis/apps/chronos/models.py:1413
+#: aleksis/apps/chronos/models.py:1425
+msgid "{} (instead of {})"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:52
-msgid "Number of days shown on substitutions print view"
+#: aleksis/apps/chronos/models.py:1614
+msgid "Lesson Event"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:60
-msgid "Show header box in substitution views"
+#: aleksis/apps/chronos/models.py:1615
+msgid "Lesson Events"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:70
-msgid "Show parent groups in header box in substitution views instead of original groups"
+#: aleksis/apps/chronos/models.py:1630
+msgid "Supervision: {}"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:79
-msgid "How many days in advance users should be notified about timetable changes?"
+#: aleksis/apps/chronos/preferences.py:21
+msgid "Timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:87
-msgid "Time for sending notifications about timetable changes"
+#: aleksis/apps/chronos/preferences.py:29
+msgid "Use parent groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:90
-msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
+#: aleksis/apps/chronos/preferences.py:31
+msgid "If a lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:101
-#: aleksis/apps/chronos/preferences.py:109
-msgid "Send notifications for current timetable changes"
+#: aleksis/apps/chronos/preferences.py:42
+msgid "Shorten groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/tables.py:41
-msgid "Substitution"
+#: aleksis/apps/chronos/preferences.py:43
+msgid "If there are more groups than the set limit, they will be collapsed."
 msgstr ""
 
-#: aleksis/apps/chronos/tables.py:43
-msgid "Manage substitution"
+#: aleksis/apps/chronos/preferences.py:51
+msgid "Limit of groups for shortening of groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:25
-msgid "No teachers timetables available."
+#: aleksis/apps/chronos/preferences.py:53
+msgid "If a user activates shortening of groups,they will be collapsed if there are more groups than this limit."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:39
-msgid "No group timetables available."
+#: aleksis/apps/chronos/preferences.py:65
+msgid "Relevant days for substitution plans"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:53
-msgid "No room timetables available."
+#: aleksis/apps/chronos/preferences.py:82
+msgid "Time when substitution plans switch to the next day"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:11
-msgid "Edit substitution."
+#: aleksis/apps/chronos/preferences.py:91
+msgid "Number of days shown on substitutions print view"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:12
-msgid "Edit substitution"
+#: aleksis/apps/chronos/preferences.py:99
+msgid "Show header box in substitution views"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:25
-msgid "Delete"
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Show parent groups in header box in substitution views instead of original groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:50
-msgid "SMART PLAN"
+#: aleksis/apps/chronos/preferences.py:118
+msgid "How many days in advance users should be notified about timetable changes?"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:22
-msgid "Show week timetable for"
+#: aleksis/apps/chronos/preferences.py:126
+msgid "Time for sending notifications about timetable changes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
-msgid "Absent teachers"
+#: aleksis/apps/chronos/preferences.py:129
+msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:22
-msgid "Absent groups"
+#: aleksis/apps/chronos/preferences.py:140
+#: aleksis/apps/chronos/preferences.py:148
+msgid "Send notifications for current timetable changes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:34
-msgid "Affected teachers"
+#: aleksis/apps/chronos/preferences.py:158
+msgid "Group types to show in timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:46
-msgid "Affected groups"
+#: aleksis/apps/chronos/preferences.py:159
+msgid "If you leave it empty, all groups will be shown."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/lesson.html:27
-msgid "Cancelled due to an event"
+#: aleksis/apps/chronos/preferences.py:169
+msgid "Lesson calendar feed color"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
-msgid "Cancelled"
+#: aleksis/apps/chronos/preferences.py:181
+msgid "Supervision calendar feed color"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:6
-msgid "Cancelled for teachers"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
+msgid "Absent teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/today.html:2
-msgid "Today"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:22
+msgid "Absent groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:14
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:25
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:36
-msgid "CW"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:34
+msgid "Affected teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:49
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
-msgid "Notes"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:46
+msgid "Affected groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:57
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
-msgid "No substitutions available."
+#: aleksis/apps/chronos/templates/chronos/partials/subs/period.html:12
+msgid "all day"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
 msgid "Print: Substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:24
-#: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
-#: aleksis/apps/chronos/util/notifications.py:206
-msgid "Timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:29
-msgid "Group teachers:"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:55
-msgid "Show regular timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:63
-#: aleksis/apps/chronos/templates/chronos/timetable.html:84
-msgid "View class register of this week"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
+msgid "Substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:76
-msgid "Show SMART PLAN"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:27
+msgid "Time"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:8
-#, python-format
-msgid ""
-"\n"
-"        My timetable for %(day)s\n"
-"      "
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
+msgid "Notes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:18
-msgid ""
-"\n"
-"          There is no timetable linked to your person.\n"
-"          "
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
+msgid "No substitutions available."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:27
-msgid "Go to smart plan"
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:2
+msgid "Areas"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:50
+#: aleksis/apps/chronos/util/notifications.py:48
 #, python-brace-format
 msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:57
+#: aleksis/apps/chronos/util/notifications.py:55
 #, python-brace-format
 msgid "The {subject} lesson in the {period}. period on {day} has some current changes."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:66
+#: aleksis/apps/chronos/util/notifications.py:64
 #, python-brace-format
 msgid "The teacher {old} is substituted by {new}."
 msgid_plural "The teachers {old} are substituted by {new}."
 msgstr[0] ""
 msgstr[1] ""
 
-#: aleksis/apps/chronos/util/notifications.py:78
+#: aleksis/apps/chronos/util/notifications.py:76
 #, python-brace-format
 msgid "The subject is changed to {subject}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:84
+#: aleksis/apps/chronos/util/notifications.py:82
 #, python-brace-format
 msgid "The lesson is moved from {old} to {new}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:93
+#: aleksis/apps/chronos/util/notifications.py:91
 #, python-brace-format
 msgid "There is an additional comment: {comment}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:101
+#: aleksis/apps/chronos/util/notifications.py:99
 #, python-brace-format
 msgid "There is an event that starts on {date_start}, {period_from}. period and ends on {date_end}, {period_to}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:114
+#: aleksis/apps/chronos/util/notifications.py:112
 #, python-brace-format
 msgid "There is an event on {date} from the {period_from}. period to the {period_to}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:125
-#: aleksis/apps/chronos/util/notifications.py:145
+#: aleksis/apps/chronos/util/notifications.py:123
+#: aleksis/apps/chronos/util/notifications.py:143
 #, python-brace-format
 msgid "Groups: {groups}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:127
-#: aleksis/apps/chronos/util/notifications.py:149
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:147
 #, python-brace-format
 msgid "Teachers: {teachers}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:130
+#: aleksis/apps/chronos/util/notifications.py:128
 #, python-brace-format
 msgid "Rooms: {rooms}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:137
+#: aleksis/apps/chronos/util/notifications.py:135
 #, python-brace-format
 msgid "There is an extra lesson on {date} in the {period}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:147
+#: aleksis/apps/chronos/util/notifications.py:145
 #, python-brace-format
 msgid "Subject: {subject}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:151
+#: aleksis/apps/chronos/util/notifications.py:149
 #, python-brace-format
 msgid "Room: {room}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:153
+#: aleksis/apps/chronos/util/notifications.py:151
 #, python-brace-format
 msgid "Comment: {comment}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:156
+#: aleksis/apps/chronos/util/notifications.py:154
 #, python-brace-format
 msgid "The supervision of {old} on {date} between the {period_from}. period and the {period_to}. period in the area {area} is substituted by {new}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:207
-msgid "There are current changes to your timetable."
-msgstr ""
-
-#: aleksis/apps/chronos/views.py:270
-msgid "The substitution has been saved."
+#: aleksis/apps/chronos/util/notifications.py:204
+msgid "Timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/views.py:291
-msgid "The substitution has been deleted."
+#: aleksis/apps/chronos/util/notifications.py:205
+msgid "There are current changes to your timetable."
 msgstr ""
diff --git a/aleksis/apps/chronos/locale/ru/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/ru/LC_MESSAGES/django.po
index 2e3d3057579d8be2e8deb28753aa9446c82ca06e..1b0a45605bebc00ee478a4bec86722a8d2d2e4d2 100644
--- a/aleksis/apps/chronos/locale/ru/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/locale/ru/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-21 11:32+0200\n"
+"POT-Creation-Date: 2024-08-18 14:23+0200\n"
 "PO-Revision-Date: 2023-05-26 04:38+0000\n"
 "Last-Translator: Serhii Horichenko <m@sgg.im>\n"
 "Language-Team: Russian <https://translate.edugit.org/projects/aleksis/aleksis-app-chronos/ru/>\n"
@@ -18,76 +18,38 @@ msgstr ""
 "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
 "X-Generator: Weblate 4.12.1\n"
 
-#: aleksis/apps/chronos/form_extensions.py:7
-msgid "Options for timetables"
-msgstr "Опции для расписания"
-
-#: aleksis/apps/chronos/form_extensions.py:8
-msgid "Optional data for timetables"
-msgstr "Опциональные данные для расписания"
-
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
-msgid "Timetables"
-msgstr "Расписания"
-
-#: aleksis/apps/chronos/menus.py:16
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:18
-msgid "My timetable"
-msgstr "Моё расписание"
-
-#: aleksis/apps/chronos/menus.py:27
-#: aleksis/apps/chronos/templates/chronos/all.html:11
-#: aleksis/apps/chronos/templates/chronos/all.html:12
-msgid "All timetables"
-msgstr "Все расписания"
-
-#: aleksis/apps/chronos/menus.py:38
-msgid "Daily lessons"
-msgstr "Ежедневные уроки"
-
-#: aleksis/apps/chronos/menus.py:49
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:11
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:17
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
-msgid "Substitutions"
-msgstr "Замены"
-
 #: aleksis/apps/chronos/mixins.py:25
 msgid "Linked validity range"
 msgstr "Связанный диапазон"
 
-#: aleksis/apps/chronos/model_extensions.py:142
-msgid "Show announcement in timetable views?"
-msgstr "Показывать объявление при просмотре расписания?"
-
-#: aleksis/apps/chronos/model_extensions.py:151
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr "Может просматривать групповые расписания"
 
-#: aleksis/apps/chronos/model_extensions.py:155
+#: aleksis/apps/chronos/model_extensions.py:149
 msgid "Can view person timetable"
 msgstr "Может просматривать личные расписания"
 
-#: aleksis/apps/chronos/models.py:86
+#: aleksis/apps/chronos/models.py:87
 msgid "School term"
 msgstr "Учебный год"
 
-#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
+#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:626
+#: aleksis/apps/chronos/models.py:1310
 msgid "Name"
 msgstr "Полное имя"
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
-#: aleksis/apps/chronos/models.py:829 aleksis/apps/chronos/models.py:1063
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:676
+#: aleksis/apps/chronos/models.py:747 aleksis/apps/chronos/models.py:979
 msgid "Start date"
 msgstr "Дата начала"
 
-#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
-#: aleksis/apps/chronos/models.py:830 aleksis/apps/chronos/models.py:1064
+#: aleksis/apps/chronos/models.py:93 aleksis/apps/chronos/models.py:677
+#: aleksis/apps/chronos/models.py:748 aleksis/apps/chronos/models.py:980
 msgid "End date"
 msgstr "Дата окончания"
 
-#: aleksis/apps/chronos/models.py:111
+#: aleksis/apps/chronos/models.py:112
 msgid "The start date must be earlier than the end date."
 msgstr "Дата начала должна быть ранее даты окончания."
 
@@ -107,461 +69,472 @@ msgstr "Контрольный период"
 msgid "Validity ranges"
 msgstr "Контрольные периоды"
 
-#: aleksis/apps/chronos/models.py:150
+#: aleksis/apps/chronos/models.py:149
 msgid "Week day"
 msgstr "День недели"
 
-#: aleksis/apps/chronos/models.py:152
+#: aleksis/apps/chronos/models.py:151
 msgid "Number of period"
 msgstr "Номер урока"
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:153
 msgid "Start time"
 msgstr "Время начала"
 
-#: aleksis/apps/chronos/models.py:155
+#: aleksis/apps/chronos/models.py:154
 msgid "End time"
 msgstr "Время окончания"
 
-#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
-#: aleksis/apps/chronos/models.py:1193
+#: aleksis/apps/chronos/models.py:324 aleksis/apps/chronos/models.py:496
+#: aleksis/apps/chronos/models.py:1122
 msgid "Time period"
 msgstr "Время урока"
 
-#: aleksis/apps/chronos/models.py:339
+#: aleksis/apps/chronos/models.py:325
 msgid "Time periods"
 msgstr "Время уроков"
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:698 aleksis/apps/chronos/models.py:875
-#: aleksis/apps/chronos/models.py:897
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:625
+#: aleksis/apps/chronos/models.py:793 aleksis/apps/chronos/models.py:810
 msgid "Short name"
 msgstr "Короткое имя"
 
-#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
-#: aleksis/apps/chronos/models.py:876 aleksis/apps/chronos/models.py:898
+#: aleksis/apps/chronos/models.py:330 aleksis/apps/chronos/models.py:794
+#: aleksis/apps/chronos/models.py:811
 msgid "Long name"
 msgstr "Длинное имя"
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:332
 msgid "Foreground colour"
 msgstr "Основной цвет"
 
-#: aleksis/apps/chronos/models.py:347
+#: aleksis/apps/chronos/models.py:333
 msgid "Background colour"
 msgstr "Фоновый цвет"
 
-#: aleksis/apps/chronos/models.py:354 aleksis/apps/chronos/models.py:390
-#: aleksis/apps/chronos/models.py:446 aleksis/apps/chronos/models.py:1200
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:47
+#: aleksis/apps/chronos/models.py:340 aleksis/apps/chronos/models.py:349
+#: aleksis/apps/chronos/models.py:416 aleksis/apps/chronos/models.py:1129
+#: aleksis/apps/chronos/models.py:1345
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:2
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr "Предмет"
 
-#: aleksis/apps/chronos/models.py:355
+#: aleksis/apps/chronos/models.py:341
 msgid "Subjects"
 msgstr "Предметы"
 
-#: aleksis/apps/chronos/models.py:374
-msgid "Can view room timetable"
-msgstr "Может просмативать расписание комнаты"
-
-#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:454
-#: aleksis/apps/chronos/models.py:533 aleksis/apps/chronos/models.py:751
-#: aleksis/apps/chronos/models.py:1215
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:48
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
-msgid "Room"
-msgstr "Комната"
-
-#: aleksis/apps/chronos/models.py:377 aleksis/apps/chronos/models.py:1080
-#: aleksis/apps/chronos/templates/chronos/all.html:45
-msgid "Rooms"
-msgstr "Комнаты"
-
-#: aleksis/apps/chronos/models.py:393 aleksis/apps/chronos/models.py:452
-#: aleksis/apps/chronos/models.py:1082 aleksis/apps/chronos/models.py:1208
-#: aleksis/apps/chronos/tables.py:35
-#: aleksis/apps/chronos/templates/chronos/all.html:17
+#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:422
+#: aleksis/apps/chronos/models.py:998 aleksis/apps/chronos/models.py:1137
+#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:3
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:1
 msgid "Teachers"
 msgstr "Преподаватели"
 
-#: aleksis/apps/chronos/models.py:399
+#: aleksis/apps/chronos/models.py:358
 msgid "Periods"
 msgstr "Часы"
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1079
-#: aleksis/apps/chronos/models.py:1203 aleksis/apps/chronos/tables.py:34
-#: aleksis/apps/chronos/templates/chronos/all.html:31
+#: aleksis/apps/chronos/models.py:360 aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1132 aleksis/apps/chronos/models.py:1326
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:1
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:26
 msgid "Groups"
 msgstr "Группы"
 
-#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
-#: aleksis/apps/chronos/models.py:795
+#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:490
+#: aleksis/apps/chronos/models.py:716 aleksis/apps/chronos/models.py:1430
+#: aleksis/apps/chronos/models.py:1454
 msgid "Lesson"
 msgstr "Урок"
 
-#: aleksis/apps/chronos/models.py:425
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
+#: aleksis/apps/chronos/models.py:395 aleksis/apps/chronos/models.py:1306
 msgid "Lessons"
 msgstr "Уроки"
 
-#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1187
+#: aleksis/apps/chronos/models.py:403 aleksis/apps/chronos/models.py:1116
 msgid "Week"
 msgstr "Неделя"
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1188
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:1117
 msgid "Year"
 msgstr "Год"
 
-#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
+#: aleksis/apps/chronos/models.py:407 aleksis/apps/chronos/models.py:620
 msgid "Lesson period"
 msgstr "Урок по порядку"
 
-#: aleksis/apps/chronos/models.py:456
+#: aleksis/apps/chronos/models.py:425 aleksis/apps/chronos/models.py:504
+#: aleksis/apps/chronos/models.py:673 aleksis/apps/chronos/models.py:1144
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
+msgid "Room"
+msgstr "Комната"
+
+#: aleksis/apps/chronos/models.py:428
 msgid "Cancelled?"
 msgstr "Отменено?"
 
-#: aleksis/apps/chronos/models.py:458
+#: aleksis/apps/chronos/models.py:430
 msgid "Cancelled for teachers?"
 msgstr "Отменено для преподавателей?"
 
-#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
-#: aleksis/apps/chronos/models.py:815 aleksis/apps/chronos/models.py:1218
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:692
+#: aleksis/apps/chronos/models.py:734 aleksis/apps/chronos/models.py:1147
+#: aleksis/apps/chronos/models.py:1357
 msgid "Comment"
 msgstr "Коментарий"
 
-#: aleksis/apps/chronos/models.py:465
+#: aleksis/apps/chronos/models.py:437
 msgid "Lessons can only be either substituted or cancelled."
 msgstr "Уроки могут быть только заменены или отменены."
 
-#: aleksis/apps/chronos/models.py:506
+#: aleksis/apps/chronos/models.py:477
 msgid "Lesson substitution"
 msgstr "Замена урока"
 
-#: aleksis/apps/chronos/models.py:507
+#: aleksis/apps/chronos/models.py:478
 msgid "Lesson substitutions"
 msgstr "Замены уроков"
 
-#: aleksis/apps/chronos/models.py:655
+#: aleksis/apps/chronos/models.py:621
 msgid "Lesson periods"
 msgstr "Учебные часы"
 
-#: aleksis/apps/chronos/models.py:693
-msgid "Timetable widget"
-msgstr "Виджет расписания"
-
-#: aleksis/apps/chronos/models.py:694
-msgid "Timetable widgets"
-msgstr "Виджеты расписания"
-
-#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
+#: aleksis/apps/chronos/models.py:635 aleksis/apps/chronos/models.py:648
 msgid "Absence reason"
 msgstr "Причина отсутствия"
 
-#: aleksis/apps/chronos/models.py:709
+#: aleksis/apps/chronos/models.py:636
 msgid "Absence reasons"
 msgstr "Причины отсутствия"
 
-#: aleksis/apps/chronos/models.py:735 aleksis/apps/chronos/models.py:976
-#: aleksis/apps/chronos/models.py:1027
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:46
+#: aleksis/apps/chronos/models.py:657 aleksis/apps/chronos/models.py:889
+#: aleksis/apps/chronos/models.py:943
 msgid "Teacher"
 msgstr "Преподаватель"
 
-#: aleksis/apps/chronos/models.py:743
+#: aleksis/apps/chronos/models.py:665
 msgid "Group"
 msgstr "Группа"
 
-#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
+#: aleksis/apps/chronos/models.py:681 aleksis/apps/chronos/models.py:723
 msgid "Start period"
 msgstr "Начало уроков"
 
-#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:809
+#: aleksis/apps/chronos/models.py:688 aleksis/apps/chronos/models.py:729
 msgid "End period"
 msgstr "Окончание уроков"
 
-#: aleksis/apps/chronos/models.py:780
+#: aleksis/apps/chronos/models.py:702
 msgid "Unknown absence"
 msgstr "Отсутствие без уважительной причины"
 
-#: aleksis/apps/chronos/models.py:786
+#: aleksis/apps/chronos/models.py:707
 msgid "Absence"
 msgstr "Отсутствие"
 
-#: aleksis/apps/chronos/models.py:787
+#: aleksis/apps/chronos/models.py:708
 msgid "Absences"
 msgstr "Пропуски"
 
-#: aleksis/apps/chronos/models.py:798
+#: aleksis/apps/chronos/models.py:719
 msgid "Date of exam"
 msgstr "Дата экзамена"
 
-#: aleksis/apps/chronos/models.py:814 aleksis/apps/chronos/models.py:828
-#: aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:733 aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:977
 msgid "Title"
 msgstr "Название"
 
-#: aleksis/apps/chronos/models.py:821
+#: aleksis/apps/chronos/models.py:739
 msgid "Exam"
 msgstr "Экзамен"
 
-#: aleksis/apps/chronos/models.py:822
+#: aleksis/apps/chronos/models.py:740
 msgid "Exams"
 msgstr "Экзамены"
 
-#: aleksis/apps/chronos/models.py:831
+#: aleksis/apps/chronos/models.py:749
 msgid "Comments"
 msgstr "Комментарии"
 
-#: aleksis/apps/chronos/models.py:870
+#: aleksis/apps/chronos/models.py:788
 msgid "Holiday"
 msgstr "Выходной"
 
-#: aleksis/apps/chronos/models.py:871
+#: aleksis/apps/chronos/models.py:789
 msgid "Holidays"
 msgstr "Выходные"
 
-#: aleksis/apps/chronos/models.py:885 aleksis/apps/chronos/models.py:966
+#: aleksis/apps/chronos/models.py:803 aleksis/apps/chronos/models.py:879
 msgid "Supervision area"
 msgstr "Зона контроля"
 
-#: aleksis/apps/chronos/models.py:886
+#: aleksis/apps/chronos/models.py:804
 msgid "Supervision areas"
 msgstr "Зоны контроля"
 
-#: aleksis/apps/chronos/models.py:903
+#: aleksis/apps/chronos/models.py:816
 msgid "Time period after break starts"
 msgstr "Учёба после перерыва начинается"
 
-#: aleksis/apps/chronos/models.py:911
+#: aleksis/apps/chronos/models.py:824
 msgid "Time period before break ends"
 msgstr "Учёба перед перерывом заканчивается"
 
-#: aleksis/apps/chronos/models.py:951 aleksis/apps/chronos/models.py:970
+#: aleksis/apps/chronos/models.py:864 aleksis/apps/chronos/models.py:883
 msgid "Break"
 msgstr "Перерыв"
 
-#: aleksis/apps/chronos/models.py:952
+#: aleksis/apps/chronos/models.py:865
 msgid "Breaks"
 msgstr "Перерывы"
 
-#: aleksis/apps/chronos/models.py:1007 aleksis/apps/chronos/models.py:1020
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
-#: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
+#: aleksis/apps/chronos/models.py:923 aleksis/apps/chronos/models.py:936
+#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:3
 msgid "Supervision"
 msgstr "Контроль"
 
-#: aleksis/apps/chronos/models.py:1008
+#: aleksis/apps/chronos/models.py:924 aleksis/apps/chronos/models.py:1622
 msgid "Supervisions"
 msgstr "Контроли"
 
-#: aleksis/apps/chronos/models.py:1016
+#: aleksis/apps/chronos/models.py:932
 msgid "Date"
 msgstr "Дата"
 
-#: aleksis/apps/chronos/models.py:1050
+#: aleksis/apps/chronos/models.py:966
 msgid "Supervision substitution"
 msgstr "Замена контроля"
 
-#: aleksis/apps/chronos/models.py:1051
+#: aleksis/apps/chronos/models.py:967
 msgid "Supervision substitutions"
 msgstr "Замены контроля"
 
-#: aleksis/apps/chronos/models.py:1069
+#: aleksis/apps/chronos/models.py:985
 msgid "Start time period"
 msgstr "Начало урока"
 
-#: aleksis/apps/chronos/models.py:1075
+#: aleksis/apps/chronos/models.py:991
 msgid "End time period"
 msgstr "Конец урока"
 
-#: aleksis/apps/chronos/models.py:1089
+#: aleksis/apps/chronos/models.py:996 aleksis/apps/chronos/models.py:1332
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:4
+msgid "Rooms"
+msgstr "Комнаты"
+
+#: aleksis/apps/chronos/models.py:1005
 #, python-brace-format
 msgid "Event {pk}"
 msgstr "Событие {pk}"
 
-#: aleksis/apps/chronos/models.py:1174
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
+#: aleksis/apps/chronos/models.py:1103
 msgid "Event"
 msgstr "Событие"
 
-#: aleksis/apps/chronos/models.py:1175
+#: aleksis/apps/chronos/models.py:1104
 msgid "Events"
 msgstr "События"
 
-#: aleksis/apps/chronos/models.py:1221
+#: aleksis/apps/chronos/models.py:1152
 msgid "Related exam"
 msgstr "Связанные экзамены"
 
-#: aleksis/apps/chronos/models.py:1244
+#: aleksis/apps/chronos/models.py:1181
 msgid "Extra lesson"
 msgstr "Дополнительный урок"
 
-#: aleksis/apps/chronos/models.py:1245
+#: aleksis/apps/chronos/models.py:1182
 msgid "Extra lessons"
 msgstr "Дополнительные уроки"
 
-#: aleksis/apps/chronos/models.py:1257
+#: aleksis/apps/chronos/models.py:1194
 msgid "Number of days shown in the plan"
 msgstr "Количество дней для отображения в плане"
 
-#: aleksis/apps/chronos/models.py:1261
+#: aleksis/apps/chronos/models.py:1198
 msgid "Show header box"
 msgstr "Показать заголовок"
 
-#: aleksis/apps/chronos/models.py:1262 aleksis/apps/chronos/preferences.py:61
+#: aleksis/apps/chronos/models.py:1199 aleksis/apps/chronos/preferences.py:100
 msgid "The header box shows affected teachers/groups."
 msgstr "Заголовок отображает преподавателей/группы, на которых влияет."
 
-#: aleksis/apps/chronos/models.py:1269
+#: aleksis/apps/chronos/models.py:1206
 msgid "Revision which triggered the last update"
 msgstr "Ревизия, которая вызвала последнее обновление"
 
-#: aleksis/apps/chronos/models.py:1330
+#: aleksis/apps/chronos/models.py:1278
 msgid "Automatic plan"
 msgstr "Автоматический план"
 
-#: aleksis/apps/chronos/models.py:1331
+#: aleksis/apps/chronos/models.py:1279
 msgid "Automatic plans"
 msgstr "Автоматические планы"
 
-#: aleksis/apps/chronos/models.py:1345
+#: aleksis/apps/chronos/models.py:1293
 msgid "Can view all room timetables"
 msgstr "Может просматривать расписания всех комнат"
 
-#: aleksis/apps/chronos/models.py:1346
+#: aleksis/apps/chronos/models.py:1294
 msgid "Can view all group timetables"
 msgstr "Может просматривать расписания всех групп"
 
-#: aleksis/apps/chronos/models.py:1347
+#: aleksis/apps/chronos/models.py:1295
 msgid "Can view all person timetables"
 msgstr "Может просматривать расписания всех людей"
 
-#: aleksis/apps/chronos/models.py:1348
+#: aleksis/apps/chronos/models.py:1296
 msgid "Can view timetable overview"
 msgstr "Может просматривать общее расписание"
 
-#: aleksis/apps/chronos/models.py:1349
+#: aleksis/apps/chronos/models.py:1297
 msgid "Can view all lessons per day"
 msgstr "Может просматривать все уроки за день"
 
-#: aleksis/apps/chronos/preferences.py:18
-msgid "Use parent groups in timetable views"
-msgstr "Использовать родительские группы в обзорах расписания"
+#: aleksis/apps/chronos/models.py:1298
+#, fuzzy
+#| msgid "Can view all lessons per day"
+msgid "Can view all supervisions per day"
+msgstr "Может просматривать все уроки за день"
 
-#: aleksis/apps/chronos/preferences.py:20
-msgid ""
-"If an lesson or substitution has only one group and this group has parent "
-"groups, show the parent groups instead of the original group."
+#: aleksis/apps/chronos/models.py:1313
+#, fuzzy
+#| msgid "Start time"
+msgid "Start slot number"
+msgstr "Время начала"
+
+#: aleksis/apps/chronos/models.py:1316
+#, fuzzy
+#| msgid "End time"
+msgid "End slot number"
+msgstr "Время окончания"
+
+#: aleksis/apps/chronos/models.py:1320
+msgid "Course"
+msgstr ""
+
+#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
+msgid "Cancelled"
+msgstr "Отменено"
+
+#: aleksis/apps/chronos/models.py:1401 aleksis/apps/chronos/models.py:1413
+#: aleksis/apps/chronos/models.py:1425
+msgid "{} (instead of {})"
 msgstr ""
-"Если у урока или у замены только одна группа и у этой группы есть "
-"родительские группы, отображать их вместо оригинальной группы."
+
+#: aleksis/apps/chronos/models.py:1614
+#, fuzzy
+#| msgid "Lesson"
+msgid "Lesson Event"
+msgstr "Урок"
+
+#: aleksis/apps/chronos/models.py:1615
+#, fuzzy
+#| msgid "Lessons"
+msgid "Lesson Events"
+msgstr "Уроки"
+
+#: aleksis/apps/chronos/models.py:1630
+#, fuzzy
+#| msgid "Supervision"
+msgid "Supervision: {}"
+msgstr "Контроль"
+
+#: aleksis/apps/chronos/preferences.py:21
+msgid "Timetables"
+msgstr "Расписания"
+
+#: aleksis/apps/chronos/preferences.py:29
+msgid "Use parent groups in timetable views"
+msgstr "Использовать родительские группы в обзорах расписания"
 
 #: aleksis/apps/chronos/preferences.py:31
+#, fuzzy
+#| msgid "If an lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
+msgid "If a lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
+msgstr "Если у урока или у замены только одна группа и у этой группы есть родительские группы, отображать их вместо оригинальной группы."
+
+#: aleksis/apps/chronos/preferences.py:42
 msgid "Shorten groups in timetable views"
 msgstr "Сокращать группы в обзорах расписания"
 
-#: aleksis/apps/chronos/preferences.py:32
+#: aleksis/apps/chronos/preferences.py:43
 msgid "If there are more groups than the set limit, they will be collapsed."
-msgstr ""
-"Если количество групп больше установленного лимита, они будут сгруппированы."
+msgstr "Если количество групп больше установленного лимита, они будут сгруппированы."
 
-#: aleksis/apps/chronos/preferences.py:40
+#: aleksis/apps/chronos/preferences.py:51
 msgid "Limit of groups for shortening of groups"
 msgstr "Лимит количества групп для сокращения групп"
 
-#: aleksis/apps/chronos/preferences.py:42
-msgid ""
-"If an user activates shortening of groups,they will be collapsed if there "
-"are more groups than this limit."
+#: aleksis/apps/chronos/preferences.py:53
+#, fuzzy
+#| msgid "If an user activates shortening of groups,they will be collapsed if there are more groups than this limit."
+msgid "If a user activates shortening of groups,they will be collapsed if there are more groups than this limit."
+msgstr "Если пользователь активирует сокращение групп и количество больше установленного лимита, они группируются."
+
+#: aleksis/apps/chronos/preferences.py:65
+#, fuzzy
+#| msgid "Lesson substitutions"
+msgid "Relevant days for substitution plans"
+msgstr "Замены уроков"
+
+#: aleksis/apps/chronos/preferences.py:82
+msgid "Time when substitution plans switch to the next day"
 msgstr ""
-"Если пользователь активирует сокращение групп и количество больше "
-"установленного лимита, они группируются."
 
-#: aleksis/apps/chronos/preferences.py:52
+#: aleksis/apps/chronos/preferences.py:91
 msgid "Number of days shown on substitutions print view"
 msgstr "Количество дней для отображения в печатном виде замен"
 
-#: aleksis/apps/chronos/preferences.py:60
+#: aleksis/apps/chronos/preferences.py:99
 msgid "Show header box in substitution views"
 msgstr "Отображать заголовок в обзоре замен"
 
-#: aleksis/apps/chronos/preferences.py:70
-msgid ""
-"Show parent groups in header box in substitution views instead of original "
-"groups"
-msgstr ""
-"В заголовке обзора замен отображать родительские группы вместо оригинальных"
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Show parent groups in header box in substitution views instead of original groups"
+msgstr "В заголовке обзора замен отображать родительские группы вместо оригинальных"
 
-#: aleksis/apps/chronos/preferences.py:79
-msgid ""
-"How many days in advance users should be notified about timetable changes?"
-msgstr ""
-"За сколько дней до изменений в расписании необходимо уведомлять "
-"пользователей?"
+#: aleksis/apps/chronos/preferences.py:118
+msgid "How many days in advance users should be notified about timetable changes?"
+msgstr "За сколько дней до изменений в расписании необходимо уведомлять пользователей?"
 
-#: aleksis/apps/chronos/preferences.py:87
+#: aleksis/apps/chronos/preferences.py:126
 msgid "Time for sending notifications about timetable changes"
 msgstr "Время для отправки уведомлений об изменениях в расписании"
 
-#: aleksis/apps/chronos/preferences.py:90
-msgid ""
-"This is only used for scheduling notifications which doesn't affect the time "
-"period configured above. All other notifications affecting the next days are "
-"sent immediately."
-msgstr ""
-"Это используется только для планирования уведомлений, которые не влияют на "
-"время уроков, настроенных выше. Все другие уведомления, которые влияют на "
-"ближайшие дни, отправляются незамедлительно."
+#: aleksis/apps/chronos/preferences.py:129
+msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
+msgstr "Это используется только для планирования уведомлений, которые не влияют на время уроков, настроенных выше. Все другие уведомления, которые влияют на ближайшие дни, отправляются незамедлительно."
 
-#: aleksis/apps/chronos/preferences.py:101
-#: aleksis/apps/chronos/preferences.py:109
+#: aleksis/apps/chronos/preferences.py:140
+#: aleksis/apps/chronos/preferences.py:148
 msgid "Send notifications for current timetable changes"
 msgstr "Отправить уведомления о текущих изменениях в расписании"
 
-#: aleksis/apps/chronos/tables.py:41
-msgid "Substitution"
-msgstr "Замена"
-
-#: aleksis/apps/chronos/tables.py:43
-msgid "Manage substitution"
-msgstr "Управление заменами"
-
-#: aleksis/apps/chronos/templates/chronos/all.html:25
-msgid "No teachers timetables available."
-msgstr "Расписания преподавателей недоступны."
-
-#: aleksis/apps/chronos/templates/chronos/all.html:39
-msgid "No group timetables available."
-msgstr "Расписания групп недоступны."
-
-#: aleksis/apps/chronos/templates/chronos/all.html:53
-msgid "No room timetables available."
-msgstr "Расписания комнат недоступны."
-
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:6
-msgid "Edit substitution."
-msgstr "Редактировать замену."
-
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:7
-msgid "Edit substitution"
-msgstr "Редактировать замену"
+#: aleksis/apps/chronos/preferences.py:158
+#, fuzzy
+#| msgid "Shorten groups in timetable views"
+msgid "Group types to show in timetables"
+msgstr "Сокращать группы в обзорах расписания"
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:20
-msgid "Delete"
-msgstr "Удалить"
+#: aleksis/apps/chronos/preferences.py:159
+msgid "If you leave it empty, all groups will be shown."
+msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:50
-msgid "SMART PLAN"
-msgstr "SMART PLAN"
+#: aleksis/apps/chronos/preferences.py:169
+msgid "Lesson calendar feed color"
+msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:22
-msgid "Show week timetable for"
-msgstr "Отобразить недельное расписание для"
+#: aleksis/apps/chronos/preferences.py:181
+#, fuzzy
+#| msgid "Supervision area"
+msgid "Supervision calendar feed color"
+msgstr "Зона контроля"
 
 #: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
 msgid "Absent teachers"
@@ -579,104 +552,47 @@ msgstr "На каких преподавателей влияет"
 msgid "Affected groups"
 msgstr "На какие группы влияет"
 
-#: aleksis/apps/chronos/templates/chronos/partials/lesson.html:27
-msgid "Cancelled due to an event"
-msgstr "Отменено из-за события"
-
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
-msgid "Cancelled"
-msgstr "Отменено"
+#: aleksis/apps/chronos/templates/chronos/partials/subs/period.html:12
+msgid "all day"
+msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:6
-msgid "Cancelled for teachers"
-msgstr "Отменено для преподавателей"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
+msgid "Print: Substitutions"
+msgstr "Печать: Замены"
 
-#: aleksis/apps/chronos/templates/chronos/partials/today.html:2
-msgid "Today"
-msgstr "Сегодня"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
+msgid "Substitutions"
+msgstr "Замены"
 
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:14
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:25
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:36
-msgid "CW"
-msgstr "НД"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:27
+#, fuzzy
+#| msgid "Timetable"
+msgid "Time"
+msgstr "Расписание"
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:49
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
 msgid "Notes"
 msgstr "Заметки"
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:57
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
 msgid "No substitutions available."
 msgstr "Замены недоступны."
 
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
-msgid "Print: Substitutions"
-msgstr "Печать: Замены"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:24
-#: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
-#: aleksis/apps/chronos/util/notifications.py:206
-msgid "Timetable"
-msgstr "Расписание"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:29
-msgid "Group teachers:"
-msgstr "Преподаватели групп:"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:55
-msgid "Show regular timetable"
-msgstr "Показать обычное расписание"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:63
-msgid "View class register of this week"
-msgstr "Обзор классного журнала за эту неделю"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:76
-msgid "Show SMART PLAN"
-msgstr "Показать SMART PLAN"
-
-#: aleksis/apps/chronos/templates/chronos/widget.html:8
-#, python-format
-msgid ""
-"\n"
-"        My timetable for %(day)s\n"
-"      "
-msgstr ""
-"\n"
-"        Моё расписание на %(day)s\n"
-"      "
-
-#: aleksis/apps/chronos/templates/chronos/widget.html:18
-msgid ""
-"\n"
-"          There is no timetable linked to your person.\n"
-"          "
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:2
+msgid "Areas"
 msgstr ""
-"\n"
-"          К Вашей персоне не привязан ни один журнал.\n"
-"          "
-
-#: aleksis/apps/chronos/templates/chronos/widget.html:27
-msgid "Go to smart plan"
-msgstr "Перейти к SMART PLAN"
 
-#: aleksis/apps/chronos/util/notifications.py:50
+#: aleksis/apps/chronos/util/notifications.py:48
 #, python-brace-format
-msgid ""
-"The {subject} lesson in the {period}. period on {day} has been cancelled."
+msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
 msgstr "Урок {subject} на {period} уроке {day} отменён."
 
-#: aleksis/apps/chronos/util/notifications.py:57
+#: aleksis/apps/chronos/util/notifications.py:55
 #, python-brace-format
-msgid ""
-"The {subject} lesson in the {period}. period on {day} has some current "
-"changes."
+msgid "The {subject} lesson in the {period}. period on {day} has some current changes."
 msgstr "В урок {subject} на {period} уроке {day} внесены некоторые изменения."
 
-#: aleksis/apps/chronos/util/notifications.py:66
+#: aleksis/apps/chronos/util/notifications.py:64
 #, python-brace-format
 msgid "The teacher {old} is substituted by {new}."
 msgid_plural "The teachers {old} are substituted by {new}."
@@ -685,97 +601,189 @@ msgstr[1] "Преподаватели {old} заменены преподава
 msgstr[2] "Преподаватели {old} заменены преподавателями {new}."
 msgstr[3] "Преподаватели {old} заменены преподавателями {new}."
 
-#: aleksis/apps/chronos/util/notifications.py:78
+#: aleksis/apps/chronos/util/notifications.py:76
 #, python-brace-format
 msgid "The subject is changed to {subject}."
 msgstr "Предмет заменён на {subject}."
 
-#: aleksis/apps/chronos/util/notifications.py:84
+#: aleksis/apps/chronos/util/notifications.py:82
 #, python-brace-format
 msgid "The lesson is moved from {old} to {new}."
 msgstr "Урок перенесён с {old} на {new}."
 
-#: aleksis/apps/chronos/util/notifications.py:93
+#: aleksis/apps/chronos/util/notifications.py:91
 #, python-brace-format
 msgid "There is an additional comment: {comment}."
 msgstr "Присутствует дополнительный комментарий: {comment}."
 
-#: aleksis/apps/chronos/util/notifications.py:101
+#: aleksis/apps/chronos/util/notifications.py:99
 #, python-brace-format
-msgid ""
-"There is an event that starts on {date_start}, {period_from}. period and "
-"ends on {date_end}, {period_to}. period:"
-msgstr ""
-"Запланировано мероприятие, которое начинается {date_start}, на "
-"{period_from}. уроке и заканчивается {date_end}, на {period_to}. уроке:"
+msgid "There is an event that starts on {date_start}, {period_from}. period and ends on {date_end}, {period_to}. period:"
+msgstr "Запланировано мероприятие, которое начинается {date_start}, на {period_from}. уроке и заканчивается {date_end}, на {period_to}. уроке:"
 
-#: aleksis/apps/chronos/util/notifications.py:114
+#: aleksis/apps/chronos/util/notifications.py:112
 #, python-brace-format
-msgid ""
-"There is an event on {date} from the {period_from}. period to the "
-"{period_to}. period:"
-msgstr ""
-"Запланировано мероприятие {date} с {period_from}. урока до {period_to}. "
-"урока:"
+msgid "There is an event on {date} from the {period_from}. period to the {period_to}. period:"
+msgstr "Запланировано мероприятие {date} с {period_from}. урока до {period_to}. урока:"
 
-#: aleksis/apps/chronos/util/notifications.py:125
-#: aleksis/apps/chronos/util/notifications.py:145
+#: aleksis/apps/chronos/util/notifications.py:123
+#: aleksis/apps/chronos/util/notifications.py:143
 #, python-brace-format
 msgid "Groups: {groups}"
 msgstr "Группы: {groups}"
 
-#: aleksis/apps/chronos/util/notifications.py:127
-#: aleksis/apps/chronos/util/notifications.py:149
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:147
 #, python-brace-format
 msgid "Teachers: {teachers}"
 msgstr "Преподаватели: {teachers}"
 
-#: aleksis/apps/chronos/util/notifications.py:130
+#: aleksis/apps/chronos/util/notifications.py:128
 #, python-brace-format
 msgid "Rooms: {rooms}"
 msgstr "Комнаты: {rooms}"
 
-#: aleksis/apps/chronos/util/notifications.py:137
+#: aleksis/apps/chronos/util/notifications.py:135
 #, python-brace-format
 msgid "There is an extra lesson on {date} in the {period}. period:"
 msgstr "Запланирован дополнительный урок {date} на {period}. уроке:"
 
-#: aleksis/apps/chronos/util/notifications.py:147
+#: aleksis/apps/chronos/util/notifications.py:145
 #, python-brace-format
 msgid "Subject: {subject}"
 msgstr "Предмет: {subject}"
 
-#: aleksis/apps/chronos/util/notifications.py:151
+#: aleksis/apps/chronos/util/notifications.py:149
 #, python-brace-format
 msgid "Room: {room}"
 msgstr "Комната: {room}"
 
-#: aleksis/apps/chronos/util/notifications.py:153
+#: aleksis/apps/chronos/util/notifications.py:151
 #, python-brace-format
 msgid "Comment: {comment}."
 msgstr "Комментарий: {comment}."
 
-#: aleksis/apps/chronos/util/notifications.py:156
+#: aleksis/apps/chronos/util/notifications.py:154
 #, python-brace-format
-msgid ""
-"The supervision of {old} on {date} between the {period_from}. period and the "
-"{period_to}. period in the area {area} is substituted by {new}."
-msgstr ""
-"Контроль {old}, {date} между {period_from}. и {period_to}. уроками в зоне "
-"{area} заменён на {new}."
+msgid "The supervision of {old} on {date} between the {period_from}. period and the {period_to}. period in the area {area} is substituted by {new}."
+msgstr "Контроль {old}, {date} между {period_from}. и {period_to}. уроками в зоне {area} заменён на {new}."
 
-#: aleksis/apps/chronos/util/notifications.py:207
+#: aleksis/apps/chronos/util/notifications.py:204
+msgid "Timetable"
+msgstr "Расписание"
+
+#: aleksis/apps/chronos/util/notifications.py:205
 msgid "There are current changes to your timetable."
 msgstr "У Вас в расписании произошли изменения."
 
-#: aleksis/apps/chronos/views.py:270
-msgid "The substitution has been saved."
-msgstr "Замена сохранена."
+#~ msgid "Options for timetables"
+#~ msgstr "Опции для расписания"
+
+#~ msgid "Optional data for timetables"
+#~ msgstr "Опциональные данные для расписания"
+
+#~ msgid "My timetable"
+#~ msgstr "Моё расписание"
+
+#~ msgid "All timetables"
+#~ msgstr "Все расписания"
+
+#~ msgid "Daily lessons"
+#~ msgstr "Ежедневные уроки"
+
+#~ msgid "Show announcement in timetable views?"
+#~ msgstr "Показывать объявление при просмотре расписания?"
+
+#~ msgid "Can view room timetable"
+#~ msgstr "Может просмативать расписание комнаты"
+
+#~ msgid "Timetable widget"
+#~ msgstr "Виджет расписания"
 
-#: aleksis/apps/chronos/views.py:291
-msgid "The substitution has been deleted."
-msgstr "Замена удалена."
+#~ msgid "Timetable widgets"
+#~ msgstr "Виджеты расписания"
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:84
-msgid "View class register of the current week"
-msgstr "Обзор классного журнала за текущую неделю"
+#~ msgid "Substitution"
+#~ msgstr "Замена"
+
+#~ msgid "Manage substitution"
+#~ msgstr "Управление заменами"
+
+#~ msgid "No teachers timetables available."
+#~ msgstr "Расписания преподавателей недоступны."
+
+#~ msgid "No group timetables available."
+#~ msgstr "Расписания групп недоступны."
+
+#~ msgid "No room timetables available."
+#~ msgstr "Расписания комнат недоступны."
+
+#~ msgid "Edit substitution."
+#~ msgstr "Редактировать замену."
+
+#~ msgid "Edit substitution"
+#~ msgstr "Редактировать замену"
+
+#~ msgid "Delete"
+#~ msgstr "Удалить"
+
+#~ msgid "SMART PLAN"
+#~ msgstr "SMART PLAN"
+
+#~ msgid "Show week timetable for"
+#~ msgstr "Отобразить недельное расписание для"
+
+#~ msgid "Cancelled due to an event"
+#~ msgstr "Отменено из-за события"
+
+#~ msgid "Cancelled for teachers"
+#~ msgstr "Отменено для преподавателей"
+
+#~ msgid "Today"
+#~ msgstr "Сегодня"
+
+#~ msgid "CW"
+#~ msgstr "НД"
+
+#~ msgid "Group teachers:"
+#~ msgstr "Преподаватели групп:"
+
+#~ msgid "Show regular timetable"
+#~ msgstr "Показать обычное расписание"
+
+#~ msgid "View class register of this week"
+#~ msgstr "Обзор классного журнала за эту неделю"
+
+#~ msgid "Show SMART PLAN"
+#~ msgstr "Показать SMART PLAN"
+
+#, python-format
+#~ msgid ""
+#~ "\n"
+#~ "        My timetable for %(day)s\n"
+#~ "      "
+#~ msgstr ""
+#~ "\n"
+#~ "        Моё расписание на %(day)s\n"
+#~ "      "
+
+#~ msgid ""
+#~ "\n"
+#~ "          There is no timetable linked to your person.\n"
+#~ "          "
+#~ msgstr ""
+#~ "\n"
+#~ "          К Вашей персоне не привязан ни один журнал.\n"
+#~ "          "
+
+#~ msgid "Go to smart plan"
+#~ msgstr "Перейти к SMART PLAN"
+
+#~ msgid "The substitution has been saved."
+#~ msgstr "Замена сохранена."
+
+#~ msgid "The substitution has been deleted."
+#~ msgstr "Замена удалена."
+
+#~ msgid "View class register of the current week"
+#~ msgstr "Обзор классного журнала за текущую неделю"
diff --git a/aleksis/apps/chronos/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/tr_TR/LC_MESSAGES/django.po
index f4190ee2c3668ce8a8a236aa9dbb007292e467a9..cfc760f01b3206aaf7123340eccf529e9e4db354 100644
--- a/aleksis/apps/chronos/locale/tr_TR/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/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: 2022-06-21 11:32+0200\n"
+"POT-Creation-Date: 2024-08-18 14:23+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,76 +17,38 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: aleksis/apps/chronos/form_extensions.py:7
-msgid "Options for timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/form_extensions.py:8
-msgid "Optional data for timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
-msgid "Timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:16
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:18
-msgid "My timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:27
-#: aleksis/apps/chronos/templates/chronos/all.html:11
-#: aleksis/apps/chronos/templates/chronos/all.html:12
-msgid "All timetables"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:38
-msgid "Daily lessons"
-msgstr ""
-
-#: aleksis/apps/chronos/menus.py:49
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:11
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:17
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
-msgid "Substitutions"
-msgstr ""
-
 #: aleksis/apps/chronos/mixins.py:25
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:142
-msgid "Show announcement in timetable views?"
-msgstr ""
-
-#: aleksis/apps/chronos/model_extensions.py:151
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:155
+#: aleksis/apps/chronos/model_extensions.py:149
 msgid "Can view person timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:86
+#: aleksis/apps/chronos/models.py:87
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
+#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:626
+#: aleksis/apps/chronos/models.py:1310
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
-#: aleksis/apps/chronos/models.py:827 aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:676
+#: aleksis/apps/chronos/models.py:747 aleksis/apps/chronos/models.py:979
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
-#: aleksis/apps/chronos/models.py:828 aleksis/apps/chronos/models.py:1062
+#: aleksis/apps/chronos/models.py:93 aleksis/apps/chronos/models.py:677
+#: aleksis/apps/chronos/models.py:748 aleksis/apps/chronos/models.py:980
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:111
+#: aleksis/apps/chronos/models.py:112
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
@@ -106,628 +68,583 @@ msgstr ""
 msgid "Validity ranges"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:150
+#: aleksis/apps/chronos/models.py:149
 msgid "Week day"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:152
+#: aleksis/apps/chronos/models.py:151
 msgid "Number of period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:153
 msgid "Start time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:155
+#: aleksis/apps/chronos/models.py:154
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
-#: aleksis/apps/chronos/models.py:1191
+#: aleksis/apps/chronos/models.py:324 aleksis/apps/chronos/models.py:496
+#: aleksis/apps/chronos/models.py:1122
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:339
+#: aleksis/apps/chronos/models.py:325
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:698 aleksis/apps/chronos/models.py:873
-#: aleksis/apps/chronos/models.py:895
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:625
+#: aleksis/apps/chronos/models.py:793 aleksis/apps/chronos/models.py:810
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
-#: aleksis/apps/chronos/models.py:874 aleksis/apps/chronos/models.py:896
+#: aleksis/apps/chronos/models.py:330 aleksis/apps/chronos/models.py:794
+#: aleksis/apps/chronos/models.py:811
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:332
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:347
+#: aleksis/apps/chronos/models.py:333
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:354 aleksis/apps/chronos/models.py:390
-#: aleksis/apps/chronos/models.py:446 aleksis/apps/chronos/models.py:1198
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:47
+#: aleksis/apps/chronos/models.py:340 aleksis/apps/chronos/models.py:349
+#: aleksis/apps/chronos/models.py:416 aleksis/apps/chronos/models.py:1129
+#: aleksis/apps/chronos/models.py:1345
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:2
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:355
+#: aleksis/apps/chronos/models.py:341
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:374
-msgid "Can view room timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:454
-#: aleksis/apps/chronos/models.py:533 aleksis/apps/chronos/models.py:751
-#: aleksis/apps/chronos/models.py:1213
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:48
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
-msgid "Room"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:377 aleksis/apps/chronos/models.py:1078
-#: aleksis/apps/chronos/templates/chronos/all.html:45
-msgid "Rooms"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:393 aleksis/apps/chronos/models.py:452
-#: aleksis/apps/chronos/models.py:1080 aleksis/apps/chronos/models.py:1206
-#: aleksis/apps/chronos/tables.py:35
-#: aleksis/apps/chronos/templates/chronos/all.html:17
+#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:422
+#: aleksis/apps/chronos/models.py:998 aleksis/apps/chronos/models.py:1137
+#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:3
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:1
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:399
+#: aleksis/apps/chronos/models.py:358
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1077
-#: aleksis/apps/chronos/models.py:1201 aleksis/apps/chronos/tables.py:34
-#: aleksis/apps/chronos/templates/chronos/all.html:31
+#: aleksis/apps/chronos/models.py:360 aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1132 aleksis/apps/chronos/models.py:1326
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:1
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:26
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
-#: aleksis/apps/chronos/models.py:795
+#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:490
+#: aleksis/apps/chronos/models.py:716 aleksis/apps/chronos/models.py:1430
+#: aleksis/apps/chronos/models.py:1454
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:425
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
+#: aleksis/apps/chronos/models.py:395 aleksis/apps/chronos/models.py:1306
 msgid "Lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1185
+#: aleksis/apps/chronos/models.py:403 aleksis/apps/chronos/models.py:1116
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1186
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:1117
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
+#: aleksis/apps/chronos/models.py:407 aleksis/apps/chronos/models.py:620
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:456
+#: aleksis/apps/chronos/models.py:425 aleksis/apps/chronos/models.py:504
+#: aleksis/apps/chronos/models.py:673 aleksis/apps/chronos/models.py:1144
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
+msgid "Room"
+msgstr ""
+
+#: aleksis/apps/chronos/models.py:428
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:458
+#: aleksis/apps/chronos/models.py:430
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
-#: aleksis/apps/chronos/models.py:813 aleksis/apps/chronos/models.py:1216
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:692
+#: aleksis/apps/chronos/models.py:734 aleksis/apps/chronos/models.py:1147
+#: aleksis/apps/chronos/models.py:1357
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:465
+#: aleksis/apps/chronos/models.py:437
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:506
+#: aleksis/apps/chronos/models.py:477
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:507
+#: aleksis/apps/chronos/models.py:478
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:655
+#: aleksis/apps/chronos/models.py:621
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:693
-msgid "Timetable widget"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:694
-msgid "Timetable widgets"
-msgstr ""
-
-#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
+#: aleksis/apps/chronos/models.py:635 aleksis/apps/chronos/models.py:648
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:709
+#: aleksis/apps/chronos/models.py:636
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:735 aleksis/apps/chronos/models.py:974
-#: aleksis/apps/chronos/models.py:1025
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:46
+#: aleksis/apps/chronos/models.py:657 aleksis/apps/chronos/models.py:889
+#: aleksis/apps/chronos/models.py:943
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:743
+#: aleksis/apps/chronos/models.py:665
 msgid "Group"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
+#: aleksis/apps/chronos/models.py:681 aleksis/apps/chronos/models.py:723
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:808
+#: aleksis/apps/chronos/models.py:688 aleksis/apps/chronos/models.py:729
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:780
+#: aleksis/apps/chronos/models.py:702
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:786
+#: aleksis/apps/chronos/models.py:707
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:787
+#: aleksis/apps/chronos/models.py:708
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:798
+#: aleksis/apps/chronos/models.py:719
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:812 aleksis/apps/chronos/models.py:826
-#: aleksis/apps/chronos/models.py:1059
+#: aleksis/apps/chronos/models.py:733 aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:977
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:819
+#: aleksis/apps/chronos/models.py:739
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:820
+#: aleksis/apps/chronos/models.py:740
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:829
+#: aleksis/apps/chronos/models.py:749
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:868
+#: aleksis/apps/chronos/models.py:788
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:869
+#: aleksis/apps/chronos/models.py:789
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:883 aleksis/apps/chronos/models.py:964
+#: aleksis/apps/chronos/models.py:803 aleksis/apps/chronos/models.py:879
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:884
+#: aleksis/apps/chronos/models.py:804
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:901
+#: aleksis/apps/chronos/models.py:816
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:909
+#: aleksis/apps/chronos/models.py:824
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:949 aleksis/apps/chronos/models.py:968
+#: aleksis/apps/chronos/models.py:864 aleksis/apps/chronos/models.py:883
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:950
+#: aleksis/apps/chronos/models.py:865
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1005 aleksis/apps/chronos/models.py:1018
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
-#: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
+#: aleksis/apps/chronos/models.py:923 aleksis/apps/chronos/models.py:936
+#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:3
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1006
+#: aleksis/apps/chronos/models.py:924 aleksis/apps/chronos/models.py:1622
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1014
+#: aleksis/apps/chronos/models.py:932
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1048
+#: aleksis/apps/chronos/models.py:966
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1049
+#: aleksis/apps/chronos/models.py:967
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1067
+#: aleksis/apps/chronos/models.py:985
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1073
+#: aleksis/apps/chronos/models.py:991
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1087
+#: aleksis/apps/chronos/models.py:996 aleksis/apps/chronos/models.py:1332
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:4
+msgid "Rooms"
+msgstr ""
+
+#: aleksis/apps/chronos/models.py:1005
 #, python-brace-format
 msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1172
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
+#: aleksis/apps/chronos/models.py:1103
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1173
+#: aleksis/apps/chronos/models.py:1104
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1221
+#: aleksis/apps/chronos/models.py:1152
 msgid "Related exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1251
+#: aleksis/apps/chronos/models.py:1181
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1252
+#: aleksis/apps/chronos/models.py:1182
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1264
+#: aleksis/apps/chronos/models.py:1194
 msgid "Number of days shown in the plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1268
+#: aleksis/apps/chronos/models.py:1198
 msgid "Show header box"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1269 aleksis/apps/chronos/preferences.py:61
+#: aleksis/apps/chronos/models.py:1199 aleksis/apps/chronos/preferences.py:100
 msgid "The header box shows affected teachers/groups."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1276
+#: aleksis/apps/chronos/models.py:1206
 msgid "Revision which triggered the last update"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1337
+#: aleksis/apps/chronos/models.py:1278
 msgid "Automatic plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/models.py:1279
 msgid "Automatic plans"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1352
+#: aleksis/apps/chronos/models.py:1293
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/models.py:1294
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1354
+#: aleksis/apps/chronos/models.py:1295
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1355
+#: aleksis/apps/chronos/models.py:1296
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1356
+#: aleksis/apps/chronos/models.py:1297
 msgid "Can view all lessons per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:18
-msgid "Use parent groups in timetable views"
+#: aleksis/apps/chronos/models.py:1298
+msgid "Can view all supervisions per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:20
-msgid "If an lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
+#: aleksis/apps/chronos/models.py:1313
+msgid "Start slot number"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:31
-msgid "Shorten groups in timetable views"
+#: aleksis/apps/chronos/models.py:1316
+msgid "End slot number"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:32
-msgid "If there are more groups than the set limit, they will be collapsed."
+#: aleksis/apps/chronos/models.py:1320
+msgid "Course"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:40
-msgid "Limit of groups for shortening of groups"
+#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
+msgid "Cancelled"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:42
-msgid "If an user activates shortening of groups,they will be collapsed if there are more groups than this limit."
+#: aleksis/apps/chronos/models.py:1401 aleksis/apps/chronos/models.py:1413
+#: aleksis/apps/chronos/models.py:1425
+msgid "{} (instead of {})"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:52
-msgid "Number of days shown on substitutions print view"
+#: aleksis/apps/chronos/models.py:1614
+msgid "Lesson Event"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:60
-msgid "Show header box in substitution views"
+#: aleksis/apps/chronos/models.py:1615
+msgid "Lesson Events"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:70
-msgid "Show parent groups in header box in substitution views instead of original groups"
+#: aleksis/apps/chronos/models.py:1630
+msgid "Supervision: {}"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:79
-msgid "How many days in advance users should be notified about timetable changes?"
+#: aleksis/apps/chronos/preferences.py:21
+msgid "Timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:87
-msgid "Time for sending notifications about timetable changes"
+#: aleksis/apps/chronos/preferences.py:29
+msgid "Use parent groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:90
-msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
+#: aleksis/apps/chronos/preferences.py:31
+msgid "If a lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:101
-#: aleksis/apps/chronos/preferences.py:109
-msgid "Send notifications for current timetable changes"
+#: aleksis/apps/chronos/preferences.py:42
+msgid "Shorten groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/tables.py:41
-msgid "Substitution"
+#: aleksis/apps/chronos/preferences.py:43
+msgid "If there are more groups than the set limit, they will be collapsed."
 msgstr ""
 
-#: aleksis/apps/chronos/tables.py:43
-msgid "Manage substitution"
+#: aleksis/apps/chronos/preferences.py:51
+msgid "Limit of groups for shortening of groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:25
-msgid "No teachers timetables available."
+#: aleksis/apps/chronos/preferences.py:53
+msgid "If a user activates shortening of groups,they will be collapsed if there are more groups than this limit."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:39
-msgid "No group timetables available."
+#: aleksis/apps/chronos/preferences.py:65
+msgid "Relevant days for substitution plans"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/all.html:53
-msgid "No room timetables available."
+#: aleksis/apps/chronos/preferences.py:82
+msgid "Time when substitution plans switch to the next day"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:11
-msgid "Edit substitution."
+#: aleksis/apps/chronos/preferences.py:91
+msgid "Number of days shown on substitutions print view"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:12
-msgid "Edit substitution"
+#: aleksis/apps/chronos/preferences.py:99
+msgid "Show header box in substitution views"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:25
-msgid "Delete"
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Show parent groups in header box in substitution views instead of original groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:50
-msgid "SMART PLAN"
+#: aleksis/apps/chronos/preferences.py:118
+msgid "How many days in advance users should be notified about timetable changes?"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:22
-msgid "Show week timetable for"
+#: aleksis/apps/chronos/preferences.py:126
+msgid "Time for sending notifications about timetable changes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
-msgid "Absent teachers"
+#: aleksis/apps/chronos/preferences.py:129
+msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:22
-msgid "Absent groups"
+#: aleksis/apps/chronos/preferences.py:140
+#: aleksis/apps/chronos/preferences.py:148
+msgid "Send notifications for current timetable changes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:34
-msgid "Affected teachers"
+#: aleksis/apps/chronos/preferences.py:158
+msgid "Group types to show in timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:46
-msgid "Affected groups"
+#: aleksis/apps/chronos/preferences.py:159
+msgid "If you leave it empty, all groups will be shown."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/lesson.html:27
-msgid "Cancelled due to an event"
+#: aleksis/apps/chronos/preferences.py:169
+msgid "Lesson calendar feed color"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
-msgid "Cancelled"
+#: aleksis/apps/chronos/preferences.py:181
+msgid "Supervision calendar feed color"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:6
-msgid "Cancelled for teachers"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
+msgid "Absent teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/today.html:2
-msgid "Today"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:22
+msgid "Absent groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:14
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:25
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:36
-msgid "CW"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:34
+msgid "Affected teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:49
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
-msgid "Notes"
+#: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:46
+msgid "Affected groups"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:57
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
-msgid "No substitutions available."
+#: aleksis/apps/chronos/templates/chronos/partials/subs/period.html:12
+msgid "all day"
 msgstr ""
 
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
 msgid "Print: Substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:24
-#: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
-#: aleksis/apps/chronos/util/notifications.py:206
-msgid "Timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:29
-msgid "Group teachers:"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:55
-msgid "Show regular timetable"
-msgstr ""
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:63
-#: aleksis/apps/chronos/templates/chronos/timetable.html:84
-msgid "View class register of this week"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
+msgid "Substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:76
-msgid "Show SMART PLAN"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:27
+msgid "Time"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:8
-#, python-format
-msgid ""
-"\n"
-"        My timetable for %(day)s\n"
-"      "
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
+msgid "Notes"
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:18
-msgid ""
-"\n"
-"          There is no timetable linked to your person.\n"
-"          "
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
+msgid "No substitutions available."
 msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:27
-msgid "Go to smart plan"
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:2
+msgid "Areas"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:50
+#: aleksis/apps/chronos/util/notifications.py:48
 #, python-brace-format
 msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:57
+#: aleksis/apps/chronos/util/notifications.py:55
 #, python-brace-format
 msgid "The {subject} lesson in the {period}. period on {day} has some current changes."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:66
+#: aleksis/apps/chronos/util/notifications.py:64
 #, python-brace-format
 msgid "The teacher {old} is substituted by {new}."
 msgid_plural "The teachers {old} are substituted by {new}."
 msgstr[0] ""
 msgstr[1] ""
 
-#: aleksis/apps/chronos/util/notifications.py:78
+#: aleksis/apps/chronos/util/notifications.py:76
 #, python-brace-format
 msgid "The subject is changed to {subject}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:84
+#: aleksis/apps/chronos/util/notifications.py:82
 #, python-brace-format
 msgid "The lesson is moved from {old} to {new}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:93
+#: aleksis/apps/chronos/util/notifications.py:91
 #, python-brace-format
 msgid "There is an additional comment: {comment}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:101
+#: aleksis/apps/chronos/util/notifications.py:99
 #, python-brace-format
 msgid "There is an event that starts on {date_start}, {period_from}. period and ends on {date_end}, {period_to}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:114
+#: aleksis/apps/chronos/util/notifications.py:112
 #, python-brace-format
 msgid "There is an event on {date} from the {period_from}. period to the {period_to}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:125
-#: aleksis/apps/chronos/util/notifications.py:145
+#: aleksis/apps/chronos/util/notifications.py:123
+#: aleksis/apps/chronos/util/notifications.py:143
 #, python-brace-format
 msgid "Groups: {groups}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:127
-#: aleksis/apps/chronos/util/notifications.py:149
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:147
 #, python-brace-format
 msgid "Teachers: {teachers}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:130
+#: aleksis/apps/chronos/util/notifications.py:128
 #, python-brace-format
 msgid "Rooms: {rooms}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:137
+#: aleksis/apps/chronos/util/notifications.py:135
 #, python-brace-format
 msgid "There is an extra lesson on {date} in the {period}. period:"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:147
+#: aleksis/apps/chronos/util/notifications.py:145
 #, python-brace-format
 msgid "Subject: {subject}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:151
+#: aleksis/apps/chronos/util/notifications.py:149
 #, python-brace-format
 msgid "Room: {room}"
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:153
+#: aleksis/apps/chronos/util/notifications.py:151
 #, python-brace-format
 msgid "Comment: {comment}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:156
+#: aleksis/apps/chronos/util/notifications.py:154
 #, python-brace-format
 msgid "The supervision of {old} on {date} between the {period_from}. period and the {period_to}. period in the area {area} is substituted by {new}."
 msgstr ""
 
-#: aleksis/apps/chronos/util/notifications.py:207
-msgid "There are current changes to your timetable."
-msgstr ""
-
-#: aleksis/apps/chronos/views.py:270
-msgid "The substitution has been saved."
+#: aleksis/apps/chronos/util/notifications.py:204
+msgid "Timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/views.py:291
-msgid "The substitution has been deleted."
+#: aleksis/apps/chronos/util/notifications.py:205
+msgid "There are current changes to your timetable."
 msgstr ""
diff --git a/aleksis/apps/chronos/locale/uk/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/uk/LC_MESSAGES/django.po
index 2985cd57672e71f444acfa40489d632919c92141..2a59feb53f2476f5088389967bf5de5ad9dbdd99 100644
--- a/aleksis/apps/chronos/locale/uk/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/locale/uk/LC_MESSAGES/django.po
@@ -7,93 +7,49 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-21 11:32+0200\n"
+"POT-Creation-Date: 2024-08-18 14:23+0200\n"
 "PO-Revision-Date: 2022-06-22 19:59+0000\n"
 "Last-Translator: Serhii Horichenko <m@sgg.im>\n"
-"Language-Team: Ukrainian <https://translate.edugit.org/projects/aleksis/"
-"aleksis-app-chronos/uk/>\n"
+"Language-Team: Ukrainian <https://translate.edugit.org/projects/aleksis/aleksis-app-chronos/uk/>\n"
 "Language: uk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 "
-"? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > "
-"14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % "
-"100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
 "X-Generator: Weblate 4.12.1\n"
 
-#: aleksis/apps/chronos/form_extensions.py:7
-msgid "Options for timetables"
-msgstr "Опції для розкладів"
-
-#: aleksis/apps/chronos/form_extensions.py:8
-msgid "Optional data for timetables"
-msgstr "Додаткові дані для розкладів"
-
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
-msgid "Timetables"
-msgstr "Розклади"
-
-#: aleksis/apps/chronos/menus.py:16
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:18
-msgid "My timetable"
-msgstr "Мій розклад"
-
-#: aleksis/apps/chronos/menus.py:27
-#: aleksis/apps/chronos/templates/chronos/all.html:11
-#: aleksis/apps/chronos/templates/chronos/all.html:12
-msgid "All timetables"
-msgstr "Усі розклади"
-
-#: aleksis/apps/chronos/menus.py:38
-msgid "Daily lessons"
-msgstr "Щоденні уроки"
-
-#: aleksis/apps/chronos/menus.py:49
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:11
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:17
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
-msgid "Substitutions"
-msgstr "Заміни"
-
 #: aleksis/apps/chronos/mixins.py:25
 msgid "Linked validity range"
 msgstr "Пов'язаний діапазон"
 
-#: aleksis/apps/chronos/model_extensions.py:142
-msgid "Show announcement in timetable views?"
-msgstr "Відображати оголошення з переглядом розкладу?"
-
-#: aleksis/apps/chronos/model_extensions.py:151
+#: aleksis/apps/chronos/model_extensions.py:145
 msgid "Can view group timetable"
 msgstr "Може переглядати групові розклади"
 
-#: aleksis/apps/chronos/model_extensions.py:155
+#: aleksis/apps/chronos/model_extensions.py:149
 msgid "Can view person timetable"
 msgstr "Може переглядати особисті розклади"
 
-#: aleksis/apps/chronos/models.py:86
+#: aleksis/apps/chronos/models.py:87
 msgid "School term"
 msgstr "Навчальний рік"
 
-#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
+#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:626
+#: aleksis/apps/chronos/models.py:1310
 msgid "Name"
 msgstr "Повне ім'я"
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
-#: aleksis/apps/chronos/models.py:827 aleksis/apps/chronos/models.py:1061
-#: aleksis/apps/chronos/models.py:829 aleksis/apps/chronos/models.py:1063
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:676
+#: aleksis/apps/chronos/models.py:747 aleksis/apps/chronos/models.py:979
 msgid "Start date"
 msgstr "Дата початку"
 
-#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
-#: aleksis/apps/chronos/models.py:828 aleksis/apps/chronos/models.py:1062
-#: aleksis/apps/chronos/models.py:830 aleksis/apps/chronos/models.py:1064
+#: aleksis/apps/chronos/models.py:93 aleksis/apps/chronos/models.py:677
+#: aleksis/apps/chronos/models.py:748 aleksis/apps/chronos/models.py:980
 msgid "End date"
 msgstr "Дата закінчення"
 
-#: aleksis/apps/chronos/models.py:111
+#: aleksis/apps/chronos/models.py:112
 msgid "The start date must be earlier than the end date."
 msgstr "Початкова дата повинна бути раніше кінцевої."
 
@@ -103,8 +59,7 @@ msgstr "Контрольний період повинен бути в рамк
 
 #: aleksis/apps/chronos/models.py:125
 msgid "There is already a validity range for this time or a part of this time."
-msgstr ""
-"На цей час або на частину цього часу контрольний період вже призначений."
+msgstr "На цей час або на частину цього часу контрольний період вже призначений."
 
 #: aleksis/apps/chronos/models.py:132
 msgid "Validity range"
@@ -114,480 +69,472 @@ msgstr "Контрольний період"
 msgid "Validity ranges"
 msgstr "Контрольні періоди"
 
-#: aleksis/apps/chronos/models.py:150
+#: aleksis/apps/chronos/models.py:149
 msgid "Week day"
 msgstr "День тижня"
 
-#: aleksis/apps/chronos/models.py:152
+#: aleksis/apps/chronos/models.py:151
 msgid "Number of period"
 msgstr "Номер урока"
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:153
 msgid "Start time"
 msgstr "Час початку"
 
-#: aleksis/apps/chronos/models.py:155
+#: aleksis/apps/chronos/models.py:154
 msgid "End time"
 msgstr "Час закінчення"
 
-#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
-#: aleksis/apps/chronos/models.py:1191 aleksis/apps/chronos/models.py:1193
+#: aleksis/apps/chronos/models.py:324 aleksis/apps/chronos/models.py:496
+#: aleksis/apps/chronos/models.py:1122
 msgid "Time period"
 msgstr "Час уроку"
 
-#: aleksis/apps/chronos/models.py:339
+#: aleksis/apps/chronos/models.py:325
 msgid "Time periods"
 msgstr "Час уроків"
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:698 aleksis/apps/chronos/models.py:873
-#: aleksis/apps/chronos/models.py:895 aleksis/apps/chronos/models.py:875
-#: aleksis/apps/chronos/models.py:897
+#: aleksis/apps/chronos/models.py:329 aleksis/apps/chronos/models.py:625
+#: aleksis/apps/chronos/models.py:793 aleksis/apps/chronos/models.py:810
 msgid "Short name"
 msgstr "Коротке ім'я"
 
-#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
-#: aleksis/apps/chronos/models.py:874 aleksis/apps/chronos/models.py:896
-#: aleksis/apps/chronos/models.py:876 aleksis/apps/chronos/models.py:898
+#: aleksis/apps/chronos/models.py:330 aleksis/apps/chronos/models.py:794
+#: aleksis/apps/chronos/models.py:811
 msgid "Long name"
 msgstr "Довге ім'я"
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:332
 msgid "Foreground colour"
 msgstr "Основний колір"
 
-#: aleksis/apps/chronos/models.py:347
+#: aleksis/apps/chronos/models.py:333
 msgid "Background colour"
 msgstr "Колір фону"
 
-#: aleksis/apps/chronos/models.py:354 aleksis/apps/chronos/models.py:390
-#: aleksis/apps/chronos/models.py:446 aleksis/apps/chronos/models.py:1198
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:47
+#: aleksis/apps/chronos/models.py:340 aleksis/apps/chronos/models.py:349
+#: aleksis/apps/chronos/models.py:416 aleksis/apps/chronos/models.py:1129
+#: aleksis/apps/chronos/models.py:1345
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:2
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:29
-#: aleksis/apps/chronos/models.py:1200
 msgid "Subject"
 msgstr "Предмет"
 
-#: aleksis/apps/chronos/models.py:355
+#: aleksis/apps/chronos/models.py:341
 msgid "Subjects"
 msgstr "Предмети"
 
-#: aleksis/apps/chronos/models.py:374
-msgid "Can view room timetable"
-msgstr "Може переглядати розклад кімнати"
-
-#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:454
-#: aleksis/apps/chronos/models.py:533 aleksis/apps/chronos/models.py:751
-#: aleksis/apps/chronos/models.py:1213
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:48
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
-#: aleksis/apps/chronos/models.py:1215
-msgid "Room"
-msgstr "Кімната"
-
-#: aleksis/apps/chronos/models.py:377 aleksis/apps/chronos/models.py:1078
-#: aleksis/apps/chronos/templates/chronos/all.html:45
-#: aleksis/apps/chronos/models.py:1080
-msgid "Rooms"
-msgstr "Кімнати"
-
-#: aleksis/apps/chronos/models.py:393 aleksis/apps/chronos/models.py:452
-#: aleksis/apps/chronos/models.py:1080 aleksis/apps/chronos/models.py:1206
-#: aleksis/apps/chronos/tables.py:35
-#: aleksis/apps/chronos/templates/chronos/all.html:17
+#: aleksis/apps/chronos/models.py:352 aleksis/apps/chronos/models.py:422
+#: aleksis/apps/chronos/models.py:998 aleksis/apps/chronos/models.py:1137
+#: aleksis/apps/chronos/models.py:1338
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:3
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:28
-#: aleksis/apps/chronos/models.py:1082 aleksis/apps/chronos/models.py:1208
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:1
 msgid "Teachers"
 msgstr "Викладачі"
 
-#: aleksis/apps/chronos/models.py:399
+#: aleksis/apps/chronos/models.py:358
 msgid "Periods"
 msgstr "Години"
 
-#: aleksis/apps/chronos/models.py:401 aleksis/apps/chronos/models.py:1077
-#: aleksis/apps/chronos/models.py:1201 aleksis/apps/chronos/tables.py:34
-#: aleksis/apps/chronos/templates/chronos/all.html:31
-#: aleksis/apps/chronos/models.py:1079 aleksis/apps/chronos/models.py:1203
+#: aleksis/apps/chronos/models.py:360 aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1132 aleksis/apps/chronos/models.py:1326
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:1
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:26
 msgid "Groups"
 msgstr "Групи"
 
-#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
-#: aleksis/apps/chronos/models.py:795
+#: aleksis/apps/chronos/models.py:394 aleksis/apps/chronos/models.py:490
+#: aleksis/apps/chronos/models.py:716 aleksis/apps/chronos/models.py:1430
+#: aleksis/apps/chronos/models.py:1454
 msgid "Lesson"
 msgstr "Урок"
 
-#: aleksis/apps/chronos/models.py:425
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:9
-#: aleksis/apps/chronos/templates/chronos/lessons_day.html:19
+#: aleksis/apps/chronos/models.py:395 aleksis/apps/chronos/models.py:1306
 msgid "Lessons"
 msgstr "Уроки"
 
-#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1185
-#: aleksis/apps/chronos/models.py:1187
+#: aleksis/apps/chronos/models.py:403 aleksis/apps/chronos/models.py:1116
 msgid "Week"
 msgstr "Тиждень"
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1186
-#: aleksis/apps/chronos/models.py:1188
+#: aleksis/apps/chronos/models.py:404 aleksis/apps/chronos/models.py:1117
 msgid "Year"
 msgstr "Рік"
 
-#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
+#: aleksis/apps/chronos/models.py:407 aleksis/apps/chronos/models.py:620
 msgid "Lesson period"
 msgstr "Урок за розкладом"
 
-#: aleksis/apps/chronos/models.py:456
+#: aleksis/apps/chronos/models.py:425 aleksis/apps/chronos/models.py:504
+#: aleksis/apps/chronos/models.py:673 aleksis/apps/chronos/models.py:1144
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:30
+msgid "Room"
+msgstr "Кімната"
+
+#: aleksis/apps/chronos/models.py:428
 msgid "Cancelled?"
 msgstr "Скасовано?"
 
-#: aleksis/apps/chronos/models.py:458
+#: aleksis/apps/chronos/models.py:430
 msgid "Cancelled for teachers?"
 msgstr "Скасовано для викладачів?"
 
-#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
-#: aleksis/apps/chronos/models.py:813 aleksis/apps/chronos/models.py:1216
-#: aleksis/apps/chronos/models.py:815 aleksis/apps/chronos/models.py:1218
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:692
+#: aleksis/apps/chronos/models.py:734 aleksis/apps/chronos/models.py:1147
+#: aleksis/apps/chronos/models.py:1357
 msgid "Comment"
 msgstr "Коментар"
 
-#: aleksis/apps/chronos/models.py:465
+#: aleksis/apps/chronos/models.py:437
 msgid "Lessons can only be either substituted or cancelled."
 msgstr "Уроки можуть бути лише або замінені, або скасовані."
 
-#: aleksis/apps/chronos/models.py:506
+#: aleksis/apps/chronos/models.py:477
 msgid "Lesson substitution"
 msgstr "Заміна уроку"
 
-#: aleksis/apps/chronos/models.py:507
+#: aleksis/apps/chronos/models.py:478
 msgid "Lesson substitutions"
 msgstr "Заміни уроків"
 
-#: aleksis/apps/chronos/models.py:655
+#: aleksis/apps/chronos/models.py:621
 msgid "Lesson periods"
 msgstr "Навчальні години"
 
-#: aleksis/apps/chronos/models.py:693
-msgid "Timetable widget"
-msgstr "Віджет розкладу"
-
-#: aleksis/apps/chronos/models.py:694
-msgid "Timetable widgets"
-msgstr "Віджети розкладу"
-
-#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
+#: aleksis/apps/chronos/models.py:635 aleksis/apps/chronos/models.py:648
 msgid "Absence reason"
 msgstr "Причина відсутності"
 
-#: aleksis/apps/chronos/models.py:709
+#: aleksis/apps/chronos/models.py:636
 msgid "Absence reasons"
 msgstr "Причини відсутності"
 
-#: aleksis/apps/chronos/models.py:735 aleksis/apps/chronos/models.py:974
-#: aleksis/apps/chronos/models.py:1025
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:46
-#: aleksis/apps/chronos/models.py:976 aleksis/apps/chronos/models.py:1027
+#: aleksis/apps/chronos/models.py:657 aleksis/apps/chronos/models.py:889
+#: aleksis/apps/chronos/models.py:943
 msgid "Teacher"
 msgstr "Викладач"
 
-#: aleksis/apps/chronos/models.py:743
+#: aleksis/apps/chronos/models.py:665
 msgid "Group"
 msgstr "Група"
 
-#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
+#: aleksis/apps/chronos/models.py:681 aleksis/apps/chronos/models.py:723
 msgid "Start period"
 msgstr "Початок уроків"
 
-#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:808
-#: aleksis/apps/chronos/models.py:809
+#: aleksis/apps/chronos/models.py:688 aleksis/apps/chronos/models.py:729
 msgid "End period"
 msgstr "Закінчення уроків"
 
-#: aleksis/apps/chronos/models.py:780
+#: aleksis/apps/chronos/models.py:702
 msgid "Unknown absence"
 msgstr "Відсутність без пояснень"
 
-#: aleksis/apps/chronos/models.py:786
+#: aleksis/apps/chronos/models.py:707
 msgid "Absence"
 msgstr "Відсутність"
 
-#: aleksis/apps/chronos/models.py:787
+#: aleksis/apps/chronos/models.py:708
 msgid "Absences"
 msgstr "Відсутності"
 
-#: aleksis/apps/chronos/models.py:798
+#: aleksis/apps/chronos/models.py:719
 msgid "Date of exam"
 msgstr "Дата іспиту"
 
-#: aleksis/apps/chronos/models.py:812 aleksis/apps/chronos/models.py:826
-#: aleksis/apps/chronos/models.py:1059 aleksis/apps/chronos/models.py:814
-#: aleksis/apps/chronos/models.py:828 aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:733 aleksis/apps/chronos/models.py:746
+#: aleksis/apps/chronos/models.py:977
 msgid "Title"
 msgstr "Назва"
 
-#: aleksis/apps/chronos/models.py:819 aleksis/apps/chronos/models.py:821
+#: aleksis/apps/chronos/models.py:739
 msgid "Exam"
 msgstr "Іспит"
 
-#: aleksis/apps/chronos/models.py:820 aleksis/apps/chronos/models.py:822
+#: aleksis/apps/chronos/models.py:740
 msgid "Exams"
 msgstr "Іспити"
 
-#: aleksis/apps/chronos/models.py:829 aleksis/apps/chronos/models.py:831
+#: aleksis/apps/chronos/models.py:749
 msgid "Comments"
 msgstr "Коментарі"
 
-#: aleksis/apps/chronos/models.py:868 aleksis/apps/chronos/models.py:870
+#: aleksis/apps/chronos/models.py:788
 msgid "Holiday"
 msgstr "Вихідний"
 
-#: aleksis/apps/chronos/models.py:869 aleksis/apps/chronos/models.py:871
+#: aleksis/apps/chronos/models.py:789
 msgid "Holidays"
 msgstr "Вихідні"
 
-#: aleksis/apps/chronos/models.py:883 aleksis/apps/chronos/models.py:964
-#: aleksis/apps/chronos/models.py:885 aleksis/apps/chronos/models.py:966
+#: aleksis/apps/chronos/models.py:803 aleksis/apps/chronos/models.py:879
 msgid "Supervision area"
 msgstr "Зона контролю"
 
-#: aleksis/apps/chronos/models.py:884 aleksis/apps/chronos/models.py:886
+#: aleksis/apps/chronos/models.py:804
 msgid "Supervision areas"
 msgstr "Зони контролю"
 
-#: aleksis/apps/chronos/models.py:901 aleksis/apps/chronos/models.py:903
+#: aleksis/apps/chronos/models.py:816
 msgid "Time period after break starts"
 msgstr "Навчання після перерви починається"
 
-#: aleksis/apps/chronos/models.py:909 aleksis/apps/chronos/models.py:911
+#: aleksis/apps/chronos/models.py:824
 msgid "Time period before break ends"
 msgstr "Навчання перед перервою закінчується"
 
-#: aleksis/apps/chronos/models.py:949 aleksis/apps/chronos/models.py:968
-#: aleksis/apps/chronos/models.py:951 aleksis/apps/chronos/models.py:970
+#: aleksis/apps/chronos/models.py:864 aleksis/apps/chronos/models.py:883
 msgid "Break"
 msgstr "Перерва"
 
-#: aleksis/apps/chronos/models.py:950 aleksis/apps/chronos/models.py:952
+#: aleksis/apps/chronos/models.py:865
 msgid "Breaks"
 msgstr "Перерви"
 
-#: aleksis/apps/chronos/models.py:1005 aleksis/apps/chronos/models.py:1018
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:23
-#: aleksis/apps/chronos/templates/chronos/partials/supervision.html:15
-#: aleksis/apps/chronos/models.py:1007 aleksis/apps/chronos/models.py:1020
+#: aleksis/apps/chronos/models.py:923 aleksis/apps/chronos/models.py:936
+#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:3
 msgid "Supervision"
 msgstr "Контроль"
 
-#: aleksis/apps/chronos/models.py:1006 aleksis/apps/chronos/models.py:1008
+#: aleksis/apps/chronos/models.py:924 aleksis/apps/chronos/models.py:1622
 msgid "Supervisions"
 msgstr "Контролі"
 
-#: aleksis/apps/chronos/models.py:1014 aleksis/apps/chronos/models.py:1016
+#: aleksis/apps/chronos/models.py:932
 msgid "Date"
 msgstr "Дата"
 
-#: aleksis/apps/chronos/models.py:1048 aleksis/apps/chronos/models.py:1050
+#: aleksis/apps/chronos/models.py:966
 msgid "Supervision substitution"
 msgstr "Заміна контролю"
 
-#: aleksis/apps/chronos/models.py:1049 aleksis/apps/chronos/models.py:1051
+#: aleksis/apps/chronos/models.py:967
 msgid "Supervision substitutions"
 msgstr "Заміни контролю"
 
-#: aleksis/apps/chronos/models.py:1067 aleksis/apps/chronos/models.py:1069
+#: aleksis/apps/chronos/models.py:985
 msgid "Start time period"
 msgstr "Початок навчання"
 
-#: aleksis/apps/chronos/models.py:1073 aleksis/apps/chronos/models.py:1075
+#: aleksis/apps/chronos/models.py:991
 msgid "End time period"
 msgstr "Закінчення навчання"
 
-#: aleksis/apps/chronos/models.py:1087 aleksis/apps/chronos/models.py:1089
+#: aleksis/apps/chronos/models.py:996 aleksis/apps/chronos/models.py:1332
+#: aleksis/apps/chronos/templates/chronos/lesson_event_description.txt:4
+msgid "Rooms"
+msgstr "Кімнати"
+
+#: aleksis/apps/chronos/models.py:1005
 #, python-brace-format
 msgid "Event {pk}"
 msgstr "Подія {pk}"
 
-#: aleksis/apps/chronos/models.py:1172
-#: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
-#: aleksis/apps/chronos/models.py:1174
+#: aleksis/apps/chronos/models.py:1103
 msgid "Event"
 msgstr "Подія"
 
-#: aleksis/apps/chronos/models.py:1173 aleksis/apps/chronos/models.py:1175
+#: aleksis/apps/chronos/models.py:1104
 msgid "Events"
 msgstr "Події"
 
-#: aleksis/apps/chronos/models.py:1221
+#: aleksis/apps/chronos/models.py:1152
 msgid "Related exam"
 msgstr "Пов'язані іспити"
 
-#: aleksis/apps/chronos/models.py:1251 aleksis/apps/chronos/models.py:1244
+#: aleksis/apps/chronos/models.py:1181
 msgid "Extra lesson"
 msgstr "Додатковий урок"
 
-#: aleksis/apps/chronos/models.py:1252 aleksis/apps/chronos/models.py:1245
+#: aleksis/apps/chronos/models.py:1182
 msgid "Extra lessons"
 msgstr "Додаткові уроки"
 
-#: aleksis/apps/chronos/models.py:1264 aleksis/apps/chronos/models.py:1257
+#: aleksis/apps/chronos/models.py:1194
 msgid "Number of days shown in the plan"
 msgstr "Кількість днів для відображення у плані"
 
-#: aleksis/apps/chronos/models.py:1268 aleksis/apps/chronos/models.py:1261
+#: aleksis/apps/chronos/models.py:1198
 msgid "Show header box"
 msgstr "Показати заголовок"
 
-#: aleksis/apps/chronos/models.py:1269 aleksis/apps/chronos/preferences.py:61
-#: aleksis/apps/chronos/models.py:1262
+#: aleksis/apps/chronos/models.py:1199 aleksis/apps/chronos/preferences.py:100
 msgid "The header box shows affected teachers/groups."
 msgstr "Заголовок показує викладачів/групи на яких це впливає."
 
-#: aleksis/apps/chronos/models.py:1276 aleksis/apps/chronos/models.py:1269
+#: aleksis/apps/chronos/models.py:1206
 msgid "Revision which triggered the last update"
 msgstr "Ревізія, яка запустила останнє оновлення"
 
-#: aleksis/apps/chronos/models.py:1337 aleksis/apps/chronos/models.py:1330
+#: aleksis/apps/chronos/models.py:1278
 msgid "Automatic plan"
 msgstr "Автоматичний план"
 
-#: aleksis/apps/chronos/models.py:1338 aleksis/apps/chronos/models.py:1331
+#: aleksis/apps/chronos/models.py:1279
 msgid "Automatic plans"
 msgstr "Автоматичні плани"
 
-#: aleksis/apps/chronos/models.py:1352 aleksis/apps/chronos/models.py:1345
+#: aleksis/apps/chronos/models.py:1293
 msgid "Can view all room timetables"
 msgstr "Може переглядати розклади усіх кімнат"
 
-#: aleksis/apps/chronos/models.py:1353 aleksis/apps/chronos/models.py:1346
+#: aleksis/apps/chronos/models.py:1294
 msgid "Can view all group timetables"
 msgstr "Може переглядати розклади усіх груп"
 
-#: aleksis/apps/chronos/models.py:1354 aleksis/apps/chronos/models.py:1347
+#: aleksis/apps/chronos/models.py:1295
 msgid "Can view all person timetables"
 msgstr "Може переглядати розклади усіх осіб"
 
-#: aleksis/apps/chronos/models.py:1355 aleksis/apps/chronos/models.py:1348
+#: aleksis/apps/chronos/models.py:1296
 msgid "Can view timetable overview"
 msgstr "Може переглядати загальний розклад"
 
-#: aleksis/apps/chronos/models.py:1356 aleksis/apps/chronos/models.py:1349
+#: aleksis/apps/chronos/models.py:1297
 msgid "Can view all lessons per day"
 msgstr "Може переглядати усі уроки окремого дня"
 
-#: aleksis/apps/chronos/preferences.py:18
-msgid "Use parent groups in timetable views"
-msgstr "Використовувати батьківські групи в огляді розкладу"
+#: aleksis/apps/chronos/models.py:1298
+#, fuzzy
+#| msgid "Can view all lessons per day"
+msgid "Can view all supervisions per day"
+msgstr "Може переглядати усі уроки окремого дня"
 
-#: aleksis/apps/chronos/preferences.py:20
-msgid ""
-"If an lesson or substitution has only one group and this group has parent "
-"groups, show the parent groups instead of the original group."
+#: aleksis/apps/chronos/models.py:1313
+#, fuzzy
+#| msgid "Start time"
+msgid "Start slot number"
+msgstr "Час початку"
+
+#: aleksis/apps/chronos/models.py:1316
+#, fuzzy
+#| msgid "End time"
+msgid "End slot number"
+msgstr "Час закінчення"
+
+#: aleksis/apps/chronos/models.py:1320
+msgid "Course"
 msgstr ""
-"Якщо урок або заміна має лише одну групу і ця група має батьківські групи, "
-"відображати ці батьківські групи замість дійсної групи."
+
+#: aleksis/apps/chronos/models.py:1353
+#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
+msgid "Cancelled"
+msgstr "Скасовано"
+
+#: aleksis/apps/chronos/models.py:1401 aleksis/apps/chronos/models.py:1413
+#: aleksis/apps/chronos/models.py:1425
+msgid "{} (instead of {})"
+msgstr ""
+
+#: aleksis/apps/chronos/models.py:1614
+#, fuzzy
+#| msgid "Lesson"
+msgid "Lesson Event"
+msgstr "Урок"
+
+#: aleksis/apps/chronos/models.py:1615
+#, fuzzy
+#| msgid "Lessons"
+msgid "Lesson Events"
+msgstr "Уроки"
+
+#: aleksis/apps/chronos/models.py:1630
+#, fuzzy
+#| msgid "Supervision"
+msgid "Supervision: {}"
+msgstr "Контроль"
+
+#: aleksis/apps/chronos/preferences.py:21
+msgid "Timetables"
+msgstr "Розклади"
+
+#: aleksis/apps/chronos/preferences.py:29
+msgid "Use parent groups in timetable views"
+msgstr "Використовувати батьківські групи в огляді розкладу"
 
 #: aleksis/apps/chronos/preferences.py:31
+#, fuzzy
+#| msgid "If an lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
+msgid "If a lesson or substitution has only one group and this group has parent groups, show the parent groups instead of the original group."
+msgstr "Якщо урок або заміна має лише одну групу і ця група має батьківські групи, відображати ці батьківські групи замість дійсної групи."
+
+#: aleksis/apps/chronos/preferences.py:42
 msgid "Shorten groups in timetable views"
 msgstr "Скорочувати групи в огляді розкладу"
 
-#: aleksis/apps/chronos/preferences.py:32
+#: aleksis/apps/chronos/preferences.py:43
 msgid "If there are more groups than the set limit, they will be collapsed."
 msgstr "Якщо груп більше за встановлений ліміт, вони будуть згруповані."
 
-#: aleksis/apps/chronos/preferences.py:40
+#: aleksis/apps/chronos/preferences.py:51
 msgid "Limit of groups for shortening of groups"
 msgstr "Ліміт груп для скорочення груп"
 
-#: aleksis/apps/chronos/preferences.py:42
-msgid ""
-"If an user activates shortening of groups,they will be collapsed if there "
-"are more groups than this limit."
+#: aleksis/apps/chronos/preferences.py:53
+#, fuzzy
+#| msgid "If an user activates shortening of groups,they will be collapsed if there are more groups than this limit."
+msgid "If a user activates shortening of groups,they will be collapsed if there are more groups than this limit."
+msgstr "Якщо користувач активує скорочення груп, і кількість груп буде більше за ліміт, вони згруповуватимуться."
+
+#: aleksis/apps/chronos/preferences.py:65
+#, fuzzy
+#| msgid "Lesson substitutions"
+msgid "Relevant days for substitution plans"
+msgstr "Заміни уроків"
+
+#: aleksis/apps/chronos/preferences.py:82
+msgid "Time when substitution plans switch to the next day"
 msgstr ""
-"Якщо користувач активує скорочення груп, і кількість груп буде більше за "
-"ліміт, вони згруповуватимуться."
 
-#: aleksis/apps/chronos/preferences.py:52
+#: aleksis/apps/chronos/preferences.py:91
 msgid "Number of days shown on substitutions print view"
 msgstr "Кількість днів для відображення у друкованому вигляді замін"
 
-#: aleksis/apps/chronos/preferences.py:60
+#: aleksis/apps/chronos/preferences.py:99
 msgid "Show header box in substitution views"
 msgstr "Відображати заголовок в огляді замін"
 
-#: aleksis/apps/chronos/preferences.py:70
-msgid ""
-"Show parent groups in header box in substitution views instead of original "
-"groups"
-msgstr ""
-"У заголовку в огляді замін відображати батьківські групи замість дійсних груп"
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Show parent groups in header box in substitution views instead of original groups"
+msgstr "У заголовку в огляді замін відображати батьківські групи замість дійсних груп"
 
-#: aleksis/apps/chronos/preferences.py:79
-msgid ""
-"How many days in advance users should be notified about timetable changes?"
-msgstr ""
-"За скільки днів потрібно інформувати користувачів щодо змін у розкладі?"
+#: aleksis/apps/chronos/preferences.py:118
+msgid "How many days in advance users should be notified about timetable changes?"
+msgstr "За скільки днів потрібно інформувати користувачів щодо змін у розкладі?"
 
-#: aleksis/apps/chronos/preferences.py:87
+#: aleksis/apps/chronos/preferences.py:126
 msgid "Time for sending notifications about timetable changes"
 msgstr "Час для надсилання сповіщень щодо змін у розкладі"
 
-#: aleksis/apps/chronos/preferences.py:90
-msgid ""
-"This is only used for scheduling notifications which doesn't affect the time "
-"period configured above. All other notifications affecting the next days are "
-"sent immediately."
-msgstr ""
-"Це використовується лише для планування сповіщень, які не впливають на "
-"навчальний час, встановлений вище. Усі інші сповіщення, які впливають на "
-"найближчі дні, надсилаються негайно."
+#: aleksis/apps/chronos/preferences.py:129
+msgid "This is only used for scheduling notifications which doesn't affect the time period configured above. All other notifications affecting the next days are sent immediately."
+msgstr "Це використовується лише для планування сповіщень, які не впливають на навчальний час, встановлений вище. Усі інші сповіщення, які впливають на найближчі дні, надсилаються негайно."
 
-#: aleksis/apps/chronos/preferences.py:101
-#: aleksis/apps/chronos/preferences.py:109
+#: aleksis/apps/chronos/preferences.py:140
+#: aleksis/apps/chronos/preferences.py:148
 msgid "Send notifications for current timetable changes"
 msgstr "Надіслати сповіщення щодо поточних змін у розкладі"
 
-#: aleksis/apps/chronos/tables.py:41
-msgid "Substitution"
-msgstr "Заміна"
-
-#: aleksis/apps/chronos/tables.py:43
-msgid "Manage substitution"
-msgstr "Керування замінами"
-
-#: aleksis/apps/chronos/templates/chronos/all.html:25
-msgid "No teachers timetables available."
-msgstr "Розклади викладачів недоступні."
-
-#: aleksis/apps/chronos/templates/chronos/all.html:39
-msgid "No group timetables available."
-msgstr "Розклади груп недоступні."
-
-#: aleksis/apps/chronos/templates/chronos/all.html:53
-msgid "No room timetables available."
-msgstr "Розклади кімнат недоступні."
-
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:11
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:6
-msgid "Edit substitution."
-msgstr "Редагувати заміну."
-
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:12
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:7
-msgid "Edit substitution"
-msgstr "Редагувати заміну"
+#: aleksis/apps/chronos/preferences.py:158
+#, fuzzy
+#| msgid "Shorten groups in timetable views"
+msgid "Group types to show in timetables"
+msgstr "Скорочувати групи в огляді розкладу"
 
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:25
-#: aleksis/apps/chronos/templates/chronos/edit_substitution.html:20
-msgid "Delete"
-msgstr "Видалити"
+#: aleksis/apps/chronos/preferences.py:159
+msgid "If you leave it empty, all groups will be shown."
+msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:19
-#: aleksis/apps/chronos/templates/chronos/timetable.html:50
-msgid "SMART PLAN"
-msgstr "SMART PLAN"
+#: aleksis/apps/chronos/preferences.py:169
+msgid "Lesson calendar feed color"
+msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/my_timetable.html:22
-msgid "Show week timetable for"
-msgstr "Відобразити тижневий розклад для"
+#: aleksis/apps/chronos/preferences.py:181
+#, fuzzy
+#| msgid "Supervision area"
+msgid "Supervision calendar feed color"
+msgstr "Зона контролю"
 
 #: aleksis/apps/chronos/templates/chronos/partials/headerbox.html:10
 msgid "Absent teachers"
@@ -605,105 +552,47 @@ msgstr "На яких викладачів впливає"
 msgid "Affected groups"
 msgstr "На які групи впливає"
 
-#: aleksis/apps/chronos/templates/chronos/partials/lesson.html:27
-msgid "Cancelled due to an event"
-msgstr "Скасовано через подію"
-
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:4
-msgid "Cancelled"
-msgstr "Скасовано"
+#: aleksis/apps/chronos/templates/chronos/partials/subs/period.html:12
+msgid "all day"
+msgstr ""
 
-#: aleksis/apps/chronos/templates/chronos/partials/subs/badge.html:6
-msgid "Cancelled for teachers"
-msgstr "Скасовано для викладачів"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
+msgid "Print: Substitutions"
+msgstr "Друк: Заміни"
 
-#: aleksis/apps/chronos/templates/chronos/partials/today.html:2
-msgid "Today"
-msgstr "Сьогодні"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:12
+msgid "Substitutions"
+msgstr "Заміни"
 
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:14
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:25
-#: aleksis/apps/chronos/templates/chronos/partials/week_select.html:36
-msgid "CW"
-msgstr "ТЖ"
+#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:27
+#, fuzzy
+#| msgid "Timetable"
+msgid "Time"
+msgstr "Розклад"
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:49
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:31
 msgid "Notes"
 msgstr "Нотатки"
 
-#: aleksis/apps/chronos/templates/chronos/substitutions.html:57
 #: aleksis/apps/chronos/templates/chronos/substitutions_print.html:41
 msgid "No substitutions available."
 msgstr "Заміни недоступні."
 
-#: aleksis/apps/chronos/templates/chronos/substitutions_print.html:11
-msgid "Print: Substitutions"
-msgstr "Друк: Заміни"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:11
-#: aleksis/apps/chronos/templates/chronos/timetable.html:24
-#: aleksis/apps/chronos/templates/chronos/timetable_print.html:11
-#: aleksis/apps/chronos/util/notifications.py:206
-msgid "Timetable"
-msgstr "Розклад"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:29
-msgid "Group teachers:"
-msgstr "Викладачі груп:"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:55
-msgid "Show regular timetable"
-msgstr "Відобразити звичайний розклад"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:63
-#: aleksis/apps/chronos/templates/chronos/timetable.html:84
-msgid "View class register of this week"
-msgstr "Огляд класного журналу за цей тиждень"
-
-#: aleksis/apps/chronos/templates/chronos/timetable.html:76
-msgid "Show SMART PLAN"
-msgstr "Відобразити SMART PLAN"
-
-#: aleksis/apps/chronos/templates/chronos/widget.html:8
-#, python-format
-msgid ""
-"\n"
-"        My timetable for %(day)s\n"
-"      "
-msgstr ""
-"\n"
-"        Мій розклад на %(day)s\n"
-"      "
-
-#: aleksis/apps/chronos/templates/chronos/widget.html:18
-msgid ""
-"\n"
-"          There is no timetable linked to your person.\n"
-"          "
+#: aleksis/apps/chronos/templates/chronos/supervision_event_description.txt:2
+msgid "Areas"
 msgstr ""
-"\n"
-"          До Вашої особи жодного журналу не прив'язано.\n"
-"          "
 
-#: aleksis/apps/chronos/templates/chronos/widget.html:27
-msgid "Go to smart plan"
-msgstr "Перейти до SMART PLAN"
-
-#: aleksis/apps/chronos/util/notifications.py:50
+#: aleksis/apps/chronos/util/notifications.py:48
 #, python-brace-format
-msgid ""
-"The {subject} lesson in the {period}. period on {day} has been cancelled."
+msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
 msgstr "Урок {subject} на {period} уроці у {day} скасований."
 
-#: aleksis/apps/chronos/util/notifications.py:57
+#: aleksis/apps/chronos/util/notifications.py:55
 #, python-brace-format
-msgid ""
-"The {subject} lesson in the {period}. period on {day} has some current "
-"changes."
+msgid "The {subject} lesson in the {period}. period on {day} has some current changes."
 msgstr "Урок {subject} на {period} уроці у {day} зараз дещо змінений."
 
-#: aleksis/apps/chronos/util/notifications.py:66
+#: aleksis/apps/chronos/util/notifications.py:64
 #, python-brace-format
 msgid "The teacher {old} is substituted by {new}."
 msgid_plural "The teachers {old} are substituted by {new}."
@@ -712,96 +601,189 @@ msgstr[1] "Викладачі {old} замінені викладачами {new
 msgstr[2] "Викладачі {old} замінені викладачами {new}."
 msgstr[3] "Викладачі {old} замінені викладачами {new}."
 
-#: aleksis/apps/chronos/util/notifications.py:78
+#: aleksis/apps/chronos/util/notifications.py:76
 #, python-brace-format
 msgid "The subject is changed to {subject}."
 msgstr "Предмет замінений на {subject}."
 
-#: aleksis/apps/chronos/util/notifications.py:84
+#: aleksis/apps/chronos/util/notifications.py:82
 #, python-brace-format
 msgid "The lesson is moved from {old} to {new}."
 msgstr "Урок перенесений з {old} до {new}."
 
-#: aleksis/apps/chronos/util/notifications.py:93
+#: aleksis/apps/chronos/util/notifications.py:91
 #, python-brace-format
 msgid "There is an additional comment: {comment}."
 msgstr "Маємо додатковий коментар: {comment}."
 
-#: aleksis/apps/chronos/util/notifications.py:101
+#: aleksis/apps/chronos/util/notifications.py:99
 #, python-brace-format
-msgid ""
-"There is an event that starts on {date_start}, {period_from}. period and "
-"ends on {date_end}, {period_to}. period:"
-msgstr ""
-"Маємо подію, яка розпочинається {date_start}, на {period_from}. уроці та "
-"закінчується {date_end}, на {period_to}. уроці:"
+msgid "There is an event that starts on {date_start}, {period_from}. period and ends on {date_end}, {period_to}. period:"
+msgstr "Маємо подію, яка розпочинається {date_start}, на {period_from}. уроці та закінчується {date_end}, на {period_to}. уроці:"
 
-#: aleksis/apps/chronos/util/notifications.py:114
+#: aleksis/apps/chronos/util/notifications.py:112
 #, python-brace-format
-msgid ""
-"There is an event on {date} from the {period_from}. period to the "
-"{period_to}. period:"
-msgstr ""
-"Маємо подію на {date} з {period_from}. уроку до кінця {period_to}. уроку:"
+msgid "There is an event on {date} from the {period_from}. period to the {period_to}. period:"
+msgstr "Маємо подію на {date} з {period_from}. уроку до кінця {period_to}. уроку:"
 
-#: aleksis/apps/chronos/util/notifications.py:125
-#: aleksis/apps/chronos/util/notifications.py:145
+#: aleksis/apps/chronos/util/notifications.py:123
+#: aleksis/apps/chronos/util/notifications.py:143
 #, python-brace-format
 msgid "Groups: {groups}"
 msgstr "Групи: {groups}"
 
-#: aleksis/apps/chronos/util/notifications.py:127
-#: aleksis/apps/chronos/util/notifications.py:149
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:147
 #, python-brace-format
 msgid "Teachers: {teachers}"
 msgstr "Викладачі: {teachers}"
 
-#: aleksis/apps/chronos/util/notifications.py:130
+#: aleksis/apps/chronos/util/notifications.py:128
 #, python-brace-format
 msgid "Rooms: {rooms}"
 msgstr "Кімнати: {rooms}"
 
-#: aleksis/apps/chronos/util/notifications.py:137
+#: aleksis/apps/chronos/util/notifications.py:135
 #, python-brace-format
 msgid "There is an extra lesson on {date} in the {period}. period:"
 msgstr "Маємо додатковий урок {date} на {period}. уроці:"
 
-#: aleksis/apps/chronos/util/notifications.py:147
+#: aleksis/apps/chronos/util/notifications.py:145
 #, python-brace-format
 msgid "Subject: {subject}"
 msgstr "Предмет: {subject}"
 
-#: aleksis/apps/chronos/util/notifications.py:151
+#: aleksis/apps/chronos/util/notifications.py:149
 #, python-brace-format
 msgid "Room: {room}"
 msgstr "Кімната: {room}"
 
-#: aleksis/apps/chronos/util/notifications.py:153
+#: aleksis/apps/chronos/util/notifications.py:151
 #, python-brace-format
 msgid "Comment: {comment}."
 msgstr "Коментар: {comment}."
 
-#: aleksis/apps/chronos/util/notifications.py:156
+#: aleksis/apps/chronos/util/notifications.py:154
 #, python-brace-format
-msgid ""
-"The supervision of {old} on {date} between the {period_from}. period and the "
-"{period_to}. period in the area {area} is substituted by {new}."
-msgstr ""
-"Контроль {old}, {date} між {period_from}. та {period_to}. уроками у зоні "
-"{area} замінений на {new}."
+msgid "The supervision of {old} on {date} between the {period_from}. period and the {period_to}. period in the area {area} is substituted by {new}."
+msgstr "Контроль {old}, {date} між {period_from}. та {period_to}. уроками у зоні {area} замінений на {new}."
 
-#: aleksis/apps/chronos/util/notifications.py:207
+#: aleksis/apps/chronos/util/notifications.py:204
+msgid "Timetable"
+msgstr "Розклад"
+
+#: aleksis/apps/chronos/util/notifications.py:205
 msgid "There are current changes to your timetable."
 msgstr "У Вашому розкладі є зміни."
 
-#: aleksis/apps/chronos/views.py:270
-msgid "The substitution has been saved."
-msgstr "Заміна збережена."
+#~ msgid "Options for timetables"
+#~ msgstr "Опції для розкладів"
+
+#~ msgid "Optional data for timetables"
+#~ msgstr "Додаткові дані для розкладів"
+
+#~ msgid "My timetable"
+#~ msgstr "Мій розклад"
+
+#~ msgid "All timetables"
+#~ msgstr "Усі розклади"
+
+#~ msgid "Daily lessons"
+#~ msgstr "Щоденні уроки"
+
+#~ msgid "Show announcement in timetable views?"
+#~ msgstr "Відображати оголошення з переглядом розкладу?"
+
+#~ msgid "Can view room timetable"
+#~ msgstr "Може переглядати розклад кімнати"
+
+#~ msgid "Timetable widget"
+#~ msgstr "Віджет розкладу"
 
-#: aleksis/apps/chronos/views.py:291
-msgid "The substitution has been deleted."
-msgstr "Заміна видалена."
+#~ msgid "Timetable widgets"
+#~ msgstr "Віджети розкладу"
 
-#: aleksis/apps/chronos/templates/chronos/timetable.html:84
-msgid "View class register of the current week"
-msgstr "Огляд класного журналу поточного тижня"
+#~ msgid "Substitution"
+#~ msgstr "Заміна"
+
+#~ msgid "Manage substitution"
+#~ msgstr "Керування замінами"
+
+#~ msgid "No teachers timetables available."
+#~ msgstr "Розклади викладачів недоступні."
+
+#~ msgid "No group timetables available."
+#~ msgstr "Розклади груп недоступні."
+
+#~ msgid "No room timetables available."
+#~ msgstr "Розклади кімнат недоступні."
+
+#~ msgid "Edit substitution."
+#~ msgstr "Редагувати заміну."
+
+#~ msgid "Edit substitution"
+#~ msgstr "Редагувати заміну"
+
+#~ msgid "Delete"
+#~ msgstr "Видалити"
+
+#~ msgid "SMART PLAN"
+#~ msgstr "SMART PLAN"
+
+#~ msgid "Show week timetable for"
+#~ msgstr "Відобразити тижневий розклад для"
+
+#~ msgid "Cancelled due to an event"
+#~ msgstr "Скасовано через подію"
+
+#~ msgid "Cancelled for teachers"
+#~ msgstr "Скасовано для викладачів"
+
+#~ msgid "Today"
+#~ msgstr "Сьогодні"
+
+#~ msgid "CW"
+#~ msgstr "ТЖ"
+
+#~ msgid "Group teachers:"
+#~ msgstr "Викладачі груп:"
+
+#~ msgid "Show regular timetable"
+#~ msgstr "Відобразити звичайний розклад"
+
+#~ msgid "View class register of this week"
+#~ msgstr "Огляд класного журналу за цей тиждень"
+
+#~ msgid "Show SMART PLAN"
+#~ msgstr "Відобразити SMART PLAN"
+
+#, python-format
+#~ msgid ""
+#~ "\n"
+#~ "        My timetable for %(day)s\n"
+#~ "      "
+#~ msgstr ""
+#~ "\n"
+#~ "        Мій розклад на %(day)s\n"
+#~ "      "
+
+#~ msgid ""
+#~ "\n"
+#~ "          There is no timetable linked to your person.\n"
+#~ "          "
+#~ msgstr ""
+#~ "\n"
+#~ "          До Вашої особи жодного журналу не прив'язано.\n"
+#~ "          "
+
+#~ msgid "Go to smart plan"
+#~ msgstr "Перейти до SMART PLAN"
+
+#~ msgid "The substitution has been saved."
+#~ msgstr "Заміна збережена."
+
+#~ msgid "The substitution has been deleted."
+#~ msgstr "Заміна видалена."
+
+#~ msgid "View class register of the current week"
+#~ msgstr "Огляд класного журналу поточного тижня"
diff --git a/aleksis/apps/chronos/managers.py b/aleksis/apps/chronos/managers.py
index ebda7f1eaedae20f3bee422df73a0c8853b2e428..600a20cae801604c76e7d992f8f07d30092dc696 100644
--- a/aleksis/apps/chronos/managers.py
+++ b/aleksis/apps/chronos/managers.py
@@ -9,13 +9,13 @@ from django.db.models.fields import DateField
 from django.db.models.functions import Concat
 
 from calendarweek import CalendarWeek
-from polymorphic.managers import PolymorphicQuerySet
 
 from aleksis.apps.chronos.util.date import week_weekday_from_date, week_weekday_to_date
 from aleksis.apps.cursus.models import Course
 from aleksis.core.managers import (
     AlekSISBaseManagerWithoutMigrations,
     DateRangeQuerySetMixin,
+    RecurrencePolymorphicQuerySet,
     SchoolTermRelatedQuerySet,
 )
 from aleksis.core.models import Group, Person, Room
@@ -866,7 +866,7 @@ class RoomPropertiesMixin:
         return sep.join([room.short_name for room in self.get_rooms()])
 
 
-class LessonEventQuerySet(PolymorphicQuerySet):
+class LessonEventQuerySet(RecurrencePolymorphicQuerySet):
     """Queryset with special query methods for lesson events."""
 
     def for_teacher(self, teacher: Union[int, Person]) -> "LessonEventQuerySet":
@@ -971,3 +971,11 @@ class LessonEventQuerySet(PolymorphicQuerySet):
     def not_amending(self) -> "LessonEventQuerySet":
         """Get all lesson events that are not amending other events."""
         return self.filter(amends__isnull=True)
+
+    def amending(self) -> "LessonEventQuerySet":
+        """Get all lesson events that are amending other events."""
+        return self.filter(amends__isnull=False)
+
+
+class SupervisionEventQuerySet(LessonEventQuerySet):
+    pass
diff --git a/aleksis/apps/chronos/migrations/0017_optional_slot_number.py b/aleksis/apps/chronos/migrations/0017_optional_slot_number.py
new file mode 100644
index 0000000000000000000000000000000000000000..6ea182cfb9cef39f76a8c65f79ccc106e5af4225
--- /dev/null
+++ b/aleksis/apps/chronos/migrations/0017_optional_slot_number.py
@@ -0,0 +1,23 @@
+# Generated by Django 5.0.7 on 2024-07-26 19:36
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('chronos', '0016_lessonevent'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='lessonevent',
+            name='slot_number_end',
+            field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='End slot number'),
+        ),
+        migrations.AddField(
+            model_name='lessonevent',
+            name='slot_number_start',
+            field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Start slot number'),
+        ),
+    ]
diff --git a/aleksis/apps/chronos/migrations/0017_add_substitution_global_permission.py b/aleksis/apps/chronos/migrations/0018_add_substitution_global_permission.py
similarity index 93%
rename from aleksis/apps/chronos/migrations/0017_add_substitution_global_permission.py
rename to aleksis/apps/chronos/migrations/0018_add_substitution_global_permission.py
index 1c34d2ef699d110b3f899f8505f814f55f564dfb..9f871f2021a519715355dfc99e6763438669f989 100644
--- a/aleksis/apps/chronos/migrations/0017_add_substitution_global_permission.py
+++ b/aleksis/apps/chronos/migrations/0018_add_substitution_global_permission.py
@@ -6,7 +6,7 @@ from django.db import migrations
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('chronos', '0016_lessonevent'),
+        ('chronos', '0017_optional_slot_number'),
     ]
 
     operations = [
diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py
index 8cb324f591a48a7a18b211f9d4e091375fd84062..e817203b759c519bda5362841ddbbf8be30763f2 100644
--- a/aleksis/apps/chronos/models.py
+++ b/aleksis/apps/chronos/models.py
@@ -42,6 +42,7 @@ from aleksis.apps.chronos.managers import (
     LessonPeriodQuerySet,
     LessonSubstitutionManager,
     LessonSubstitutionQuerySet,
+    SupervisionEventQuerySet,
     SupervisionManager,
     SupervisionQuerySet,
     SupervisionSubstitutionManager,
@@ -59,7 +60,10 @@ from aleksis.apps.chronos.util.format import format_m2m
 from aleksis.apps.cursus import models as cursus_models
 from aleksis.apps.cursus.models import Course
 from aleksis.apps.resint.models import LiveDocument
-from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations, PolymorphicBaseManager
+from aleksis.core.managers import (
+    AlekSISBaseManagerWithoutMigrations,
+    RecurrencePolymorphicManager,
+)
 from aleksis.core.mixins import (
     ExtensibleModel,
     GlobalPermissionModel,
@@ -1206,20 +1210,26 @@ class AutomaticPlan(LiveDocument):
     @property
     def current_start_day(self) -> date:
         """Get first day which should be shown in the PDF."""
-        return TimePeriod.get_next_relevant_day(timezone.now().date(), datetime.now().time())
+        from aleksis.apps.chronos.util.chronos_helpers import get_next_relevant_day
+
+        return get_next_relevant_day(timezone.now())
 
     @property
     def current_end_day(self) -> date:
         """Get last day which should be shown in the PDF."""
-        return self.current_start_day + timedelta(days=self.number_of_days - 1)
+        from aleksis.apps.chronos.util.chronos_helpers import get_next_relevant_day
+
+        day = self.current_start_day
+        for _i in range(self.number_of_days - 1):
+            day = get_next_relevant_day(day)
+        return day
 
     def get_context_data(self) -> dict[str, Any]:
         """Get context data for generating the substitutions PDF."""
         from aleksis.apps.chronos.util.chronos_helpers import get_substitutions_context_data  # noqa
 
         context = get_substitutions_context_data(
-            request=None,
-            is_print=True,
+            wanted_day=date.today(),
             number_of_days=self.number_of_days,
             show_header_box=self.show_header_box,
         )
@@ -1245,11 +1255,16 @@ class AutomaticPlan(LiveDocument):
                     continue
 
                 # Check if the changed object is relevant for the time period of the PDF file
-                if isinstance(version.object, Event):
+                if not version.object.amends:
+                    return
+
+                if version.object.datetime_start:
+                    date_start = version.object.datetime_start.date()
+                    date_end = version.object.datetime_end.date()
+                else:
                     date_start = version.object.date_start
                     date_end = version.object.date_end
-                else:
-                    date_start = date_end = version.object.date
+
                 if date_start <= self.current_end_day and date_end >= self.current_start_day:
                     update = True
                     break
@@ -1291,10 +1306,17 @@ class LessonEvent(CalendarEvent):
     name = "lesson"
     verbose_name = _("Lessons")
 
-    objects = PolymorphicBaseManager.from_queryset(LessonEventQuerySet)()
+    objects = RecurrencePolymorphicManager.from_queryset(LessonEventQuerySet)()
 
     title = models.CharField(verbose_name=_("Name"), max_length=255, blank=True)
 
+    slot_number_start = models.PositiveSmallIntegerField(
+        verbose_name=_("Start slot number"), blank=True, null=True
+    )
+    slot_number_end = models.PositiveSmallIntegerField(
+        verbose_name=_("End slot number"), blank=True, null=True
+    )
+
     course = models.ForeignKey(
         Course, on_delete=models.CASCADE, verbose_name=_("Course"), null=True, blank=True
     )
@@ -1491,6 +1513,8 @@ class LessonEvent(CalendarEvent):
             if reference_object.amends
             else None,
             "title": reference_object.title,
+            "slot_number_start": reference_object.slot_number_start,
+            "slot_number_end": reference_object.slot_number_end,
             "teachers": [
                 {
                     "id": t.pk,
@@ -1526,10 +1550,22 @@ class LessonEvent(CalendarEvent):
 
     @classmethod
     def get_objects(
-        cls, request: HttpRequest | None = None, params: dict[str, any] | None = None
+        cls,
+        request: HttpRequest | None = None,
+        params: dict[str, any] | None = None,
+        no_effect: bool = False,
+        **kwargs,
     ) -> Iterable:
         """Return all objects that should be included in the calendar."""
-        objs = super().get_objects(request, params).not_instance_of(SupervisionEvent)
+        if no_effect:
+            return super().get_objects(request, params, **kwargs)
+        objs = (
+            super()
+            .get_objects(request, params, **kwargs)
+            .not_instance_of(SupervisionEvent)
+            .select_related("subject", "course")
+            .prefetch_related("groups", "teachers", "rooms", "groups__members")
+        )
 
         if request and not has_person(request.user):
             raise PermissionDenied()
@@ -1540,6 +1576,7 @@ class LessonEvent(CalendarEvent):
             prefetch_absences = params.get("prefetch_absences", False)
             not_amended = params.get("not_amended", False)
             not_amending = params.get("not_amending", False)
+            amending = params.get("amending", False)
             own = params.get("own", False)
             all = params.get("all", False)
 
@@ -1552,6 +1589,9 @@ class LessonEvent(CalendarEvent):
             if not_amending:
                 objs = objs.not_amending()
 
+            if amending:
+                objs = objs.amending()
+
             if request and "own" in params:
                 if own:
                     objs = objs.for_person(request.user.person)
@@ -1674,7 +1714,7 @@ class SupervisionEvent(LessonEvent):
     name = "supervision"
     verbose_name = _("Supervisions")
 
-    objects = PolymorphicBaseManager.from_queryset(LessonEventQuerySet)()
+    objects = RecurrencePolymorphicManager.from_queryset(SupervisionEventQuerySet)()
 
     @classmethod
     def value_title(cls, reference_object: LessonEvent, request: HttpRequest | None = None) -> str:
@@ -1696,13 +1736,25 @@ class SupervisionEvent(LessonEvent):
 
     @classmethod
     def get_objects(
-        cls, request: HttpRequest | None = None, params: dict[str, any] | None = None
+        cls, request: HttpRequest | None = None, params: dict[str, any] | None = None, **kwargs
     ) -> Iterable:
         """Return all objects that should be included in the calendar."""
-        objs = cls.objects.instance_of(cls)
+        objs = super().get_objects(request, params, no_effect=True, **kwargs)
         if params:
             obj_id = int(params.get("id", 0))
             type_ = params.get("type", None)
+            not_amended = params.get("not_amended", False)
+            not_amending = params.get("not_amending", False)
+            amending = params.get("amending", False)
+
+            if not_amended:
+                objs = objs.not_amended()
+
+            if not_amending:
+                objs = objs.not_amending()
+
+            if amending:
+                objs = objs.amending()
 
             if type_ and obj_id:
                 if type_ == "TEACHER":
diff --git a/aleksis/apps/chronos/preferences.py b/aleksis/apps/chronos/preferences.py
index e75062cc2209c6a2affddbf2f52a45aaebd0f0d2..b3dc8362091693b313bda2d5f9493d8afa7e7701 100644
--- a/aleksis/apps/chronos/preferences.py
+++ b/aleksis/apps/chronos/preferences.py
@@ -1,13 +1,16 @@
 from datetime import time
 
+from django.core.exceptions import ValidationError
 from django.utils.translation import gettext_lazy as _
 
+from calendarweek.django import i18n_day_name_choices_lazy
 from colorfield.widgets import ColorWidget
 from dynamic_preferences.preferences import Section
 from dynamic_preferences.types import (
     BooleanPreference,
     IntegerPreference,
     ModelMultipleChoicePreference,
+    MultipleChoicePreference,
     StringPreference,
     TimePreference,
 )
@@ -52,6 +55,34 @@ class ShortenGroupsLimit(IntegerPreference):
     )
 
 
+@site_preferences_registry.register
+class SubstitutionsRelevantDays(MultipleChoicePreference):
+    """Relevant days which have substitution plans."""
+
+    section = chronos
+    name = "substitutions_relevant_days"
+    default = [0, 1, 2, 3, 4]
+    verbose_name = _("Relevant days for substitution plans")
+    required = True
+    choices = i18n_day_name_choices_lazy()
+
+    def validate(self, value):
+        for v in value:
+            if int(v) not in self.get_choice_values():
+                raise ValidationError(f"{v} is not a valid choice")
+
+
+@site_preferences_registry.register
+class SubstitutionsDayChangeTime(TimePreference):
+    """Time when substitution plans should switch to the next day."""
+
+    section = chronos
+    name = "substitutions_day_change_time"
+    default = time(18, 0)
+    verbose_name = _("Time when substitution plans switch to the next day")
+    required = True
+
+
 @site_preferences_registry.register
 class SubstitutionsPrintNumberOfDays(IntegerPreference):
     section = chronos
@@ -127,9 +158,6 @@ class GroupTypesTimetables(ModelMultipleChoicePreference):
     verbose_name = _("Group types to show in timetables")
     help_text = _("If you leave it empty, all groups will be shown.")
 
-    def get_queryset(self):
-        return GroupType.objects.managed_and_unmanaged()
-
 
 @site_preferences_registry.register
 class LessonEventFeedColor(StringPreference):
diff --git a/aleksis/apps/chronos/schema/__init__.py b/aleksis/apps/chronos/schema/__init__.py
index 6da805e05c64bee2f090b15c9515c68e382c4d12..537b36aa227212aea322203eec9c235f22e18790 100644
--- a/aleksis/apps/chronos/schema/__init__.py
+++ b/aleksis/apps/chronos/schema/__init__.py
@@ -7,15 +7,16 @@ from django.db.models import F, ManyToManyField, OuterRef, Subquery, Q, Prefetch
 
 import graphene
 from graphene_django import DjangoObjectType
-from graphene_django_cud.mutations import (
-    DjangoBatchCreateMutation,
-    DjangoBatchDeleteMutation,
-    DjangoBatchPatchMutation,
-)
 from reversion import create_revision, set_comment, set_user
 
 from aleksis.core.models import CalendarEvent, Group, Person, Room
-from aleksis.core.schema.base import DeleteMutation, FilterOrderList
+from aleksis.core.schema.base import (
+    BaseBatchCreateMutation,
+    BaseBatchDeleteMutation,
+    BaseBatchPatchMutation,
+    DeleteMutation,
+    FilterOrderList,
+)
 from aleksis.apps.cursus.models import Subject
 
 from ..models import LessonEvent
@@ -48,6 +49,9 @@ class LessonEventType(DjangoObjectType):
         model = LessonEvent
         fields = (
             "id",
+            "title",
+            "slot_number_start",
+            "slot_number_end",
             "amends",
             "datetime_start",
             "datetime_end",
@@ -95,27 +99,7 @@ class LessonEventType(DjangoObjectType):
         return []
 
 
-class DatetimeTimezoneMixin:
-    """Handle datetimes for mutations with CalendarEvent objects.
-
-    This is necessary because the client sends timezone information as
-    ISO string which only includes an offset (+00:00 UTC) and an
-    offset is not a valid timezone. Instead we set UTC as timezone
-    here directly.
-    """
-
-    @classmethod
-    def handle_datetime_start(cls, value, name, info) -> int:
-        value = value.replace(tzinfo=timezone.utc)
-        return value
-
-    @classmethod
-    def handle_datetime_end(cls, value, name, info) -> int:
-        value = value.replace(tzinfo=timezone.utc)
-        return value
-
-
-class AmendLessonBatchCreateMutation(DatetimeTimezoneMixin, DjangoBatchCreateMutation):
+class AmendLessonBatchCreateMutation(BaseBatchCreateMutation):
     class Meta:
         model = LessonEvent
         permissions = ("chronos.edit_substitution_rule",)
@@ -133,12 +117,13 @@ class AmendLessonBatchCreateMutation(DatetimeTimezoneMixin, DjangoBatchCreateMut
 
     @classmethod
     def before_save(cls, root, info, input, created_objects):  # noqa: A002
+        super().before_save(root, info, input, created_objects)
         for obj in created_objects:
             obj.timezone = obj.amends.timezone
         return created_objects
 
 
-class AmendLessonBatchPatchMutation(DatetimeTimezoneMixin, DjangoBatchPatchMutation):
+class AmendLessonBatchPatchMutation(BaseBatchPatchMutation):
     class Meta:
         model = LessonEvent
         permissions = ("chronos.edit_substitution_rule",)
@@ -146,12 +131,13 @@ class AmendLessonBatchPatchMutation(DatetimeTimezoneMixin, DjangoBatchPatchMutat
 
     @classmethod
     def before_save(cls, root, info, input, updated_objects):  # noqa: A002
+        super().before_save(root, info, input, updated_objects)
         for obj in updated_objects:
             obj.timezone = obj.amends.timezone
         return updated_objects
 
 
-class AmendLessonBatchDeleteMutation(DjangoBatchDeleteMutation):
+class AmendLessonBatchDeleteMutation(BaseBatchDeleteMutation):
     class Meta:
         model = LessonEvent
         permissions = ("chronos.delete_substitution_rule",)
diff --git a/aleksis/apps/chronos/templates/chronos/partials/datepicker.html b/aleksis/apps/chronos/templates/chronos/partials/datepicker.html
deleted file mode 100644
index f7d49f34e44569009b9af35aec1b0f26571773f4..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/datepicker.html
+++ /dev/null
@@ -1,30 +0,0 @@
-{% load static %}
-
-{% if not display_date_only %}
-  <script type="text/javascript" src="{% static "js/helper.js" %}"></script>
-  {{ datepicker|json_script:"datepicker_data" }}
-  <script type="text/javascript" src="{% static "js/chronos/date_select.js" %}"></script>
-{% endif %}
-
-<div class="col s2 no-padding">
-  <a class="waves-effect waves-secondary btn-flat btn-flat-medium left" href="{{ url_prev }}">
-    <i class="material-icons iconify center" data-icon="mdi:chevron-left"></i>
-  </a>
-</div>
-
-{% if display_date_only %}
-  <div class="col s8">
-    <span class="card-title center-block" id="date">
-        {{ day|date:"l" }}, {{ day }}
-    </span>
-  </div>
-{% else %}
-  <div class="col s8 no-padding">
-    <input type="text" class="datepicker center-align" id="date">
-  </div>
-{% endif %}
-<div class="col s2 no-padding">
-  <a class="waves-effect waves-secondary btn-flat btn-flat-medium right" href="{{ url_next }}">
-    <i class="material-icons iconify center" data-icon="mdi:chevron-right"></i>
-  </a>
-</div>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/elements.html b/aleksis/apps/chronos/templates/chronos/partials/elements.html
deleted file mode 100644
index a7df614d20a2bc7fb2c203d90b0473756294da0a..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/elements.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<div class="card lesson-card {% if active_day and week_day == active_day %} z-depth-5 active {% endif %}">
-  <div class="card-content">
-    {% for element in elements %}
-      {% if element.label_ == "lesson_period" %}
-        {% include "chronos/partials/lesson.html" with lesson_period=element %}
-      {% elif element.label_ == "extra_lesson" and smart %}
-        {% include "chronos/partials/extra_lesson.html" with extra_lesson=element %}
-      {% elif element.label_ == "event" and smart %}
-        {% include "chronos/partials/event.html" with event=element %}
-      {% endif %}
-    {% endfor %}
-  </div>
-</div>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/event.html b/aleksis/apps/chronos/templates/chronos/partials/event.html
deleted file mode 100644
index 3aa6b797639598c0e24051053f040fcd3f1aead4..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/event.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<div class="lesson-with-event">
-  <p>
-    {# Teacher or room > Display groups #}
-    {% if type.value == "teacher" or type.value == "room" %}
-      {% include "chronos/partials/groups.html" with groups=event.groups.all %}
-    {% endif %}
-
-    {# Class or room > Display teachers #}
-    {% if type.value == "room" or type.value == "group" %}
-      {% include "chronos/partials/teachers.html" with teachers=event.teachers.all %}
-    {% endif %}
-
-    {# Teacher or class > Display rooms #}
-    {% if type.value == "teacher" or type.value == "group" %}
-      {% for room in event.rooms.all %}
-        {% include "chronos/partials/room.html" with room=room %}{% if not forloop.last %},{% endif %}
-      {% endfor %}
-    {% endif %}
-
-    {% if type.value == "teacher" and not event.groups.all and not event.rooms.all and event.title %}
-      <em>{{ event.title }}</em>
-    {% elif type.value == "group" and not event.teachers.all and not event.groups.all and event.title %}
-      <em>{{ event.title }}</em>
-    {% elif type.value == "room" and not event.teachers.all and not event.groups.all and event.title %}
-      <em>{{ event.title }}</em>
-    {% elif event.title %}
-      <br/>
-      <small>
-        <em>{{ event.title }}</em>
-      </small>
-    {% endif %}
-  </p>
-</div>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/extra_lesson.html b/aleksis/apps/chronos/templates/chronos/partials/extra_lesson.html
deleted file mode 100644
index 1113f011f0164be5a92f1dbe7ef3b32e8db07ed5..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/extra_lesson.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<div class="lesson-with-sub"
-     style="{% include "chronos/partials/subject_colour.html" with subject=extra_lesson.subject %}">
-  <p>
-    {# Teacher or room > Display groups #}
-    {% if type.value == "teacher" or type.value == "room" %}
-      {% include "chronos/partials/groups.html" with groups=extra_lesson.groups.all %}
-    {% endif %}
-
-    {# Class or room > Display teachers #}
-    {% if type.value == "room" or type.value == "group" %}
-      {% include "chronos/partials/teachers.html" with teachers=extra_lesson.teachers.all %}
-    {% endif %}
-
-    {% include "chronos/partials/subject.html" with subject=extra_lesson.subject %}
-
-    {# Teacher or class > Display rooms #}
-    {% if type.value == "teacher" or type.value == "group" %}
-      {% include "chronos/partials/room.html" with room=extra_lesson.room %}
-    {% endif %}
-
-    {% if extra_lesson.comment %}
-      <br/>
-      <small>
-        <em>{{ extra_lesson.comment }}</em>
-      </small>
-    {% endif %}
-  </p>
-</div>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/group.html b/aleksis/apps/chronos/templates/chronos/partials/group.html
index d2e345d53df2bec9020b9de38139726744d1effe..3105150c7630d7d6fd550536366900d3ba3a3fa1 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/group.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/group.html
@@ -1,3 +1 @@
-<a href="{% url "timetable" "group" item.pk %}">
-  {{ item.short_name }}{% if not forloop.last %},{% endif %}
-</a>
+{{ item.short_name }}{% if not forloop.last %},{% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/groups.html b/aleksis/apps/chronos/templates/chronos/partials/groups.html
index fb85c6d4dce53da5aea4ecef805fb52ddab4eed9..61bf6927b350f89cb2f191acc593dcb2758fb055 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/groups.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/groups.html
@@ -1,5 +1,5 @@
 {% if groups.count == 1 and groups.0.parent_groups.all and request.site.preferences.chronos__use_parent_groups %}
-  {% include "chronos/partials/groups_part.html" with groups=groups.0.parent_groups.all no_collapsible=no_collapsible %}
+  {% include "chronos/partials/groups_part.html" with groups=groups.0.parent_groups.all %}
 {% else %}
   {% include "chronos/partials/groups_part.html" with groups=groups no_collapsible=no_collapsible %}
 {% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/groups_part.html b/aleksis/apps/chronos/templates/chronos/partials/groups_part.html
index edafcb1977d04a18fb2a53651cf4ad6def3f0b19..d4c8f9f2a71c066f61b4c0a1c71d44674b190f0a 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/groups_part.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/groups_part.html
@@ -1,7 +1,3 @@
-{% if groups.count > request.site.preferences.chronos__shorten_groups_limit and request.user.person.preferences.chronos__shorten_groups and not no_collapsible %}
-  {% include "components/text_collapsible.html" with template="chronos/partials/group.html" qs=groups %}
-{% else %}
-  {% for group in groups %}
-    {% include "chronos/partials/group.html" with item=group %}
-  {% endfor %}
-{% endif %}
+{% for group in groups %}
+  {% include "chronos/partials/group.html" with item=group %}
+{% endfor %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/headerbox.html b/aleksis/apps/chronos/templates/chronos/partials/headerbox.html
index 1ed1e7de07cdcf64b2afea35f93f40b74aca9bd2..c3862168a7f71127935987b99767fbed20d9ab79 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/headerbox.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/headerbox.html
@@ -1,53 +1,53 @@
 {% load i18n %}
 
 {% if affected_teachers or affected_groups or absent_teachers or absent_groups %}
-  <div class="{% if not print %}card{% endif %}">
-    <div class="{% if not print %}card-content{% endif %}">
+  <div>
+    <div>
       {% if absent_teachers %}
         <div class="row no-margin">
-          <div class="col {% if not print %}s12 m3{% else %}s3{% endif %}">
+          <div class="col">
             <strong class="truncate">
               {% trans "Absent teachers" %}
             </strong>
           </div>
-          <div class="col {% if not print %}s12 m9{% else %}s9{% endif %} black-text-a">
+          <div class="col">
             {% include "chronos/partials/teachers.html" with teachers=absent_teachers %}
           </div>
         </div>
       {% endif %}
       {% if absent_groups %}
         <div class="row no-margin">
-          <div class="col {% if not print %}s12 m3{% else %}s3{% endif %}">
+          <div class="col">
             <strong class="truncate">
               {% trans "Absent groups" %}
             </strong>
           </div>
-          <div class="col {% if not print %}s12 m9{% else %}s9{% endif %} black-text-a">
+          <div class="col">
             {% include "chronos/partials/groups.html" with groups=absent_groups no_collapsible=True %}
           </div>
         </div>
       {% endif %}
       {% if affected_teachers %}
         <div class="row no-margin">
-          <div class="col {% if not print %}s12 m3{% else %}s3{% endif %}">
+          <div class="col">
             <strong class="truncate">
               {% trans "Affected teachers" %}
             </strong>
           </div>
-          <div class="col {% if not print %}s12 m9{% else %}s9{% endif %} black-text-a">
+          <div class="col">
             {% include "chronos/partials/teachers.html" with teachers=affected_teachers %}
           </div>
         </div>
       {% endif %}
       {% if affected_groups %}
         <div class="row no-margin">
-          <div class="col {% if not print %}s12 m3{% else %}s3{% endif %}">
+          <div class="col">
             <strong class="truncate">
               {% trans "Affected groups" %}
             </strong>
           </div>
-          <div class="col {% if not print %}s12 m9{% else %}s9{% endif %} black-text-a">
-            {% include "chronos/partials/groups.html" with groups=affected_groups no_collapsible=True %}
+          <div class="col">
+            {% include "chronos/partials/groups.html" with groups=affected_groups %}
           </div>
         </div>
       {% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/holiday.html b/aleksis/apps/chronos/templates/chronos/partials/holiday.html
deleted file mode 100644
index 85fc42d4ffd50621da8fe04802b3c2d18a509b71..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/holiday.html
+++ /dev/null
@@ -1 +0,0 @@
-<span class="badge new blue center-align holiday-badge">{{ holiday.title }}</span>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/lesson.html b/aleksis/apps/chronos/templates/chronos/partials/lesson.html
deleted file mode 100644
index 3fa1f75788ae6433bc1bf2ef9983a06df8fb59ff..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/lesson.html
+++ /dev/null
@@ -1,103 +0,0 @@
-{% load i18n %}
-
-<div style="
-        {% with sub=lesson_period.get_substitution %}
-        {# Display background color only if lesson is not cancelled and it is not the old room #}
-        {% if not smart %}
-          {% include "chronos/partials/subject_colour.html" with subject=lesson_period.lesson.subject %}
-        {% elif not sub.cancelled and not lesson_period.get_substitution.cancelled_for_teachers and not lesson_period.replaced_by_event %}
-          {% if not type.value == "room" or lesson_period.room == lesson_period.get_room or lesson_period.get_room == el %}
-            {% if sub and sub.subject %}
-              {% include "chronos/partials/subject_colour.html" with subject=sub.subject %}
-            {% else %}
-              {% include "chronos/partials/subject_colour.html" with subject=lesson_period.lesson.subject %}
-            {% endif %}
-          {% endif %}
-        {% endif %}
-        {% endwith %}
-        "
-        {# Add CSS class for sub when it's a sub #}
-     class="{% if smart %}{% if lesson_period.get_substitution or lesson_period.replaced_by_event %}lesson-with-sub{% endif %}{% endif %}"
->
-  <p>
-    {% if lesson_period.replaced_by_event and smart %}
-      {% include "chronos/partials/groups.html" with groups=lesson_period.lesson.groups.all %}
-      {% include "chronos/partials/subject.html" with subject=lesson_period.lesson.subject %}
-      <br/>
-      <span class="badge new green">{% trans "Cancelled due to an event" %}</span>
-    {% elif lesson_period.get_substitution and smart %}
-      {% with sub=lesson_period.get_substitution %}
-        {# SUBSTITUTION #}
-        {% if type.value == "room" and lesson_period.room != lesson_period.get_room and lesson_period.get_room != el %}
-          {# When it's the old room, let it empty #}
-
-        {% elif sub.cancelled or sub.cancelled_for_teachers %}
-          {# When a badge (cancellation, etc.) exists, then display it with the teacher#}
-
-          {# Class or room > Display teacher #}
-          {% if type.value == "group" or type.value == "room" and lesson_period.lesson.teachers.all %}
-            {% include "chronos/partials/teachers.html" with teachers=lesson_period.lesson.teachers.all %}<br/>
-          {% endif %}
-
-          {# Badge #}
-          {% include "chronos/partials/subs/badge.html" with sub=sub %}
-
-        {% else %}
-          {# Display sub #}
-
-          {# Teacher or room > display classes #}
-          {% if type.value == "teacher" or type.value == "room" %}
-            {% include "chronos/partials/groups.html" with groups=lesson_period.lesson.groups.all %}
-          {% endif %}
-
-          {# Display teacher with tooltip #}
-          {% include "chronos/partials/subs/teachers.html" with type="substitution" el=sub %}
-
-          {# Display subject #}
-          {% include "chronos/partials/subs/subject.html" with type="substitution" el=sub %}
-
-          {# Teacher or class > display room #}
-          {% if type.value == "teacher" or type.value == "group" %}
-            {% include "chronos/partials/subs/room.html" with type="substitution" el=sub %}
-          {% endif %}
-        {% endif %}
-
-
-        {# Display the comment (e. g. work orders) #}
-        {% if sub.comment %}
-          <br>
-          <small>
-            <em>{{ sub.comment }}</em>
-          </small>
-        {% endif %}
-      {% endwith %}
-
-
-    {% else %}
-      {# Normal plan #}
-
-      {# Teacher or room > Display classes #}
-      {% if type.value == "teacher" or type.value == "room" %}
-        {#                            {{ element_container.element.classes }}#}
-        {% if lesson_period.lesson.groups %}
-          {% include "chronos/partials/groups.html" with groups=lesson_period.lesson.groups.all %}
-        {% endif %}
-      {% endif %}
-
-      {# Class or room > Display teacher #}
-      {% if type.value == "room" or type.value == "group" %}
-        {% include "chronos/partials/teachers.html" with teachers=lesson_period.lesson.teachers.all %}
-      {% endif %}
-
-      {# Display subject #}
-      {% include "chronos/partials/subject.html" with subject=lesson_period.lesson.subject %}
-
-      {# Teacher or class > Display room #}
-      {% if type.value == "teacher" or type.value == "group" %}
-        {% if lesson_period.room %}
-          {% include "chronos/partials/room.html" with room=lesson_period.room %}
-        {% endif %}
-      {% endif %}
-    {% endif %}
-  </p>
-</div>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/lessons_col.html b/aleksis/apps/chronos/templates/chronos/partials/lessons_col.html
deleted file mode 100644
index 25ddedc47f422916b2e44f5419151e1a36ce8332..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/lessons_col.html
+++ /dev/null
@@ -1,30 +0,0 @@
-{% if holiday %}
-  <div class="row">
-    <div class="col s12">
-      <div class="card col s12 holiday-card">
-        <div class="card-content">
-          <p>
-            {% include "chronos/partials/holiday.html" with holiday=holiday %}<br/>
-          </p>
-        </div>
-      </div>
-    </div>
-  </div>
-{% else %}
-  {% for row in timetable %}
-    <div class="row">
-      <div class="col s4">
-        {% if row.type == "period" %}
-          {% include "chronos/partials/period_time.html" with period=row.period periods=periods %}
-        {% endif %}
-      </div>
-      <div class="col s8">
-        {% if row.type == "period" %}
-          {% include "chronos/partials/elements.html" with elements=row.col %}
-        {% else %}
-          {% include "chronos/partials/supervision.html" with supervision=row.col %}
-        {% endif %}
-      </div>
-    </div>
-  {% endfor %}
-{% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/period_time.html b/aleksis/apps/chronos/templates/chronos/partials/period_time.html
deleted file mode 100644
index ebd76dab6393c83332e07c1b194248480846323f..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/period_time.html
+++ /dev/null
@@ -1,20 +0,0 @@
-{% load data_helpers %}
-
-<div class="card timetable-title-card">
-  <div class="card-content">
-
-    {# Lesson number #}
-    <span class="card-title left">
-                                {{ period }}.
-                            </span>
-
-    {# Time dimension of lesson #}
-    <div class="right timetable-time grey-text text-darken-2">
-      {% with period_obj=periods|get_dict:period %}
-        <span>{{ period_obj.0|time }}</span>
-        <br/>
-        <span>{{ period_obj.1|time }}</span>
-      {% endwith %}
-    </div>
-  </div>
-</div>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/room.html b/aleksis/apps/chronos/templates/chronos/partials/room.html
deleted file mode 100644
index c96a7fd01975a86ac1bb66241a82872333d084bc..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/room.html
+++ /dev/null
@@ -1,7 +0,0 @@
-{% if room %}
-  <span class="tooltipped" data-position="bottom" data-tooltip="{{ room.name }}">
-    <a href="{% url "timetable" "room" room.pk %}">
-      {{ room.short_name }}
-    </a>
-  </span>
-{% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/rooms.html b/aleksis/apps/chronos/templates/chronos/partials/rooms.html
new file mode 100644
index 0000000000000000000000000000000000000000..e1f895c7d4aea8c03e02f71f0752e2a495e85c4a
--- /dev/null
+++ b/aleksis/apps/chronos/templates/chronos/partials/rooms.html
@@ -0,0 +1,3 @@
+{% for room in rooms %}
+  {{ room.short_name|default:room.name }}{% if not forloop.last %},{% endif %}
+{% endfor %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/subject.html b/aleksis/apps/chronos/templates/chronos/partials/subject.html
index e326c75a2419b28880578a32a1ffea4002194847..efed11727cb1b824f238d0e33d08cd2036f60837 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/subject.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/subject.html
@@ -1,3 +1 @@
-<strong>
-  <span data-position="bottom" class="tooltipped" data-tooltip="{{ subject.name }}">{{ subject.short_name }}</span>
-</strong>
+{{ subject.short_name|default:subject.name }}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/subject_colour.html b/aleksis/apps/chronos/templates/chronos/partials/subject_colour.html
deleted file mode 100644
index 4cead55119b2c4b799c13018dc175c2fe414f059..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/subject_colour.html
+++ /dev/null
@@ -1,6 +0,0 @@
-{% if subject.colour_fg %}
-  color: {{ subject.colour_fg }};
-{% endif %}
-{% if subject.colour_bg and subject.colour_bg != subject.colour_fg %}
-  background-color: {{ subject.colour_bg }};
-{% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/subs/badge.html b/aleksis/apps/chronos/templates/chronos/partials/subs/badge.html
index c04c9dd331eeb4f271ae5e7c212b43a776c71a51..f0210546a37921a76c78a2e2d100f6b01092f1a9 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/subs/badge.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/subs/badge.html
@@ -1,7 +1,5 @@
 {% load i18n %}
 
-{% if sub.cancelled %}
+{% if el.cancelled %}
   <span class="badge new green">{% trans "Cancelled" %}</span>
-{% elif item.el.cancelled_for_teachers %}
-  <span class="badge new green">{% trans "Cancelled for teachers" %}</span>
 {% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/subs/colour.html b/aleksis/apps/chronos/templates/chronos/partials/subs/colour.html
index 833a24b2080d1ecb555ba94c8159fd8550ede7ce..06ccab2698661fd484ce14c9a06adb57551f225c 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/subs/colour.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/subs/colour.html
@@ -1,11 +1,5 @@
-{% if item.type == "substitution" %}
-  {% if item.el.cancelled or item.el.cancelled_for_teachers %}
-    green-text
-  {% else %}
-    black-text
-  {% endif %}
-{% elif item.type == "supervision_substitution" %}
-  blue-text
-{% elif item.type == "event" %}
-  purple-text
+{% if el.cancelled %}
+  green-text
+{% else %}
+  black-text
 {% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/subs/groups.html b/aleksis/apps/chronos/templates/chronos/partials/subs/groups.html
index d1a4da990b388458a9de5614acd17d988c4aac09..447054384f19929af4872de104df01401254be2a 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/subs/groups.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/subs/groups.html
@@ -1,5 +1,11 @@
-{% if type == "substitution" %}
-  {% include "chronos/partials/groups.html" with groups=el.lesson_period.lesson.groups.all %}
-{% elif type == "extra_lesson" or type == "event" %}
+{% if el.cancelled and el.amends.groups.all %}
+  {% include "chronos/partials/groups.html" with groups=el.amends.groups.all %}
+{% elif el.groups.all and el.amends.groups.all %}
+  <s>{% include "chronos/partials/groups.html" with groups=el.amends.groups.all %}</s>
+  &nbsp;→&nbsp;
+  <strong>{% include "chronos/partials/groups.html" with groups=el.groups.all %}</strong>
+{% elif el.groups.all and not el.amends.groups.all %}
   {% include "chronos/partials/groups.html" with groups=el.groups.all %}
+{% elif el.amends.groups.all %}
+  {% include "chronos/partials/groups.html" with groups=el.amends.groups.all %}
 {% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/subs/period.html b/aleksis/apps/chronos/templates/chronos/partials/subs/period.html
index ef1d2838373b1537444aa6f2248ddc4c0e644267..9aa39762a4a0b88b58351b33ab0b02cc759b63b1 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/subs/period.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/subs/period.html
@@ -1,19 +1,14 @@
+{% load i18n %}
 <strong>
-  {% if type == "substitution" and item.start_period == item.end_period %}
-    {{ el.lesson_period.period.period }}.
-  {% elif type == "substitution"  %}
-    {{ item.start_period }}.–{{ item.end_period }}.
-  {% elif type == "extra_lesson" %}
-    {{ el.period.period }}.
-  {% elif type == "event" %}
-    {% if el.period_from_on_day == el.period_to_on_day %}
-      {{ el.period_from_on_day }}.
+  {% if el.REFERENCE_OBJECT.slot_number_start and el.REFERENCE_OBJECT.slot_number_end %}
+    {% if el.REFERENCE_OBJECT.slot_number_start == el.REFERENCE_OBJECT.slot_number_end %}
+      {{ el.REFERENCE_OBJECT.slot_number_start }}.
     {% else %}
-      {{ el.period_from_on_day }}.–{{ el.period_to_on_day }}.
+      {{ el.REFERENCE_OBJECT.slot_number_start }}.–{{ el.REFERENCE_OBJECT.slot_number_end }}.
     {% endif %}
-  {% elif type == "supervision_substitution" %}
-    {% with break=el.supervision.break_item %}
-      {{ break.after_period_number }}./{{ break.before_period_number }}.
-    {% endwith %}
+  {% elif el.DTSTART.dt.time %}
+    {{ el.DTSTART.dt.time }}–{{ el.DTEND.dt.time }}
+  {% else %}
+    {% trans "all day" %}
   {% endif %}
 </strong>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/subs/room.html b/aleksis/apps/chronos/templates/chronos/partials/subs/room.html
deleted file mode 100644
index 94f2d3574992d23dffe3d6f9b03ffdd3e75cb042..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/subs/room.html
+++ /dev/null
@@ -1,39 +0,0 @@
-{% if type == "substitution" %}
-  {% if el.cancelled or el.cancelled_for_teachers %}
-    {# Cancelled lesson: no room #}
-  {% elif el.room and el.lesson_period.room %}
-    {# New and old room available #}
-    <span class="tooltipped" data-position="bottom"
-          data-tooltip="{{ el.lesson_period.room.name }} → {{ el.room.name }}"
-          title="{{ el.lesson_period.room.name }} → {{ el.room.name }}">
-      <a href="{% url "timetable" "room" el.lesson_period.room.pk %}">
-          <s>{{ el.lesson_period.room.short_name }}</s>
-      </a>
-      →
-      <a href="{% url "timetable" "room" el.room.pk %}">
-          <strong>{{ el.room.short_name }}</strong>
-      </a>
-    </span>
-  {% elif el.room and not el.lesson_period.room %}
-    {# Only new room available #}
-    {% include "chronos/partials/room.html" with room=el.room %}
-  {% elif not el.room and not el.lesson_period.room %}
-    {# Nothing to view #}
-  {% else %}
-    {# Only old room available #}
-    {% include "chronos/partials/room.html" with room=el.lesson_period.room %}
-  {% endif %}
-{% elif type == "supervision_substitution" %}
-  {% with supervision=el.supervision %}
-    <span data-position="bottom" class="tooltipped"
-          data-tooltip="{{ supervision.area.name }}" title="{{ supervision.area.name }}">
-      {{ supervision.area.short_name }}
-    </span>
-  {% endwith %}
-{% elif type == "extra_lesson" %}
-  {% include "chronos/partials/room.html" with room=el.room %}
-{% elif type == "event" %}
-  {% for room in el.rooms.all %}
-    {% include "chronos/partials/room.html" with room=room %}{% if not forloop.last %},{% endif %}
-  {% endfor %}
-{% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/subs/rooms.html b/aleksis/apps/chronos/templates/chronos/partials/subs/rooms.html
new file mode 100644
index 0000000000000000000000000000000000000000..6a1ad0dedf556584323a97c9d4168497af81af35
--- /dev/null
+++ b/aleksis/apps/chronos/templates/chronos/partials/subs/rooms.html
@@ -0,0 +1,11 @@
+{% if el.cancelled and el.amends.rooms.all %}
+  {% include "chronos/partials/rooms.html" with rooms=el.amends.rooms.all %}
+{% elif el.rooms.all and el.amends.rooms.all %}
+  <s>{% include "chronos/partials/rooms.html" with rooms=el.amends.rooms.all %}</s>
+  &nbsp;→&nbsp;
+  <strong>{% include "chronos/partials/rooms.html" with rooms=el.rooms.all %}</strong>
+{% elif el.rooms.all and not el.amends.rooms.all %}
+  {% include "chronos/partials/rooms.html" with rooms=el.rooms.all %}
+{% elif el.amends.rooms.all %}
+  {% include "chronos/partials/rooms.html" with rooms=el.amends.rooms.all %}
+{% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/subs/subject.html b/aleksis/apps/chronos/templates/chronos/partials/subs/subject.html
index 1b7a3c5ce4e0ba6f286778adfb846d5006b9e2cb..033d7b745a36aa3d859ad95b79e705b9ce4cfb87 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/subs/subject.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/subs/subject.html
@@ -1,28 +1,21 @@
 {% load i18n %}
-
-{% if type == "substitution" %}
-  {% if not el.lesson_period.lesson.subject and not el.subject %}
-  {% elif el.cancelled or el.cancelled_for_teachers %}
-    <span data-position="bottom" class="tooltipped" data-tooltip="{{ el.lesson_period.lesson.subject.name }}">
-    <s>{{ el.lesson_period.lesson.subject.short_name }}</s>
-  </span>
-  {% elif el.subject and el.lesson_period.lesson.subject %}
-    <span data-position="bottom" class="tooltipped" data-tooltip="{{ el.lesson_period.lesson.subject.name }}">
-    <s>{{ el.lesson_period.lesson.subject.short_name }}</s>
-  </span>
-    →
-    <span data-position="bottom" class="tooltipped" data-tooltip="{{ el.subject.name }}">
-    <strong>{{ el.subject.short_name }}</strong>
-  </span>
-  {% elif el.subject and not el.lesson_period.lesson.subject %}
-    {% include "chronos/partials/subject.html" with subject=el.subject %}
-  {% else %}
-    {% include "chronos/partials/subject.html" with subject=el.lesson_period.lesson.subject %}
-  {% endif %}
-{% elif type == "supervision_substitution" %}
+{% if el.name == "supervision" %}
   {% trans "Supervision" %}
-{% elif type == "extra_lesson" %}
+{% elif not el.amends.subject and not el.subject %}
+  {% if el.amends.title %}
+    <s>{{ el.amends.title }}</s>
+  {% endif %}
+  {% if el.title %}
+    <s>{{ el.title }}</s>
+  {% endif %}
+{% elif el.cancelled %}
+  <s>{% include "chronos/partials/subject.html" with subject=el.amends.subject %}</s>
+{% elif el.subject and el.amends.subject %}
+  <s>{% include "chronos/partials/subject.html" with subject=el.amends.subject %}</s>
+  &nbsp;→&nbsp;
+  <strong>{% include "chronos/partials/subject.html" with subject=el.subject %}</strong>
+{% elif el.subject and not el.amends.subject %}
   {% include "chronos/partials/subject.html" with subject=el.subject %}
-{% elif type == "event" %}
-  {% trans "Event" %}
+{% else %}
+  {% include "chronos/partials/subject.html" with subject=el.amends.subject %}
 {% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/subs/teachers.html b/aleksis/apps/chronos/templates/chronos/partials/subs/teachers.html
index 4fa80d8fc7f82d8cae15010083ad4b93222bba41..9e08eeb5aca391263f0112010d58f58766af5f6a 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/subs/teachers.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/subs/teachers.html
@@ -1,27 +1,15 @@
-{% if type == "substitution" %}
-  {% if el.cancelled and el.lesson_period.lesson.teachers.all %}
-    {% include "chronos/partials/teachers.html" with teachers=el.lesson_period.lesson.teachers.all %}
-  {% elif el.teachers.all and el.lesson_period.lesson.teachers.all %}
-    <s>
-      {% include "chronos/partials/teachers.html" with teachers=el.lesson_period.lesson.teachers.all %}
-    </s>
-    →
-    <strong>
-      {% include "chronos/partials/teachers.html" with teachers=el.teachers.all %}
-    </strong>
-  {% elif el.teachers.all and not el.lesson_period.lesson.teachers.all %}
-    {% include "chronos/partials/teachers.html" with teachers=el.teachers.all %}
-  {% elif el.lesson_period.lesson.teachers.all %}
-    {% include "chronos/partials/teachers.html" with teachers=el.lesson_period.lesson.teachers.all %}
-  {% endif %}
-{% elif type == "supervision_substitution" %}
+{% if el.cancelled and el.amends.teachers.all %}
+  {% include "chronos/partials/teachers.html" with teachers=el.amends.teachers.all %}
+{% elif el.teachers.all and el.amends.teachers.all %}
   <s>
-    {% include "chronos/partials/teachers.html" with teachers=el.supervision.teachers %}
+    {% include "chronos/partials/teachers.html" with teachers=el.amends.teachers.all %}
   </s>
   →
   <strong>
-    {% include "chronos/partials/teachers.html" with teachers=el.teachers %}
+    {% include "chronos/partials/teachers.html" with teachers=el.teachers.all %}
   </strong>
-{% elif type == "extra_lesson" or type == "event" %}
+{% elif el.teachers.all and not el.amends.teachers.all %}
   {% include "chronos/partials/teachers.html" with teachers=el.teachers.all %}
+{% elif el.amends.teachers.all %}
+  {% include "chronos/partials/teachers.html" with teachers=el.amends.teachers.all %}
 {% endif %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/supervision.html b/aleksis/apps/chronos/templates/chronos/partials/supervision.html
deleted file mode 100644
index 0fff8f5cfef6c5fa1e897c0705210ce3d1a3ca54..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/supervision.html
+++ /dev/null
@@ -1,29 +0,0 @@
-{% load i18n %}
-
-<div class="card lesson-card supervision-card {% if active_day and week_day == active_day %} z-depth-5 active {% endif %}">
-  <div class="card-content">
-    {% if supervision %}
-      <div style="
-              {% if supervision.area.colour_fg %}
-                color: {{ supervision.area.colour_fg }};
-              {% endif %}
-              {% if supervision.area.colour_bg and supervision.area.colour_bg != supervision.area.colour_fg %}
-                background-color: {{ supervision.area.colour_bg }};
-              {% endif %}
-              " class="{% if supervision.get_substitution and smart %}lesson-with-sub{% endif %}">
-        <p>
-          <strong>{% trans "Supervision" %}</strong>
-          <span data-position="bottom" class="tooltipped"
-                data-tooltip="{{ supervision.area.name }}" title="{{ supervision.area.name }}">
-            {{ supervision.area.short_name }}
-          </span>
-          {% if supervision.get_substitution and smart %}
-            {% include "chronos/partials/subs/teachers.html" with type="supervision_substitution" el=supervision.get_substitution %}
-          {% elif type == "supervision_area" %}
-            {% include "chronos/partials/teachers.html" with teachers=supervision.teachers %}
-          {% endif %}
-        </p>
-      </div>
-    {% endif %}
-  </div>
-</div>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/teachers.html b/aleksis/apps/chronos/templates/chronos/partials/teachers.html
index d7ec97197f1309c651d0a8c07b0d1e387ecaade8..f506b4b14287cb35d8f4127cd21aafdd223f3287 100644
--- a/aleksis/apps/chronos/templates/chronos/partials/teachers.html
+++ b/aleksis/apps/chronos/templates/chronos/partials/teachers.html
@@ -1,8 +1,3 @@
 {% for teacher in teachers %}
-  <span data-position="bottom" class="tooltipped"
-        data-tooltip="{{ teacher }}">
-      <a href="{% url "timetable" "teacher" teacher.pk %}">
-          {{ teacher.short_name }}{% if not forloop.last %},{% endif %}
-      </a>
-  </span>
+  {{ teacher.short_name|default:teacher.full_name }}{% if not forloop.last %},{% endif %}
 {% endfor %}
diff --git a/aleksis/apps/chronos/templates/chronos/partials/today.html b/aleksis/apps/chronos/templates/chronos/partials/today.html
deleted file mode 100644
index 8f3897c26b5de1d4c69d825d828e8df6630cf682..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/today.html
+++ /dev/null
@@ -1,2 +0,0 @@
-{% load i18n %}
-<span class="badge new orange center-align holiday-badge">{% trans "Today" %}</span>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/week_select.html b/aleksis/apps/chronos/templates/chronos/partials/week_select.html
deleted file mode 100644
index e9b57b84ceb1ce5443676cb9e6711640bb7bebd9..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/week_select.html
+++ /dev/null
@@ -1,47 +0,0 @@
-{% load i18n %}
-
-<div class="col s12 m6 right">
-  <div class="col s2 no-print">
-    <a class="waves-effect waves-teal btn-flat btn-flat-medium right" href="{{ url_prev }}">
-      <i class="material-icons iconify center" data-icon="mdi:chevron-left"></i>
-    </a>
-  </div>
-
-  <div class="input-field col s8 no-margin hide-on-med-and-up">
-    <select id="calendar-week-1">
-      {% for week in weeks %}
-        <option value="{{ week.week }}" {% if week == wanted_week %}
-                selected {% endif %}>{% trans "CW" %} {{ week.week }}
-          ({{ week.0|date:"SHORT_DATE_FORMAT" }}–{{ week.6|date:"SHORT_DATE_FORMAT" }})
-        </option>
-      {% endfor %}
-    </select>
-  </div>
-
-  <div class="input-field col s8 no-margin hide-on-med-and-down">
-    <select id="calendar-week-2">
-      {% for week in weeks %}
-        <option value="{{ week.week }}" {% if week == wanted_week %}
-                selected {% endif %}>{% trans "CW" %} {{ week.week }}
-          ({{ week.0|date:"j.n." }}–{{ week.6|date:"SHORT_DATE_FORMAT" }})
-        </option>
-      {% endfor %}
-    </select>
-  </div>
-
-  <div class="input-field col s8 no-margin hide-on-small-and-down hide-on-large-only">
-    <select id="calendar-week-3">
-      {% for week in weeks %}
-        <option value="{{ week.week }}" {% if week == wanted_week %}
-                selected {% endif %}>{% trans "CW" %} {{ week.week }} ({{ week.0|date:"j.n." }}–{{ week.6|date:"j.n." }})
-        </option>
-      {% endfor %}
-    </select>
-  </div>
-
-  <div class="col s2 no-print">
-    <a class="waves-effect waves-teal btn-flat btn-flat-medium left" href="{{ url_next }}">
-      <i class="material-icons iconify center" data-icon="mdi:chevron-right"></i>
-    </a>
-  </div>
-</div>
diff --git a/aleksis/apps/chronos/templates/chronos/partials/week_timetable.html b/aleksis/apps/chronos/templates/chronos/partials/week_timetable.html
deleted file mode 100644
index 22030da954fd3f96ccf324e4ef7b50ab76862835..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/partials/week_timetable.html
+++ /dev/null
@@ -1,71 +0,0 @@
-{#  Week days #}
-<div class="row">
-    <div class="col {% if active_day %}s1{% else %}s2{% endif %}">
-
-    </div>
-    {# Show short weekdays on tablets #}
-    {% for weekday in weekdays_short %}
-    <div class="col s2 hide-on-large-only">
-        <div class="card timetable-title-card {% if active_day and weekday.date == active_day %} z-depth-5 {% endif %}">
-            <div class="card-content">
-              <span class="card-title">
-                {{ weekday.name }}
-              </span>
-                {% if smart %}
-                {{ weekday.date }}
-                {% if weekday.holiday %}
-                <br/>{% include "chronos/partials/holiday.html" with holiday=weekday.holiday %}
-                {% endif %}
-                {% if weekday.date == today %}
-                    <br/> {% include "chronos/partials/today.html" %}
-                {% endif %}
-                {% endif %}
-            </div>
-        </div>
-    </div>
-    {% endfor %}
-
-    {# Show long weekdays elsewere #}
-    {% for weekday in weekdays %}
-    <div class="col {% if weekday.date == active_day %} s3 {% else %} s2 {% endif %} hide-on-med-only">
-        <div class="card timetable-title-card {% if active_day and weekday.date == active_day %} z-depth-5 {% endif %}">
-            <div class="card-content">
-              <span class="card-title">
-                {{ weekday.name }}
-              </span>
-                {% if smart %}
-                {{ weekday.date }}
-                {% if weekday.holiday %}
-                <br/>{% include "chronos/partials/holiday.html" with holiday=weekday.holiday %}
-                {% endif %}
-                {% if weekday.date == today %}
-                    <br/> {% include "chronos/partials/today.html" %}
-                {% endif %}
-                {% endif %}
-            </div>
-        </div>
-    </div>
-    {% endfor %}
-</div>
-
-{#  Lessons #}
-{% for row in timetable %}
-<div class="row">
-    <div class="col {% if active_day %}s1{% else %}s2{% endif %}">
-        {% if row.type == "period" %}
-        {% include "chronos/partials/period_time.html" with period=row.period periods=periods %}
-        {% endif %}
-    </div>
-
-    {% for col in row.cols %}
-    {# A lesson #}
-    <div class="col {% if forloop.counter0 == active_day.weekday %} s3 {% else %} s2 {% endif %}">
-        {% if row.type == "period" %}
-        {% include "chronos/partials/elements.html" with elements=col week_day=forloop.counter0 active_day=active_day.weekday %}
-        {% else %}
-        {% include "chronos/partials/supervision.html" with supervision=col %}
-        {% endif %}
-    </div>
-    {% endfor %}
-</div>
-{% endfor %}
\ No newline at end of file
diff --git a/aleksis/apps/chronos/templates/chronos/substitutions_print.html b/aleksis/apps/chronos/templates/chronos/substitutions_print.html
index 743a2234e990bbafff8343e3ec7108e89995991c..04dc4cf24a5a171fa0638a9074693d025b1ccd02 100644
--- a/aleksis/apps/chronos/templates/chronos/substitutions_print.html
+++ b/aleksis/apps/chronos/templates/chronos/substitutions_print.html
@@ -18,13 +18,13 @@
 
     {% include "core/partials/announcements.html" with announcements=c.announcements show_recipients=1 %}
 
-    {% include "chronos/partials/headerbox.html" with affected_teachers=c.affected_teachers affected_groups=c.affected_groups absent_teachers=c.absent_teachers absent_groups=c.absent_groups print=1 %}
+    {% include "chronos/partials/headerbox.html" with absent_teachers=c.absent_teachers absent_groups=c.absent_groups affected_teachers=c.affected_teachers affected_groups=c.affected_groups %}
 
     <table class="substitutions">
       <thead>
       <tr>
-        <th><i class="material-icons iconify center" data-icon="mdi:account-multiple-outline"></i></th>
-        <th><i class="material-icons iconify center" data-icon="mdi:clock-outline"></i></th>
+        <th>{% blocktrans %}Groups{% endblocktrans %}</th>
+        <th>{% blocktrans %}Time{% endblocktrans %}</th>
         <th>{% blocktrans %}Teachers{% endblocktrans %}</th>
         <th>{% blocktrans %}Subject{% endblocktrans %}</th>
         <th>{% blocktrans %}Room{% endblocktrans %}</th>
@@ -47,30 +47,30 @@
 
       <tbody>
       {% for item in c.substitutions %}
-        {% ifchanged item.el.lesson_period.lesson.groups_to_show_names %}
+        {% ifchanged item.el.REFERENCE_OBJECT.group_names %}
           </tbody>
           <tbody class="{% cycle "striped" "not-striped" %}">
         {% endifchanged %}
 
-        <tr class="{% include "chronos/partials/subs/colour.html" with item=item %}">
+        <tr class="{% include "chronos/partials/subs/colour.html" with el=item.el.REFERENCE_OBJECT %}">
           <td>
-            {% include "chronos/partials/subs/groups.html" with type=item.type el=item.el %}
+            {% include "chronos/partials/subs/groups.html" with el=item.el.REFERENCE_OBJECT %}
           </td>
           <td>
-            {% include "chronos/partials/subs/period.html" with type=item.type el=item.el item=item %}
+            {% include "chronos/partials/subs/period.html" with el=item.el %}
           </td>
           <td>
-            {% include "chronos/partials/subs/teachers.html" with type=item.type el=item.el %}
+            {% include "chronos/partials/subs/teachers.html" with el=item.el.REFERENCE_OBJECT %}
           </td>
           <td>
-            {% include "chronos/partials/subs/subject.html" with type=item.type el=item.el %}
+            {% include "chronos/partials/subs/subject.html" with  el=item.el.REFERENCE_OBJECT %}
           </td>
           <td>
-            {% include "chronos/partials/subs/room.html" with type=item.type el=item.el %}
+            {% include "chronos/partials/subs/rooms.html" with  el=item.el.REFERENCE_OBJECT %}
           </td>
           <td>
-            {% include "chronos/partials/subs/badge.html" with sub=item.el %}
-            {% include "chronos/partials/subs/comment.html" with el=item.el %}
+            {% include "chronos/partials/subs/badge.html" with el=item.el.REFERENCE_OBJECT %}
+            {% include "chronos/partials/subs/comment.html" with el=item.el.REFERENCE_OBJECT %}
           </td>
         </tr>
       {% endfor %}
diff --git a/aleksis/apps/chronos/templates/chronos/timetable_print.html b/aleksis/apps/chronos/templates/chronos/timetable_print.html
deleted file mode 100644
index 4769673610019ad98538d11db579a9cbe6c4601c..0000000000000000000000000000000000000000
--- a/aleksis/apps/chronos/templates/chronos/timetable_print.html
+++ /dev/null
@@ -1,55 +0,0 @@
-{% extends 'core/base_print.html' %}
-
-{% load data_helpers static i18n %}
-
-{% block extra_head %}
-  <link rel="stylesheet" href="{% static 'css/chronos/timetable.css' %}">
-  <link rel="stylesheet" href="{% static 'css/chronos/timetable_print.css' %}">
-{% endblock %}
-
-{% block page_title %}
-  {% trans "Timetable" %} <i>{{ el.short_name }}</i>
-{% endblock %}
-{% block content %}
-  <div class="timetable-plan">
-    {#  Week days #}
-    <div class="row">
-      <div class="col s2">
-
-      </div>
-      {% for weekday in weekdays_short %}
-        <div class="col s2">
-          <div class="card timetable-title-card">
-            <div class="card-content">
-              <span class="card-title">
-                {{ weekday.name }}
-              </span>
-            </div>
-          </div>
-        </div>
-      {% endfor %}
-    </div>
-
-    {% for row in timetable %}
-      <div class="row">
-        <div class="col s2">
-          {% if row.type == "period" %}
-            {% include "chronos/partials/period_time.html" with period=row.period periods=periods %}
-          {% endif %}
-        </div>
-
-        {% for col in row.cols %}
-          {# A lesson #}
-          <div class="col s2">
-            {% if row.type == "period" %}
-              {% include "chronos/partials/elements.html" with elements=col %}
-            {% else %}
-              {% include "chronos/partials/supervision.html" with supervision=col %}
-            {% endif %}
-          </div>
-        {% endfor %}
-      </div>
-    {% endfor %}
-  </div>
-
-{% endblock %}
diff --git a/aleksis/apps/chronos/urls.py b/aleksis/apps/chronos/urls.py
index 7d55323042b9a23438975c589bd23967c3cbb396..0e3a3e7f10bf87613a2614fbd299ced106be0d96 100644
--- a/aleksis/apps/chronos/urls.py
+++ b/aleksis/apps/chronos/urls.py
@@ -8,4 +8,9 @@ urlpatterns = [
         views.substitutions_print,
         name="substitutions_print",
     ),
+    path(
+        "substitutions/print/<str:day>/",
+        views.substitutions_print,
+        name="substitutions_print",
+    ),
 ]
diff --git a/aleksis/apps/chronos/util/build.py b/aleksis/apps/chronos/util/build.py
index 625998db7a20e293f0f8edc3e4f04f4109c3c9db..dd24a0452b93b3e34785e71f5ccdd5b58b908baa 100644
--- a/aleksis/apps/chronos/util/build.py
+++ b/aleksis/apps/chronos/util/build.py
@@ -1,5 +1,5 @@
 from collections import OrderedDict
-from datetime import date
+from datetime import date, datetime, time
 from typing import Union
 
 from django.apps import apps
@@ -7,9 +7,11 @@ from django.apps import apps
 from calendarweek import CalendarWeek
 
 from aleksis.apps.chronos.managers import TimetableType
+from aleksis.apps.chronos.models import SupervisionEvent
 from aleksis.core.models import Group, Person, Room
 
 LessonPeriod = apps.get_model("chronos", "LessonPeriod")
+LessonEvent = apps.get_model("chronos", "LessonEvent")
 TimePeriod = apps.get_model("chronos", "TimePeriod")
 Break = apps.get_model("chronos", "Break")
 Supervision = apps.get_model("chronos", "Supervision")
@@ -380,96 +382,57 @@ def build_timetable(
     return rows
 
 
-def build_substitutions_list(wanted_day: date) -> list[dict]:
+def build_substitutions_list(wanted_day: date) -> tuple[list[dict], set[Person], set[Group]]:
     rows = []
-
-    subs = LessonSubstitution.objects.on_day(wanted_day).order_by(
-        "lesson_period__lesson__groups", "lesson_period__period"
+    affected_teachers = set()
+    affected_groups = set()
+
+    lesson_events = LessonEvent.get_single_events(
+        datetime.combine(wanted_day, time.min),
+        datetime.combine(wanted_day, time.max),
+        params={"amending": True},
+        with_reference_object=True,
     )
 
-    start_period = None
-    for i, sub in enumerate(subs):
-        if not sub.cancelled_for_teachers:
-            sort_a = sub.lesson_period.lesson.groups_to_show_names
-        else:
-            sort_a = f"Z.{sub.lesson_period.lesson.teacher_names}"
-
-        # Get next substitution
-        next_sub = subs[i + 1] if i + 1 < len(subs) else None
-
-        # Check if next substitution is equal with this substitution
-        if (
-            next_sub
-            and sub.comment == next_sub.comment
-            and sub.cancelled == next_sub.cancelled
-            and sub.subject == next_sub.subject
-            and sub.room == next_sub.room
-            and sub.lesson_period.lesson == next_sub.lesson_period.lesson
-            and set(sub.teachers.all()) == set(next_sub.teachers.all())
-        ):
-            if not start_period:
-                start_period = sub.lesson_period.period.period
-            continue
+    for lesson_event in lesson_events:
+        affected_teachers.update(lesson_event["REFERENCE_OBJECT"].teachers.all())
+        affected_teachers.update(lesson_event["REFERENCE_OBJECT"].amends.teachers.all())
+        affected_groups.update(lesson_event["REFERENCE_OBJECT"].groups.all())
+        affected_groups.update(lesson_event["REFERENCE_OBJECT"].amends.groups.all())
 
         row = {
             "type": "substitution",
-            "sort_a": sort_a,
-            "sort_b": str(sub.lesson_period.period.period),
-            "el": sub,
-            "start_period": start_period if start_period else sub.lesson_period.period.period,
-            "end_period": sub.lesson_period.period.period,
+            "sort_a": lesson_event["REFERENCE_OBJECT"].group_names,
+            "sort_b": str(lesson_event["DTSTART"]),
+            "el": lesson_event,
         }
 
-        if start_period:
-            start_period = None
-
         rows.append(row)
 
-    # Get supervision substitutions
-    super_subs = SupervisionSubstitution.objects.filter(date=wanted_day)
+    supervision_events = SupervisionEvent.get_single_events(
+        datetime.combine(wanted_day, time.min),
+        datetime.combine(wanted_day, time.max),
+        params={"amending": True},
+        with_reference_object=True,
+    )
+    print(supervision_events)
+
+    for supervision_event in supervision_events:
+        affected_teachers.update(supervision_event["REFERENCE_OBJECT"].teachers.all())
+        affected_teachers.update(supervision_event["REFERENCE_OBJECT"].amends.teachers.all())
 
-    for super_sub in super_subs:
         row = {
             "type": "supervision_substitution",
-            "sort_a": f"Z.{super_sub.teacher}",
-            "sort_b": str(super_sub.supervision.break_item.after_period_number),
-            "el": super_sub,
+            "sort_a": "Z",
+            "sort_b": str(supervision_event["DTSTART"]),
+            "el": supervision_event,
         }
-        rows.append(row)
-
-    # Get extra lessons
-    extra_lessons = ExtraLesson.objects.on_day(wanted_day)
 
-    for extra_lesson in extra_lessons:
-        row = {
-            "type": "extra_lesson",
-            "sort_a": str(extra_lesson.group_names),
-            "sort_b": str(extra_lesson.period.period),
-            "el": extra_lesson,
-        }
         rows.append(row)
 
-    # Get events
-    events = Event.objects.on_day(wanted_day).annotate_day(wanted_day)
+    rows.sort(key=lambda row: row["sort_a"] + row["sort_b"])
 
-    for event in events:
-        sort_a = event.group_names if event.groups.all() else f"Z.{event.teacher_names}"
-
-        row = {
-            "type": "event",
-            "sort_a": sort_a,
-            "sort_b": str(event.period_from_on_day),
-            "el": event,
-        }
-        rows.append(row)
-
-    # Sort all items
-    def sorter(row: dict):
-        return row["sort_a"] + row["sort_b"]
-
-    rows.sort(key=sorter)
-
-    return rows
+    return rows, affected_teachers, affected_groups
 
 
 def build_weekdays(
diff --git a/aleksis/apps/chronos/util/change_tracker.py b/aleksis/apps/chronos/util/change_tracker.py
index c9b8afb1b94c9bd5630a50b36d36e08ba58d31fd..669f5c4ee3f0cd6077189e019f58954ad3adf0f1 100644
--- a/aleksis/apps/chronos/util/change_tracker.py
+++ b/aleksis/apps/chronos/util/change_tracker.py
@@ -1,9 +1,4 @@
-from typing import Any, Optional
-
 from django.contrib.contenttypes.models import ContentType
-from django.db import transaction
-from django.db.models import Model
-from django.db.models.signals import m2m_changed, post_save, pre_delete
 from django.dispatch import Signal, receiver
 
 from celery import shared_task
@@ -11,126 +6,9 @@ from reversion.models import Revision
 
 
 def _get_substitution_models():
-    from aleksis.apps.chronos.models import (
-        Event,
-        ExtraLesson,
-        LessonSubstitution,
-        SupervisionSubstitution,
-    )
-
-    return [LessonSubstitution, Event, ExtraLesson, SupervisionSubstitution]
-
-
-class TimetableChange:
-    """A change to timetable models."""
-
-    def __init__(
-        self,
-        instance: Model,
-        changed_fields: Optional[dict[str, Any]] = None,
-        created: bool = False,
-        deleted: bool = False,
-    ):
-        self.instance = instance
-        self.changed_fields = changed_fields or {}
-        self.created = created
-        self.deleted = deleted
-
-
-class TimetableDataChangeTracker:
-    """Helper class for tracking changes in timetable models by using signals."""
-
-    @classmethod
-    def get_models(cls) -> list[type[Model]]:
-        """Return all models that should be tracked."""
-        from aleksis.apps.chronos.models import (
-            Event,
-            ExtraLesson,
-            LessonSubstitution,
-            SupervisionSubstitution,
-        )
-
-        return [LessonSubstitution, Event, ExtraLesson, SupervisionSubstitution]
-
-    def __init__(self):
-        self.changes = {}
-        self.m2m_fields = {}
-
-        if transaction.get_autocommit():
-            raise RuntimeError("Cannot use change tracker outside of transaction")
-
-        for model in self.get_models():
-            post_save.connect(self._handle_save, sender=model, weak=False)
-            pre_delete.connect(self._handle_delete, sender=model, weak=False)
-
-            # Register signals for all relevant m2m fields
-            m2m_fields = {
-                getattr(model, f.name).through: f
-                for f in model._meta.get_fields()
-                if f.many_to_many
-            }
-            self.m2m_fields.update(m2m_fields)
-            for through_model, _field in m2m_fields.items():
-                m2m_changed.connect(self._handle_m2m_changed, sender=through_model, weak=False)
-
-        transaction.on_commit(self.close)
-
-    def get_instance_key(self, instance: Model) -> str:
-        """Get unique string key for an instance."""
-        return f"{instance._meta.model_name}_{instance.id}"
-
-    def _add_change(self, change: TimetableChange):
-        """Add a change to the list of changes and update, if necessary."""
-        key = self.get_instance_key(change.instance)
-        if key not in self.changes or change.deleted or change.created:
-            self.changes[key] = change
-        else:
-            self.changes[key].changed_fields.update(change.changed_fields)
-
-    def _handle_save(self, sender: type[Model], instance: Model, created: bool, **kwargs):
-        """Handle the save signal."""
-        change = TimetableChange(instance, created=created)
-        if not created:
-            change.changed_fields = instance.tracker.changed()
-        self._add_change(change)
-
-    def _handle_delete(self, sender: type[Model], instance: Model, **kwargs):
-        """Handle the delete signal."""
-        change = TimetableChange(instance, deleted=True)
-        self._add_change(change)
-
-    def _handle_m2m_changed(
-        self,
-        sender: type[Model],
-        instance: Model,
-        action: str,
-        model: type[Model],
-        pk_set: set,
-        **kwargs,
-    ):
-        """Handle the m2m_changed signal."""
-        if action in ["pre_add", "pre_remove", "pre_clear"]:
-            field_name = self.m2m_fields[sender].name
-            current_value = list(getattr(instance, field_name).all())
-            if self.get_instance_key(instance) in self.changes:
-                change = self.changes[self.get_instance_key(instance)]
-                if field_name in change.changed_fields:
-                    current_value = None
-
-            if current_value is not None:
-                change = TimetableChange(instance, changed_fields={field_name: current_value})
-                self._add_change(change)
-
-    def close(self):
-        """Disconnect signals and send change signal."""
-        for model in self.get_models():
-            post_save.disconnect(self._handle_save, sender=model)
-            pre_delete.disconnect(self._handle_delete, sender=model)
-
-        for through_model, _field in self.m2m_fields.items():
-            m2m_changed.disconnect(self._handle_m2m_changed, sender=through_model)
+    from aleksis.apps.chronos.models import LessonEvent, SupervisionEvent
 
-        timetable_data_changed.send(sender=self, changes=self.changes)
+    return [LessonEvent, SupervisionEvent]
 
 
 chronos_revision_created = Signal()
diff --git a/aleksis/apps/chronos/util/chronos_helpers.py b/aleksis/apps/chronos/util/chronos_helpers.py
index 8e1640150383c7c00cfb145c74c9b8750c7a0c29..8e70ceae4b383dfcd72eb3aad80afd12d2f08175 100644
--- a/aleksis/apps/chronos/util/chronos_helpers.py
+++ b/aleksis/apps/chronos/util/chronos_helpers.py
@@ -1,11 +1,9 @@
-from datetime import datetime, timedelta
+from datetime import date, datetime, timedelta
 from typing import TYPE_CHECKING, Optional
 
 from django.db.models import Count, Q
 from django.http import HttpRequest, HttpResponseNotFound
 from django.shortcuts import get_object_or_404
-from django.urls import reverse
-from django.utils import timezone
 
 from guardian.core import ObjectPermissionChecker
 
@@ -15,15 +13,12 @@ from aleksis.core.util.predicates import check_global_permission
 
 from ..managers import TimetableType
 from ..models import (
-    Absence,
     LessonPeriod,
     LessonSubstitution,
     Supervision,
     SupervisionSubstitution,
-    TimePeriod,
 )
 from .build import build_substitutions_list
-from .js import date_unix
 
 if TYPE_CHECKING:
     from django.contrib.auth import get_user_model
@@ -160,23 +155,13 @@ def get_rooms(user: "User"):
 
 
 def get_substitutions_context_data(
-    request: Optional[HttpRequest] = None,
-    year: Optional[int] = None,
-    month: Optional[int] = None,
-    day: Optional[int] = None,
-    is_print: bool = False,
+    wanted_day: date,
     number_of_days: Optional[int] = None,
     show_header_box: Optional[bool] = None,
 ):
     """Get context data for the substitutions table."""
     context = {}
 
-    if day:
-        wanted_day = timezone.datetime(year=year, month=month, day=day).date()
-        wanted_day = TimePeriod.get_next_relevant_day(wanted_day)
-    else:
-        wanted_day = TimePeriod.get_next_relevant_day(timezone.now().date(), timezone.now().time())
-
     day_number = (
         number_of_days or get_site_preferences()["chronos__substitutions_print_number_of_days"]
     )
@@ -187,50 +172,41 @@ def get_substitutions_context_data(
     )
     day_contexts = {}
 
-    if is_print:
-        next_day = wanted_day
-        for _i in range(day_number):
-            day_contexts[next_day] = {"day": next_day}
-            next_day = TimePeriod.get_next_relevant_day(next_day + timedelta(days=1))
-    else:
-        day_contexts = {wanted_day: {"day": wanted_day}}
+    day = get_next_relevant_day(wanted_day)
+    for _i in range(day_number):
+        day_contexts[day] = {"day": day}
 
-    for day in day_contexts:
-        subs = build_substitutions_list(day)
+        subs, affected_teachers, affected_groups = build_substitutions_list(day)
         day_contexts[day]["substitutions"] = subs
 
-        day_contexts[day]["announcements"] = Announcement.for_timetables().on_date(day)
+        day_contexts[day]["announcements"] = Announcement.objects.on_date(day)
 
         if show_header_box:
-            subs = LessonSubstitution.objects.on_day(day).order_by(
-                "lesson_period__lesson__groups", "lesson_period__period"
+            day_contexts[day]["affected_teachers"] = sorted(
+                affected_teachers, key=lambda t: t.short_name or t.full_name
             )
-            absences = Absence.objects.on_day(day)
-            day_contexts[day]["absent_teachers"] = absences.absent_teachers()
-            day_contexts[day]["absent_groups"] = absences.absent_groups()
-            day_contexts[day]["affected_teachers"] = subs.affected_teachers()
-            affected_groups = subs.affected_groups()
-            if get_site_preferences()["chronos__affected_groups_parent_groups"]:
-                groups_with_parent_groups = affected_groups.filter(parent_groups__isnull=False)
-                groups_without_parent_groups = affected_groups.filter(parent_groups__isnull=True)
-                affected_groups = Group.objects.filter(
-                    Q(child_groups__pk__in=groups_with_parent_groups.values_list("pk", flat=True))
-                    | Q(pk__in=groups_without_parent_groups.values_list("pk", flat=True))
-                ).distinct()
             day_contexts[day]["affected_groups"] = affected_groups
 
-    if not is_print:
-        context = day_contexts[wanted_day]
-        context["datepicker"] = {
-            "date": date_unix(wanted_day),
-            "dest": reverse("substitutions"),
-        }
+        day = get_next_relevant_day(day + timedelta(days=1))
 
-        context["url_prev"], context["url_next"] = TimePeriod.get_prev_next_by_day(
-            wanted_day, "substitutions_by_date"
-        )
+    context["days"] = day_contexts
+
+    return context
+
+
+def get_next_relevant_day(current: datetime | date) -> date:
+    """Get next relevant day for substitution plans."""
+    relevant_days = get_site_preferences()["chronos__substitutions_relevant_days"]
+    change_time = get_site_preferences()["chronos__substitutions_day_change_time"]
 
+    if isinstance(current, datetime):
+        current_day = current.date()
+        if current.time() > change_time:
+            current_day += timedelta(days=1)
     else:
-        context["days"] = day_contexts
+        current_day = current
 
-    return context
+    while str(current_day.weekday()) not in relevant_days:
+        current_day += timedelta(days=1)
+
+    return current_day
diff --git a/aleksis/apps/chronos/views.py b/aleksis/apps/chronos/views.py
index a45997ca580db9f8fa442be52d88054055e2661d..84d093728e50825f90358084909d828f48cc7d71 100644
--- a/aleksis/apps/chronos/views.py
+++ b/aleksis/apps/chronos/views.py
@@ -1,10 +1,10 @@
+from datetime import date, datetime
 from typing import Optional
 
 from django.http import HttpRequest, HttpResponse
 
 from rules.contrib.views import permission_required
 
-from aleksis.core.decorators import pwa_cache
 from aleksis.core.util.pdf import render_pdf
 
 from .util.chronos_helpers import (
@@ -12,14 +12,12 @@ from .util.chronos_helpers import (
 )
 
 
-@pwa_cache
 @permission_required("chronos.view_substitutions_rule")
 def substitutions_print(
     request: HttpRequest,
-    year: Optional[int] = None,
-    month: Optional[int] = None,
-    day: Optional[int] = None,
+    day: Optional[str] = None,
 ) -> HttpResponse:
     """View all substitutions on a specified day."""
-    context = get_substitutions_context_data(request, year, month, day, is_print=True)
+    day = datetime.strptime(day, "%Y-%m-%d").date() if day else date.today()
+    context = get_substitutions_context_data(day)
     return render_pdf(request, "chronos/substitutions_print.html", context)
diff --git a/pyproject.toml b/pyproject.toml
index fb56e25888a876fd01f48f6ef6e32490d1376bf7..0e8dc2244f8d364a90b8f923dc48df22228444e4 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "AlekSIS-App-Chronos"
-version = "4.0.0.dev4"
+version = "4.0.0.dev6"
 packages = [
     { include = "aleksis" }
 ]
@@ -51,9 +51,9 @@ priority = "supplemental"
 [tool.poetry.dependencies]
 python = "^3.10"
 calendarweek = "^0.5.0"
-aleksis-core = "^4.0.0.dev6"
+aleksis-core = "^4.0.0.dev11"
 aleksis-app-resint = "^4.0.0.dev1"
-aleksis-app-cursus = "^0.1.0.dev1"
+aleksis-app-cursus = "^0.1.0.dev3"
 aleksis-app-kolego = "^0.1.dev0"