From e38546c61dabad33bd64cfdb863f34ba5a64d115 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Mon, 21 Mar 2022 19:48:38 +0100
Subject: [PATCH] Update translation files

---
 .../chronos/locale/ar/LC_MESSAGES/django.po   | 340 ++++++++++++------
 .../locale/de_DE/LC_MESSAGES/django.po        | 338 +++++++++++------
 .../chronos/locale/fr/LC_MESSAGES/django.po   | 337 +++++++++++------
 .../chronos/locale/la/LC_MESSAGES/django.po   | 336 +++++++++++------
 .../locale/nb_NO/LC_MESSAGES/django.po        | 336 +++++++++++------
 .../locale/tr_TR/LC_MESSAGES/django.po        | 336 +++++++++++------
 6 files changed, 1333 insertions(+), 690 deletions(-)

diff --git a/aleksis/apps/chronos/locale/ar/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/ar/LC_MESSAGES/django.po
index 593061dc..c3cf80d3 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-02-13 11:34+0000\n"
+"POT-Creation-Date: 2022-03-21 19:47+0100\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"
@@ -26,7 +26,7 @@ msgstr ""
 msgid "Optional data for timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:8
+#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
 msgid "Timetables"
 msgstr ""
 
@@ -57,431 +57,448 @@ msgstr ""
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:137
+#: aleksis/apps/chronos/model_extensions.py:142
 msgid "Show announcement in timetable views?"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:146
+#: aleksis/apps/chronos/model_extensions.py:151
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:150
+#: aleksis/apps/chronos/model_extensions.py:155
 msgid "Can view person timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:85
+#: aleksis/apps/chronos/models.py:86
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:88 aleksis/apps/chronos/models.py:686
+#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:741
-#: aleksis/apps/chronos/models.py:816 aleksis/apps/chronos/models.py:1035
+#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
+#: aleksis/apps/chronos/models.py:829 aleksis/apps/chronos/models.py:1063
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:742
-#: aleksis/apps/chronos/models.py:817 aleksis/apps/chronos/models.py:1036
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
+#: aleksis/apps/chronos/models.py:830 aleksis/apps/chronos/models.py:1064
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:110
+#: aleksis/apps/chronos/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:117
+#: aleksis/apps/chronos/models.py:118
 msgid "The validity range must be within the school term."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:124
+#: aleksis/apps/chronos/models.py:125
 msgid "There is already a validity range for this time or a part of this time."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:131
+#: aleksis/apps/chronos/models.py:132
 msgid "Validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:132
+#: aleksis/apps/chronos/models.py:133
 msgid "Validity ranges"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:149
+#: aleksis/apps/chronos/models.py:150
 msgid "Week day"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:151
+#: aleksis/apps/chronos/models.py:152
 msgid "Number of period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:153
+#: aleksis/apps/chronos/models.py:154
 msgid "Start time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:155
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:337 aleksis/apps/chronos/models.py:512
-#: aleksis/apps/chronos/models.py:1156
+#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
+#: aleksis/apps/chronos/models.py:1193
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:338
+#: aleksis/apps/chronos/models.py:339
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:342 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:685 aleksis/apps/chronos/models.py:862
-#: aleksis/apps/chronos/models.py:884
+#: 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
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:863 aleksis/apps/chronos/models.py:885
+#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
+#: aleksis/apps/chronos/models.py:876 aleksis/apps/chronos/models.py:898
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:345
+#: aleksis/apps/chronos/models.py:346
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:347
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:389
-#: aleksis/apps/chronos/models.py:443 aleksis/apps/chronos/models.py:1163
+#: 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/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:354
+#: aleksis/apps/chronos/models.py:355
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:374
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:375 aleksis/apps/chronos/models.py:451
-#: aleksis/apps/chronos/models.py:520 aleksis/apps/chronos/models.py:738
-#: aleksis/apps/chronos/models.py:1178
+#: 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:376 aleksis/apps/chronos/models.py:1052
+#: 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:392 aleksis/apps/chronos/models.py:449
-#: aleksis/apps/chronos/models.py:1054 aleksis/apps/chronos/models.py:1171
+#: 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/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:398
+#: aleksis/apps/chronos/models.py:399
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:400 aleksis/apps/chronos/models.py:1051
-#: aleksis/apps/chronos/models.py:1166 aleksis/apps/chronos/tables.py:34
+#: 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
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:423 aleksis/apps/chronos/models.py:506
-#: aleksis/apps/chronos/models.py:782
+#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
+#: aleksis/apps/chronos/models.py:795
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:424
+#: 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 ""
 
-#: aleksis/apps/chronos/models.py:430 aleksis/apps/chronos/models.py:1150
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1187
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:431 aleksis/apps/chronos/models.py:1151
+#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1188
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:641
+#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:453
+#: aleksis/apps/chronos/models.py:456
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:455
+#: aleksis/apps/chronos/models.py:458
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:458 aleksis/apps/chronos/models.py:757
-#: aleksis/apps/chronos/models.py:802 aleksis/apps/chronos/models.py:1181
+#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
+#: aleksis/apps/chronos/models.py:815 aleksis/apps/chronos/models.py:1218
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:462
+#: aleksis/apps/chronos/models.py:465
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:493
+#: aleksis/apps/chronos/models.py:506
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:494
+#: aleksis/apps/chronos/models.py:507
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:642
+#: aleksis/apps/chronos/models.py:655
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:680
+#: aleksis/apps/chronos/models.py:693
 msgid "Timetable widget"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:681
+#: aleksis/apps/chronos/models.py:694
 msgid "Timetable widgets"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:695 aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:696
+#: aleksis/apps/chronos/models.py:709
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:722 aleksis/apps/chronos/models.py:963
-#: aleksis/apps/chronos/models.py:1012
+#: 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
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:730
+#: aleksis/apps/chronos/models.py:743
 msgid "Group"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:746 aleksis/apps/chronos/models.py:789
+#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:753 aleksis/apps/chronos/models.py:796
+#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:809
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:767
+#: aleksis/apps/chronos/models.py:780
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:773
+#: aleksis/apps/chronos/models.py:786
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:774
+#: aleksis/apps/chronos/models.py:787
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:798
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:801 aleksis/apps/chronos/models.py:815
-#: aleksis/apps/chronos/models.py:1033
+#: aleksis/apps/chronos/models.py:814 aleksis/apps/chronos/models.py:828
+#: aleksis/apps/chronos/models.py:1061
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:808
+#: aleksis/apps/chronos/models.py:821
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:809
+#: aleksis/apps/chronos/models.py:822
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:818
+#: aleksis/apps/chronos/models.py:831
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:857
+#: aleksis/apps/chronos/models.py:870
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:858
+#: aleksis/apps/chronos/models.py:871
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:872 aleksis/apps/chronos/models.py:953
+#: aleksis/apps/chronos/models.py:885 aleksis/apps/chronos/models.py:966
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:873
+#: aleksis/apps/chronos/models.py:886
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:890
+#: aleksis/apps/chronos/models.py:903
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:898
+#: aleksis/apps/chronos/models.py:911
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:938 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:951 aleksis/apps/chronos/models.py:970
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:939
+#: aleksis/apps/chronos/models.py:952
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:994 aleksis/apps/chronos/models.py:1005
+#: 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
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1008
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1001
+#: aleksis/apps/chronos/models.py:1016
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1024
+#: aleksis/apps/chronos/models.py:1050
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1025
+#: aleksis/apps/chronos/models.py:1051
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1041
+#: aleksis/apps/chronos/models.py:1069
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1047
+#: aleksis/apps/chronos/models.py:1075
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:1089
 #, python-brace-format
 msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1139
+#: aleksis/apps/chronos/models.py:1174
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1140
+#: aleksis/apps/chronos/models.py:1175
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1200
+#: aleksis/apps/chronos/models.py:1244
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1201
+#: aleksis/apps/chronos/models.py:1245
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1211
+#: aleksis/apps/chronos/models.py:1255
 msgid "Number of days shown in the plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1215
+#: aleksis/apps/chronos/models.py:1259
 msgid "Show header box"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1216 aleksis/apps/chronos/preferences.py:59
+#: aleksis/apps/chronos/models.py:1260 aleksis/apps/chronos/preferences.py:61
 msgid "The header box shows affected teachers/groups."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1223
+#: aleksis/apps/chronos/models.py:1267
 msgid "Revision which triggered the last update"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1297
+#: aleksis/apps/chronos/models.py:1341
 msgid "Automatic plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1298
+#: aleksis/apps/chronos/models.py:1342
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:8
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:9
 msgid "Automatic plans"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1312
+#: aleksis/apps/chronos/models.py:1356
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1313
+#: aleksis/apps/chronos/models.py:1357
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1314
+#: aleksis/apps/chronos/models.py:1358
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1315
+#: aleksis/apps/chronos/models.py:1359
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1316
+#: aleksis/apps/chronos/models.py:1360
 msgid "Can view all lessons per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:16
+#: aleksis/apps/chronos/preferences.py:18
 msgid "Use parent groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:18
+#: 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 ""
 
-#: aleksis/apps/chronos/preferences.py:29
+#: aleksis/apps/chronos/preferences.py:31
 msgid "Shorten groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:30
+#: aleksis/apps/chronos/preferences.py:32
 msgid "If there are more groups than the set limit, they will be collapsed."
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:38
+#: aleksis/apps/chronos/preferences.py:40
 msgid "Limit of groups for shortening of groups"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:40
+#: 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 ""
 
-#: aleksis/apps/chronos/preferences.py:50
+#: aleksis/apps/chronos/preferences.py:52
 msgid "Number of days shown on substitutions print view"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:58
+#: aleksis/apps/chronos/preferences.py:60
 msgid "Show header box in substitution views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:68
+#: 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:79
+msgid "How many days in advance users should be notified about timetable changes?"
+msgstr ""
+
+#: aleksis/apps/chronos/preferences.py:87
+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:101
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Send notifications for current timetable changes"
+msgstr ""
+
 #: aleksis/apps/chronos/tables.py:41
 msgid "Substitution"
 msgstr ""
@@ -585,6 +602,7 @@ 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 ""
 
@@ -627,6 +645,98 @@ msgstr ""
 msgid "Go to smart plan"
 msgstr ""
 
+#: aleksis/apps/chronos/util/notifications.py:50
+#, python-brace-format
+msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
+msgstr ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:66
+#, python-brace-format
+msgid "The teacher {old} is substituted by {new}."
+msgid_plural "The teachers {old} are substituted by {new}."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+#: aleksis/apps/chronos/util/notifications.py:78
+#, python-brace-format
+msgid "The subject is changed to {subject}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:84
+#, python-brace-format
+msgid "The lesson is moved from {old} to {new}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:93
+#, python-brace-format
+msgid "There is an additional comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:145
+#, python-brace-format
+msgid "Groups: {groups}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:127
+#: aleksis/apps/chronos/util/notifications.py:149
+#, python-brace-format
+msgid "Teachers: {teachers}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:130
+#, python-brace-format
+msgid "Rooms: {rooms}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:137
+#, python-brace-format
+msgid "There is an extra lesson on {date} in the {period}. period:"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:147
+#, python-brace-format
+msgid "Subject: {subject}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:151
+#, python-brace-format
+msgid "Room: {room}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:153
+#, python-brace-format
+msgid "Comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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."
 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 14f0f7e8..ee5854f2 100644
--- a/aleksis/apps/chronos/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/apps/chronos/locale/de_DE/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-02-13 11:34+0000\n"
+"POT-Creation-Date: 2022-03-21 19:47+0100\n"
 "PO-Revision-Date: 2022-01-12 16:35+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-app-chronos/de/>\n"
@@ -26,7 +26,7 @@ msgstr "Einstellungen für Stundenpläne"
 msgid "Optional data for timetables"
 msgstr "Optionale Daten für Stundenpläne"
 
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:8
+#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
 msgid "Timetables"
 msgstr "Stundenpläne"
 
@@ -57,431 +57,448 @@ msgstr "Vertretungen"
 msgid "Linked validity range"
 msgstr "Zugeordneter Gültigkeitsbereich"
 
-#: aleksis/apps/chronos/model_extensions.py:137
+#: 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:146
+#: aleksis/apps/chronos/model_extensions.py:151
 msgid "Can view group timetable"
 msgstr "Kann Gruppenstundenpläne sehen"
 
-#: aleksis/apps/chronos/model_extensions.py:150
+#: aleksis/apps/chronos/model_extensions.py:155
 msgid "Can view person timetable"
 msgstr "Kann Personenstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:85
+#: aleksis/apps/chronos/models.py:86
 msgid "School term"
 msgstr "Schuljahr"
 
-#: aleksis/apps/chronos/models.py:88 aleksis/apps/chronos/models.py:686
+#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
 msgid "Name"
 msgstr "Name"
 
-#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:741
-#: aleksis/apps/chronos/models.py:816 aleksis/apps/chronos/models.py:1035
+#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
+#: aleksis/apps/chronos/models.py:829 aleksis/apps/chronos/models.py:1063
 msgid "Start date"
 msgstr "Startdatum"
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:742
-#: aleksis/apps/chronos/models.py:817 aleksis/apps/chronos/models.py:1036
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
+#: aleksis/apps/chronos/models.py:830 aleksis/apps/chronos/models.py:1064
 msgid "End date"
 msgstr "Enddatum"
 
-#: aleksis/apps/chronos/models.py:110
+#: 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."
 
-#: aleksis/apps/chronos/models.py:117
+#: aleksis/apps/chronos/models.py:118
 msgid "The validity range must be within the school term."
 msgstr "Der Gültigkeitsbereich muss innerhalb des Schuljahres liegen."
 
-#: aleksis/apps/chronos/models.py:124
+#: 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."
 
-#: aleksis/apps/chronos/models.py:131
+#: aleksis/apps/chronos/models.py:132
 msgid "Validity range"
 msgstr "Gültigkeitsbereich"
 
-#: aleksis/apps/chronos/models.py:132
+#: aleksis/apps/chronos/models.py:133
 msgid "Validity ranges"
 msgstr "Gültigkeitsbereiche"
 
-#: aleksis/apps/chronos/models.py:149
+#: aleksis/apps/chronos/models.py:150
 msgid "Week day"
 msgstr "Wochentag"
 
-#: 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:153
+#: aleksis/apps/chronos/models.py:154
 msgid "Start time"
 msgstr "Startzeit"
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:155
 msgid "End time"
 msgstr "Endzeit"
 
-#: aleksis/apps/chronos/models.py:337 aleksis/apps/chronos/models.py:512
-#: aleksis/apps/chronos/models.py:1156
+#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
+#: aleksis/apps/chronos/models.py:1193
 msgid "Time period"
 msgstr "Stunde"
 
-#: aleksis/apps/chronos/models.py:338
+#: aleksis/apps/chronos/models.py:339
 msgid "Time periods"
 msgstr "Stunden"
 
-#: aleksis/apps/chronos/models.py:342 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:685 aleksis/apps/chronos/models.py:862
-#: aleksis/apps/chronos/models.py:884
+#: 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
 msgid "Short name"
 msgstr "Kurzname"
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:863 aleksis/apps/chronos/models.py:885
+#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
+#: aleksis/apps/chronos/models.py:876 aleksis/apps/chronos/models.py:898
 msgid "Long name"
 msgstr "Langname"
 
-#: aleksis/apps/chronos/models.py:345
+#: aleksis/apps/chronos/models.py:346
 msgid "Foreground colour"
 msgstr "Vordergrundfarbe"
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:347
 msgid "Background colour"
 msgstr "Hintergrundfarbe"
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:389
-#: aleksis/apps/chronos/models.py:443 aleksis/apps/chronos/models.py:1163
+#: 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/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr "Fach"
 
-#: aleksis/apps/chronos/models.py:354
+#: aleksis/apps/chronos/models.py:355
 msgid "Subjects"
 msgstr "Fächer"
 
-#: aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:374
 msgid "Can view room timetable"
 msgstr "Kann Raumstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:375 aleksis/apps/chronos/models.py:451
-#: aleksis/apps/chronos/models.py:520 aleksis/apps/chronos/models.py:738
-#: aleksis/apps/chronos/models.py:1178
+#: 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 "Raum"
 
-#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:1052
+#: aleksis/apps/chronos/models.py:377 aleksis/apps/chronos/models.py:1080
 #: aleksis/apps/chronos/templates/chronos/all.html:45
 msgid "Rooms"
 msgstr "Räume"
 
-#: aleksis/apps/chronos/models.py:392 aleksis/apps/chronos/models.py:449
-#: aleksis/apps/chronos/models.py:1054 aleksis/apps/chronos/models.py:1171
+#: 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/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr "Lehrkräfte"
 
-#: aleksis/apps/chronos/models.py:398
+#: aleksis/apps/chronos/models.py:399
 msgid "Periods"
 msgstr "Stunden"
 
-#: aleksis/apps/chronos/models.py:400 aleksis/apps/chronos/models.py:1051
-#: aleksis/apps/chronos/models.py:1166 aleksis/apps/chronos/tables.py:34
+#: 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
 msgid "Groups"
 msgstr "Gruppen"
 
-#: aleksis/apps/chronos/models.py:423 aleksis/apps/chronos/models.py:506
-#: aleksis/apps/chronos/models.py:782
+#: 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:424
+#: 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:430 aleksis/apps/chronos/models.py:1150
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1187
 msgid "Week"
 msgstr "KW"
 
-#: aleksis/apps/chronos/models.py:431 aleksis/apps/chronos/models.py:1151
+#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1188
 msgid "Year"
 msgstr "Jahr"
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:641
+#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
 msgid "Lesson period"
 msgstr "Unterrichtsstunde"
 
-#: aleksis/apps/chronos/models.py:453
+#: aleksis/apps/chronos/models.py:456
 msgid "Cancelled?"
 msgstr "Entfällt?"
 
-#: aleksis/apps/chronos/models.py:455
+#: aleksis/apps/chronos/models.py:458
 msgid "Cancelled for teachers?"
 msgstr "Entfällt für Lehrkräfte?"
 
-#: aleksis/apps/chronos/models.py:458 aleksis/apps/chronos/models.py:757
-#: aleksis/apps/chronos/models.py:802 aleksis/apps/chronos/models.py:1181
+#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
+#: aleksis/apps/chronos/models.py:815 aleksis/apps/chronos/models.py:1218
 msgid "Comment"
 msgstr "Kommentar"
 
-#: aleksis/apps/chronos/models.py:462
+#: 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."
 
-#: aleksis/apps/chronos/models.py:493
+#: aleksis/apps/chronos/models.py:506
 msgid "Lesson substitution"
 msgstr "Vertretung"
 
-#: aleksis/apps/chronos/models.py:494
+#: aleksis/apps/chronos/models.py:507
 msgid "Lesson substitutions"
 msgstr "Vertretungen"
 
-#: aleksis/apps/chronos/models.py:642
+#: aleksis/apps/chronos/models.py:655
 msgid "Lesson periods"
 msgstr "Unterrichtsstunden"
 
-#: aleksis/apps/chronos/models.py:680
+#: aleksis/apps/chronos/models.py:693
 msgid "Timetable widget"
 msgstr "Stundenplanwidget"
 
-#: aleksis/apps/chronos/models.py:681
+#: aleksis/apps/chronos/models.py:694
 msgid "Timetable widgets"
 msgstr "Stundenplanwidgets"
 
-#: aleksis/apps/chronos/models.py:695 aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
 msgid "Absence reason"
 msgstr "Absenzgrund"
 
-#: aleksis/apps/chronos/models.py:696
+#: aleksis/apps/chronos/models.py:709
 msgid "Absence reasons"
 msgstr "Absenzgründe"
 
-#: aleksis/apps/chronos/models.py:722 aleksis/apps/chronos/models.py:963
-#: aleksis/apps/chronos/models.py:1012
+#: 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
 msgid "Teacher"
 msgstr "Lehrkraft"
 
-#: aleksis/apps/chronos/models.py:730
+#: aleksis/apps/chronos/models.py:743
 msgid "Group"
 msgstr "Gruppe"
 
-#: aleksis/apps/chronos/models.py:746 aleksis/apps/chronos/models.py:789
+#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
 msgid "Start period"
 msgstr "Startstunde"
 
-#: aleksis/apps/chronos/models.py:753 aleksis/apps/chronos/models.py:796
+#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:809
 msgid "End period"
 msgstr "Endstunde"
 
-#: aleksis/apps/chronos/models.py:767
+#: aleksis/apps/chronos/models.py:780
 msgid "Unknown absence"
 msgstr "Unbekannte Absenz"
 
-#: aleksis/apps/chronos/models.py:773
+#: aleksis/apps/chronos/models.py:786
 msgid "Absence"
 msgstr "Absenz"
 
-#: aleksis/apps/chronos/models.py:774
+#: aleksis/apps/chronos/models.py:787
 msgid "Absences"
 msgstr "Fehlstunden"
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:798
 msgid "Date of exam"
 msgstr "Datum der Klausur"
 
-#: aleksis/apps/chronos/models.py:801 aleksis/apps/chronos/models.py:815
-#: aleksis/apps/chronos/models.py:1033
+#: aleksis/apps/chronos/models.py:814 aleksis/apps/chronos/models.py:828
+#: aleksis/apps/chronos/models.py:1061
 msgid "Title"
 msgstr "Titel"
 
-#: aleksis/apps/chronos/models.py:808
+#: aleksis/apps/chronos/models.py:821
 msgid "Exam"
 msgstr "Klausur"
 
-#: aleksis/apps/chronos/models.py:809
+#: aleksis/apps/chronos/models.py:822
 msgid "Exams"
 msgstr "Klausuren"
 
-#: aleksis/apps/chronos/models.py:818
+#: aleksis/apps/chronos/models.py:831
 msgid "Comments"
 msgstr "Kommentare"
 
-#: aleksis/apps/chronos/models.py:857
+#: aleksis/apps/chronos/models.py:870
 msgid "Holiday"
 msgstr "Ferien"
 
-#: aleksis/apps/chronos/models.py:858
+#: aleksis/apps/chronos/models.py:871
 msgid "Holidays"
 msgstr "Ferien"
 
-#: aleksis/apps/chronos/models.py:872 aleksis/apps/chronos/models.py:953
+#: aleksis/apps/chronos/models.py:885 aleksis/apps/chronos/models.py:966
 msgid "Supervision area"
 msgstr "Aufsichtsgebiet"
 
-#: aleksis/apps/chronos/models.py:873
+#: aleksis/apps/chronos/models.py:886
 msgid "Supervision areas"
 msgstr "Aufsichtsgebiete"
 
-#: aleksis/apps/chronos/models.py:890
+#: aleksis/apps/chronos/models.py:903
 msgid "Time period after break starts"
 msgstr "Stunde, nach der die Pause startet"
 
-#: aleksis/apps/chronos/models.py:898
+#: aleksis/apps/chronos/models.py:911
 msgid "Time period before break ends"
 msgstr "Stunde nach der Pause"
 
-#: aleksis/apps/chronos/models.py:938 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:951 aleksis/apps/chronos/models.py:970
 msgid "Break"
 msgstr "Pause"
 
-#: aleksis/apps/chronos/models.py:939
+#: aleksis/apps/chronos/models.py:952
 msgid "Breaks"
 msgstr "Pausen"
 
-#: aleksis/apps/chronos/models.py:994 aleksis/apps/chronos/models.py:1005
+#: 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
 msgid "Supervision"
 msgstr "Aufsicht"
 
-#: aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1008
 msgid "Supervisions"
 msgstr "Aufsichten"
 
-#: aleksis/apps/chronos/models.py:1001
+#: aleksis/apps/chronos/models.py:1016
 msgid "Date"
 msgstr "Datum"
 
-#: aleksis/apps/chronos/models.py:1024
+#: aleksis/apps/chronos/models.py:1050
 msgid "Supervision substitution"
 msgstr "Aufsichtsvertretung"
 
-#: aleksis/apps/chronos/models.py:1025
+#: aleksis/apps/chronos/models.py:1051
 msgid "Supervision substitutions"
 msgstr "Aufsichtsvertretungen"
 
-#: aleksis/apps/chronos/models.py:1041
+#: aleksis/apps/chronos/models.py:1069
 msgid "Start time period"
 msgstr "Startstunde"
 
-#: aleksis/apps/chronos/models.py:1047
+#: aleksis/apps/chronos/models.py:1075
 msgid "End time period"
 msgstr "Endstunde"
 
-#: aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:1089
 #, python-brace-format
 msgid "Event {pk}"
 msgstr "Veranstaltung {pk}"
 
-#: aleksis/apps/chronos/models.py:1139
+#: aleksis/apps/chronos/models.py:1174
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr "Veranstaltung"
 
-#: aleksis/apps/chronos/models.py:1140
+#: aleksis/apps/chronos/models.py:1175
 msgid "Events"
 msgstr "Veranstaltungen"
 
-#: aleksis/apps/chronos/models.py:1200
+#: aleksis/apps/chronos/models.py:1244
 msgid "Extra lesson"
 msgstr "Sonderstunde"
 
-#: aleksis/apps/chronos/models.py:1201
+#: aleksis/apps/chronos/models.py:1245
 msgid "Extra lessons"
 msgstr "Sonderstunden"
 
-#: aleksis/apps/chronos/models.py:1211
+#: aleksis/apps/chronos/models.py:1255
 msgid "Number of days shown in the plan"
 msgstr "Anzahl der Tage, die im Plan angezeigt werden"
 
-#: aleksis/apps/chronos/models.py:1215
+#: aleksis/apps/chronos/models.py:1259
 msgid "Show header box"
 msgstr "Kopfbox anzeigen"
 
-#: aleksis/apps/chronos/models.py:1216 aleksis/apps/chronos/preferences.py:59
+#: aleksis/apps/chronos/models.py:1260 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:1223
+#: aleksis/apps/chronos/models.py:1267
 msgid "Revision which triggered the last update"
 msgstr "Revision, die die letzte Aktualisierung ausgelöst hat"
 
-#: aleksis/apps/chronos/models.py:1297
+#: aleksis/apps/chronos/models.py:1341
 msgid "Automatic plan"
 msgstr "Automatischer Plan"
 
-#: aleksis/apps/chronos/models.py:1298
+#: aleksis/apps/chronos/models.py:1342
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:8
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:9
 msgid "Automatic plans"
 msgstr "Automatische Pläne"
 
-#: aleksis/apps/chronos/models.py:1312
+#: aleksis/apps/chronos/models.py:1356
 msgid "Can view all room timetables"
 msgstr "Kann alle Raumstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:1313
+#: aleksis/apps/chronos/models.py:1357
 msgid "Can view all group timetables"
 msgstr "Kann alle Gruppenstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:1314
+#: aleksis/apps/chronos/models.py:1358
 msgid "Can view all person timetables"
 msgstr "Kann alle Personenstundenpläne sehen"
 
-#: aleksis/apps/chronos/models.py:1315
+#: aleksis/apps/chronos/models.py:1359
 msgid "Can view timetable overview"
 msgstr "Kann Stundenplanübersicht sehen"
 
-#: aleksis/apps/chronos/models.py:1316
+#: aleksis/apps/chronos/models.py:1360
 msgid "Can view all lessons per day"
 msgstr "Kann alle Tagesstunden sehen"
 
-#: aleksis/apps/chronos/preferences.py:16
+#: aleksis/apps/chronos/preferences.py:18
 msgid "Use parent groups in timetable views"
 msgstr "Elterngruppen in Stundenplanansichten benutzen"
 
-#: aleksis/apps/chronos/preferences.py:18
+#: 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:29
+#: aleksis/apps/chronos/preferences.py:31
 msgid "Shorten groups in timetable views"
 msgstr "Gruppen in Stundenplanansichten kürzen"
 
-#: aleksis/apps/chronos/preferences.py:30
+#: 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."
 
-#: aleksis/apps/chronos/preferences.py:38
+#: 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:40
+#: 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:50
+#: 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"
 
-#: aleksis/apps/chronos/preferences.py:58
+#: aleksis/apps/chronos/preferences.py:60
 msgid "Show header box in substitution views"
 msgstr "Kopfbox in Vertretungsplänen anzeigen"
 
-#: aleksis/apps/chronos/preferences.py:68
+#: 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"
 
+#: 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:87
+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:101
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Send notifications for current timetable changes"
+msgstr ""
+
 #: aleksis/apps/chronos/tables.py:41
 msgid "Substitution"
 msgstr "Vertretung"
@@ -585,6 +602,7 @@ 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"
 
@@ -633,6 +651,96 @@ msgstr ""
 msgid "Go to smart plan"
 msgstr "SMART PLAN anzeigen"
 
+#: aleksis/apps/chronos/util/notifications.py:50
+#, python-brace-format
+msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
+msgstr ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:66
+#, 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
+#, python-brace-format
+msgid "The subject is changed to {subject}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:84
+#, python-brace-format
+msgid "The lesson is moved from {old} to {new}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:93
+#, python-brace-format
+msgid "There is an additional comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:145
+#, python-brace-format
+msgid "Groups: {groups}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:127
+#: aleksis/apps/chronos/util/notifications.py:149
+#, fuzzy, python-brace-format
+#| msgid "Affected teachers"
+msgid "Teachers: {teachers}"
+msgstr "Betroffene Lehrkräfte"
+
+#: aleksis/apps/chronos/util/notifications.py:130
+#, python-brace-format
+msgid "Rooms: {rooms}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:137
+#, python-brace-format
+msgid "There is an extra lesson on {date} in the {period}. period:"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:147
+#, fuzzy, python-brace-format
+#| msgid "Subjects"
+msgid "Subject: {subject}"
+msgstr "Fächer"
+
+#: aleksis/apps/chronos/util/notifications.py:151
+#, python-brace-format
+msgid "Room: {room}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:153
+#, python-brace-format
+msgid "Comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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."
 msgstr "Die Vertretung wurde gespeichert."
diff --git a/aleksis/apps/chronos/locale/fr/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/fr/LC_MESSAGES/django.po
index e690d8be..b346e333 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-02-13 11:34+0000\n"
+"POT-Creation-Date: 2022-03-21 19:47+0100\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"
@@ -26,7 +26,7 @@ msgstr ""
 msgid "Optional data for timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:8
+#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
 msgid "Timetables"
 msgstr ""
 
@@ -57,433 +57,450 @@ msgstr ""
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:137
+#: aleksis/apps/chronos/model_extensions.py:142
 msgid "Show announcement in timetable views?"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:146
+#: aleksis/apps/chronos/model_extensions.py:151
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:150
+#: aleksis/apps/chronos/model_extensions.py:155
 msgid "Can view person timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:85
+#: aleksis/apps/chronos/models.py:86
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:88 aleksis/apps/chronos/models.py:686
+#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:741
-#: aleksis/apps/chronos/models.py:816 aleksis/apps/chronos/models.py:1035
+#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
+#: aleksis/apps/chronos/models.py:829 aleksis/apps/chronos/models.py:1063
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:742
-#: aleksis/apps/chronos/models.py:817 aleksis/apps/chronos/models.py:1036
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
+#: aleksis/apps/chronos/models.py:830 aleksis/apps/chronos/models.py:1064
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:110
+#: aleksis/apps/chronos/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:117
+#: aleksis/apps/chronos/models.py:118
 msgid "The validity range must be within the school term."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:124
+#: aleksis/apps/chronos/models.py:125
 msgid "There is already a validity range for this time or a part of this time."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:131
+#: aleksis/apps/chronos/models.py:132
 msgid "Validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:132
+#: aleksis/apps/chronos/models.py:133
 msgid "Validity ranges"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:149
+#: aleksis/apps/chronos/models.py:150
 msgid "Week day"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:151
+#: aleksis/apps/chronos/models.py:152
 msgid "Number of period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:153
+#: aleksis/apps/chronos/models.py:154
 msgid "Start time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:155
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:337 aleksis/apps/chronos/models.py:512
-#: aleksis/apps/chronos/models.py:1156
+#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
+#: aleksis/apps/chronos/models.py:1193
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:338
+#: aleksis/apps/chronos/models.py:339
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:342 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:685 aleksis/apps/chronos/models.py:862
-#: aleksis/apps/chronos/models.py:884
+#: 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
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:863 aleksis/apps/chronos/models.py:885
+#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
+#: aleksis/apps/chronos/models.py:876 aleksis/apps/chronos/models.py:898
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:345
+#: aleksis/apps/chronos/models.py:346
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:347
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:389
-#: aleksis/apps/chronos/models.py:443 aleksis/apps/chronos/models.py:1163
+#: 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/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr "Sujet"
 
-#: aleksis/apps/chronos/models.py:354
+#: aleksis/apps/chronos/models.py:355
 #, fuzzy
 #| msgid "Subject"
 msgid "Subjects"
 msgstr "Sujet"
 
-#: aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:374
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:375 aleksis/apps/chronos/models.py:451
-#: aleksis/apps/chronos/models.py:520 aleksis/apps/chronos/models.py:738
-#: aleksis/apps/chronos/models.py:1178
+#: 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 "Salle"
 
-#: aleksis/apps/chronos/models.py:376 aleksis/apps/chronos/models.py:1052
+#: 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:392 aleksis/apps/chronos/models.py:449
-#: aleksis/apps/chronos/models.py:1054 aleksis/apps/chronos/models.py:1171
+#: 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/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr "Profs"
 
-#: aleksis/apps/chronos/models.py:398
+#: aleksis/apps/chronos/models.py:399
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:400 aleksis/apps/chronos/models.py:1051
-#: aleksis/apps/chronos/models.py:1166 aleksis/apps/chronos/tables.py:34
+#: 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
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:423 aleksis/apps/chronos/models.py:506
-#: aleksis/apps/chronos/models.py:782
+#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
+#: aleksis/apps/chronos/models.py:795
 msgid "Lesson"
 msgstr "Cours"
 
-#: aleksis/apps/chronos/models.py:424
+#: 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 ""
 
-#: aleksis/apps/chronos/models.py:430 aleksis/apps/chronos/models.py:1150
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1187
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:431 aleksis/apps/chronos/models.py:1151
+#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1188
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:641
+#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:453
+#: aleksis/apps/chronos/models.py:456
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:455
+#: aleksis/apps/chronos/models.py:458
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:458 aleksis/apps/chronos/models.py:757
-#: aleksis/apps/chronos/models.py:802 aleksis/apps/chronos/models.py:1181
+#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
+#: aleksis/apps/chronos/models.py:815 aleksis/apps/chronos/models.py:1218
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:462
+#: aleksis/apps/chronos/models.py:465
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:493
+#: aleksis/apps/chronos/models.py:506
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:494
+#: aleksis/apps/chronos/models.py:507
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:642
+#: aleksis/apps/chronos/models.py:655
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:680
+#: aleksis/apps/chronos/models.py:693
 msgid "Timetable widget"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:681
+#: aleksis/apps/chronos/models.py:694
 msgid "Timetable widgets"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:695 aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:696
+#: aleksis/apps/chronos/models.py:709
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:722 aleksis/apps/chronos/models.py:963
-#: aleksis/apps/chronos/models.py:1012
+#: 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
 msgid "Teacher"
 msgstr "prof"
 
-#: aleksis/apps/chronos/models.py:730
+#: aleksis/apps/chronos/models.py:743
 msgid "Group"
 msgstr "groupe"
 
-#: aleksis/apps/chronos/models.py:746 aleksis/apps/chronos/models.py:789
+#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:753 aleksis/apps/chronos/models.py:796
+#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:809
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:767
+#: aleksis/apps/chronos/models.py:780
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:773
+#: aleksis/apps/chronos/models.py:786
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:774
+#: aleksis/apps/chronos/models.py:787
 msgid "Absences"
 msgstr "Absences"
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:798
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:801 aleksis/apps/chronos/models.py:815
-#: aleksis/apps/chronos/models.py:1033
+#: aleksis/apps/chronos/models.py:814 aleksis/apps/chronos/models.py:828
+#: aleksis/apps/chronos/models.py:1061
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:808
+#: aleksis/apps/chronos/models.py:821
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:809
+#: aleksis/apps/chronos/models.py:822
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:818
+#: aleksis/apps/chronos/models.py:831
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:857
+#: aleksis/apps/chronos/models.py:870
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:858
+#: aleksis/apps/chronos/models.py:871
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:872 aleksis/apps/chronos/models.py:953
+#: aleksis/apps/chronos/models.py:885 aleksis/apps/chronos/models.py:966
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:873
+#: aleksis/apps/chronos/models.py:886
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:890
+#: aleksis/apps/chronos/models.py:903
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:898
+#: aleksis/apps/chronos/models.py:911
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:938 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:951 aleksis/apps/chronos/models.py:970
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:939
+#: aleksis/apps/chronos/models.py:952
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:994 aleksis/apps/chronos/models.py:1005
+#: 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
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1008
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1001
+#: aleksis/apps/chronos/models.py:1016
 msgid "Date"
 msgstr "Date"
 
-#: aleksis/apps/chronos/models.py:1024
+#: aleksis/apps/chronos/models.py:1050
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1025
+#: aleksis/apps/chronos/models.py:1051
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1041
+#: aleksis/apps/chronos/models.py:1069
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1047
+#: aleksis/apps/chronos/models.py:1075
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:1089
 #, python-brace-format
 msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1139
+#: aleksis/apps/chronos/models.py:1174
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1140
+#: aleksis/apps/chronos/models.py:1175
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1200
+#: aleksis/apps/chronos/models.py:1244
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1201
+#: aleksis/apps/chronos/models.py:1245
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1211
+#: aleksis/apps/chronos/models.py:1255
 msgid "Number of days shown in the plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1215
+#: aleksis/apps/chronos/models.py:1259
 msgid "Show header box"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1216 aleksis/apps/chronos/preferences.py:59
+#: aleksis/apps/chronos/models.py:1260 aleksis/apps/chronos/preferences.py:61
 msgid "The header box shows affected teachers/groups."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1223
+#: aleksis/apps/chronos/models.py:1267
 msgid "Revision which triggered the last update"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1297
+#: aleksis/apps/chronos/models.py:1341
 msgid "Automatic plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1298
+#: aleksis/apps/chronos/models.py:1342
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:8
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:9
 msgid "Automatic plans"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1312
+#: aleksis/apps/chronos/models.py:1356
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1313
+#: aleksis/apps/chronos/models.py:1357
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1314
+#: aleksis/apps/chronos/models.py:1358
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1315
+#: aleksis/apps/chronos/models.py:1359
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1316
+#: aleksis/apps/chronos/models.py:1360
 msgid "Can view all lessons per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:16
+#: aleksis/apps/chronos/preferences.py:18
 msgid "Use parent groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:18
+#: 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 ""
 
-#: aleksis/apps/chronos/preferences.py:29
+#: aleksis/apps/chronos/preferences.py:31
 msgid "Shorten groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:30
+#: aleksis/apps/chronos/preferences.py:32
 msgid "If there are more groups than the set limit, they will be collapsed."
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:38
+#: aleksis/apps/chronos/preferences.py:40
 msgid "Limit of groups for shortening of groups"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:40
+#: 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 ""
 
-#: aleksis/apps/chronos/preferences.py:50
+#: aleksis/apps/chronos/preferences.py:52
 msgid "Number of days shown on substitutions print view"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:58
+#: aleksis/apps/chronos/preferences.py:60
 msgid "Show header box in substitution views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:68
+#: 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:79
+msgid "How many days in advance users should be notified about timetable changes?"
+msgstr ""
+
+#: aleksis/apps/chronos/preferences.py:87
+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:101
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Send notifications for current timetable changes"
+msgstr ""
+
 #: aleksis/apps/chronos/tables.py:41
 msgid "Substitution"
 msgstr ""
@@ -587,6 +604,7 @@ 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 ""
 
@@ -629,6 +647,95 @@ msgstr ""
 msgid "Go to smart plan"
 msgstr ""
 
+#: aleksis/apps/chronos/util/notifications.py:50
+#, python-brace-format
+msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
+msgstr ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:66
+#, 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
+#, python-brace-format
+msgid "The subject is changed to {subject}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:84
+#, python-brace-format
+msgid "The lesson is moved from {old} to {new}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:93
+#, python-brace-format
+msgid "There is an additional comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:145
+#, python-brace-format
+msgid "Groups: {groups}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:127
+#: aleksis/apps/chronos/util/notifications.py:149
+#, python-brace-format
+msgid "Teachers: {teachers}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:130
+#, python-brace-format
+msgid "Rooms: {rooms}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:137
+#, python-brace-format
+msgid "There is an extra lesson on {date} in the {period}. period:"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:147
+#, fuzzy, python-brace-format
+#| msgid "Subject"
+msgid "Subject: {subject}"
+msgstr "Sujet"
+
+#: aleksis/apps/chronos/util/notifications.py:151
+#, python-brace-format
+msgid "Room: {room}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:153
+#, python-brace-format
+msgid "Comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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."
 msgstr ""
diff --git a/aleksis/apps/chronos/locale/la/LC_MESSAGES/django.po b/aleksis/apps/chronos/locale/la/LC_MESSAGES/django.po
index a5e7d42c..a1d9bb53 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-02-13 11:34+0000\n"
+"POT-Creation-Date: 2022-03-21 19:47+0100\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"
@@ -26,7 +26,7 @@ msgstr ""
 msgid "Optional data for timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:8
+#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
 msgid "Timetables"
 msgstr ""
 
@@ -57,431 +57,448 @@ msgstr ""
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:137
+#: aleksis/apps/chronos/model_extensions.py:142
 msgid "Show announcement in timetable views?"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:146
+#: aleksis/apps/chronos/model_extensions.py:151
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:150
+#: aleksis/apps/chronos/model_extensions.py:155
 msgid "Can view person timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:85
+#: aleksis/apps/chronos/models.py:86
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:88 aleksis/apps/chronos/models.py:686
+#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:741
-#: aleksis/apps/chronos/models.py:816 aleksis/apps/chronos/models.py:1035
+#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
+#: aleksis/apps/chronos/models.py:829 aleksis/apps/chronos/models.py:1063
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:742
-#: aleksis/apps/chronos/models.py:817 aleksis/apps/chronos/models.py:1036
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
+#: aleksis/apps/chronos/models.py:830 aleksis/apps/chronos/models.py:1064
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:110
+#: aleksis/apps/chronos/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:117
+#: aleksis/apps/chronos/models.py:118
 msgid "The validity range must be within the school term."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:124
+#: aleksis/apps/chronos/models.py:125
 msgid "There is already a validity range for this time or a part of this time."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:131
+#: aleksis/apps/chronos/models.py:132
 msgid "Validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:132
+#: aleksis/apps/chronos/models.py:133
 msgid "Validity ranges"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:149
+#: aleksis/apps/chronos/models.py:150
 msgid "Week day"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:151
+#: aleksis/apps/chronos/models.py:152
 msgid "Number of period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:153
+#: aleksis/apps/chronos/models.py:154
 msgid "Start time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:155
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:337 aleksis/apps/chronos/models.py:512
-#: aleksis/apps/chronos/models.py:1156
+#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
+#: aleksis/apps/chronos/models.py:1193
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:338
+#: aleksis/apps/chronos/models.py:339
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:342 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:685 aleksis/apps/chronos/models.py:862
-#: aleksis/apps/chronos/models.py:884
+#: 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
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:863 aleksis/apps/chronos/models.py:885
+#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
+#: aleksis/apps/chronos/models.py:876 aleksis/apps/chronos/models.py:898
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:345
+#: aleksis/apps/chronos/models.py:346
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:347
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:389
-#: aleksis/apps/chronos/models.py:443 aleksis/apps/chronos/models.py:1163
+#: 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/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:354
+#: aleksis/apps/chronos/models.py:355
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:374
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:375 aleksis/apps/chronos/models.py:451
-#: aleksis/apps/chronos/models.py:520 aleksis/apps/chronos/models.py:738
-#: aleksis/apps/chronos/models.py:1178
+#: 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:376 aleksis/apps/chronos/models.py:1052
+#: 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:392 aleksis/apps/chronos/models.py:449
-#: aleksis/apps/chronos/models.py:1054 aleksis/apps/chronos/models.py:1171
+#: 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/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:398
+#: aleksis/apps/chronos/models.py:399
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:400 aleksis/apps/chronos/models.py:1051
-#: aleksis/apps/chronos/models.py:1166 aleksis/apps/chronos/tables.py:34
+#: 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
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:423 aleksis/apps/chronos/models.py:506
-#: aleksis/apps/chronos/models.py:782
+#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
+#: aleksis/apps/chronos/models.py:795
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:424
+#: 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 ""
 
-#: aleksis/apps/chronos/models.py:430 aleksis/apps/chronos/models.py:1150
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1187
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:431 aleksis/apps/chronos/models.py:1151
+#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1188
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:641
+#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:453
+#: aleksis/apps/chronos/models.py:456
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:455
+#: aleksis/apps/chronos/models.py:458
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:458 aleksis/apps/chronos/models.py:757
-#: aleksis/apps/chronos/models.py:802 aleksis/apps/chronos/models.py:1181
+#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
+#: aleksis/apps/chronos/models.py:815 aleksis/apps/chronos/models.py:1218
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:462
+#: aleksis/apps/chronos/models.py:465
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:493
+#: aleksis/apps/chronos/models.py:506
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:494
+#: aleksis/apps/chronos/models.py:507
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:642
+#: aleksis/apps/chronos/models.py:655
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:680
+#: aleksis/apps/chronos/models.py:693
 msgid "Timetable widget"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:681
+#: aleksis/apps/chronos/models.py:694
 msgid "Timetable widgets"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:695 aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:696
+#: aleksis/apps/chronos/models.py:709
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:722 aleksis/apps/chronos/models.py:963
-#: aleksis/apps/chronos/models.py:1012
+#: 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
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:730
+#: aleksis/apps/chronos/models.py:743
 msgid "Group"
 msgstr "Grex"
 
-#: aleksis/apps/chronos/models.py:746 aleksis/apps/chronos/models.py:789
+#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:753 aleksis/apps/chronos/models.py:796
+#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:809
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:767
+#: aleksis/apps/chronos/models.py:780
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:773
+#: aleksis/apps/chronos/models.py:786
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:774
+#: aleksis/apps/chronos/models.py:787
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:798
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:801 aleksis/apps/chronos/models.py:815
-#: aleksis/apps/chronos/models.py:1033
+#: aleksis/apps/chronos/models.py:814 aleksis/apps/chronos/models.py:828
+#: aleksis/apps/chronos/models.py:1061
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:808
+#: aleksis/apps/chronos/models.py:821
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:809
+#: aleksis/apps/chronos/models.py:822
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:818
+#: aleksis/apps/chronos/models.py:831
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:857
+#: aleksis/apps/chronos/models.py:870
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:858
+#: aleksis/apps/chronos/models.py:871
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:872 aleksis/apps/chronos/models.py:953
+#: aleksis/apps/chronos/models.py:885 aleksis/apps/chronos/models.py:966
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:873
+#: aleksis/apps/chronos/models.py:886
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:890
+#: aleksis/apps/chronos/models.py:903
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:898
+#: aleksis/apps/chronos/models.py:911
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:938 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:951 aleksis/apps/chronos/models.py:970
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:939
+#: aleksis/apps/chronos/models.py:952
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:994 aleksis/apps/chronos/models.py:1005
+#: 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
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1008
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1001
+#: aleksis/apps/chronos/models.py:1016
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1024
+#: aleksis/apps/chronos/models.py:1050
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1025
+#: aleksis/apps/chronos/models.py:1051
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1041
+#: aleksis/apps/chronos/models.py:1069
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1047
+#: aleksis/apps/chronos/models.py:1075
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:1089
 #, python-brace-format
 msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1139
+#: aleksis/apps/chronos/models.py:1174
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1140
+#: aleksis/apps/chronos/models.py:1175
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1200
+#: aleksis/apps/chronos/models.py:1244
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1201
+#: aleksis/apps/chronos/models.py:1245
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1211
+#: aleksis/apps/chronos/models.py:1255
 msgid "Number of days shown in the plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1215
+#: aleksis/apps/chronos/models.py:1259
 msgid "Show header box"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1216 aleksis/apps/chronos/preferences.py:59
+#: aleksis/apps/chronos/models.py:1260 aleksis/apps/chronos/preferences.py:61
 msgid "The header box shows affected teachers/groups."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1223
+#: aleksis/apps/chronos/models.py:1267
 msgid "Revision which triggered the last update"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1297
+#: aleksis/apps/chronos/models.py:1341
 msgid "Automatic plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1298
+#: aleksis/apps/chronos/models.py:1342
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:8
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:9
 msgid "Automatic plans"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1312
+#: aleksis/apps/chronos/models.py:1356
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1313
+#: aleksis/apps/chronos/models.py:1357
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1314
+#: aleksis/apps/chronos/models.py:1358
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1315
+#: aleksis/apps/chronos/models.py:1359
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1316
+#: aleksis/apps/chronos/models.py:1360
 msgid "Can view all lessons per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:16
+#: aleksis/apps/chronos/preferences.py:18
 msgid "Use parent groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:18
+#: 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 ""
 
-#: aleksis/apps/chronos/preferences.py:29
+#: aleksis/apps/chronos/preferences.py:31
 msgid "Shorten groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:30
+#: aleksis/apps/chronos/preferences.py:32
 msgid "If there are more groups than the set limit, they will be collapsed."
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:38
+#: aleksis/apps/chronos/preferences.py:40
 msgid "Limit of groups for shortening of groups"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:40
+#: 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 ""
 
-#: aleksis/apps/chronos/preferences.py:50
+#: aleksis/apps/chronos/preferences.py:52
 msgid "Number of days shown on substitutions print view"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:58
+#: aleksis/apps/chronos/preferences.py:60
 msgid "Show header box in substitution views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:68
+#: 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:79
+msgid "How many days in advance users should be notified about timetable changes?"
+msgstr ""
+
+#: aleksis/apps/chronos/preferences.py:87
+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:101
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Send notifications for current timetable changes"
+msgstr ""
+
 #: aleksis/apps/chronos/tables.py:41
 msgid "Substitution"
 msgstr ""
@@ -585,6 +602,7 @@ 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 ""
 
@@ -627,6 +645,94 @@ msgstr ""
 msgid "Go to smart plan"
 msgstr ""
 
+#: aleksis/apps/chronos/util/notifications.py:50
+#, python-brace-format
+msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
+msgstr ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:66
+#, 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
+#, python-brace-format
+msgid "The subject is changed to {subject}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:84
+#, python-brace-format
+msgid "The lesson is moved from {old} to {new}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:93
+#, python-brace-format
+msgid "There is an additional comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:145
+#, python-brace-format
+msgid "Groups: {groups}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:127
+#: aleksis/apps/chronos/util/notifications.py:149
+#, python-brace-format
+msgid "Teachers: {teachers}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:130
+#, python-brace-format
+msgid "Rooms: {rooms}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:137
+#, python-brace-format
+msgid "There is an extra lesson on {date} in the {period}. period:"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:147
+#, python-brace-format
+msgid "Subject: {subject}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:151
+#, python-brace-format
+msgid "Room: {room}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:153
+#, python-brace-format
+msgid "Comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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."
 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 347adedd..69ad4cf7 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-02-13 11:34+0000\n"
+"POT-Creation-Date: 2022-03-21 19:47+0100\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"
@@ -25,7 +25,7 @@ msgstr ""
 msgid "Optional data for timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:8
+#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
 msgid "Timetables"
 msgstr ""
 
@@ -56,431 +56,448 @@ msgstr ""
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:137
+#: aleksis/apps/chronos/model_extensions.py:142
 msgid "Show announcement in timetable views?"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:146
+#: aleksis/apps/chronos/model_extensions.py:151
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:150
+#: aleksis/apps/chronos/model_extensions.py:155
 msgid "Can view person timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:85
+#: aleksis/apps/chronos/models.py:86
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:88 aleksis/apps/chronos/models.py:686
+#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:741
-#: aleksis/apps/chronos/models.py:816 aleksis/apps/chronos/models.py:1035
+#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
+#: aleksis/apps/chronos/models.py:829 aleksis/apps/chronos/models.py:1063
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:742
-#: aleksis/apps/chronos/models.py:817 aleksis/apps/chronos/models.py:1036
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
+#: aleksis/apps/chronos/models.py:830 aleksis/apps/chronos/models.py:1064
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:110
+#: aleksis/apps/chronos/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:117
+#: aleksis/apps/chronos/models.py:118
 msgid "The validity range must be within the school term."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:124
+#: aleksis/apps/chronos/models.py:125
 msgid "There is already a validity range for this time or a part of this time."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:131
+#: aleksis/apps/chronos/models.py:132
 msgid "Validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:132
+#: aleksis/apps/chronos/models.py:133
 msgid "Validity ranges"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:149
+#: aleksis/apps/chronos/models.py:150
 msgid "Week day"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:151
+#: aleksis/apps/chronos/models.py:152
 msgid "Number of period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:153
+#: aleksis/apps/chronos/models.py:154
 msgid "Start time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:155
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:337 aleksis/apps/chronos/models.py:512
-#: aleksis/apps/chronos/models.py:1156
+#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
+#: aleksis/apps/chronos/models.py:1193
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:338
+#: aleksis/apps/chronos/models.py:339
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:342 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:685 aleksis/apps/chronos/models.py:862
-#: aleksis/apps/chronos/models.py:884
+#: 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
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:863 aleksis/apps/chronos/models.py:885
+#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
+#: aleksis/apps/chronos/models.py:876 aleksis/apps/chronos/models.py:898
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:345
+#: aleksis/apps/chronos/models.py:346
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:347
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:389
-#: aleksis/apps/chronos/models.py:443 aleksis/apps/chronos/models.py:1163
+#: 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/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:354
+#: aleksis/apps/chronos/models.py:355
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:374
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:375 aleksis/apps/chronos/models.py:451
-#: aleksis/apps/chronos/models.py:520 aleksis/apps/chronos/models.py:738
-#: aleksis/apps/chronos/models.py:1178
+#: 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:376 aleksis/apps/chronos/models.py:1052
+#: 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:392 aleksis/apps/chronos/models.py:449
-#: aleksis/apps/chronos/models.py:1054 aleksis/apps/chronos/models.py:1171
+#: 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/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:398
+#: aleksis/apps/chronos/models.py:399
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:400 aleksis/apps/chronos/models.py:1051
-#: aleksis/apps/chronos/models.py:1166 aleksis/apps/chronos/tables.py:34
+#: 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
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:423 aleksis/apps/chronos/models.py:506
-#: aleksis/apps/chronos/models.py:782
+#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
+#: aleksis/apps/chronos/models.py:795
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:424
+#: 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 ""
 
-#: aleksis/apps/chronos/models.py:430 aleksis/apps/chronos/models.py:1150
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1187
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:431 aleksis/apps/chronos/models.py:1151
+#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1188
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:641
+#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:453
+#: aleksis/apps/chronos/models.py:456
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:455
+#: aleksis/apps/chronos/models.py:458
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:458 aleksis/apps/chronos/models.py:757
-#: aleksis/apps/chronos/models.py:802 aleksis/apps/chronos/models.py:1181
+#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
+#: aleksis/apps/chronos/models.py:815 aleksis/apps/chronos/models.py:1218
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:462
+#: aleksis/apps/chronos/models.py:465
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:493
+#: aleksis/apps/chronos/models.py:506
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:494
+#: aleksis/apps/chronos/models.py:507
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:642
+#: aleksis/apps/chronos/models.py:655
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:680
+#: aleksis/apps/chronos/models.py:693
 msgid "Timetable widget"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:681
+#: aleksis/apps/chronos/models.py:694
 msgid "Timetable widgets"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:695 aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:696
+#: aleksis/apps/chronos/models.py:709
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:722 aleksis/apps/chronos/models.py:963
-#: aleksis/apps/chronos/models.py:1012
+#: 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
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:730
+#: aleksis/apps/chronos/models.py:743
 msgid "Group"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:746 aleksis/apps/chronos/models.py:789
+#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:753 aleksis/apps/chronos/models.py:796
+#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:809
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:767
+#: aleksis/apps/chronos/models.py:780
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:773
+#: aleksis/apps/chronos/models.py:786
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:774
+#: aleksis/apps/chronos/models.py:787
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:798
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:801 aleksis/apps/chronos/models.py:815
-#: aleksis/apps/chronos/models.py:1033
+#: aleksis/apps/chronos/models.py:814 aleksis/apps/chronos/models.py:828
+#: aleksis/apps/chronos/models.py:1061
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:808
+#: aleksis/apps/chronos/models.py:821
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:809
+#: aleksis/apps/chronos/models.py:822
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:818
+#: aleksis/apps/chronos/models.py:831
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:857
+#: aleksis/apps/chronos/models.py:870
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:858
+#: aleksis/apps/chronos/models.py:871
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:872 aleksis/apps/chronos/models.py:953
+#: aleksis/apps/chronos/models.py:885 aleksis/apps/chronos/models.py:966
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:873
+#: aleksis/apps/chronos/models.py:886
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:890
+#: aleksis/apps/chronos/models.py:903
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:898
+#: aleksis/apps/chronos/models.py:911
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:938 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:951 aleksis/apps/chronos/models.py:970
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:939
+#: aleksis/apps/chronos/models.py:952
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:994 aleksis/apps/chronos/models.py:1005
+#: 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
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1008
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1001
+#: aleksis/apps/chronos/models.py:1016
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1024
+#: aleksis/apps/chronos/models.py:1050
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1025
+#: aleksis/apps/chronos/models.py:1051
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1041
+#: aleksis/apps/chronos/models.py:1069
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1047
+#: aleksis/apps/chronos/models.py:1075
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:1089
 #, python-brace-format
 msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1139
+#: aleksis/apps/chronos/models.py:1174
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1140
+#: aleksis/apps/chronos/models.py:1175
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1200
+#: aleksis/apps/chronos/models.py:1244
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1201
+#: aleksis/apps/chronos/models.py:1245
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1211
+#: aleksis/apps/chronos/models.py:1255
 msgid "Number of days shown in the plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1215
+#: aleksis/apps/chronos/models.py:1259
 msgid "Show header box"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1216 aleksis/apps/chronos/preferences.py:59
+#: aleksis/apps/chronos/models.py:1260 aleksis/apps/chronos/preferences.py:61
 msgid "The header box shows affected teachers/groups."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1223
+#: aleksis/apps/chronos/models.py:1267
 msgid "Revision which triggered the last update"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1297
+#: aleksis/apps/chronos/models.py:1341
 msgid "Automatic plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1298
+#: aleksis/apps/chronos/models.py:1342
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:8
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:9
 msgid "Automatic plans"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1312
+#: aleksis/apps/chronos/models.py:1356
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1313
+#: aleksis/apps/chronos/models.py:1357
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1314
+#: aleksis/apps/chronos/models.py:1358
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1315
+#: aleksis/apps/chronos/models.py:1359
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1316
+#: aleksis/apps/chronos/models.py:1360
 msgid "Can view all lessons per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:16
+#: aleksis/apps/chronos/preferences.py:18
 msgid "Use parent groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:18
+#: 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 ""
 
-#: aleksis/apps/chronos/preferences.py:29
+#: aleksis/apps/chronos/preferences.py:31
 msgid "Shorten groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:30
+#: aleksis/apps/chronos/preferences.py:32
 msgid "If there are more groups than the set limit, they will be collapsed."
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:38
+#: aleksis/apps/chronos/preferences.py:40
 msgid "Limit of groups for shortening of groups"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:40
+#: 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 ""
 
-#: aleksis/apps/chronos/preferences.py:50
+#: aleksis/apps/chronos/preferences.py:52
 msgid "Number of days shown on substitutions print view"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:58
+#: aleksis/apps/chronos/preferences.py:60
 msgid "Show header box in substitution views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:68
+#: 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:79
+msgid "How many days in advance users should be notified about timetable changes?"
+msgstr ""
+
+#: aleksis/apps/chronos/preferences.py:87
+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:101
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Send notifications for current timetable changes"
+msgstr ""
+
 #: aleksis/apps/chronos/tables.py:41
 msgid "Substitution"
 msgstr ""
@@ -584,6 +601,7 @@ 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 ""
 
@@ -626,6 +644,94 @@ msgstr ""
 msgid "Go to smart plan"
 msgstr ""
 
+#: aleksis/apps/chronos/util/notifications.py:50
+#, python-brace-format
+msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
+msgstr ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:66
+#, 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
+#, python-brace-format
+msgid "The subject is changed to {subject}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:84
+#, python-brace-format
+msgid "The lesson is moved from {old} to {new}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:93
+#, python-brace-format
+msgid "There is an additional comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:145
+#, python-brace-format
+msgid "Groups: {groups}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:127
+#: aleksis/apps/chronos/util/notifications.py:149
+#, python-brace-format
+msgid "Teachers: {teachers}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:130
+#, python-brace-format
+msgid "Rooms: {rooms}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:137
+#, python-brace-format
+msgid "There is an extra lesson on {date} in the {period}. period:"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:147
+#, python-brace-format
+msgid "Subject: {subject}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:151
+#, python-brace-format
+msgid "Room: {room}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:153
+#, python-brace-format
+msgid "Comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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."
 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 347adedd..69ad4cf7 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-02-13 11:34+0000\n"
+"POT-Creation-Date: 2022-03-21 19:47+0100\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"
@@ -25,7 +25,7 @@ msgstr ""
 msgid "Optional data for timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:8
+#: aleksis/apps/chronos/menus.py:6 aleksis/apps/chronos/preferences.py:10
 msgid "Timetables"
 msgstr ""
 
@@ -56,431 +56,448 @@ msgstr ""
 msgid "Linked validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:137
+#: aleksis/apps/chronos/model_extensions.py:142
 msgid "Show announcement in timetable views?"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:146
+#: aleksis/apps/chronos/model_extensions.py:151
 msgid "Can view group timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/model_extensions.py:150
+#: aleksis/apps/chronos/model_extensions.py:155
 msgid "Can view person timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:85
+#: aleksis/apps/chronos/models.py:86
 msgid "School term"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:88 aleksis/apps/chronos/models.py:686
+#: aleksis/apps/chronos/models.py:89 aleksis/apps/chronos/models.py:699
 msgid "Name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:90 aleksis/apps/chronos/models.py:741
-#: aleksis/apps/chronos/models.py:816 aleksis/apps/chronos/models.py:1035
+#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:754
+#: aleksis/apps/chronos/models.py:829 aleksis/apps/chronos/models.py:1063
 msgid "Start date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:91 aleksis/apps/chronos/models.py:742
-#: aleksis/apps/chronos/models.py:817 aleksis/apps/chronos/models.py:1036
+#: aleksis/apps/chronos/models.py:92 aleksis/apps/chronos/models.py:755
+#: aleksis/apps/chronos/models.py:830 aleksis/apps/chronos/models.py:1064
 msgid "End date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:110
+#: aleksis/apps/chronos/models.py:111
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:117
+#: aleksis/apps/chronos/models.py:118
 msgid "The validity range must be within the school term."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:124
+#: aleksis/apps/chronos/models.py:125
 msgid "There is already a validity range for this time or a part of this time."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:131
+#: aleksis/apps/chronos/models.py:132
 msgid "Validity range"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:132
+#: aleksis/apps/chronos/models.py:133
 msgid "Validity ranges"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:149
+#: aleksis/apps/chronos/models.py:150
 msgid "Week day"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:151
+#: aleksis/apps/chronos/models.py:152
 msgid "Number of period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:153
+#: aleksis/apps/chronos/models.py:154
 msgid "Start time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:154
+#: aleksis/apps/chronos/models.py:155
 msgid "End time"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:337 aleksis/apps/chronos/models.py:512
-#: aleksis/apps/chronos/models.py:1156
+#: aleksis/apps/chronos/models.py:338 aleksis/apps/chronos/models.py:525
+#: aleksis/apps/chronos/models.py:1193
 msgid "Time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:338
+#: aleksis/apps/chronos/models.py:339
 msgid "Time periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:342 aleksis/apps/chronos/models.py:363
-#: aleksis/apps/chronos/models.py:685 aleksis/apps/chronos/models.py:862
-#: aleksis/apps/chronos/models.py:884
+#: 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
 msgid "Short name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:343 aleksis/apps/chronos/models.py:364
-#: aleksis/apps/chronos/models.py:863 aleksis/apps/chronos/models.py:885
+#: aleksis/apps/chronos/models.py:344 aleksis/apps/chronos/models.py:365
+#: aleksis/apps/chronos/models.py:876 aleksis/apps/chronos/models.py:898
 msgid "Long name"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:345
+#: aleksis/apps/chronos/models.py:346
 msgid "Foreground colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:346
+#: aleksis/apps/chronos/models.py:347
 msgid "Background colour"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:353 aleksis/apps/chronos/models.py:389
-#: aleksis/apps/chronos/models.py:443 aleksis/apps/chronos/models.py:1163
+#: 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/templates/chronos/substitutions_print.html:29
 msgid "Subject"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:354
+#: aleksis/apps/chronos/models.py:355
 msgid "Subjects"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:373
+#: aleksis/apps/chronos/models.py:374
 msgid "Can view room timetable"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:375 aleksis/apps/chronos/models.py:451
-#: aleksis/apps/chronos/models.py:520 aleksis/apps/chronos/models.py:738
-#: aleksis/apps/chronos/models.py:1178
+#: 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:376 aleksis/apps/chronos/models.py:1052
+#: 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:392 aleksis/apps/chronos/models.py:449
-#: aleksis/apps/chronos/models.py:1054 aleksis/apps/chronos/models.py:1171
+#: 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/templates/chronos/substitutions_print.html:28
 msgid "Teachers"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:398
+#: aleksis/apps/chronos/models.py:399
 msgid "Periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:400 aleksis/apps/chronos/models.py:1051
-#: aleksis/apps/chronos/models.py:1166 aleksis/apps/chronos/tables.py:34
+#: 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
 msgid "Groups"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:423 aleksis/apps/chronos/models.py:506
-#: aleksis/apps/chronos/models.py:782
+#: aleksis/apps/chronos/models.py:424 aleksis/apps/chronos/models.py:519
+#: aleksis/apps/chronos/models.py:795
 msgid "Lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:424
+#: 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 ""
 
-#: aleksis/apps/chronos/models.py:430 aleksis/apps/chronos/models.py:1150
+#: aleksis/apps/chronos/models.py:433 aleksis/apps/chronos/models.py:1187
 msgid "Week"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:431 aleksis/apps/chronos/models.py:1151
+#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:1188
 msgid "Year"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:434 aleksis/apps/chronos/models.py:641
+#: aleksis/apps/chronos/models.py:437 aleksis/apps/chronos/models.py:654
 msgid "Lesson period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:453
+#: aleksis/apps/chronos/models.py:456
 msgid "Cancelled?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:455
+#: aleksis/apps/chronos/models.py:458
 msgid "Cancelled for teachers?"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:458 aleksis/apps/chronos/models.py:757
-#: aleksis/apps/chronos/models.py:802 aleksis/apps/chronos/models.py:1181
+#: aleksis/apps/chronos/models.py:461 aleksis/apps/chronos/models.py:770
+#: aleksis/apps/chronos/models.py:815 aleksis/apps/chronos/models.py:1218
 msgid "Comment"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:462
+#: aleksis/apps/chronos/models.py:465
 msgid "Lessons can only be either substituted or cancelled."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:493
+#: aleksis/apps/chronos/models.py:506
 msgid "Lesson substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:494
+#: aleksis/apps/chronos/models.py:507
 msgid "Lesson substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:642
+#: aleksis/apps/chronos/models.py:655
 msgid "Lesson periods"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:680
+#: aleksis/apps/chronos/models.py:693
 msgid "Timetable widget"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:681
+#: aleksis/apps/chronos/models.py:694
 msgid "Timetable widgets"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:695 aleksis/apps/chronos/models.py:713
+#: aleksis/apps/chronos/models.py:708 aleksis/apps/chronos/models.py:726
 msgid "Absence reason"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:696
+#: aleksis/apps/chronos/models.py:709
 msgid "Absence reasons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:722 aleksis/apps/chronos/models.py:963
-#: aleksis/apps/chronos/models.py:1012
+#: 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
 msgid "Teacher"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:730
+#: aleksis/apps/chronos/models.py:743
 msgid "Group"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:746 aleksis/apps/chronos/models.py:789
+#: aleksis/apps/chronos/models.py:759 aleksis/apps/chronos/models.py:802
 msgid "Start period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:753 aleksis/apps/chronos/models.py:796
+#: aleksis/apps/chronos/models.py:766 aleksis/apps/chronos/models.py:809
 msgid "End period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:767
+#: aleksis/apps/chronos/models.py:780
 msgid "Unknown absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:773
+#: aleksis/apps/chronos/models.py:786
 msgid "Absence"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:774
+#: aleksis/apps/chronos/models.py:787
 msgid "Absences"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:785
+#: aleksis/apps/chronos/models.py:798
 msgid "Date of exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:801 aleksis/apps/chronos/models.py:815
-#: aleksis/apps/chronos/models.py:1033
+#: aleksis/apps/chronos/models.py:814 aleksis/apps/chronos/models.py:828
+#: aleksis/apps/chronos/models.py:1061
 msgid "Title"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:808
+#: aleksis/apps/chronos/models.py:821
 msgid "Exam"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:809
+#: aleksis/apps/chronos/models.py:822
 msgid "Exams"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:818
+#: aleksis/apps/chronos/models.py:831
 msgid "Comments"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:857
+#: aleksis/apps/chronos/models.py:870
 msgid "Holiday"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:858
+#: aleksis/apps/chronos/models.py:871
 msgid "Holidays"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:872 aleksis/apps/chronos/models.py:953
+#: aleksis/apps/chronos/models.py:885 aleksis/apps/chronos/models.py:966
 msgid "Supervision area"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:873
+#: aleksis/apps/chronos/models.py:886
 msgid "Supervision areas"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:890
+#: aleksis/apps/chronos/models.py:903
 msgid "Time period after break starts"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:898
+#: aleksis/apps/chronos/models.py:911
 msgid "Time period before break ends"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:938 aleksis/apps/chronos/models.py:957
+#: aleksis/apps/chronos/models.py:951 aleksis/apps/chronos/models.py:970
 msgid "Break"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:939
+#: aleksis/apps/chronos/models.py:952
 msgid "Breaks"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:994 aleksis/apps/chronos/models.py:1005
+#: 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
 msgid "Supervision"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:995
+#: aleksis/apps/chronos/models.py:1008
 msgid "Supervisions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1001
+#: aleksis/apps/chronos/models.py:1016
 msgid "Date"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1024
+#: aleksis/apps/chronos/models.py:1050
 msgid "Supervision substitution"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1025
+#: aleksis/apps/chronos/models.py:1051
 msgid "Supervision substitutions"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1041
+#: aleksis/apps/chronos/models.py:1069
 msgid "Start time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1047
+#: aleksis/apps/chronos/models.py:1075
 msgid "End time period"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1061
+#: aleksis/apps/chronos/models.py:1089
 #, python-brace-format
 msgid "Event {pk}"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1139
+#: aleksis/apps/chronos/models.py:1174
 #: aleksis/apps/chronos/templates/chronos/partials/subs/subject.html:27
 msgid "Event"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1140
+#: aleksis/apps/chronos/models.py:1175
 msgid "Events"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1200
+#: aleksis/apps/chronos/models.py:1244
 msgid "Extra lesson"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1201
+#: aleksis/apps/chronos/models.py:1245
 msgid "Extra lessons"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1211
+#: aleksis/apps/chronos/models.py:1255
 msgid "Number of days shown in the plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1215
+#: aleksis/apps/chronos/models.py:1259
 msgid "Show header box"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1216 aleksis/apps/chronos/preferences.py:59
+#: aleksis/apps/chronos/models.py:1260 aleksis/apps/chronos/preferences.py:61
 msgid "The header box shows affected teachers/groups."
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1223
+#: aleksis/apps/chronos/models.py:1267
 msgid "Revision which triggered the last update"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1297
+#: aleksis/apps/chronos/models.py:1341
 msgid "Automatic plan"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1298
+#: aleksis/apps/chronos/models.py:1342
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:8
 #: aleksis/apps/chronos/templates/chronos/automatic_plan/list.html:9
 msgid "Automatic plans"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1312
+#: aleksis/apps/chronos/models.py:1356
 msgid "Can view all room timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1313
+#: aleksis/apps/chronos/models.py:1357
 msgid "Can view all group timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1314
+#: aleksis/apps/chronos/models.py:1358
 msgid "Can view all person timetables"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1315
+#: aleksis/apps/chronos/models.py:1359
 msgid "Can view timetable overview"
 msgstr ""
 
-#: aleksis/apps/chronos/models.py:1316
+#: aleksis/apps/chronos/models.py:1360
 msgid "Can view all lessons per day"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:16
+#: aleksis/apps/chronos/preferences.py:18
 msgid "Use parent groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:18
+#: 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 ""
 
-#: aleksis/apps/chronos/preferences.py:29
+#: aleksis/apps/chronos/preferences.py:31
 msgid "Shorten groups in timetable views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:30
+#: aleksis/apps/chronos/preferences.py:32
 msgid "If there are more groups than the set limit, they will be collapsed."
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:38
+#: aleksis/apps/chronos/preferences.py:40
 msgid "Limit of groups for shortening of groups"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:40
+#: 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 ""
 
-#: aleksis/apps/chronos/preferences.py:50
+#: aleksis/apps/chronos/preferences.py:52
 msgid "Number of days shown on substitutions print view"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:58
+#: aleksis/apps/chronos/preferences.py:60
 msgid "Show header box in substitution views"
 msgstr ""
 
-#: aleksis/apps/chronos/preferences.py:68
+#: 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:79
+msgid "How many days in advance users should be notified about timetable changes?"
+msgstr ""
+
+#: aleksis/apps/chronos/preferences.py:87
+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:101
+#: aleksis/apps/chronos/preferences.py:109
+msgid "Send notifications for current timetable changes"
+msgstr ""
+
 #: aleksis/apps/chronos/tables.py:41
 msgid "Substitution"
 msgstr ""
@@ -584,6 +601,7 @@ 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 ""
 
@@ -626,6 +644,94 @@ msgstr ""
 msgid "Go to smart plan"
 msgstr ""
 
+#: aleksis/apps/chronos/util/notifications.py:50
+#, python-brace-format
+msgid "The {subject} lesson in the {period}. period on {day} has been cancelled."
+msgstr ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:66
+#, 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
+#, python-brace-format
+msgid "The subject is changed to {subject}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:84
+#, python-brace-format
+msgid "The lesson is moved from {old} to {new}."
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:93
+#, python-brace-format
+msgid "There is an additional comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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 ""
+
+#: aleksis/apps/chronos/util/notifications.py:125
+#: aleksis/apps/chronos/util/notifications.py:145
+#, python-brace-format
+msgid "Groups: {groups}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:127
+#: aleksis/apps/chronos/util/notifications.py:149
+#, python-brace-format
+msgid "Teachers: {teachers}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:130
+#, python-brace-format
+msgid "Rooms: {rooms}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:137
+#, python-brace-format
+msgid "There is an extra lesson on {date} in the {period}. period:"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:147
+#, python-brace-format
+msgid "Subject: {subject}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:151
+#, python-brace-format
+msgid "Room: {room}"
+msgstr ""
+
+#: aleksis/apps/chronos/util/notifications.py:153
+#, python-brace-format
+msgid "Comment: {comment}."
+msgstr ""
+
+#: 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 ""
+
+#: 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."
 msgstr ""
-- 
GitLab