diff --git a/aleksis/core/locale/ar/LC_MESSAGES/django.po b/aleksis/core/locale/ar/LC_MESSAGES/django.po
index ee356cc39b7d01a0aad1fd7fa3e0343f42da7a6c..71b3e82d26258ad34f53d00d6a1b18b6af3a8d24 100644
--- a/aleksis/core/locale/ar/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/ar/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-23 11:19+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -38,8 +38,8 @@ msgstr ""
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:185
-#: aleksis/core/models.py:487 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:171
+#: aleksis/core/models.py:489 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:246
 msgid "Groups"
@@ -66,6 +66,24 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
+#: aleksis/core/feeds.py:52
+msgid "Birthday Calendar"
+msgstr ""
+
+#: aleksis/core/feeds.py:53
+msgid "A Calendar of Birthdays"
+msgstr ""
+
+#: aleksis/core/feeds.py:66
+#, python-format
+msgid "%(name)s's birthday"
+msgstr ""
+
+#: aleksis/core/feeds.py:71
+#, python-format
+msgid "%(name)s was born on %(birthday)s"
+msgstr ""
+
 #: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:139
 #: aleksis/core/templates/core/base.html:140
 #: aleksis/core/templates/core/group/list.html:20
@@ -91,11 +109,11 @@ msgstr ""
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:713
+#: aleksis/core/filters.py:113 aleksis/core/models.py:715
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:486
+#: aleksis/core/filters.py:135 aleksis/core/models.py:488
 msgid "Group"
 msgstr ""
 
@@ -131,7 +149,7 @@ msgstr ""
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:134
+#: aleksis/core/forms.py:153 aleksis/core/models.py:136
 msgid "School term"
 msgstr ""
 
@@ -140,7 +158,7 @@ msgid "Common data"
 msgstr ""
 
 #: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/menus.py:174 aleksis/core/models.py:157
+#: aleksis/core/menus.py:160 aleksis/core/models.py:159
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
@@ -150,18 +168,18 @@ msgstr ""
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:210
-#: aleksis/core/models.py:539
+#: aleksis/core/forms.py:157 aleksis/core/models.py:212
+#: aleksis/core/models.py:541
 msgid "Photo"
 msgstr ""
 
 #: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:79
 msgid "Date"
 msgstr ""
 
 #: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:87
 msgid "Time"
 msgstr ""
 
@@ -197,11 +215,11 @@ msgstr ""
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:185
+#: aleksis/core/forms.py:418 aleksis/core/models.py:187
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:186
+#: aleksis/core/forms.py:419 aleksis/core/models.py:188
 msgid "Last name"
 msgstr ""
 
@@ -234,7 +252,7 @@ msgid "You must grant the permission to all objects and/or to some objects."
 msgstr ""
 
 #: aleksis/core/forms.py:586
-msgid "Adress data"
+msgid "Address data"
 msgstr ""
 
 #: aleksis/core/forms.py:598
@@ -281,138 +299,131 @@ msgstr ""
 msgid "No backup result found!"
 msgstr ""
 
-#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
+#: aleksis/core/menus.py:7 aleksis/core/templates/two_factor/core/login.html:6
 #: aleksis/core/templates/two_factor/core/login.html:32
 #: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr ""
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
+#: aleksis/core/menus.py:13 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr ""
 
-#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7
+#: aleksis/core/menus.py:22 aleksis/core/templates/invitations/enter.html:7
 msgid "Accept invitation"
 msgstr ""
 
-#: aleksis/core/menus.py:33
+#: aleksis/core/menus.py:31
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:765
-#: aleksis/core/preferences.py:29 aleksis/core/templates/core/base.html:81
-#: aleksis/core/templates/core/notifications.html:4
-#: aleksis/core/templates/core/notifications.html:5
-msgid "Notifications"
-msgstr ""
-
-#: aleksis/core/menus.py:53
+#: aleksis/core/menus.py:39
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:61 aleksis/core/models.py:865
+#: aleksis/core/menus.py:47 aleksis/core/models.py:867
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:72 aleksis/core/models.py:135
+#: aleksis/core/menus.py:58 aleksis/core/models.py:137
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/menus.py:83
+#: aleksis/core/menus.py:69
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 msgid "Dashboard widgets"
 msgstr ""
 
-#: aleksis/core/menus.py:94
+#: aleksis/core/menus.py:80
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr ""
 
-#: aleksis/core/menus.py:105
+#: aleksis/core/menus.py:91
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr ""
 
-#: aleksis/core/menus.py:116
+#: aleksis/core/menus.py:102
 msgid "Configuration"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:113 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/menus.py:133 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/menus.py:119 aleksis/core/templates/core/perms/list.html:13
 #: aleksis/core/templates/core/perms/list.html:14
 msgid "Manage permissions"
 msgstr ""
 
-#: aleksis/core/menus.py:144
+#: aleksis/core/menus.py:130
 msgid "Backend Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:152
+#: aleksis/core/menus.py:138
 #: aleksis/core/templates/oauth2_provider/application/list.html:5
 #: aleksis/core/templates/oauth2_provider/application/list.html:6
 msgid "OAuth2 Applications"
 msgstr ""
 
-#: aleksis/core/menus.py:165
+#: aleksis/core/menus.py:151
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:196 aleksis/core/models.py:1099
+#: aleksis/core/menus.py:182 aleksis/core/models.py:1101
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
-#: aleksis/core/menus.py:207
+#: aleksis/core/menus.py:193
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:218 aleksis/core/models.py:535
+#: aleksis/core/menus.py:204 aleksis/core/models.py:537
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:215
 msgid "Invite person"
 msgstr ""
 
-#: aleksis/core/menus.py:242
+#: aleksis/core/menus.py:228
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/menus.py:254
+#: aleksis/core/menus.py:240
 msgid "Stop impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:263
+#: aleksis/core/menus.py:249
 msgid "Account"
 msgstr ""
 
-#: aleksis/core/menus.py:272
+#: aleksis/core/menus.py:258
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr ""
 
-#: aleksis/core/menus.py:281
+#: aleksis/core/menus.py:267
 msgid "2FA"
 msgstr ""
 
-#: aleksis/core/menus.py:289
+#: aleksis/core/menus.py:275
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -424,17 +435,21 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
-#: aleksis/core/menus.py:301
+#: aleksis/core/menus.py:287
 msgid "Third-party accounts"
 msgstr ""
 
-#: aleksis/core/menus.py:310
+#: aleksis/core/menus.py:296
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 msgid "Authorized applications"
 msgstr ""
 
-#: aleksis/core/menus.py:320
+#: aleksis/core/menus.py:305
+msgid "Calendar Feeds"
+msgstr ""
+
+#: aleksis/core/menus.py:318
 msgid "Logout"
 msgstr ""
 
@@ -442,559 +457,584 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:75
+#: aleksis/core/models.py:77
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:78
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:80
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:81
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:203
+#: aleksis/core/models.py:82 aleksis/core/models.py:205
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:83
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:84
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:85
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:86
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:88
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:98 aleksis/core/models.py:1068
+#: aleksis/core/models.py:100 aleksis/core/models.py:1070
+#: aleksis/core/models.py:1374
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:100
+#: aleksis/core/models.py:102
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:101
+#: aleksis/core/models.py:103
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:120
+#: aleksis/core/models.py:122
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:129
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:156 aleksis/core/models.py:1017
+#: aleksis/core/models.py:158 aleksis/core/models.py:1019
+#: aleksis/core/models.py:1371
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:159
+#: aleksis/core/models.py:161
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:160
+#: aleksis/core/models.py:162
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:161
+#: aleksis/core/models.py:163
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:162
+#: aleksis/core/models.py:164
 msgid "Can view avatar image"
 msgstr ""
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:165
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:166
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:182 aleksis/core/models.py:1271
+#: aleksis/core/models.py:184 aleksis/core/models.py:1273
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:190
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:192 aleksis/core/models.py:504
+#: aleksis/core/models.py:194 aleksis/core/models.py:506
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:197
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:198
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:197
+#: aleksis/core/models.py:199
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:198
+#: aleksis/core/models.py:200
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:200 aleksis/core/templates/core/person/full.html:160
+#: aleksis/core/models.py:202 aleksis/core/templates/core/person/full.html:160
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:201 aleksis/core/templates/core/person/full.html:170
+#: aleksis/core/models.py:203 aleksis/core/templates/core/person/full.html:170
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:207
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:206
+#: aleksis/core/models.py:208
 msgid "Place of birth"
 msgstr ""
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:209
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:214 aleksis/core/models.py:543
+#: aleksis/core/models.py:216 aleksis/core/models.py:545
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr ""
 
-#: aleksis/core/models.py:219 aleksis/core/models.py:547
+#: aleksis/core/models.py:221 aleksis/core/models.py:549
 msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:222 aleksis/core/models.py:550
+#: aleksis/core/models.py:224 aleksis/core/models.py:552
 msgid "This is a picture or an avatar for public display."
 msgstr ""
 
-#: aleksis/core/models.py:227 aleksis/core/templates/core/person/full.html:235
+#: aleksis/core/models.py:229 aleksis/core/templates/core/person/full.html:235
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:236
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:237 aleksis/core/models.py:717
-#: aleksis/core/models.py:741 aleksis/core/models.py:832
-#: aleksis/core/models.py:1092
+#: aleksis/core/models.py:239 aleksis/core/models.py:719
+#: aleksis/core/models.py:743 aleksis/core/models.py:834
+#: aleksis/core/models.py:1094
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:459
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:459
+#: aleksis/core/models.py:461
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:461
+#: aleksis/core/models.py:463
 msgid "Required"
 msgstr ""
 
-#: aleksis/core/models.py:462
+#: aleksis/core/models.py:464
 msgid "Help text / description"
 msgstr ""
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:470
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:471
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:489
+#: aleksis/core/models.py:491
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:490
+#: aleksis/core/models.py:492
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:502
+#: aleksis/core/models.py:504
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:512 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:514 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:515 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:517 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:524 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:530
+#: aleksis/core/models.py:532
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:716 aleksis/core/models.py:740
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:718 aleksis/core/models.py:742
+#: aleksis/core/models.py:833
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:719
+#: aleksis/core/models.py:721
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:727
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:728
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:734
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:737
+#: aleksis/core/models.py:739
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:742 aleksis/core/models.py:1069
+#: aleksis/core/models.py:744 aleksis/core/models.py:1071
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:746
 msgid "Send notification at"
 msgstr ""
 
-#: aleksis/core/models.py:746
+#: aleksis/core/models.py:748
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:747
+#: aleksis/core/models.py:749
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:766
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:833
+#: aleksis/core/models.py:767 aleksis/core/preferences.py:29
+#: aleksis/core/templates/core/base.html:81
+#: aleksis/core/templates/core/notifications.html:4
+#: aleksis/core/templates/core/notifications.html:5
+msgid "Notifications"
+msgstr ""
+
+#: aleksis/core/models.py:835
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:838
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:839
+#: aleksis/core/models.py:841
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:864
+#: aleksis/core/models.py:866
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:904
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:903
+#: aleksis/core/models.py:905
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:927
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:926
+#: aleksis/core/models.py:928
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:927
+#: aleksis/core/models.py:929
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:930
+#: aleksis/core/models.py:932
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:931
+#: aleksis/core/models.py:933
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:938
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:939
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:942
+#: aleksis/core/models.py:944
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:943
+#: aleksis/core/models.py:945
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:950
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:949
+#: aleksis/core/models.py:951
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:980
+#: aleksis/core/models.py:982
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:981
+#: aleksis/core/models.py:983
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:982
+#: aleksis/core/models.py:984
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:988
+#: aleksis/core/models.py:990
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:991
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:997
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:998
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1002
+#: aleksis/core/models.py:1004
 msgid "Content"
 msgstr ""
 
-#: aleksis/core/models.py:1008
+#: aleksis/core/models.py:1010
 msgid "Static content widget"
 msgstr ""
 
-#: aleksis/core/models.py:1009
+#: aleksis/core/models.py:1011
 msgid "Static content widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1014
+#: aleksis/core/models.py:1016
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1021
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:1020
+#: aleksis/core/models.py:1022
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:1035
+#: aleksis/core/models.py:1037
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:1036
+#: aleksis/core/models.py:1038
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1044
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:1055
+#: aleksis/core/models.py:1057
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:1056
+#: aleksis/core/models.py:1058
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1068
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1070 aleksis/core/models.py:1318
+#: aleksis/core/models.py:1072 aleksis/core/models.py:1320
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1078
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:1077
+#: aleksis/core/models.py:1079
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:1091
+#: aleksis/core/models.py:1093
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:1098 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1100 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:1114
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:1113
+#: aleksis/core/models.py:1115
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:1114
+#: aleksis/core/models.py:1116
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1117
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:1116
+#: aleksis/core/models.py:1118
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1117
+#: aleksis/core/models.py:1119
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1120
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1121
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1120
+#: aleksis/core/models.py:1122
 msgid "Can invite persons"
 msgstr ""
 
-#: aleksis/core/models.py:1156
+#: aleksis/core/models.py:1158
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1164
+#: aleksis/core/models.py:1166
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1165
+#: aleksis/core/models.py:1167
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1178
+#: aleksis/core/models.py:1180
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1179
+#: aleksis/core/models.py:1181
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1181
+#: aleksis/core/models.py:1183
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1182
+#: aleksis/core/models.py:1184
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1189
+#: aleksis/core/models.py:1191
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1221
+#: aleksis/core/models.py:1223
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1225
+#: aleksis/core/models.py:1227
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1227
+#: aleksis/core/models.py:1229
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1229
+#: aleksis/core/models.py:1231
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1236
+#: aleksis/core/models.py:1238
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1237
+#: aleksis/core/models.py:1239
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1242
+#: aleksis/core/models.py:1244
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1247
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1257
+#: aleksis/core/models.py:1259
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1260
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1276
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1312
+#: aleksis/core/models.py:1314
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1322
+#: aleksis/core/models.py:1324
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
+#: aleksis/core/models.py:1373
+msgid "UUID"
+msgstr ""
+
+#: aleksis/core/models.py:1377
+msgid "Selected ICal feed"
+msgstr ""
+
+#: aleksis/core/models.py:1386
+msgid "Personal Calendar URL"
+msgstr ""
+
+#: aleksis/core/models.py:1387
+msgid "Personal Calendar URLs"
+msgstr ""
+
 #: aleksis/core/preferences.py:25
 msgid "General"
 msgstr ""
@@ -1519,7 +1559,7 @@ msgid "Publish new announcement"
 msgstr ""
 
 #: aleksis/core/templates/core/announcement/form.html:34
-msgid "Save und publish announcement"
+msgid "Save and publish announcement"
 msgstr ""
 
 #: aleksis/core/templates/core/announcement/list.html:19
@@ -1821,6 +1861,40 @@ msgstr ""
 msgid "Create group type"
 msgstr ""
 
+#: aleksis/core/templates/core/ical/ical_create.html:4
+#: aleksis/core/templates/core/ical/ical_create.html:5
+#: aleksis/core/templates/core/ical/ical_list.html:12
+msgid "Create iCal URL"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_create.html:16
+#: aleksis/core/templates/core/ical/ical_edit.html:16
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
+#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
+#: aleksis/core/templates/two_factor/_wizard_actions.html:6
+msgid "Cancel"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_edit.html:4
+#: aleksis/core/templates/core/ical/ical_edit.html:5
+#, python-format
+msgid "Edit iCal URL %(object)s"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:4
+#: aleksis/core/templates/core/ical/ical_list.html:5
+msgid "ICal Feeds"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:8
+msgid "These are URLs for different Calendar Feeds in the iCal (.ics) format. You can create as many as you want and import them in your calendar software."
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:14
+msgid "Your iCal URLs"
+msgstr ""
+
 #: aleksis/core/templates/core/index.html:4
 msgid "Home"
 msgstr ""
@@ -2297,13 +2371,6 @@ msgstr ""
 msgid "Register OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/create.html:14
-#: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
-#: aleksis/core/templates/two_factor/_wizard_actions.html:6
-msgid "Cancel"
-msgstr ""
-
 #: aleksis/core/templates/oauth2_provider/application/detail.html:5
 msgid "OAuth2 Application"
 msgstr ""
@@ -3027,156 +3094,168 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:289
+#: aleksis/core/views.py:292
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:301
+#: aleksis/core/views.py:304
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:421
+#: aleksis/core/views.py:424
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:440 aleksis/core/views.py:450
+#: aleksis/core/views.py:443 aleksis/core/views.py:453
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:500
+#: aleksis/core/views.py:503
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:597
+#: aleksis/core/views.py:600
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:613
+#: aleksis/core/views.py:616
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:681
+#: aleksis/core/views.py:684
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:703
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:724
+#: aleksis/core/views.py:727
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:738
+#: aleksis/core/views.py:741
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:770
+#: aleksis/core/views.py:773
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:804
+#: aleksis/core/views.py:807
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:829
+#: aleksis/core/views.py:832
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:862
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:892
+#: aleksis/core/views.py:895
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:893
+#: aleksis/core/views.py:896
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:894
+#: aleksis/core/views.py:897
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:895
+#: aleksis/core/views.py:898
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:911
+#: aleksis/core/views.py:914
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:924
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:953
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:983
+#: aleksis/core/views.py:986
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:993
+#: aleksis/core/views.py:996
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1064
+#: aleksis/core/views.py:1067
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1066
+#: aleksis/core/views.py:1069
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1142
+#: aleksis/core/views.py:1145
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1236
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1246
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1253
+#: aleksis/core/views.py:1256
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1263
+#: aleksis/core/views.py:1266
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1273
+#: aleksis/core/views.py:1276
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1341
+#: aleksis/core/views.py:1344
 msgid "The requested PDF file does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:1350 aleksis/core/views.py:1354
+#: aleksis/core/views.py:1353 aleksis/core/views.py:1357
 msgid "The requested task does not exist or is not accessible"
 msgstr ""
 
-#: aleksis/core/views.py:1406
+#: aleksis/core/views.py:1409
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1413
+#: aleksis/core/views.py:1416
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1484
+#: aleksis/core/views.py:1487
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1495
+#: aleksis/core/views.py:1498
 msgid "Person was already invited."
 msgstr ""
+
+#: aleksis/core/views.py:1598
+msgid "ICal feed updated successfully"
+msgstr ""
+
+#: aleksis/core/views.py:1608
+msgid "ICal feed deleted successfully"
+msgstr ""
+
+#: aleksis/core/views.py:1616
+msgid "ICal feed created successfully"
+msgstr ""
diff --git a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po
index 31b839fb203db1208029422282b10d1fa3e95123..5cc7c348c2ab6303aae0b8d753a8cf07f89fe384 100644
--- a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-23 11:20+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
index e39ddc518a4ec11696d1f0cb411139a7615e90c1..e7cd654c6aa1d500a42406953f71e2c318bf6ce3 100644
--- a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
@@ -7,11 +7,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-23 11:19+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: 2022-03-23 11:06+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
-"Language-Team: German <https://translate.edugit.org/projects/aleksis/"
-"aleksis-core/de/>\n"
+"Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-core/de/>\n"
 "Language: de_DE\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -39,8 +38,8 @@ msgstr "E-Mail-Adresse"
 msgid "Home and mobile phone"
 msgstr "Festnetz- und Mobilfunknummer"
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:185
-#: aleksis/core/models.py:487 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:171
+#: aleksis/core/models.py:489 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:246
 msgid "Groups"
@@ -67,6 +66,24 @@ msgstr "Sicherstellen, dass es keine kaputten Dashboard-Widgets gibt."
 msgid "The DashboardWidget was reported broken automatically."
 msgstr "Das Dashboard-Widget wurde automatisch als kaputt gemeldet."
 
+#: aleksis/core/feeds.py:52
+msgid "Birthday Calendar"
+msgstr ""
+
+#: aleksis/core/feeds.py:53
+msgid "A Calendar of Birthdays"
+msgstr ""
+
+#: aleksis/core/feeds.py:66
+#, python-format
+msgid "%(name)s's birthday"
+msgstr ""
+
+#: aleksis/core/feeds.py:71
+#, python-format
+msgid "%(name)s was born on %(birthday)s"
+msgstr ""
+
 #: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:139
 #: aleksis/core/templates/core/base.html:140
 #: aleksis/core/templates/core/group/list.html:20
@@ -92,11 +109,11 @@ msgstr "Berechtigung"
 msgid "Content type"
 msgstr "Inhaltstyp"
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:713
+#: aleksis/core/filters.py:113 aleksis/core/models.py:715
 msgid "User"
 msgstr "Benutzer"
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:486
+#: aleksis/core/filters.py:135 aleksis/core/models.py:488
 msgid "Group"
 msgstr "Gruppe"
 
@@ -132,7 +149,7 @@ msgstr "Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen
 msgid "This username is already in use."
 msgstr "Dieser Benutzername wird bereits genutzt."
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:134
+#: aleksis/core/forms.py:153 aleksis/core/models.py:136
 msgid "School term"
 msgstr "Schuljahr"
 
@@ -141,7 +158,7 @@ msgid "Common data"
 msgstr "Allgemeine Daten"
 
 #: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/menus.py:174 aleksis/core/models.py:157
+#: aleksis/core/menus.py:160 aleksis/core/models.py:159
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
@@ -151,18 +168,18 @@ msgstr "Personen"
 msgid "Additional data"
 msgstr "Zusätzliche Datne"
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:210
-#: aleksis/core/models.py:539
+#: aleksis/core/forms.py:157 aleksis/core/models.py:212
+#: aleksis/core/models.py:541
 msgid "Photo"
 msgstr "Foto"
 
 #: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:79
 msgid "Date"
 msgstr "Datum"
 
 #: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:87
 msgid "Time"
 msgstr "Zeit"
 
@@ -198,11 +215,11 @@ msgstr "Einladungscode"
 msgid "Please enter your invitation code."
 msgstr "Bitte geben Sie Ihren Einladungscode ein."
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:185
+#: aleksis/core/forms.py:418 aleksis/core/models.py:187
 msgid "First name"
 msgstr "Vorname"
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:186
+#: aleksis/core/forms.py:419 aleksis/core/models.py:188
 msgid "Last name"
 msgstr "Nachname"
 
@@ -235,7 +252,9 @@ msgid "You must grant the permission to all objects and/or to some objects."
 msgstr "Sie müssen die Berechtigung auf alle Objekte und/oder für einige Objekte vergeben."
 
 #: aleksis/core/forms.py:586
-msgid "Adress data"
+#, fuzzy
+#| msgid "Adress data"
+msgid "Address data"
 msgstr "Adressdaten"
 
 #: aleksis/core/forms.py:598
@@ -256,9 +275,7 @@ msgstr "Die ausgewählte Aktion existiert nicht."
 
 #: aleksis/core/forms.py:739
 msgid "You do not have permission to run {} on all selected objects."
-msgstr ""
-"Sie haben nicht die Berechtigung, {} auf alle ausgewählten Objekte "
-"auszuführen."
+msgstr "Sie haben nicht die Berechtigung, {} auf alle ausgewählten Objekte auszuführen."
 
 #: aleksis/core/forms.py:795
 msgid "No valid selection."
@@ -284,138 +301,131 @@ msgstr "Kein Backup gefunden!"
 msgid "No backup result found!"
 msgstr "Kein Backupergebnis gefunden!"
 
-#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
+#: aleksis/core/menus.py:7 aleksis/core/templates/two_factor/core/login.html:6
 #: aleksis/core/templates/two_factor/core/login.html:32
 #: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr "Anmelden"
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
+#: aleksis/core/menus.py:13 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr "Registrieren"
 
-#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7
+#: aleksis/core/menus.py:22 aleksis/core/templates/invitations/enter.html:7
 msgid "Accept invitation"
 msgstr "Einladung akzeptieren"
 
-#: aleksis/core/menus.py:33
+#: aleksis/core/menus.py:31
 msgid "Dashboard"
 msgstr "Dashboard"
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:765
-#: aleksis/core/preferences.py:29 aleksis/core/templates/core/base.html:81
-#: aleksis/core/templates/core/notifications.html:4
-#: aleksis/core/templates/core/notifications.html:5
-msgid "Notifications"
-msgstr "Benachrichtigungen"
-
-#: aleksis/core/menus.py:53
+#: aleksis/core/menus.py:39
 msgid "Admin"
 msgstr "Admin"
 
-#: aleksis/core/menus.py:61 aleksis/core/models.py:865
+#: aleksis/core/menus.py:47 aleksis/core/models.py:867
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr "Ankündigungen"
 
-#: aleksis/core/menus.py:72 aleksis/core/models.py:135
+#: aleksis/core/menus.py:58 aleksis/core/models.py:137
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr "Schuljahre"
 
-#: aleksis/core/menus.py:83
+#: aleksis/core/menus.py:69
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 msgid "Dashboard widgets"
 msgstr "Dashboard-Widgets"
 
-#: aleksis/core/menus.py:94
+#: aleksis/core/menus.py:80
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr "Datenverwaltung"
 
-#: aleksis/core/menus.py:105
+#: aleksis/core/menus.py:91
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr "Systemstatus"
 
-#: aleksis/core/menus.py:116
+#: aleksis/core/menus.py:102
 msgid "Configuration"
 msgstr "Konfiguration"
 
-#: aleksis/core/menus.py:127 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:113 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 msgid "Data checks"
 msgstr "Datenprüfungen"
 
-#: aleksis/core/menus.py:133 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/menus.py:119 aleksis/core/templates/core/perms/list.html:13
 #: aleksis/core/templates/core/perms/list.html:14
 msgid "Manage permissions"
 msgstr "Berechtigungen verwalten"
 
-#: aleksis/core/menus.py:144
+#: aleksis/core/menus.py:130
 msgid "Backend Admin"
 msgstr "Backend-Administration"
 
-#: aleksis/core/menus.py:152
+#: aleksis/core/menus.py:138
 #: aleksis/core/templates/oauth2_provider/application/list.html:5
 #: aleksis/core/templates/oauth2_provider/application/list.html:6
 msgid "OAuth2 Applications"
 msgstr "OAuth2-Anwendungen"
 
-#: aleksis/core/menus.py:165
+#: aleksis/core/menus.py:151
 msgid "People"
 msgstr "Leute"
 
-#: aleksis/core/menus.py:196 aleksis/core/models.py:1099
+#: aleksis/core/menus.py:182 aleksis/core/models.py:1101
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr "Gruppentypen"
 
-#: aleksis/core/menus.py:207
+#: aleksis/core/menus.py:193
 msgid "Groups and child groups"
 msgstr "Gruppen und Kindgruppen"
 
-#: aleksis/core/menus.py:218 aleksis/core/models.py:535
+#: aleksis/core/menus.py:204 aleksis/core/models.py:537
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr "Zusätzliche Felder"
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:215
 msgid "Invite person"
 msgstr "Person einladen"
 
-#: aleksis/core/menus.py:242
+#: aleksis/core/menus.py:228
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr "Kindgruppen zu Gruppen zuordnen"
 
-#: aleksis/core/menus.py:254
+#: aleksis/core/menus.py:240
 msgid "Stop impersonation"
 msgstr "Verkleidung beenden"
 
-#: aleksis/core/menus.py:263
+#: aleksis/core/menus.py:249
 msgid "Account"
 msgstr "Konto"
 
-#: aleksis/core/menus.py:272
+#: aleksis/core/menus.py:258
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr "Einstellungen"
 
-#: aleksis/core/menus.py:281
+#: aleksis/core/menus.py:267
 msgid "2FA"
 msgstr "2FA"
 
-#: aleksis/core/menus.py:289
+#: aleksis/core/menus.py:275
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -427,17 +437,21 @@ msgstr "2FA"
 msgid "Change password"
 msgstr "Passwort ändern"
 
-#: aleksis/core/menus.py:301
+#: aleksis/core/menus.py:287
 msgid "Third-party accounts"
 msgstr "Drittanbieter-Konten"
 
-#: aleksis/core/menus.py:310
+#: aleksis/core/menus.py:296
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 msgid "Authorized applications"
 msgstr "Autorisierte Anwendungen"
 
-#: aleksis/core/menus.py:320
+#: aleksis/core/menus.py:305
+msgid "Calendar Feeds"
+msgstr ""
+
+#: aleksis/core/menus.py:318
 msgid "Logout"
 msgstr "Abmelden"
 
@@ -445,559 +459,584 @@ msgstr "Abmelden"
 msgid "Linked school term"
 msgstr "Zugeordnetes Schuljahr"
 
-#: aleksis/core/models.py:75
+#: aleksis/core/models.py:77
 msgid "Boolean (Yes/No)"
 msgstr "Boolean (Ja/Nein)"
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:78
 msgid "Text (one line)"
 msgstr "Text (eine Zeile)"
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:80
 msgid "Date and time"
 msgstr "Datum und Uhrzeit"
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:81
 msgid "Decimal number"
 msgstr "Dezimalzahl"
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:203
+#: aleksis/core/models.py:82 aleksis/core/models.py:205
 msgid "E-mail address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:83
 msgid "Integer"
 msgstr "Ganze Zahl"
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:84
 msgid "IP address"
 msgstr "IP-Adresse"
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:85
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr "Boolean oder leer (Ja/Nein/weder)"
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:86
 msgid "Text (multi-line)"
 msgstr "Text (mehrzeilig)"
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:88
 msgid "URL / Link"
 msgstr "URL / Link"
 
-#: aleksis/core/models.py:98 aleksis/core/models.py:1068
+#: aleksis/core/models.py:100 aleksis/core/models.py:1070
+#: aleksis/core/models.py:1374
 msgid "Name"
 msgstr "Name"
 
-#: aleksis/core/models.py:100
+#: aleksis/core/models.py:102
 msgid "Start date"
 msgstr "Startdatum"
 
-#: aleksis/core/models.py:101
+#: aleksis/core/models.py:103
 msgid "End date"
 msgstr "Enddatum"
 
-#: aleksis/core/models.py:120
+#: aleksis/core/models.py:122
 msgid "The start date must be earlier than the end date."
 msgstr "Das Startdatum muss vor dem Enddatum liegen."
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:129
 msgid "There is already a school term for this time or a part of this time."
 msgstr "Es gibt bereits ein Schuljahr für diesen Zeitraum oder einen Teilzeitraum."
 
-#: aleksis/core/models.py:156 aleksis/core/models.py:1017
+#: aleksis/core/models.py:158 aleksis/core/models.py:1019
+#: aleksis/core/models.py:1371
 msgid "Person"
 msgstr "Person"
 
-#: aleksis/core/models.py:159
+#: aleksis/core/models.py:161
 msgid "Can view address"
 msgstr "Kann Adresse sehen"
 
-#: aleksis/core/models.py:160
+#: aleksis/core/models.py:162
 msgid "Can view contact details"
 msgstr "Kann Kontaktdetails sehen"
 
-#: aleksis/core/models.py:161
+#: aleksis/core/models.py:163
 msgid "Can view photo"
 msgstr "Kann Foto sehen"
 
-#: aleksis/core/models.py:162
+#: aleksis/core/models.py:164
 msgid "Can view avatar image"
 msgstr "Kann Avatar-Bild sehen"
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:165
 msgid "Can view persons groups"
 msgstr "Kann Gruppen einer Person sehen"
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:166
 msgid "Can view personal details"
 msgstr "Kann persönliche Daten sehen"
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "female"
 msgstr "weiblich"
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "male"
 msgstr "männlich"
 
-#: aleksis/core/models.py:182 aleksis/core/models.py:1271
+#: aleksis/core/models.py:184 aleksis/core/models.py:1273
 msgid "Linked user"
 msgstr "Verknüpfter Benutzer"
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:190
 msgid "Additional name(s)"
 msgstr "Zusätzliche Namen"
 
-#: aleksis/core/models.py:192 aleksis/core/models.py:504
+#: aleksis/core/models.py:194 aleksis/core/models.py:506
 msgid "Short name"
 msgstr "Kurzname"
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:197
 msgid "Street"
 msgstr "Straße"
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:198
 msgid "Street number"
 msgstr "Hausnummer"
 
-#: aleksis/core/models.py:197
+#: aleksis/core/models.py:199
 msgid "Postal code"
 msgstr "Postleitzahl"
 
-#: aleksis/core/models.py:198
+#: aleksis/core/models.py:200
 msgid "Place"
 msgstr "Ort"
 
-#: aleksis/core/models.py:200 aleksis/core/templates/core/person/full.html:160
+#: aleksis/core/models.py:202 aleksis/core/templates/core/person/full.html:160
 msgid "Home phone"
 msgstr "Festnetz"
 
-#: aleksis/core/models.py:201 aleksis/core/templates/core/person/full.html:170
+#: aleksis/core/models.py:203 aleksis/core/templates/core/person/full.html:170
 msgid "Mobile phone"
 msgstr "Handy"
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:207
 msgid "Date of birth"
 msgstr "Geburtsdatum"
 
-#: aleksis/core/models.py:206
+#: aleksis/core/models.py:208
 msgid "Place of birth"
 msgstr "Geburtsort"
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:209
 msgid "Sex"
 msgstr "Geschlecht"
 
-#: aleksis/core/models.py:214 aleksis/core/models.py:543
+#: aleksis/core/models.py:216 aleksis/core/models.py:545
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr "Dies ist ein offizielles Foto, genutzt für offizielle Dokumente und interne Zwecke."
 
-#: aleksis/core/models.py:219 aleksis/core/models.py:547
+#: aleksis/core/models.py:221 aleksis/core/models.py:549
 msgid "Display picture / Avatar"
 msgstr "Bild/Avatar anzeigen"
 
-#: aleksis/core/models.py:222 aleksis/core/models.py:550
+#: aleksis/core/models.py:224 aleksis/core/models.py:552
 msgid "This is a picture or an avatar for public display."
 msgstr "Dies ist ein Bild oder ein Avatar für die öffentliche Darstellung."
 
-#: aleksis/core/models.py:227 aleksis/core/templates/core/person/full.html:235
+#: aleksis/core/models.py:229 aleksis/core/templates/core/person/full.html:235
 msgid "Guardians / Parents"
 msgstr "Erziehungsberechtigte / Eltern"
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:236
 msgid "Primary group"
 msgstr "Primärgruppe"
 
-#: aleksis/core/models.py:237 aleksis/core/models.py:717
-#: aleksis/core/models.py:741 aleksis/core/models.py:832
-#: aleksis/core/models.py:1092
+#: aleksis/core/models.py:239 aleksis/core/models.py:719
+#: aleksis/core/models.py:743 aleksis/core/models.py:834
+#: aleksis/core/models.py:1094
 msgid "Description"
 msgstr "Beschreibung"
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:459
 msgid "Title of field"
 msgstr "Feldtitel"
 
-#: aleksis/core/models.py:459
+#: aleksis/core/models.py:461
 msgid "Type of field"
 msgstr "Feldtyp"
 
-#: aleksis/core/models.py:461
+#: aleksis/core/models.py:463
 msgid "Required"
 msgstr "Pflichtfeld"
 
-#: aleksis/core/models.py:462
+#: aleksis/core/models.py:464
 msgid "Help text / description"
 msgstr "Hilfetext/Beschreibung"
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:470
 msgid "Addtitional field for groups"
 msgstr "Zusätzliche Felder für Gruppen"
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:471
 msgid "Addtitional fields for groups"
 msgstr "Zusätzliche Felder für Gruppen"
 
-#: aleksis/core/models.py:489
+#: aleksis/core/models.py:491
 msgid "Can assign child groups to groups"
 msgstr "Kann Kindgruppen zu Gruppen zuordnen"
 
-#: aleksis/core/models.py:490
+#: aleksis/core/models.py:492
 msgid "Can view statistics about group."
 msgstr "Kann Statistiken über Gruppen sehen."
 
-#: aleksis/core/models.py:502
+#: aleksis/core/models.py:504
 msgid "Long name"
 msgstr "Langname"
 
-#: aleksis/core/models.py:512 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:514 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr "Mitglieder"
 
-#: aleksis/core/models.py:515 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:517 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr "Leiter/-innen"
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:524 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr "Ãœbergeordnete Gruppen"
 
-#: aleksis/core/models.py:530
+#: aleksis/core/models.py:532
 msgid "Type of group"
 msgstr "Gruppentyp"
 
-#: aleksis/core/models.py:716 aleksis/core/models.py:740
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:718 aleksis/core/models.py:742
+#: aleksis/core/models.py:833
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Titel"
 
-#: aleksis/core/models.py:719
+#: aleksis/core/models.py:721
 msgid "Application"
 msgstr "Anwendung"
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:727
 msgid "Activity"
 msgstr "Aktivität"
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:728
 msgid "Activities"
 msgstr "Aktivitäten"
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:734
 msgid "Sender"
 msgstr "Absender"
 
-#: aleksis/core/models.py:737
+#: aleksis/core/models.py:739
 msgid "Recipient"
 msgstr "Empfänger"
 
-#: aleksis/core/models.py:742 aleksis/core/models.py:1069
+#: aleksis/core/models.py:744 aleksis/core/models.py:1071
 msgid "Link"
 msgstr "Link"
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:746
 msgid "Send notification at"
 msgstr "Benachrichtigung schicken am"
 
-#: aleksis/core/models.py:746
+#: aleksis/core/models.py:748
 msgid "Read"
 msgstr "Gelesen"
 
-#: aleksis/core/models.py:747
+#: aleksis/core/models.py:749
 msgid "Sent"
 msgstr "Versandt"
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:766
 msgid "Notification"
 msgstr "Benachrichtigung"
 
-#: aleksis/core/models.py:833
+#: aleksis/core/models.py:767 aleksis/core/preferences.py:29
+#: aleksis/core/templates/core/base.html:81
+#: aleksis/core/templates/core/notifications.html:4
+#: aleksis/core/templates/core/notifications.html:5
+msgid "Notifications"
+msgstr "Benachrichtigungen"
+
+#: aleksis/core/models.py:835
 msgid "Link to detailed view"
 msgstr "Link zur detaillierten Ansicht"
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:838
 msgid "Date and time from when to show"
 msgstr "Datum und Uhrzeit des Anzeigestarts"
 
-#: aleksis/core/models.py:839
+#: aleksis/core/models.py:841
 msgid "Date and time until when to show"
 msgstr "Anzeigezeitraum"
 
-#: aleksis/core/models.py:864
+#: aleksis/core/models.py:866
 msgid "Announcement"
 msgstr "Ankündigung"
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:904
 msgid "Announcement recipient"
 msgstr "Empfänger der Ankündigung"
 
-#: aleksis/core/models.py:903
+#: aleksis/core/models.py:905
 msgid "Announcement recipients"
 msgstr "Empfänger der Ankündigung"
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:927
 msgid "Widget Title"
 msgstr "Widget-Titel"
 
-#: aleksis/core/models.py:926
+#: aleksis/core/models.py:928
 msgid "Activate Widget"
 msgstr "Widget aktivieren"
 
-#: aleksis/core/models.py:927
+#: aleksis/core/models.py:929
 msgid "Widget is broken"
 msgstr "Widget ist kaputt"
 
-#: aleksis/core/models.py:930
+#: aleksis/core/models.py:932
 msgid "Size on mobile devices"
 msgstr "Größe auf Mobilgeräten"
 
-#: aleksis/core/models.py:931
+#: aleksis/core/models.py:933
 msgid "<= 600 px, 12 columns"
 msgstr "<= 600 px, 12 Spalten"
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:938
 msgid "Size on tablet devices"
 msgstr "Größe auf Tablets"
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:939
 msgid "> 600 px, 12 columns"
 msgstr "> 600px, 12 Spalten"
 
-#: aleksis/core/models.py:942
+#: aleksis/core/models.py:944
 msgid "Size on desktop devices"
 msgstr "Größe auf Desktopgeräten"
 
-#: aleksis/core/models.py:943
+#: aleksis/core/models.py:945
 msgid "> 992 px, 12 columns"
 msgstr "> 992 px, 12 Spalten"
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:950
 msgid "Size on large desktop devices"
 msgstr "Größe auf großen Desktopgeräten"
 
-#: aleksis/core/models.py:949
+#: aleksis/core/models.py:951
 msgid "> 1200 px>, 12 columns"
 msgstr "> 1200 px, 12 Spalten"
 
-#: aleksis/core/models.py:980
+#: aleksis/core/models.py:982
 msgid "Can edit default dashboard"
 msgstr "Kann Standarddashboard bearbeiten"
 
-#: aleksis/core/models.py:981
+#: aleksis/core/models.py:983
 msgid "Dashboard Widget"
 msgstr "Dashboard-Widget"
 
-#: aleksis/core/models.py:982
+#: aleksis/core/models.py:984
 msgid "Dashboard Widgets"
 msgstr "Dashboard-Widgets"
 
-#: aleksis/core/models.py:988
+#: aleksis/core/models.py:990
 msgid "URL"
 msgstr "URL"
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:991
 msgid "Icon URL"
 msgstr "Symbol-URL"
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:997
 msgid "External link widget"
 msgstr "Externer-Link-Widget"
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:998
 msgid "External link widgets"
 msgstr "Externer-Link-Widgets"
 
-#: aleksis/core/models.py:1002
+#: aleksis/core/models.py:1004
 msgid "Content"
 msgstr "Inhalt"
 
-#: aleksis/core/models.py:1008
+#: aleksis/core/models.py:1010
 msgid "Static content widget"
 msgstr "Statischer-Inhalt-Widget"
 
-#: aleksis/core/models.py:1009
+#: aleksis/core/models.py:1011
 msgid "Static content widgets"
 msgstr "Statischer-Inhalt-Widgets"
 
-#: aleksis/core/models.py:1014
+#: aleksis/core/models.py:1016
 msgid "Dashboard widget"
 msgstr "Dashboard-Widget"
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1021
 msgid "Order"
 msgstr "Reihenfolge"
 
-#: aleksis/core/models.py:1020
+#: aleksis/core/models.py:1022
 msgid "Part of the default dashboard"
 msgstr "Teil des Standarddashboards"
 
-#: aleksis/core/models.py:1035
+#: aleksis/core/models.py:1037
 msgid "Dashboard widget order"
 msgstr "Reihenfolge der Dashboard-Widgets"
 
-#: aleksis/core/models.py:1036
+#: aleksis/core/models.py:1038
 msgid "Dashboard widget orders"
 msgstr "Reihenfolgen der Dashboard-Widgets"
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1044
 msgid "Menu ID"
 msgstr "Menü-ID"
 
-#: aleksis/core/models.py:1055
+#: aleksis/core/models.py:1057
 msgid "Custom menu"
 msgstr "Benutzerdefiniertes Menü"
 
-#: aleksis/core/models.py:1056
+#: aleksis/core/models.py:1058
 msgid "Custom menus"
 msgstr "Benutzerdefinierte Menüs"
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1068
 msgid "Menu"
 msgstr "Menü"
 
-#: aleksis/core/models.py:1070 aleksis/core/models.py:1318
+#: aleksis/core/models.py:1072 aleksis/core/models.py:1320
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr "Symbol"
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1078
 msgid "Custom menu item"
 msgstr "Benutzerdefiniertes Menüelement"
 
-#: aleksis/core/models.py:1077
+#: aleksis/core/models.py:1079
 msgid "Custom menu items"
 msgstr "Benutzerdefinierte Menüelemente"
 
-#: aleksis/core/models.py:1091
+#: aleksis/core/models.py:1093
 msgid "Title of type"
 msgstr "Titel des Typs"
 
-#: aleksis/core/models.py:1098 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1100 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr "Gruppentyp"
 
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:1114
 msgid "Can view system status"
 msgstr "Kann Systemstatus sehen"
 
-#: aleksis/core/models.py:1113
+#: aleksis/core/models.py:1115
 msgid "Can manage data"
 msgstr "Kann Daten verwalten"
 
-#: aleksis/core/models.py:1114
+#: aleksis/core/models.py:1116
 msgid "Can impersonate"
 msgstr "Kann sich verkleiden"
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1117
 msgid "Can use search"
 msgstr "Kann Suche benutzen"
 
-#: aleksis/core/models.py:1116
+#: aleksis/core/models.py:1118
 msgid "Can change site preferences"
 msgstr "Kann Konfiguration ändern"
 
-#: aleksis/core/models.py:1117
+#: aleksis/core/models.py:1119
 msgid "Can change person preferences"
 msgstr "Kann Einstellungen einer Person verändern"
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1120
 msgid "Can change group preferences"
 msgstr "Kann Einstellungen einer Gruppe verändern"
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1121
 msgid "Can test PDF generation"
 msgstr "Kann die PDF-Generierung testen"
 
-#: aleksis/core/models.py:1120
+#: aleksis/core/models.py:1122
 msgid "Can invite persons"
 msgstr "Kann Personen einladen"
 
-#: aleksis/core/models.py:1156
+#: aleksis/core/models.py:1158
 msgid "Related data check task"
 msgstr "Zugehörige Datenprüfungsaufgabe"
 
-#: aleksis/core/models.py:1164
+#: aleksis/core/models.py:1166
 msgid "Issue solved"
 msgstr "Problem gelöst"
 
-#: aleksis/core/models.py:1165
+#: aleksis/core/models.py:1167
 msgid "Notification sent"
 msgstr "Benachrichtigung gesendet"
 
-#: aleksis/core/models.py:1178
+#: aleksis/core/models.py:1180
 msgid "Data check result"
 msgstr "Datenprüfungsergebnis"
 
-#: aleksis/core/models.py:1179
+#: aleksis/core/models.py:1181
 msgid "Data check results"
 msgstr "Datenprüfungsergebnisse"
 
-#: aleksis/core/models.py:1181
+#: aleksis/core/models.py:1183
 msgid "Can run data checks"
 msgstr "Kann Datenprüfungen ausführen"
 
-#: aleksis/core/models.py:1182
+#: aleksis/core/models.py:1184
 msgid "Can solve data check problems"
 msgstr "Kann Datenprüfungsprobleme lösen"
 
-#: aleksis/core/models.py:1189
+#: aleksis/core/models.py:1191
 msgid "E-Mail address"
 msgstr "E-Mail-Adresse"
 
-#: aleksis/core/models.py:1221
+#: aleksis/core/models.py:1223
 msgid "Owner"
 msgstr "Leiter"
 
-#: aleksis/core/models.py:1225
+#: aleksis/core/models.py:1227
 msgid "File expires at"
 msgstr "Datei abgelaufen am"
 
-#: aleksis/core/models.py:1227
+#: aleksis/core/models.py:1229
 msgid "Generated HTML file"
 msgstr "Generierte HTML-Datei"
 
-#: aleksis/core/models.py:1229
+#: aleksis/core/models.py:1231
 msgid "Generated PDF file"
 msgstr "Generierte PDF-Datei"
 
-#: aleksis/core/models.py:1236
+#: aleksis/core/models.py:1238
 msgid "PDF file"
 msgstr "PDF-Datei"
 
-#: aleksis/core/models.py:1237
+#: aleksis/core/models.py:1239
 msgid "PDF files"
 msgstr "PDF-Dateien"
 
-#: aleksis/core/models.py:1242
+#: aleksis/core/models.py:1244
 msgid "Task result"
 msgstr "Task-Ergebnis"
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1247
 msgid "Task user"
 msgstr "Task-Benutzer"
 
-#: aleksis/core/models.py:1257
+#: aleksis/core/models.py:1259
 msgid "Task user assignment"
 msgstr "Task-Benutzer-Zuordnung"
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1260
 msgid "Task user assignments"
 msgstr "Task-Benutzer-Zuordnungen"
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1276
 msgid "Additional attributes"
 msgstr "Zusätzliche Attribute"
 
-#: aleksis/core/models.py:1312
+#: aleksis/core/models.py:1314
 msgid "Allowed scopes that clients can request"
 msgstr "Erlaubte Scopes, die ein Client anfordern kann"
 
-#: aleksis/core/models.py:1322
+#: aleksis/core/models.py:1324
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr "Dieses Bild wird im Autorisierungs-Vorgang als Symbol angezeigt werden. Es sollte rechteckig sein."
 
+#: aleksis/core/models.py:1373
+msgid "UUID"
+msgstr ""
+
+#: aleksis/core/models.py:1377
+msgid "Selected ICal feed"
+msgstr ""
+
+#: aleksis/core/models.py:1386
+msgid "Personal Calendar URL"
+msgstr ""
+
+#: aleksis/core/models.py:1387
+msgid "Personal Calendar URLs"
+msgstr ""
+
 #: aleksis/core/preferences.py:25
 msgid "General"
 msgstr "Allgemein"
@@ -1580,7 +1619,9 @@ msgid "Publish new announcement"
 msgstr "Neue Ankündigung veröffentlichen"
 
 #: aleksis/core/templates/core/announcement/form.html:34
-msgid "Save und publish announcement"
+#, fuzzy
+#| msgid "Save und publish announcement"
+msgid "Save and publish announcement"
 msgstr "Ankündigung speichern und veröffentlichen"
 
 #: aleksis/core/templates/core/announcement/list.html:19
@@ -1913,6 +1954,40 @@ msgstr "Gruppentyp editieren"
 msgid "Create group type"
 msgstr "Gruppentyp erstellen"
 
+#: aleksis/core/templates/core/ical/ical_create.html:4
+#: aleksis/core/templates/core/ical/ical_create.html:5
+#: aleksis/core/templates/core/ical/ical_list.html:12
+msgid "Create iCal URL"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_create.html:16
+#: aleksis/core/templates/core/ical/ical_edit.html:16
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
+#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
+#: aleksis/core/templates/two_factor/_wizard_actions.html:6
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: aleksis/core/templates/core/ical/ical_edit.html:4
+#: aleksis/core/templates/core/ical/ical_edit.html:5
+#, python-format
+msgid "Edit iCal URL %(object)s"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:4
+#: aleksis/core/templates/core/ical/ical_list.html:5
+msgid "ICal Feeds"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:8
+msgid "These are URLs for different Calendar Feeds in the iCal (.ics) format. You can create as many as you want and import them in your calendar software."
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:14
+msgid "Your iCal URLs"
+msgstr ""
+
 #: aleksis/core/templates/core/index.html:4
 msgid "Home"
 msgstr "Startseite"
@@ -2449,13 +2524,6 @@ msgstr "Die Einladung für %(email)s wurde akzeptiert."
 msgid "Register OAuth2 Application"
 msgstr "OAuth2-Anwendung registrieren"
 
-#: aleksis/core/templates/oauth2_provider/application/create.html:14
-#: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
-#: aleksis/core/templates/two_factor/_wizard_actions.html:6
-msgid "Cancel"
-msgstr "Abbrechen"
-
 #: aleksis/core/templates/oauth2_provider/application/detail.html:5
 msgid "OAuth2 Application"
 msgstr "OAuth2-Anwendung"
@@ -3317,169 +3385,184 @@ msgstr "Es ist ein Fehler beim Generieren der PDF-Datei aufgetreten."
 msgid "Download PDF"
 msgstr "PDF herunterladen"
 
-#: aleksis/core/views.py:289
+#: aleksis/core/views.py:292
 msgid "The school term has been created."
 msgstr "Das Schuljahr wurde erstellt."
 
-#: aleksis/core/views.py:301
+#: aleksis/core/views.py:304
 msgid "The school term has been saved."
 msgstr "Das Schuljahr wurde gespeichert."
 
-#: aleksis/core/views.py:421
+#: aleksis/core/views.py:424
 msgid "The child groups were successfully saved."
 msgstr "Die Untergruppen wurden gespeichert."
 
-#: aleksis/core/views.py:440 aleksis/core/views.py:450
+#: aleksis/core/views.py:443 aleksis/core/views.py:453
 msgid "The person has been saved."
 msgstr "Die Person wurde gespeichert."
 
-#: aleksis/core/views.py:500
+#: aleksis/core/views.py:503
 msgid "The group has been saved."
 msgstr "Die Gruppe wurde gespeichert."
 
-#: aleksis/core/views.py:597
+#: aleksis/core/views.py:600
 msgid "The announcement has been saved."
 msgstr "Die Ankündigung wurde gespeichert."
 
-#: aleksis/core/views.py:613
+#: aleksis/core/views.py:616
 msgid "The announcement has been deleted."
 msgstr "Ankündigung wurde gelöscht."
 
-#: aleksis/core/views.py:681
+#: aleksis/core/views.py:684
 msgid "The requested preference registry does not exist"
 msgstr "Das angeforderte Einstellungsregister existiert nicht"
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:703
 msgid "The preferences have been saved successfully."
 msgstr "Die Einstellungen wurde gespeichert."
 
-#: aleksis/core/views.py:724
+#: aleksis/core/views.py:727
 msgid "The person has been deleted."
 msgstr "Die Person wurde gelöscht."
 
-#: aleksis/core/views.py:738
+#: aleksis/core/views.py:741
 msgid "The group has been deleted."
 msgstr "Die Gruppe wurde gelöscht."
 
-#: aleksis/core/views.py:770
+#: aleksis/core/views.py:773
 msgid "The additional_field has been saved."
 msgstr "Das zusätzliche Feld wurde gespeichert."
 
-#: aleksis/core/views.py:804
+#: aleksis/core/views.py:807
 msgid "The additional field has been deleted."
 msgstr "Das zusätzliche Feld wurde gelöscht."
 
-#: aleksis/core/views.py:829
+#: aleksis/core/views.py:832
 msgid "The group type has been saved."
 msgstr "Der Gruppentyp wurde gespeichert."
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:862
 msgid "The group type has been deleted."
 msgstr "Der Gruppentyp wurde gelöscht."
 
-#: aleksis/core/views.py:892
+#: aleksis/core/views.py:895
 msgid "Progress: Run data checks"
 msgstr "Fortschritt: Datenprüfungen ausführen"
 
-#: aleksis/core/views.py:893
+#: aleksis/core/views.py:896
 msgid "Run data checks …"
 msgstr "Datenprüfungen laufen …"
 
-#: aleksis/core/views.py:894
+#: aleksis/core/views.py:897
 msgid "The data checks were run successfully."
 msgstr "Die Datenprüfungen wurden erfolgreich ausgeführt."
 
-#: aleksis/core/views.py:895
+#: aleksis/core/views.py:898
 msgid "There was a problem while running data checks."
 msgstr "Es gab ein Problem beim Ausführen der Datenprüfungen."
 
-#: aleksis/core/views.py:911
+#: aleksis/core/views.py:914
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr "Die Lösungsoption \"{solve_option_obj.verbose_name}\" "
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:924
 msgid "The requested solve option does not exist"
 msgstr "Die angeforderte Lösungsoption existiert nicht"
 
-#: aleksis/core/views.py:953
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been saved."
 msgstr "Das Dashboard-Widget wurde gespeichert."
 
-#: aleksis/core/views.py:983
+#: aleksis/core/views.py:986
 msgid "The dashboard widget has been created."
 msgstr "Das Dashboard-Widget wurde erstellt."
 
-#: aleksis/core/views.py:993
+#: aleksis/core/views.py:996
 msgid "The dashboard widget has been deleted."
 msgstr "Das Dashboard-Widget wurde gelöscht."
 
-#: aleksis/core/views.py:1064
+#: aleksis/core/views.py:1067
 msgid "Your dashboard configuration has been saved successfully."
 msgstr "Ihre Dashboardkonfiguration wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1066
+#: aleksis/core/views.py:1069
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr "Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert."
 
-#: aleksis/core/views.py:1142
+#: aleksis/core/views.py:1145
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr "Die Einladung wurde erfolgreich erstellt. Der Einladungscode ist {code}"
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1236
 msgid "We have successfully assigned the permissions."
 msgstr "Wir haben die Berechtigungen erfolgreich zugewiesen."
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1246
 msgid "The global user permission has been deleted."
 msgstr "Die globale Benutzerberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1253
+#: aleksis/core/views.py:1256
 msgid "The global group permission has been deleted."
 msgstr "Die globale Gruppenberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1263
+#: aleksis/core/views.py:1266
 msgid "The object user permission has been deleted."
 msgstr "Die Objekt-Benutzerberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1273
+#: aleksis/core/views.py:1276
 msgid "The object group permission has been deleted."
 msgstr "Die Objekt-Gruppenberechtigung wurde gelöscht."
 
-#: aleksis/core/views.py:1341
+#: aleksis/core/views.py:1344
 msgid "The requested PDF file does not exist"
 msgstr "Die angeforderte PDF-Datei existiert nicht"
 
-#: aleksis/core/views.py:1350 aleksis/core/views.py:1354
+#: aleksis/core/views.py:1353 aleksis/core/views.py:1357
 msgid "The requested task does not exist or is not accessible"
 msgstr "Der angeforderte Task existiert nicht oder ist nicht abrufbar"
 
-#: aleksis/core/views.py:1406
+#: aleksis/core/views.py:1409
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr "Das Drittanbieter-Konto konnte nicht deaktiviert werden, weil es die einzige verfügbare Anmeldeoption ist."
 
-#: aleksis/core/views.py:1413
+#: aleksis/core/views.py:1416
 msgid "The third-party account has been successfully disconnected."
 msgstr "Das Drittanbieter-Konto wurde erfolgreich getrennt."
 
-#: aleksis/core/views.py:1484
+#: aleksis/core/views.py:1487
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr "Die Person wurde erfolgreich eingeladen und eine E-Mail mit weiteren Anweisungen wurde an sie verschickt."
 
-#: aleksis/core/views.py:1495
+#: aleksis/core/views.py:1498
 msgid "Person was already invited."
 msgstr "Person wurde bereits eingeladen."
 
+#: aleksis/core/views.py:1598
+#, fuzzy
+#| msgid "Person was invited successfully."
+msgid "ICal feed updated successfully"
+msgstr "Person wurde erfolgreich eingeladen."
+
+#: aleksis/core/views.py:1608
+#, fuzzy
+#| msgid "The PDF file has been generated successfully."
+msgid "ICal feed deleted successfully"
+msgstr "Die PDF-Datei wurde erfolgreich generiert."
+
+#: aleksis/core/views.py:1616
+#, fuzzy
+#| msgid "The PDF file has been generated successfully."
+msgid "ICal feed created successfully"
+msgstr "Die PDF-Datei wurde erfolgreich generiert."
+
 #~ msgid "Me"
 #~ msgstr "Ich"
 
 #~ msgid "Logged in as"
 #~ msgstr "Angemeldet als"
 
-#~ msgid "Person was invited successfully."
-#~ msgstr "Person wurde erfolgreich eingeladen."
-
 #, python-brace-format
 #~ msgid "Last backup {time_gone_since_backup}!"
 #~ msgstr "Letztes Backup: {time_gone_since_backup}!"
diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
index c0b719bf0961c3f0c22071603f7df5b175571354..46116e73483b8a4b7af5f566700cd6110f8c29dc 100644
--- a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-23 11:20+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: 2021-10-28 14:37+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-core-js/de/>\n"
diff --git a/aleksis/core/locale/fr/LC_MESSAGES/django.po b/aleksis/core/locale/fr/LC_MESSAGES/django.po
index 231a5f739692d128aa759a0b397450df36c54169..03ca8ed9426a18b415e7ebe22449010c847dd68e 100644
--- a/aleksis/core/locale/fr/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/fr/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-23 11:19+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: 2021-06-16 12:00+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis/fr/>\n"
@@ -40,8 +40,8 @@ msgstr "Détails de contact"
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:185
-#: aleksis/core/models.py:487 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:171
+#: aleksis/core/models.py:489 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:246
 #, fuzzy
@@ -70,6 +70,24 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
+#: aleksis/core/feeds.py:52
+msgid "Birthday Calendar"
+msgstr ""
+
+#: aleksis/core/feeds.py:53
+msgid "A Calendar of Birthdays"
+msgstr ""
+
+#: aleksis/core/feeds.py:66
+#, python-format
+msgid "%(name)s's birthday"
+msgstr ""
+
+#: aleksis/core/feeds.py:71
+#, python-format
+msgid "%(name)s was born on %(birthday)s"
+msgstr ""
+
 #: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:139
 #: aleksis/core/templates/core/base.html:140
 #: aleksis/core/templates/core/group/list.html:20
@@ -97,11 +115,11 @@ msgstr ""
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:713
+#: aleksis/core/filters.py:113 aleksis/core/models.py:715
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:486
+#: aleksis/core/filters.py:135 aleksis/core/models.py:488
 msgid "Group"
 msgstr "groupe"
 
@@ -141,7 +159,7 @@ msgstr ""
 msgid "This username is already in use."
 msgstr "Cet nom est deja en utilisation."
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:134
+#: aleksis/core/forms.py:153 aleksis/core/models.py:136
 msgid "School term"
 msgstr ""
 
@@ -152,7 +170,7 @@ msgid "Common data"
 msgstr "Détails de contact"
 
 #: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/menus.py:174 aleksis/core/models.py:157
+#: aleksis/core/menus.py:160 aleksis/core/models.py:159
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 #, fuzzy
@@ -166,18 +184,18 @@ msgstr "Personne"
 msgid "Additional data"
 msgstr "Détails de contact"
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:210
-#: aleksis/core/models.py:539
+#: aleksis/core/forms.py:157 aleksis/core/models.py:212
+#: aleksis/core/models.py:541
 msgid "Photo"
 msgstr ""
 
 #: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:79
 msgid "Date"
 msgstr "Date"
 
 #: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:87
 msgid "Time"
 msgstr ""
 
@@ -213,11 +231,11 @@ msgstr ""
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:185
+#: aleksis/core/forms.py:418 aleksis/core/models.py:187
 msgid "First name"
 msgstr "Prénom"
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:186
+#: aleksis/core/forms.py:419 aleksis/core/models.py:188
 msgid "Last name"
 msgstr "Nom de famille"
 
@@ -250,7 +268,7 @@ msgid "You must grant the permission to all objects and/or to some objects."
 msgstr ""
 
 #: aleksis/core/forms.py:586
-msgid "Adress data"
+msgid "Address data"
 msgstr ""
 
 #: aleksis/core/forms.py:598
@@ -299,95 +317,88 @@ msgstr ""
 msgid "No backup result found!"
 msgstr ""
 
-#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
+#: aleksis/core/menus.py:7 aleksis/core/templates/two_factor/core/login.html:6
 #: aleksis/core/templates/two_factor/core/login.html:32
 #: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr ""
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
+#: aleksis/core/menus.py:13 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr ""
 
-#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7
+#: aleksis/core/menus.py:22 aleksis/core/templates/invitations/enter.html:7
 msgid "Accept invitation"
 msgstr ""
 
-#: aleksis/core/menus.py:33
+#: aleksis/core/menus.py:31
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:765
-#: aleksis/core/preferences.py:29 aleksis/core/templates/core/base.html:81
-#: aleksis/core/templates/core/notifications.html:4
-#: aleksis/core/templates/core/notifications.html:5
-msgid "Notifications"
-msgstr ""
-
-#: aleksis/core/menus.py:53
+#: aleksis/core/menus.py:39
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:61 aleksis/core/models.py:865
+#: aleksis/core/menus.py:47 aleksis/core/models.py:867
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:72 aleksis/core/models.py:135
+#: aleksis/core/menus.py:58 aleksis/core/models.py:137
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/menus.py:83
+#: aleksis/core/menus.py:69
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 msgid "Dashboard widgets"
 msgstr ""
 
-#: aleksis/core/menus.py:94
+#: aleksis/core/menus.py:80
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr ""
 
-#: aleksis/core/menus.py:105
+#: aleksis/core/menus.py:91
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr ""
 
-#: aleksis/core/menus.py:116
+#: aleksis/core/menus.py:102
 msgid "Configuration"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:113 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/menus.py:133 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/menus.py:119 aleksis/core/templates/core/perms/list.html:13
 #: aleksis/core/templates/core/perms/list.html:14
 msgid "Manage permissions"
 msgstr ""
 
-#: aleksis/core/menus.py:144
+#: aleksis/core/menus.py:130
 msgid "Backend Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:152
+#: aleksis/core/menus.py:138
 #: aleksis/core/templates/oauth2_provider/application/list.html:5
 #: aleksis/core/templates/oauth2_provider/application/list.html:6
 msgid "OAuth2 Applications"
 msgstr ""
 
-#: aleksis/core/menus.py:165
+#: aleksis/core/menus.py:151
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:196 aleksis/core/models.py:1099
+#: aleksis/core/menus.py:182 aleksis/core/models.py:1101
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 #, fuzzy
@@ -395,46 +406,46 @@ msgstr ""
 msgid "Group types"
 msgstr "Groupe"
 
-#: aleksis/core/menus.py:207
+#: aleksis/core/menus.py:193
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:218 aleksis/core/models.py:535
+#: aleksis/core/menus.py:204 aleksis/core/models.py:537
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:215
 #, fuzzy
 #| msgid "Contact details"
 msgid "Invite person"
 msgstr "Détails de contact"
 
-#: aleksis/core/menus.py:242
+#: aleksis/core/menus.py:228
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/menus.py:254
+#: aleksis/core/menus.py:240
 msgid "Stop impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:263
+#: aleksis/core/menus.py:249
 msgid "Account"
 msgstr ""
 
-#: aleksis/core/menus.py:272
+#: aleksis/core/menus.py:258
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr ""
 
-#: aleksis/core/menus.py:281
+#: aleksis/core/menus.py:267
 msgid "2FA"
 msgstr ""
 
-#: aleksis/core/menus.py:289
+#: aleksis/core/menus.py:275
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -446,17 +457,21 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
-#: aleksis/core/menus.py:301
+#: aleksis/core/menus.py:287
 msgid "Third-party accounts"
 msgstr ""
 
-#: aleksis/core/menus.py:310
+#: aleksis/core/menus.py:296
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 msgid "Authorized applications"
 msgstr ""
 
-#: aleksis/core/menus.py:320
+#: aleksis/core/menus.py:305
+msgid "Calendar Feeds"
+msgstr ""
+
+#: aleksis/core/menus.py:318
 msgid "Logout"
 msgstr ""
 
@@ -464,597 +479,622 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:75
+#: aleksis/core/models.py:77
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:78
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:80
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:81
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:203
+#: aleksis/core/models.py:82 aleksis/core/models.py:205
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:83
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:84
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:85
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:86
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:88
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:98 aleksis/core/models.py:1068
+#: aleksis/core/models.py:100 aleksis/core/models.py:1070
+#: aleksis/core/models.py:1374
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:100
+#: aleksis/core/models.py:102
 #, fuzzy
 #| msgid "Contact details"
 msgid "Start date"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:101
+#: aleksis/core/models.py:103
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:120
+#: aleksis/core/models.py:122
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:129
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:156 aleksis/core/models.py:1017
+#: aleksis/core/models.py:158 aleksis/core/models.py:1019
+#: aleksis/core/models.py:1371
 msgid "Person"
 msgstr "Personne"
 
-#: aleksis/core/models.py:159
+#: aleksis/core/models.py:161
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view address"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:160
+#: aleksis/core/models.py:162
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view contact details"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:161
+#: aleksis/core/models.py:163
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view photo"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:162
+#: aleksis/core/models.py:164
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view avatar image"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:165
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view persons groups"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:166
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view personal details"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:182 aleksis/core/models.py:1271
+#: aleksis/core/models.py:184 aleksis/core/models.py:1273
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:190
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:192 aleksis/core/models.py:504
+#: aleksis/core/models.py:194 aleksis/core/models.py:506
 #, fuzzy
 #| msgid "First name"
 msgid "Short name"
 msgstr "Prénom"
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:197
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:198
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:197
+#: aleksis/core/models.py:199
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:198
+#: aleksis/core/models.py:200
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:200 aleksis/core/templates/core/person/full.html:160
+#: aleksis/core/models.py:202 aleksis/core/templates/core/person/full.html:160
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:201 aleksis/core/templates/core/person/full.html:170
+#: aleksis/core/models.py:203 aleksis/core/templates/core/person/full.html:170
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:207
 msgid "Date of birth"
 msgstr "Date d'anniversaire"
 
-#: aleksis/core/models.py:206
+#: aleksis/core/models.py:208
 #, fuzzy
 #| msgid "Date of birth"
 msgid "Place of birth"
 msgstr "Date d'anniversaire"
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:209
 msgid "Sex"
 msgstr "Sexe"
 
-#: aleksis/core/models.py:214 aleksis/core/models.py:543
+#: aleksis/core/models.py:216 aleksis/core/models.py:545
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr ""
 
-#: aleksis/core/models.py:219 aleksis/core/models.py:547
+#: aleksis/core/models.py:221 aleksis/core/models.py:549
 msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:222 aleksis/core/models.py:550
+#: aleksis/core/models.py:224 aleksis/core/models.py:552
 msgid "This is a picture or an avatar for public display."
 msgstr ""
 
-#: aleksis/core/models.py:227 aleksis/core/templates/core/person/full.html:235
+#: aleksis/core/models.py:229 aleksis/core/templates/core/person/full.html:235
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:236
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:237 aleksis/core/models.py:717
-#: aleksis/core/models.py:741 aleksis/core/models.py:832
-#: aleksis/core/models.py:1092
+#: aleksis/core/models.py:239 aleksis/core/models.py:719
+#: aleksis/core/models.py:743 aleksis/core/models.py:834
+#: aleksis/core/models.py:1094
 msgid "Description"
 msgstr "Description"
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:459
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:459
+#: aleksis/core/models.py:461
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:461
+#: aleksis/core/models.py:463
 msgid "Required"
 msgstr ""
 
-#: aleksis/core/models.py:462
+#: aleksis/core/models.py:464
 #, fuzzy
 #| msgid "Description"
 msgid "Help text / description"
 msgstr "Description"
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:470
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:471
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:489
+#: aleksis/core/models.py:491
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:490
+#: aleksis/core/models.py:492
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view statistics about group."
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:502
+#: aleksis/core/models.py:504
 #, fuzzy
 #| msgid "Last name"
 msgid "Long name"
 msgstr "Nom de famille"
 
-#: aleksis/core/models.py:512 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:514 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:515 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:517 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr "Propriétaires"
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:524 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:530
+#: aleksis/core/models.py:532
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:716 aleksis/core/models.py:740
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:718 aleksis/core/models.py:742
+#: aleksis/core/models.py:833
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:719
+#: aleksis/core/models.py:721
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:727
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:728
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:734
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:737
+#: aleksis/core/models.py:739
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:742 aleksis/core/models.py:1069
+#: aleksis/core/models.py:744 aleksis/core/models.py:1071
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:746
 msgid "Send notification at"
 msgstr ""
 
-#: aleksis/core/models.py:746
+#: aleksis/core/models.py:748
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:747
+#: aleksis/core/models.py:749
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:766
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:833
+#: aleksis/core/models.py:767 aleksis/core/preferences.py:29
+#: aleksis/core/templates/core/base.html:81
+#: aleksis/core/templates/core/notifications.html:4
+#: aleksis/core/templates/core/notifications.html:5
+msgid "Notifications"
+msgstr ""
+
+#: aleksis/core/models.py:835
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:838
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:839
+#: aleksis/core/models.py:841
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:864
+#: aleksis/core/models.py:866
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:904
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:903
+#: aleksis/core/models.py:905
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:927
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:926
+#: aleksis/core/models.py:928
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:927
+#: aleksis/core/models.py:929
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:930
+#: aleksis/core/models.py:932
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:931
+#: aleksis/core/models.py:933
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:938
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:939
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:942
+#: aleksis/core/models.py:944
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:943
+#: aleksis/core/models.py:945
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:950
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:949
+#: aleksis/core/models.py:951
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:980
+#: aleksis/core/models.py:982
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:981
+#: aleksis/core/models.py:983
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:982
+#: aleksis/core/models.py:984
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:988
+#: aleksis/core/models.py:990
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:991
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:997
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:998
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1002
+#: aleksis/core/models.py:1004
 msgid "Content"
 msgstr ""
 
-#: aleksis/core/models.py:1008
+#: aleksis/core/models.py:1010
 msgid "Static content widget"
 msgstr ""
 
-#: aleksis/core/models.py:1009
+#: aleksis/core/models.py:1011
 msgid "Static content widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1014
+#: aleksis/core/models.py:1016
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1021
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:1020
+#: aleksis/core/models.py:1022
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:1035
+#: aleksis/core/models.py:1037
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:1036
+#: aleksis/core/models.py:1038
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1044
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:1055
+#: aleksis/core/models.py:1057
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:1056
+#: aleksis/core/models.py:1058
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1068
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1070 aleksis/core/models.py:1318
+#: aleksis/core/models.py:1072 aleksis/core/models.py:1320
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1078
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:1077
+#: aleksis/core/models.py:1079
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:1091
+#: aleksis/core/models.py:1093
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:1098 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1100 aleksis/core/templates/core/group/full.html:47
 #, fuzzy
 #| msgid "Group"
 msgid "Group type"
 msgstr "Groupe"
 
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:1114
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can view system status"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1113
+#: aleksis/core/models.py:1115
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:1114
+#: aleksis/core/models.py:1116
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can impersonate"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1117
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:1116
+#: aleksis/core/models.py:1118
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1117
+#: aleksis/core/models.py:1119
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1120
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1121
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1120
+#: aleksis/core/models.py:1122
 #, fuzzy
 #| msgid "Contact details"
 msgid "Can invite persons"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1156
+#: aleksis/core/models.py:1158
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1164
+#: aleksis/core/models.py:1166
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1165
+#: aleksis/core/models.py:1167
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1178
+#: aleksis/core/models.py:1180
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1179
+#: aleksis/core/models.py:1181
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1181
+#: aleksis/core/models.py:1183
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1182
+#: aleksis/core/models.py:1184
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1189
+#: aleksis/core/models.py:1191
 #, fuzzy
 #| msgid "Contact details"
 msgid "E-Mail address"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1221
+#: aleksis/core/models.py:1223
 #, fuzzy
 #| msgid "Owners"
 msgid "Owner"
 msgstr "Propriétaires"
 
-#: aleksis/core/models.py:1225
+#: aleksis/core/models.py:1227
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1227
+#: aleksis/core/models.py:1229
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1229
+#: aleksis/core/models.py:1231
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1236
+#: aleksis/core/models.py:1238
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1237
+#: aleksis/core/models.py:1239
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1242
+#: aleksis/core/models.py:1244
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1247
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1257
+#: aleksis/core/models.py:1259
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1260
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1276
 #, fuzzy
 #| msgid "Contact details"
 msgid "Additional attributes"
 msgstr "Détails de contact"
 
-#: aleksis/core/models.py:1312
+#: aleksis/core/models.py:1314
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1322
+#: aleksis/core/models.py:1324
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
+#: aleksis/core/models.py:1373
+msgid "UUID"
+msgstr ""
+
+#: aleksis/core/models.py:1377
+msgid "Selected ICal feed"
+msgstr ""
+
+#: aleksis/core/models.py:1386
+msgid "Personal Calendar URL"
+msgstr ""
+
+#: aleksis/core/models.py:1387
+msgid "Personal Calendar URLs"
+msgstr ""
+
 #: aleksis/core/preferences.py:25
 msgid "General"
 msgstr ""
@@ -1587,7 +1627,7 @@ msgid "Publish new announcement"
 msgstr ""
 
 #: aleksis/core/templates/core/announcement/form.html:34
-msgid "Save und publish announcement"
+msgid "Save and publish announcement"
 msgstr ""
 
 #: aleksis/core/templates/core/announcement/list.html:19
@@ -1899,6 +1939,40 @@ msgstr "Groupe"
 msgid "Create group type"
 msgstr "Groupe"
 
+#: aleksis/core/templates/core/ical/ical_create.html:4
+#: aleksis/core/templates/core/ical/ical_create.html:5
+#: aleksis/core/templates/core/ical/ical_list.html:12
+msgid "Create iCal URL"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_create.html:16
+#: aleksis/core/templates/core/ical/ical_edit.html:16
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
+#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
+#: aleksis/core/templates/two_factor/_wizard_actions.html:6
+msgid "Cancel"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_edit.html:4
+#: aleksis/core/templates/core/ical/ical_edit.html:5
+#, python-format
+msgid "Edit iCal URL %(object)s"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:4
+#: aleksis/core/templates/core/ical/ical_list.html:5
+msgid "ICal Feeds"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:8
+msgid "These are URLs for different Calendar Feeds in the iCal (.ics) format. You can create as many as you want and import them in your calendar software."
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:14
+msgid "Your iCal URLs"
+msgstr ""
+
 #: aleksis/core/templates/core/index.html:4
 msgid "Home"
 msgstr ""
@@ -2387,13 +2461,6 @@ msgstr ""
 msgid "Register OAuth2 Application"
 msgstr "Détails de contact"
 
-#: aleksis/core/templates/oauth2_provider/application/create.html:14
-#: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
-#: aleksis/core/templates/two_factor/_wizard_actions.html:6
-msgid "Cancel"
-msgstr ""
-
 #: aleksis/core/templates/oauth2_provider/application/detail.html:5
 #, fuzzy
 #| msgid "Contact details"
@@ -3127,162 +3194,174 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:289
+#: aleksis/core/views.py:292
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:301
+#: aleksis/core/views.py:304
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:421
+#: aleksis/core/views.py:424
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:440 aleksis/core/views.py:450
+#: aleksis/core/views.py:443 aleksis/core/views.py:453
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:500
+#: aleksis/core/views.py:503
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:597
+#: aleksis/core/views.py:600
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:613
+#: aleksis/core/views.py:616
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:681
+#: aleksis/core/views.py:684
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:703
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:724
+#: aleksis/core/views.py:727
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:738
+#: aleksis/core/views.py:741
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:770
+#: aleksis/core/views.py:773
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:804
+#: aleksis/core/views.py:807
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:829
+#: aleksis/core/views.py:832
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:862
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:892
+#: aleksis/core/views.py:895
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:893
+#: aleksis/core/views.py:896
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:894
+#: aleksis/core/views.py:897
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:895
+#: aleksis/core/views.py:898
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:911
+#: aleksis/core/views.py:914
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:924
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:953
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:983
+#: aleksis/core/views.py:986
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:993
+#: aleksis/core/views.py:996
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1064
+#: aleksis/core/views.py:1067
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1066
+#: aleksis/core/views.py:1069
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1142
+#: aleksis/core/views.py:1145
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1236
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1246
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1253
+#: aleksis/core/views.py:1256
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1263
+#: aleksis/core/views.py:1266
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1273
+#: aleksis/core/views.py:1276
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1341
+#: aleksis/core/views.py:1344
 msgid "The requested PDF file does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:1350 aleksis/core/views.py:1354
+#: aleksis/core/views.py:1353 aleksis/core/views.py:1357
 msgid "The requested task does not exist or is not accessible"
 msgstr ""
 
-#: aleksis/core/views.py:1406
+#: aleksis/core/views.py:1409
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1413
+#: aleksis/core/views.py:1416
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1484
+#: aleksis/core/views.py:1487
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1495
+#: aleksis/core/views.py:1498
 #, fuzzy
 #| msgid "This username is already in use."
 msgid "Person was already invited."
 msgstr "Cet nom est deja en utilisation."
 
+#: aleksis/core/views.py:1598
+msgid "ICal feed updated successfully"
+msgstr ""
+
+#: aleksis/core/views.py:1608
+msgid "ICal feed deleted successfully"
+msgstr ""
+
+#: aleksis/core/views.py:1616
+msgid "ICal feed created successfully"
+msgstr ""
+
 #, fuzzy
 #~| msgid "Contact details"
 #~ msgid "Can link persons to accounts"
diff --git a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po
index 0f31d087d69a8fca9b3573dfa6d977c8459eaf99..8b09ccccb99d662228f56e974bfc374c48e225fa 100644
--- a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-23 11:20+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/aleksis/core/locale/la/LC_MESSAGES/django.po b/aleksis/core/locale/la/LC_MESSAGES/django.po
index fd7a3aa487f88448c539f5347f5700188a72d270..2d18ad75e75b9e8c18abb297f12c14b2ba21088d 100644
--- a/aleksis/core/locale/la/LC_MESSAGES/django.po
+++ b/aleksis/core/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-03-23 11:19+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: 2020-12-19 12:57+0000\n"
 "Last-Translator: Julian <leuckerj@gmail.com>\n"
 "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis/la/>\n"
@@ -44,8 +44,8 @@ msgstr "Inscriptio electronica"
 msgid "Home and mobile phone"
 msgstr "Numerus telephoni mobilis"
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:185
-#: aleksis/core/models.py:487 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:171
+#: aleksis/core/models.py:489 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:246
 msgid "Groups"
@@ -74,6 +74,24 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
+#: aleksis/core/feeds.py:52
+msgid "Birthday Calendar"
+msgstr ""
+
+#: aleksis/core/feeds.py:53
+msgid "A Calendar of Birthdays"
+msgstr ""
+
+#: aleksis/core/feeds.py:66
+#, python-format
+msgid "%(name)s's birthday"
+msgstr ""
+
+#: aleksis/core/feeds.py:71
+#, python-format
+msgid "%(name)s was born on %(birthday)s"
+msgstr ""
+
 #: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:139
 #: aleksis/core/templates/core/base.html:140
 #: aleksis/core/templates/core/group/list.html:20
@@ -101,11 +119,11 @@ msgstr ""
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:713
+#: aleksis/core/filters.py:113 aleksis/core/models.py:715
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:486
+#: aleksis/core/filters.py:135 aleksis/core/models.py:488
 msgid "Group"
 msgstr "Grex"
 
@@ -145,7 +163,7 @@ msgstr ""
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:134
+#: aleksis/core/forms.py:153 aleksis/core/models.py:136
 msgid "School term"
 msgstr "Anus scolae"
 
@@ -156,7 +174,7 @@ msgid "Common data"
 msgstr "Adminstratio datarum"
 
 #: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/menus.py:174 aleksis/core/models.py:157
+#: aleksis/core/menus.py:160 aleksis/core/models.py:159
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
@@ -168,18 +186,18 @@ msgstr "personae"
 msgid "Additional data"
 msgstr "addita nomines"
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:210
-#: aleksis/core/models.py:539
+#: aleksis/core/forms.py:157 aleksis/core/models.py:212
+#: aleksis/core/models.py:541
 msgid "Photo"
 msgstr "Photographia"
 
 #: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:79
 msgid "Date"
 msgstr "dies"
 
 #: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:87
 msgid "Time"
 msgstr "tempus"
 
@@ -215,11 +233,11 @@ msgstr ""
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:185
+#: aleksis/core/forms.py:418 aleksis/core/models.py:187
 msgid "First name"
 msgstr "Primus nomen"
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:186
+#: aleksis/core/forms.py:419 aleksis/core/models.py:188
 msgid "Last name"
 msgstr "Secondus nomen"
 
@@ -258,7 +276,7 @@ msgstr ""
 #: aleksis/core/forms.py:586
 #, fuzzy
 #| msgid "E-mail address"
-msgid "Adress data"
+msgid "Address data"
 msgstr "Inscriptio electronica"
 
 #: aleksis/core/forms.py:598
@@ -309,51 +327,44 @@ msgstr ""
 msgid "No backup result found!"
 msgstr ""
 
-#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
+#: aleksis/core/menus.py:7 aleksis/core/templates/two_factor/core/login.html:6
 #: aleksis/core/templates/two_factor/core/login.html:32
 #: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr "nomen profiteri"
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
+#: aleksis/core/menus.py:13 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr ""
 
-#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7
+#: aleksis/core/menus.py:22 aleksis/core/templates/invitations/enter.html:7
 #, fuzzy
 #| msgid "Edit school information"
 msgid "Accept invitation"
 msgstr "Muta informationes scolae"
 
-#: aleksis/core/menus.py:33
+#: aleksis/core/menus.py:31
 msgid "Dashboard"
 msgstr "Forum"
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:765
-#: aleksis/core/preferences.py:29 aleksis/core/templates/core/base.html:81
-#: aleksis/core/templates/core/notifications.html:4
-#: aleksis/core/templates/core/notifications.html:5
-msgid "Notifications"
-msgstr "Nuntii"
-
-#: aleksis/core/menus.py:53
+#: aleksis/core/menus.py:39
 msgid "Admin"
 msgstr "Administratio"
 
-#: aleksis/core/menus.py:61 aleksis/core/models.py:865
+#: aleksis/core/menus.py:47 aleksis/core/models.py:867
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr "Nuntii"
 
-#: aleksis/core/menus.py:72 aleksis/core/models.py:135
+#: aleksis/core/menus.py:58 aleksis/core/models.py:137
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr "ani scolae"
 
-#: aleksis/core/menus.py:83
+#: aleksis/core/menus.py:69
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 #, fuzzy
@@ -361,41 +372,41 @@ msgstr "ani scolae"
 msgid "Dashboard widgets"
 msgstr "Forum"
 
-#: aleksis/core/menus.py:94
+#: aleksis/core/menus.py:80
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/menus.py:105
+#: aleksis/core/menus.py:91
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr "Status systemae"
 
-#: aleksis/core/menus.py:116
+#: aleksis/core/menus.py:102
 #, fuzzy
 #| msgid "Notification"
 msgid "Configuration"
 msgstr "Nuntius"
 
-#: aleksis/core/menus.py:127 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:113 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 #, fuzzy
 #| msgid "System status"
 msgid "Data checks"
 msgstr "Status systemae"
 
-#: aleksis/core/menus.py:133 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/menus.py:119 aleksis/core/templates/core/perms/list.html:13
 #: aleksis/core/templates/core/perms/list.html:14
 msgid "Manage permissions"
 msgstr ""
 
-#: aleksis/core/menus.py:144
+#: aleksis/core/menus.py:130
 msgid "Backend Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:152
+#: aleksis/core/menus.py:138
 #: aleksis/core/templates/oauth2_provider/application/list.html:5
 #: aleksis/core/templates/oauth2_provider/application/list.html:6
 #, fuzzy
@@ -403,11 +414,11 @@ msgstr ""
 msgid "OAuth2 Applications"
 msgstr "Nuntii"
 
-#: aleksis/core/menus.py:165
+#: aleksis/core/menus.py:151
 msgid "People"
 msgstr "Personae"
 
-#: aleksis/core/menus.py:196 aleksis/core/models.py:1099
+#: aleksis/core/menus.py:182 aleksis/core/models.py:1101
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 #, fuzzy
@@ -415,11 +426,11 @@ msgstr "Personae"
 msgid "Group types"
 msgstr "Greges"
 
-#: aleksis/core/menus.py:207
+#: aleksis/core/menus.py:193
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:218 aleksis/core/models.py:535
+#: aleksis/core/menus.py:204 aleksis/core/models.py:537
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 #, fuzzy
@@ -427,36 +438,36 @@ msgstr ""
 msgid "Additional fields"
 msgstr "addita nomines"
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:215
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Invite person"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/menus.py:242
+#: aleksis/core/menus.py:228
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/menus.py:254
+#: aleksis/core/menus.py:240
 msgid "Stop impersonation"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/menus.py:263
+#: aleksis/core/menus.py:249
 msgid "Account"
 msgstr ""
 
-#: aleksis/core/menus.py:272
+#: aleksis/core/menus.py:258
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr ""
 
-#: aleksis/core/menus.py:281
+#: aleksis/core/menus.py:267
 msgid "2FA"
 msgstr ""
 
-#: aleksis/core/menus.py:289
+#: aleksis/core/menus.py:275
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -468,13 +479,13 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
-#: aleksis/core/menus.py:301
+#: aleksis/core/menus.py:287
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Third-party accounts"
 msgstr "Personae et computi"
 
-#: aleksis/core/menus.py:310
+#: aleksis/core/menus.py:296
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 #, fuzzy
@@ -482,7 +493,11 @@ msgstr "Personae et computi"
 msgid "Authorized applications"
 msgstr "Nuntii"
 
-#: aleksis/core/menus.py:320
+#: aleksis/core/menus.py:305
+msgid "Calendar Feeds"
+msgstr ""
+
+#: aleksis/core/menus.py:318
 msgid "Logout"
 msgstr "nomen retractare"
 
@@ -492,629 +507,654 @@ msgstr "nomen retractare"
 msgid "Linked school term"
 msgstr "Muta anum scolae"
 
-#: aleksis/core/models.py:75
+#: aleksis/core/models.py:77
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:78
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:80
 msgid "Date and time"
 msgstr "Dies et hora"
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:81
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:203
+#: aleksis/core/models.py:82 aleksis/core/models.py:205
 msgid "E-mail address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:83
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:84
 #, fuzzy
 #| msgid "E-mail address"
 msgid "IP address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:85
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:86
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:88
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:98 aleksis/core/models.py:1068
+#: aleksis/core/models.py:100 aleksis/core/models.py:1070
+#: aleksis/core/models.py:1374
 msgid "Name"
 msgstr "Nomen"
 
-#: aleksis/core/models.py:100
+#: aleksis/core/models.py:102
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:101
+#: aleksis/core/models.py:103
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:120
+#: aleksis/core/models.py:122
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:129
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:156 aleksis/core/models.py:1017
+#: aleksis/core/models.py:158 aleksis/core/models.py:1019
+#: aleksis/core/models.py:1371
 msgid "Person"
 msgstr "Persona"
 
-#: aleksis/core/models.py:159
+#: aleksis/core/models.py:161
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:160
+#: aleksis/core/models.py:162
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view contact details"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:161
+#: aleksis/core/models.py:163
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view photo"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:162
+#: aleksis/core/models.py:164
 #, fuzzy
 #| msgid "E-mail address"
 msgid "Can view avatar image"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:165
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Can view persons groups"
 msgstr "Personae et computi"
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:166
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can view personal details"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "female"
 msgstr "femininum"
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "male"
 msgstr "maskulinum"
 
-#: aleksis/core/models.py:182 aleksis/core/models.py:1271
+#: aleksis/core/models.py:184 aleksis/core/models.py:1273
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:190
 msgid "Additional name(s)"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:192 aleksis/core/models.py:504
+#: aleksis/core/models.py:194 aleksis/core/models.py:506
 msgid "Short name"
 msgstr "Breve nomen"
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:197
 msgid "Street"
 msgstr "Via"
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:198
 msgid "Street number"
 msgstr "Numerus domini"
 
-#: aleksis/core/models.py:197
+#: aleksis/core/models.py:199
 msgid "Postal code"
 msgstr "Numerus directorius"
 
-#: aleksis/core/models.py:198
+#: aleksis/core/models.py:200
 msgid "Place"
 msgstr "Urbs"
 
-#: aleksis/core/models.py:200 aleksis/core/templates/core/person/full.html:160
+#: aleksis/core/models.py:202 aleksis/core/templates/core/person/full.html:160
 msgid "Home phone"
 msgstr "Numerus telephoni domi"
 
-#: aleksis/core/models.py:201 aleksis/core/templates/core/person/full.html:170
+#: aleksis/core/models.py:203 aleksis/core/templates/core/person/full.html:170
 msgid "Mobile phone"
 msgstr "Numerus telephoni mobilis"
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:207
 msgid "Date of birth"
 msgstr "Dies natalis"
 
-#: aleksis/core/models.py:206
+#: aleksis/core/models.py:208
 #, fuzzy
 #| msgid "Date of birth"
 msgid "Place of birth"
 msgstr "Dies natalis"
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:209
 msgid "Sex"
 msgstr "Genus"
 
-#: aleksis/core/models.py:214 aleksis/core/models.py:543
+#: aleksis/core/models.py:216 aleksis/core/models.py:545
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr ""
 
-#: aleksis/core/models.py:219 aleksis/core/models.py:547
+#: aleksis/core/models.py:221 aleksis/core/models.py:549
 msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:222 aleksis/core/models.py:550
+#: aleksis/core/models.py:224 aleksis/core/models.py:552
 msgid "This is a picture or an avatar for public display."
 msgstr ""
 
-#: aleksis/core/models.py:227 aleksis/core/templates/core/person/full.html:235
+#: aleksis/core/models.py:229 aleksis/core/templates/core/person/full.html:235
 msgid "Guardians / Parents"
 msgstr "Parentes"
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:236
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:237 aleksis/core/models.py:717
-#: aleksis/core/models.py:741 aleksis/core/models.py:832
-#: aleksis/core/models.py:1092
+#: aleksis/core/models.py:239 aleksis/core/models.py:719
+#: aleksis/core/models.py:743 aleksis/core/models.py:834
+#: aleksis/core/models.py:1094
 msgid "Description"
 msgstr "Descriptio"
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:459
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:459
+#: aleksis/core/models.py:461
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:461
+#: aleksis/core/models.py:463
 msgid "Required"
 msgstr ""
 
-#: aleksis/core/models.py:462
+#: aleksis/core/models.py:464
 #, fuzzy
 #| msgid "Site description"
 msgid "Help text / description"
 msgstr "Descriptio paginae"
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:470
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Addtitional field for groups"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:471
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Addtitional fields for groups"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:489
+#: aleksis/core/models.py:491
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:490
+#: aleksis/core/models.py:492
 #, fuzzy
 #| msgid "Persons and accounts"
 msgid "Can view statistics about group."
 msgstr "Personae et computi"
 
-#: aleksis/core/models.py:502
+#: aleksis/core/models.py:504
 #, fuzzy
 #| msgid "Last name"
 msgid "Long name"
 msgstr "Secondus nomen"
 
-#: aleksis/core/models.py:512 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:514 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:515 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:517 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:524 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:530
+#: aleksis/core/models.py:532
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:716 aleksis/core/models.py:740
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:718 aleksis/core/models.py:742
+#: aleksis/core/models.py:833
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr "Titulus"
 
-#: aleksis/core/models.py:719
+#: aleksis/core/models.py:721
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:727
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:728
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:734
 msgid "Sender"
 msgstr "Mittens"
 
-#: aleksis/core/models.py:737
+#: aleksis/core/models.py:739
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:742 aleksis/core/models.py:1069
+#: aleksis/core/models.py:744 aleksis/core/models.py:1071
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:746
 #, fuzzy
 #| msgid "Notification"
 msgid "Send notification at"
 msgstr "Nuntius"
 
-#: aleksis/core/models.py:746
+#: aleksis/core/models.py:748
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:747
+#: aleksis/core/models.py:749
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:766
 #, fuzzy
 #| msgid "Notifications"
 msgid "Notification"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:833
+#: aleksis/core/models.py:767 aleksis/core/preferences.py:29
+#: aleksis/core/templates/core/base.html:81
+#: aleksis/core/templates/core/notifications.html:4
+#: aleksis/core/templates/core/notifications.html:5
+msgid "Notifications"
+msgstr "Nuntii"
+
+#: aleksis/core/models.py:835
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:838
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:839
+#: aleksis/core/models.py:841
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:864
+#: aleksis/core/models.py:866
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:904
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement recipient"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:903
+#: aleksis/core/models.py:905
 #, fuzzy
 #| msgid "Announcements"
 msgid "Announcement recipients"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:927
 #, fuzzy
 #| msgid "Site title"
 msgid "Widget Title"
 msgstr "Titulus paginae"
 
-#: aleksis/core/models.py:926
+#: aleksis/core/models.py:928
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:927
+#: aleksis/core/models.py:929
 #, fuzzy
 #| msgid "Site title"
 msgid "Widget is broken"
 msgstr "Titulus paginae"
 
-#: aleksis/core/models.py:930
+#: aleksis/core/models.py:932
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:931
+#: aleksis/core/models.py:933
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:938
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:939
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:942
+#: aleksis/core/models.py:944
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:943
+#: aleksis/core/models.py:945
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:950
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:949
+#: aleksis/core/models.py:951
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:980
+#: aleksis/core/models.py:982
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Can edit default dashboard"
 msgstr "Forum"
 
-#: aleksis/core/models.py:981
+#: aleksis/core/models.py:983
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard Widget"
 msgstr "Forum"
 
-#: aleksis/core/models.py:982
+#: aleksis/core/models.py:984
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard Widgets"
 msgstr "Forum"
 
-#: aleksis/core/models.py:988
+#: aleksis/core/models.py:990
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:991
 #, fuzzy
 #| msgid "Icon"
 msgid "Icon URL"
 msgstr "Nota"
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:997
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:998
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1002
+#: aleksis/core/models.py:1004
 msgid "Content"
 msgstr ""
 
-#: aleksis/core/models.py:1008
+#: aleksis/core/models.py:1010
 msgid "Static content widget"
 msgstr ""
 
-#: aleksis/core/models.py:1009
+#: aleksis/core/models.py:1011
 msgid "Static content widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1014
+#: aleksis/core/models.py:1016
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget"
 msgstr "Forum"
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1021
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:1020
+#: aleksis/core/models.py:1022
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:1035
+#: aleksis/core/models.py:1037
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget order"
 msgstr "Forum"
 
-#: aleksis/core/models.py:1036
+#: aleksis/core/models.py:1038
 #, fuzzy
 #| msgid "Dashboard"
 msgid "Dashboard widget orders"
 msgstr "Forum"
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1044
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:1055
+#: aleksis/core/models.py:1057
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:1056
+#: aleksis/core/models.py:1058
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1068
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1070 aleksis/core/models.py:1318
+#: aleksis/core/models.py:1072 aleksis/core/models.py:1320
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr "Nota"
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1078
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:1077
+#: aleksis/core/models.py:1079
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:1091
+#: aleksis/core/models.py:1093
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:1098 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1100 aleksis/core/templates/core/group/full.html:47
 #, fuzzy
 #| msgid "Group"
 msgid "Group type"
 msgstr "Grex"
 
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:1114
 #, fuzzy
 #| msgid "System status"
 msgid "Can view system status"
 msgstr "Status systemae"
 
-#: aleksis/core/models.py:1113
+#: aleksis/core/models.py:1115
 #, fuzzy
 #| msgid "Data management"
 msgid "Can manage data"
 msgstr "Adminstratio datarum"
 
-#: aleksis/core/models.py:1114
+#: aleksis/core/models.py:1116
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can impersonate"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1117
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:1116
+#: aleksis/core/models.py:1118
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1117
+#: aleksis/core/models.py:1119
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1120
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1121
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1120
+#: aleksis/core/models.py:1122
 #, fuzzy
 #| msgid "Stop impersonation"
 msgid "Can invite persons"
 msgstr "Simulandum aliquem finire"
 
-#: aleksis/core/models.py:1156
+#: aleksis/core/models.py:1158
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1164
+#: aleksis/core/models.py:1166
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1165
+#: aleksis/core/models.py:1167
 #, fuzzy
 #| msgid "Notifications"
 msgid "Notification sent"
 msgstr "Nuntii"
 
-#: aleksis/core/models.py:1178
+#: aleksis/core/models.py:1180
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1179
+#: aleksis/core/models.py:1181
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1181
+#: aleksis/core/models.py:1183
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1182
+#: aleksis/core/models.py:1184
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1189
+#: aleksis/core/models.py:1191
 #, fuzzy
 #| msgid "E-mail address"
 msgid "E-Mail address"
 msgstr "Inscriptio electronica"
 
-#: aleksis/core/models.py:1221
+#: aleksis/core/models.py:1223
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1225
+#: aleksis/core/models.py:1227
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1227
+#: aleksis/core/models.py:1229
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1229
+#: aleksis/core/models.py:1231
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1236
+#: aleksis/core/models.py:1238
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1237
+#: aleksis/core/models.py:1239
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1242
+#: aleksis/core/models.py:1244
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1247
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1257
+#: aleksis/core/models.py:1259
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1260
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1276
 #, fuzzy
 #| msgid "Additional name(s)"
 msgid "Additional attributes"
 msgstr "addita nomines"
 
-#: aleksis/core/models.py:1312
+#: aleksis/core/models.py:1314
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1322
+#: aleksis/core/models.py:1324
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
+#: aleksis/core/models.py:1373
+msgid "UUID"
+msgstr ""
+
+#: aleksis/core/models.py:1377
+msgid "Selected ICal feed"
+msgstr ""
+
+#: aleksis/core/models.py:1386
+msgid "Personal Calendar URL"
+msgstr ""
+
+#: aleksis/core/models.py:1387
+msgid "Personal Calendar URLs"
+msgstr ""
+
 #: aleksis/core/preferences.py:25
 msgid "General"
 msgstr ""
@@ -1673,7 +1713,7 @@ msgstr "Quis nuntium videatne?"
 #: aleksis/core/templates/core/announcement/form.html:34
 #, fuzzy
 #| msgid "Who should see the announcement?"
-msgid "Save und publish announcement"
+msgid "Save and publish announcement"
 msgstr "Quis nuntium videatne?"
 
 #: aleksis/core/templates/core/announcement/list.html:19
@@ -1997,6 +2037,40 @@ msgstr "Grex"
 msgid "Create group type"
 msgstr "Grex"
 
+#: aleksis/core/templates/core/ical/ical_create.html:4
+#: aleksis/core/templates/core/ical/ical_create.html:5
+#: aleksis/core/templates/core/ical/ical_list.html:12
+msgid "Create iCal URL"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_create.html:16
+#: aleksis/core/templates/core/ical/ical_edit.html:16
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
+#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
+#: aleksis/core/templates/two_factor/_wizard_actions.html:6
+msgid "Cancel"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_edit.html:4
+#: aleksis/core/templates/core/ical/ical_edit.html:5
+#, python-format
+msgid "Edit iCal URL %(object)s"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:4
+#: aleksis/core/templates/core/ical/ical_list.html:5
+msgid "ICal Feeds"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:8
+msgid "These are URLs for different Calendar Feeds in the iCal (.ics) format. You can create as many as you want and import them in your calendar software."
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:14
+msgid "Your iCal URLs"
+msgstr ""
+
 #: aleksis/core/templates/core/index.html:4
 msgid "Home"
 msgstr ""
@@ -2505,13 +2579,6 @@ msgstr ""
 msgid "Register OAuth2 Application"
 msgstr "Nuntii"
 
-#: aleksis/core/templates/oauth2_provider/application/create.html:14
-#: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
-#: aleksis/core/templates/two_factor/_wizard_actions.html:6
-msgid "Cancel"
-msgstr ""
-
 #: aleksis/core/templates/oauth2_provider/application/detail.html:5
 #, fuzzy
 #| msgid "Notifications"
@@ -3258,162 +3325,174 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:289
+#: aleksis/core/views.py:292
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:301
+#: aleksis/core/views.py:304
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:421
+#: aleksis/core/views.py:424
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:440 aleksis/core/views.py:450
+#: aleksis/core/views.py:443 aleksis/core/views.py:453
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:500
+#: aleksis/core/views.py:503
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:597
+#: aleksis/core/views.py:600
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:613
+#: aleksis/core/views.py:616
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:681
+#: aleksis/core/views.py:684
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:703
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:724
+#: aleksis/core/views.py:727
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:738
+#: aleksis/core/views.py:741
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:770
+#: aleksis/core/views.py:773
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:804
+#: aleksis/core/views.py:807
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:829
+#: aleksis/core/views.py:832
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:862
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:892
+#: aleksis/core/views.py:895
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:893
+#: aleksis/core/views.py:896
 #, fuzzy
 #| msgid "System status"
 msgid "Run data checks …"
 msgstr "Status systemae"
 
-#: aleksis/core/views.py:894
+#: aleksis/core/views.py:897
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:895
+#: aleksis/core/views.py:898
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:911
+#: aleksis/core/views.py:914
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:924
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:953
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:983
+#: aleksis/core/views.py:986
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:993
+#: aleksis/core/views.py:996
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1064
+#: aleksis/core/views.py:1067
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1066
+#: aleksis/core/views.py:1069
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1142
+#: aleksis/core/views.py:1145
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1236
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1246
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1253
+#: aleksis/core/views.py:1256
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1263
+#: aleksis/core/views.py:1266
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1273
+#: aleksis/core/views.py:1276
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1341
+#: aleksis/core/views.py:1344
 msgid "The requested PDF file does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:1350 aleksis/core/views.py:1354
+#: aleksis/core/views.py:1353 aleksis/core/views.py:1357
 msgid "The requested task does not exist or is not accessible"
 msgstr ""
 
-#: aleksis/core/views.py:1406
+#: aleksis/core/views.py:1409
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1413
+#: aleksis/core/views.py:1416
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1484
+#: aleksis/core/views.py:1487
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1495
+#: aleksis/core/views.py:1498
 msgid "Person was already invited."
 msgstr ""
 
+#: aleksis/core/views.py:1598
+msgid "ICal feed updated successfully"
+msgstr ""
+
+#: aleksis/core/views.py:1608
+msgid "ICal feed deleted successfully"
+msgstr ""
+
+#: aleksis/core/views.py:1616
+msgid "ICal feed created successfully"
+msgstr ""
+
 #, fuzzy
 #~| msgid "Street number"
 #~ msgid "home number"
diff --git a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po
index f3df4c3fc6d2848a739ddd1faac44cb9048c97b2..509b8a65f4bdbc6ac9c1ec0282c1ff99b6f1f8c1 100644
--- a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-23 11:20+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
index 71dc8727c985e991974f2700347f6fb37e4f7b47..9f0be4386a3358d3d0594f80838759c88c9c6c08 100644
--- a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-23 11:19+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -37,8 +37,8 @@ msgstr ""
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:185
-#: aleksis/core/models.py:487 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:171
+#: aleksis/core/models.py:489 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:246
 msgid "Groups"
@@ -65,6 +65,24 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
+#: aleksis/core/feeds.py:52
+msgid "Birthday Calendar"
+msgstr ""
+
+#: aleksis/core/feeds.py:53
+msgid "A Calendar of Birthdays"
+msgstr ""
+
+#: aleksis/core/feeds.py:66
+#, python-format
+msgid "%(name)s's birthday"
+msgstr ""
+
+#: aleksis/core/feeds.py:71
+#, python-format
+msgid "%(name)s was born on %(birthday)s"
+msgstr ""
+
 #: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:139
 #: aleksis/core/templates/core/base.html:140
 #: aleksis/core/templates/core/group/list.html:20
@@ -90,11 +108,11 @@ msgstr ""
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:713
+#: aleksis/core/filters.py:113 aleksis/core/models.py:715
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:486
+#: aleksis/core/filters.py:135 aleksis/core/models.py:488
 msgid "Group"
 msgstr ""
 
@@ -130,7 +148,7 @@ msgstr ""
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:134
+#: aleksis/core/forms.py:153 aleksis/core/models.py:136
 msgid "School term"
 msgstr ""
 
@@ -139,7 +157,7 @@ msgid "Common data"
 msgstr ""
 
 #: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/menus.py:174 aleksis/core/models.py:157
+#: aleksis/core/menus.py:160 aleksis/core/models.py:159
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
@@ -149,18 +167,18 @@ msgstr ""
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:210
-#: aleksis/core/models.py:539
+#: aleksis/core/forms.py:157 aleksis/core/models.py:212
+#: aleksis/core/models.py:541
 msgid "Photo"
 msgstr ""
 
 #: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:79
 msgid "Date"
 msgstr ""
 
 #: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:87
 msgid "Time"
 msgstr ""
 
@@ -196,11 +214,11 @@ msgstr ""
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:185
+#: aleksis/core/forms.py:418 aleksis/core/models.py:187
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:186
+#: aleksis/core/forms.py:419 aleksis/core/models.py:188
 msgid "Last name"
 msgstr ""
 
@@ -233,7 +251,7 @@ msgid "You must grant the permission to all objects and/or to some objects."
 msgstr ""
 
 #: aleksis/core/forms.py:586
-msgid "Adress data"
+msgid "Address data"
 msgstr ""
 
 #: aleksis/core/forms.py:598
@@ -280,138 +298,131 @@ msgstr ""
 msgid "No backup result found!"
 msgstr ""
 
-#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
+#: aleksis/core/menus.py:7 aleksis/core/templates/two_factor/core/login.html:6
 #: aleksis/core/templates/two_factor/core/login.html:32
 #: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr ""
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
+#: aleksis/core/menus.py:13 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr ""
 
-#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7
+#: aleksis/core/menus.py:22 aleksis/core/templates/invitations/enter.html:7
 msgid "Accept invitation"
 msgstr ""
 
-#: aleksis/core/menus.py:33
+#: aleksis/core/menus.py:31
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:765
-#: aleksis/core/preferences.py:29 aleksis/core/templates/core/base.html:81
-#: aleksis/core/templates/core/notifications.html:4
-#: aleksis/core/templates/core/notifications.html:5
-msgid "Notifications"
-msgstr ""
-
-#: aleksis/core/menus.py:53
+#: aleksis/core/menus.py:39
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:61 aleksis/core/models.py:865
+#: aleksis/core/menus.py:47 aleksis/core/models.py:867
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:72 aleksis/core/models.py:135
+#: aleksis/core/menus.py:58 aleksis/core/models.py:137
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/menus.py:83
+#: aleksis/core/menus.py:69
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 msgid "Dashboard widgets"
 msgstr ""
 
-#: aleksis/core/menus.py:94
+#: aleksis/core/menus.py:80
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr ""
 
-#: aleksis/core/menus.py:105
+#: aleksis/core/menus.py:91
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr ""
 
-#: aleksis/core/menus.py:116
+#: aleksis/core/menus.py:102
 msgid "Configuration"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:113 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/menus.py:133 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/menus.py:119 aleksis/core/templates/core/perms/list.html:13
 #: aleksis/core/templates/core/perms/list.html:14
 msgid "Manage permissions"
 msgstr ""
 
-#: aleksis/core/menus.py:144
+#: aleksis/core/menus.py:130
 msgid "Backend Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:152
+#: aleksis/core/menus.py:138
 #: aleksis/core/templates/oauth2_provider/application/list.html:5
 #: aleksis/core/templates/oauth2_provider/application/list.html:6
 msgid "OAuth2 Applications"
 msgstr ""
 
-#: aleksis/core/menus.py:165
+#: aleksis/core/menus.py:151
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:196 aleksis/core/models.py:1099
+#: aleksis/core/menus.py:182 aleksis/core/models.py:1101
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
-#: aleksis/core/menus.py:207
+#: aleksis/core/menus.py:193
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:218 aleksis/core/models.py:535
+#: aleksis/core/menus.py:204 aleksis/core/models.py:537
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:215
 msgid "Invite person"
 msgstr ""
 
-#: aleksis/core/menus.py:242
+#: aleksis/core/menus.py:228
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/menus.py:254
+#: aleksis/core/menus.py:240
 msgid "Stop impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:263
+#: aleksis/core/menus.py:249
 msgid "Account"
 msgstr ""
 
-#: aleksis/core/menus.py:272
+#: aleksis/core/menus.py:258
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr ""
 
-#: aleksis/core/menus.py:281
+#: aleksis/core/menus.py:267
 msgid "2FA"
 msgstr ""
 
-#: aleksis/core/menus.py:289
+#: aleksis/core/menus.py:275
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -423,17 +434,21 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
-#: aleksis/core/menus.py:301
+#: aleksis/core/menus.py:287
 msgid "Third-party accounts"
 msgstr ""
 
-#: aleksis/core/menus.py:310
+#: aleksis/core/menus.py:296
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 msgid "Authorized applications"
 msgstr ""
 
-#: aleksis/core/menus.py:320
+#: aleksis/core/menus.py:305
+msgid "Calendar Feeds"
+msgstr ""
+
+#: aleksis/core/menus.py:318
 msgid "Logout"
 msgstr ""
 
@@ -441,559 +456,584 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:75
+#: aleksis/core/models.py:77
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:78
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:80
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:81
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:203
+#: aleksis/core/models.py:82 aleksis/core/models.py:205
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:83
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:84
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:85
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:86
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:88
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:98 aleksis/core/models.py:1068
+#: aleksis/core/models.py:100 aleksis/core/models.py:1070
+#: aleksis/core/models.py:1374
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:100
+#: aleksis/core/models.py:102
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:101
+#: aleksis/core/models.py:103
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:120
+#: aleksis/core/models.py:122
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:129
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:156 aleksis/core/models.py:1017
+#: aleksis/core/models.py:158 aleksis/core/models.py:1019
+#: aleksis/core/models.py:1371
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:159
+#: aleksis/core/models.py:161
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:160
+#: aleksis/core/models.py:162
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:161
+#: aleksis/core/models.py:163
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:162
+#: aleksis/core/models.py:164
 msgid "Can view avatar image"
 msgstr ""
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:165
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:166
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:182 aleksis/core/models.py:1271
+#: aleksis/core/models.py:184 aleksis/core/models.py:1273
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:190
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:192 aleksis/core/models.py:504
+#: aleksis/core/models.py:194 aleksis/core/models.py:506
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:197
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:198
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:197
+#: aleksis/core/models.py:199
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:198
+#: aleksis/core/models.py:200
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:200 aleksis/core/templates/core/person/full.html:160
+#: aleksis/core/models.py:202 aleksis/core/templates/core/person/full.html:160
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:201 aleksis/core/templates/core/person/full.html:170
+#: aleksis/core/models.py:203 aleksis/core/templates/core/person/full.html:170
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:207
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:206
+#: aleksis/core/models.py:208
 msgid "Place of birth"
 msgstr ""
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:209
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:214 aleksis/core/models.py:543
+#: aleksis/core/models.py:216 aleksis/core/models.py:545
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr ""
 
-#: aleksis/core/models.py:219 aleksis/core/models.py:547
+#: aleksis/core/models.py:221 aleksis/core/models.py:549
 msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:222 aleksis/core/models.py:550
+#: aleksis/core/models.py:224 aleksis/core/models.py:552
 msgid "This is a picture or an avatar for public display."
 msgstr ""
 
-#: aleksis/core/models.py:227 aleksis/core/templates/core/person/full.html:235
+#: aleksis/core/models.py:229 aleksis/core/templates/core/person/full.html:235
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:236
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:237 aleksis/core/models.py:717
-#: aleksis/core/models.py:741 aleksis/core/models.py:832
-#: aleksis/core/models.py:1092
+#: aleksis/core/models.py:239 aleksis/core/models.py:719
+#: aleksis/core/models.py:743 aleksis/core/models.py:834
+#: aleksis/core/models.py:1094
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:459
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:459
+#: aleksis/core/models.py:461
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:461
+#: aleksis/core/models.py:463
 msgid "Required"
 msgstr ""
 
-#: aleksis/core/models.py:462
+#: aleksis/core/models.py:464
 msgid "Help text / description"
 msgstr ""
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:470
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:471
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:489
+#: aleksis/core/models.py:491
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:490
+#: aleksis/core/models.py:492
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:502
+#: aleksis/core/models.py:504
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:512 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:514 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:515 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:517 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:524 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:530
+#: aleksis/core/models.py:532
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:716 aleksis/core/models.py:740
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:718 aleksis/core/models.py:742
+#: aleksis/core/models.py:833
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:719
+#: aleksis/core/models.py:721
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:727
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:728
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:734
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:737
+#: aleksis/core/models.py:739
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:742 aleksis/core/models.py:1069
+#: aleksis/core/models.py:744 aleksis/core/models.py:1071
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:746
 msgid "Send notification at"
 msgstr ""
 
-#: aleksis/core/models.py:746
+#: aleksis/core/models.py:748
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:747
+#: aleksis/core/models.py:749
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:766
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:833
+#: aleksis/core/models.py:767 aleksis/core/preferences.py:29
+#: aleksis/core/templates/core/base.html:81
+#: aleksis/core/templates/core/notifications.html:4
+#: aleksis/core/templates/core/notifications.html:5
+msgid "Notifications"
+msgstr ""
+
+#: aleksis/core/models.py:835
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:838
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:839
+#: aleksis/core/models.py:841
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:864
+#: aleksis/core/models.py:866
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:904
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:903
+#: aleksis/core/models.py:905
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:927
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:926
+#: aleksis/core/models.py:928
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:927
+#: aleksis/core/models.py:929
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:930
+#: aleksis/core/models.py:932
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:931
+#: aleksis/core/models.py:933
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:938
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:939
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:942
+#: aleksis/core/models.py:944
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:943
+#: aleksis/core/models.py:945
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:950
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:949
+#: aleksis/core/models.py:951
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:980
+#: aleksis/core/models.py:982
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:981
+#: aleksis/core/models.py:983
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:982
+#: aleksis/core/models.py:984
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:988
+#: aleksis/core/models.py:990
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:991
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:997
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:998
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1002
+#: aleksis/core/models.py:1004
 msgid "Content"
 msgstr ""
 
-#: aleksis/core/models.py:1008
+#: aleksis/core/models.py:1010
 msgid "Static content widget"
 msgstr ""
 
-#: aleksis/core/models.py:1009
+#: aleksis/core/models.py:1011
 msgid "Static content widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1014
+#: aleksis/core/models.py:1016
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1021
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:1020
+#: aleksis/core/models.py:1022
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:1035
+#: aleksis/core/models.py:1037
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:1036
+#: aleksis/core/models.py:1038
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1044
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:1055
+#: aleksis/core/models.py:1057
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:1056
+#: aleksis/core/models.py:1058
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1068
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1070 aleksis/core/models.py:1318
+#: aleksis/core/models.py:1072 aleksis/core/models.py:1320
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1078
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:1077
+#: aleksis/core/models.py:1079
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:1091
+#: aleksis/core/models.py:1093
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:1098 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1100 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:1114
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:1113
+#: aleksis/core/models.py:1115
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:1114
+#: aleksis/core/models.py:1116
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1117
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:1116
+#: aleksis/core/models.py:1118
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1117
+#: aleksis/core/models.py:1119
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1120
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1121
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1120
+#: aleksis/core/models.py:1122
 msgid "Can invite persons"
 msgstr ""
 
-#: aleksis/core/models.py:1156
+#: aleksis/core/models.py:1158
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1164
+#: aleksis/core/models.py:1166
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1165
+#: aleksis/core/models.py:1167
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1178
+#: aleksis/core/models.py:1180
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1179
+#: aleksis/core/models.py:1181
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1181
+#: aleksis/core/models.py:1183
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1182
+#: aleksis/core/models.py:1184
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1189
+#: aleksis/core/models.py:1191
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1221
+#: aleksis/core/models.py:1223
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1225
+#: aleksis/core/models.py:1227
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1227
+#: aleksis/core/models.py:1229
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1229
+#: aleksis/core/models.py:1231
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1236
+#: aleksis/core/models.py:1238
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1237
+#: aleksis/core/models.py:1239
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1242
+#: aleksis/core/models.py:1244
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1247
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1257
+#: aleksis/core/models.py:1259
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1260
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1276
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1312
+#: aleksis/core/models.py:1314
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1322
+#: aleksis/core/models.py:1324
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
+#: aleksis/core/models.py:1373
+msgid "UUID"
+msgstr ""
+
+#: aleksis/core/models.py:1377
+msgid "Selected ICal feed"
+msgstr ""
+
+#: aleksis/core/models.py:1386
+msgid "Personal Calendar URL"
+msgstr ""
+
+#: aleksis/core/models.py:1387
+msgid "Personal Calendar URLs"
+msgstr ""
+
 #: aleksis/core/preferences.py:25
 msgid "General"
 msgstr ""
@@ -1518,7 +1558,7 @@ msgid "Publish new announcement"
 msgstr ""
 
 #: aleksis/core/templates/core/announcement/form.html:34
-msgid "Save und publish announcement"
+msgid "Save and publish announcement"
 msgstr ""
 
 #: aleksis/core/templates/core/announcement/list.html:19
@@ -1820,6 +1860,40 @@ msgstr ""
 msgid "Create group type"
 msgstr ""
 
+#: aleksis/core/templates/core/ical/ical_create.html:4
+#: aleksis/core/templates/core/ical/ical_create.html:5
+#: aleksis/core/templates/core/ical/ical_list.html:12
+msgid "Create iCal URL"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_create.html:16
+#: aleksis/core/templates/core/ical/ical_edit.html:16
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
+#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
+#: aleksis/core/templates/two_factor/_wizard_actions.html:6
+msgid "Cancel"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_edit.html:4
+#: aleksis/core/templates/core/ical/ical_edit.html:5
+#, python-format
+msgid "Edit iCal URL %(object)s"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:4
+#: aleksis/core/templates/core/ical/ical_list.html:5
+msgid "ICal Feeds"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:8
+msgid "These are URLs for different Calendar Feeds in the iCal (.ics) format. You can create as many as you want and import them in your calendar software."
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:14
+msgid "Your iCal URLs"
+msgstr ""
+
 #: aleksis/core/templates/core/index.html:4
 msgid "Home"
 msgstr ""
@@ -2296,13 +2370,6 @@ msgstr ""
 msgid "Register OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/create.html:14
-#: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
-#: aleksis/core/templates/two_factor/_wizard_actions.html:6
-msgid "Cancel"
-msgstr ""
-
 #: aleksis/core/templates/oauth2_provider/application/detail.html:5
 msgid "OAuth2 Application"
 msgstr ""
@@ -3022,159 +3089,171 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:289
+#: aleksis/core/views.py:292
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:301
+#: aleksis/core/views.py:304
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:421
+#: aleksis/core/views.py:424
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:440 aleksis/core/views.py:450
+#: aleksis/core/views.py:443 aleksis/core/views.py:453
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:500
+#: aleksis/core/views.py:503
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:597
+#: aleksis/core/views.py:600
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:613
+#: aleksis/core/views.py:616
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:681
+#: aleksis/core/views.py:684
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:703
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:724
+#: aleksis/core/views.py:727
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:738
+#: aleksis/core/views.py:741
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:770
+#: aleksis/core/views.py:773
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:804
+#: aleksis/core/views.py:807
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:829
+#: aleksis/core/views.py:832
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:862
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:892
+#: aleksis/core/views.py:895
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:893
+#: aleksis/core/views.py:896
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:894
+#: aleksis/core/views.py:897
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:895
+#: aleksis/core/views.py:898
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:911
+#: aleksis/core/views.py:914
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:924
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:953
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:983
+#: aleksis/core/views.py:986
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:993
+#: aleksis/core/views.py:996
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1064
+#: aleksis/core/views.py:1067
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1066
+#: aleksis/core/views.py:1069
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1142
+#: aleksis/core/views.py:1145
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1236
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1246
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1253
+#: aleksis/core/views.py:1256
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1263
+#: aleksis/core/views.py:1266
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1273
+#: aleksis/core/views.py:1276
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1341
+#: aleksis/core/views.py:1344
 msgid "The requested PDF file does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:1350 aleksis/core/views.py:1354
+#: aleksis/core/views.py:1353 aleksis/core/views.py:1357
 msgid "The requested task does not exist or is not accessible"
 msgstr ""
 
-#: aleksis/core/views.py:1406
+#: aleksis/core/views.py:1409
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1413
+#: aleksis/core/views.py:1416
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1484
+#: aleksis/core/views.py:1487
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1495
+#: aleksis/core/views.py:1498
 msgid "Person was already invited."
 msgstr ""
 
+#: aleksis/core/views.py:1598
+msgid "ICal feed updated successfully"
+msgstr ""
+
+#: aleksis/core/views.py:1608
+msgid "ICal feed deleted successfully"
+msgstr ""
+
+#: aleksis/core/views.py:1616
+msgid "ICal feed created successfully"
+msgstr ""
+
 #~ msgid "Norwegian (bokmål)"
 #~ msgstr "Norsk (bokmål)"
diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po
index f3df4c3fc6d2848a739ddd1faac44cb9048c97b2..509b8a65f4bdbc6ac9c1ec0282c1ff99b6f1f8c1 100644
--- a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-23 11:20+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/aleksis/core/locale/ru/LC_MESSAGES/django.po b/aleksis/core/locale/ru/LC_MESSAGES/django.po
index b2b7031722e061ea2bbf974779f8e95456846337..d71890f30d63586d52c2df9eeef982226dc4b8d5 100644
--- a/aleksis/core/locale/ru/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/ru/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-04-23 12:58+0000\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,9 +16,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
-"%100>=11 && n%100<=14)? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
 
 #: aleksis/core/apps.py:166
 msgid "OpenID Connect scope"
@@ -254,7 +252,7 @@ msgid "You must grant the permission to all objects and/or to some objects."
 msgstr ""
 
 #: aleksis/core/forms.py:586
-msgid "Adress data"
+msgid "Address data"
 msgstr ""
 
 #: aleksis/core/forms.py:598
@@ -1561,7 +1559,7 @@ msgid "Publish new announcement"
 msgstr ""
 
 #: aleksis/core/templates/core/announcement/form.html:34
-msgid "Save und publish announcement"
+msgid "Save and publish announcement"
 msgstr ""
 
 #: aleksis/core/templates/core/announcement/list.html:19
diff --git a/aleksis/core/locale/ru/LC_MESSAGES/djangojs.po b/aleksis/core/locale/ru/LC_MESSAGES/djangojs.po
index d6da3e02221f450be360e4dfc522f83e32df5a60..02408f44d9e524a7eb8eeb53a378bb6da074e6d0 100644
--- a/aleksis/core/locale/ru/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/ru/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-04-23 12:58+0000\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,9 +16,8 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
-"%100>=11 && n%100<=14)? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
+
 #: aleksis/core/static/js/main.js:66
 msgid "Today"
 msgstr ""
diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
index d5a2d5f0647e2460b313fb20d6cca3d9059a3d8b..09920d095f71a15fbf6707526c6f44ef76033eed 100644
--- a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: AlekSIS (School Information System) 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-23 11:19+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -37,8 +37,8 @@ msgstr ""
 msgid "Home and mobile phone"
 msgstr ""
 
-#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:185
-#: aleksis/core/models.py:487 aleksis/core/templates/core/group/list.html:8
+#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:171
+#: aleksis/core/models.py:489 aleksis/core/templates/core/group/list.html:8
 #: aleksis/core/templates/core/group/list.html:9
 #: aleksis/core/templates/core/person/full.html:246
 msgid "Groups"
@@ -65,6 +65,24 @@ msgstr ""
 msgid "The DashboardWidget was reported broken automatically."
 msgstr ""
 
+#: aleksis/core/feeds.py:52
+msgid "Birthday Calendar"
+msgstr ""
+
+#: aleksis/core/feeds.py:53
+msgid "A Calendar of Birthdays"
+msgstr ""
+
+#: aleksis/core/feeds.py:66
+#, python-format
+msgid "%(name)s's birthday"
+msgstr ""
+
+#: aleksis/core/feeds.py:71
+#, python-format
+msgid "%(name)s was born on %(birthday)s"
+msgstr ""
+
 #: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:139
 #: aleksis/core/templates/core/base.html:140
 #: aleksis/core/templates/core/group/list.html:20
@@ -90,11 +108,11 @@ msgstr ""
 msgid "Content type"
 msgstr ""
 
-#: aleksis/core/filters.py:113 aleksis/core/models.py:713
+#: aleksis/core/filters.py:113 aleksis/core/models.py:715
 msgid "User"
 msgstr ""
 
-#: aleksis/core/filters.py:135 aleksis/core/models.py:486
+#: aleksis/core/filters.py:135 aleksis/core/models.py:488
 msgid "Group"
 msgstr ""
 
@@ -130,7 +148,7 @@ msgstr ""
 msgid "This username is already in use."
 msgstr ""
 
-#: aleksis/core/forms.py:153 aleksis/core/models.py:134
+#: aleksis/core/forms.py:153 aleksis/core/models.py:136
 msgid "School term"
 msgstr ""
 
@@ -139,7 +157,7 @@ msgid "Common data"
 msgstr ""
 
 #: aleksis/core/forms.py:155 aleksis/core/forms.py:207
-#: aleksis/core/menus.py:174 aleksis/core/models.py:157
+#: aleksis/core/menus.py:160 aleksis/core/models.py:159
 #: aleksis/core/templates/core/person/list.html:8
 #: aleksis/core/templates/core/person/list.html:9
 msgid "Persons"
@@ -149,18 +167,18 @@ msgstr ""
 msgid "Additional data"
 msgstr ""
 
-#: aleksis/core/forms.py:157 aleksis/core/models.py:210
-#: aleksis/core/models.py:539
+#: aleksis/core/forms.py:157 aleksis/core/models.py:212
+#: aleksis/core/models.py:541
 msgid "Photo"
 msgstr ""
 
 #: aleksis/core/forms.py:199 aleksis/core/forms.py:202
-#: aleksis/core/models.py:77
+#: aleksis/core/models.py:79
 msgid "Date"
 msgstr ""
 
 #: aleksis/core/forms.py:200 aleksis/core/forms.py:203
-#: aleksis/core/models.py:85
+#: aleksis/core/models.py:87
 msgid "Time"
 msgstr ""
 
@@ -196,11 +214,11 @@ msgstr ""
 msgid "Please enter your invitation code."
 msgstr ""
 
-#: aleksis/core/forms.py:418 aleksis/core/models.py:185
+#: aleksis/core/forms.py:418 aleksis/core/models.py:187
 msgid "First name"
 msgstr ""
 
-#: aleksis/core/forms.py:419 aleksis/core/models.py:186
+#: aleksis/core/forms.py:419 aleksis/core/models.py:188
 msgid "Last name"
 msgstr ""
 
@@ -233,7 +251,7 @@ msgid "You must grant the permission to all objects and/or to some objects."
 msgstr ""
 
 #: aleksis/core/forms.py:586
-msgid "Adress data"
+msgid "Address data"
 msgstr ""
 
 #: aleksis/core/forms.py:598
@@ -280,138 +298,131 @@ msgstr ""
 msgid "No backup result found!"
 msgstr ""
 
-#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6
+#: aleksis/core/menus.py:7 aleksis/core/templates/two_factor/core/login.html:6
 #: aleksis/core/templates/two_factor/core/login.html:32
 #: aleksis/core/templates/two_factor/core/login.html:95
 msgid "Login"
 msgstr ""
 
-#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22
+#: aleksis/core/menus.py:13 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
 msgstr ""
 
-#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7
+#: aleksis/core/menus.py:22 aleksis/core/templates/invitations/enter.html:7
 msgid "Accept invitation"
 msgstr ""
 
-#: aleksis/core/menus.py:33
+#: aleksis/core/menus.py:31
 msgid "Dashboard"
 msgstr ""
 
-#: aleksis/core/menus.py:41 aleksis/core/models.py:765
-#: aleksis/core/preferences.py:29 aleksis/core/templates/core/base.html:81
-#: aleksis/core/templates/core/notifications.html:4
-#: aleksis/core/templates/core/notifications.html:5
-msgid "Notifications"
-msgstr ""
-
-#: aleksis/core/menus.py:53
+#: aleksis/core/menus.py:39
 msgid "Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:61 aleksis/core/models.py:865
+#: aleksis/core/menus.py:47 aleksis/core/models.py:867
 #: aleksis/core/templates/core/announcement/list.html:7
 #: aleksis/core/templates/core/announcement/list.html:8
 msgid "Announcements"
 msgstr ""
 
-#: aleksis/core/menus.py:72 aleksis/core/models.py:135
+#: aleksis/core/menus.py:58 aleksis/core/models.py:137
 #: aleksis/core/templates/core/school_term/list.html:8
 #: aleksis/core/templates/core/school_term/list.html:9
 msgid "School terms"
 msgstr ""
 
-#: aleksis/core/menus.py:83
+#: aleksis/core/menus.py:69
 #: aleksis/core/templates/core/dashboard_widget/list.html:8
 #: aleksis/core/templates/core/dashboard_widget/list.html:9
 msgid "Dashboard widgets"
 msgstr ""
 
-#: aleksis/core/menus.py:94
+#: aleksis/core/menus.py:80
 #: aleksis/core/templates/core/management/data_management.html:6
 #: aleksis/core/templates/core/management/data_management.html:7
 msgid "Data management"
 msgstr ""
 
-#: aleksis/core/menus.py:105
+#: aleksis/core/menus.py:91
 #: aleksis/core/templates/core/pages/system_status.html:5
 #: aleksis/core/templates/core/pages/system_status.html:7
 msgid "System status"
 msgstr ""
 
-#: aleksis/core/menus.py:116
+#: aleksis/core/menus.py:102
 msgid "Configuration"
 msgstr ""
 
-#: aleksis/core/menus.py:127 aleksis/core/templates/core/data_check/list.html:9
+#: aleksis/core/menus.py:113 aleksis/core/templates/core/data_check/list.html:9
 #: aleksis/core/templates/core/data_check/list.html:10
 msgid "Data checks"
 msgstr ""
 
-#: aleksis/core/menus.py:133 aleksis/core/templates/core/perms/list.html:13
+#: aleksis/core/menus.py:119 aleksis/core/templates/core/perms/list.html:13
 #: aleksis/core/templates/core/perms/list.html:14
 msgid "Manage permissions"
 msgstr ""
 
-#: aleksis/core/menus.py:144
+#: aleksis/core/menus.py:130
 msgid "Backend Admin"
 msgstr ""
 
-#: aleksis/core/menus.py:152
+#: aleksis/core/menus.py:138
 #: aleksis/core/templates/oauth2_provider/application/list.html:5
 #: aleksis/core/templates/oauth2_provider/application/list.html:6
 msgid "OAuth2 Applications"
 msgstr ""
 
-#: aleksis/core/menus.py:165
+#: aleksis/core/menus.py:151
 msgid "People"
 msgstr ""
 
-#: aleksis/core/menus.py:196 aleksis/core/models.py:1099
+#: aleksis/core/menus.py:182 aleksis/core/models.py:1101
 #: aleksis/core/templates/core/group_type/list.html:8
 #: aleksis/core/templates/core/group_type/list.html:9
 msgid "Group types"
 msgstr ""
 
-#: aleksis/core/menus.py:207
+#: aleksis/core/menus.py:193
 msgid "Groups and child groups"
 msgstr ""
 
-#: aleksis/core/menus.py:218 aleksis/core/models.py:535
+#: aleksis/core/menus.py:204 aleksis/core/models.py:537
 #: aleksis/core/templates/core/additional_field/list.html:8
 #: aleksis/core/templates/core/additional_field/list.html:9
 msgid "Additional fields"
 msgstr ""
 
-#: aleksis/core/menus.py:229
+#: aleksis/core/menus.py:215
 msgid "Invite person"
 msgstr ""
 
-#: aleksis/core/menus.py:242
+#: aleksis/core/menus.py:228
 #: aleksis/core/templates/core/group/child_groups.html:7
 #: aleksis/core/templates/core/group/child_groups.html:9
 msgid "Assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/menus.py:254
+#: aleksis/core/menus.py:240
 msgid "Stop impersonation"
 msgstr ""
 
-#: aleksis/core/menus.py:263
+#: aleksis/core/menus.py:249
 msgid "Account"
 msgstr ""
 
-#: aleksis/core/menus.py:272
+#: aleksis/core/menus.py:258
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
 msgstr ""
 
-#: aleksis/core/menus.py:281
+#: aleksis/core/menus.py:267
 msgid "2FA"
 msgstr ""
 
-#: aleksis/core/menus.py:289
+#: aleksis/core/menus.py:275
 #: aleksis/core/templates/account/password_change.html:5
 #: aleksis/core/templates/account/password_change.html:6
 #: aleksis/core/templates/account/password_change.html:19
@@ -423,17 +434,21 @@ msgstr ""
 msgid "Change password"
 msgstr ""
 
-#: aleksis/core/menus.py:301
+#: aleksis/core/menus.py:287
 msgid "Third-party accounts"
 msgstr ""
 
-#: aleksis/core/menus.py:310
+#: aleksis/core/menus.py:296
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
 msgid "Authorized applications"
 msgstr ""
 
-#: aleksis/core/menus.py:320
+#: aleksis/core/menus.py:305
+msgid "Calendar Feeds"
+msgstr ""
+
+#: aleksis/core/menus.py:318
 msgid "Logout"
 msgstr ""
 
@@ -441,559 +456,584 @@ msgstr ""
 msgid "Linked school term"
 msgstr ""
 
-#: aleksis/core/models.py:75
+#: aleksis/core/models.py:77
 msgid "Boolean (Yes/No)"
 msgstr ""
 
-#: aleksis/core/models.py:76
+#: aleksis/core/models.py:78
 msgid "Text (one line)"
 msgstr ""
 
-#: aleksis/core/models.py:78
+#: aleksis/core/models.py:80
 msgid "Date and time"
 msgstr ""
 
-#: aleksis/core/models.py:79
+#: aleksis/core/models.py:81
 msgid "Decimal number"
 msgstr ""
 
-#: aleksis/core/models.py:80 aleksis/core/models.py:203
+#: aleksis/core/models.py:82 aleksis/core/models.py:205
 msgid "E-mail address"
 msgstr ""
 
-#: aleksis/core/models.py:81
+#: aleksis/core/models.py:83
 msgid "Integer"
 msgstr ""
 
-#: aleksis/core/models.py:82
+#: aleksis/core/models.py:84
 msgid "IP address"
 msgstr ""
 
-#: aleksis/core/models.py:83
+#: aleksis/core/models.py:85
 msgid "Boolean or empty (Yes/No/Neither)"
 msgstr ""
 
-#: aleksis/core/models.py:84
+#: aleksis/core/models.py:86
 msgid "Text (multi-line)"
 msgstr ""
 
-#: aleksis/core/models.py:86
+#: aleksis/core/models.py:88
 msgid "URL / Link"
 msgstr ""
 
-#: aleksis/core/models.py:98 aleksis/core/models.py:1068
+#: aleksis/core/models.py:100 aleksis/core/models.py:1070
+#: aleksis/core/models.py:1374
 msgid "Name"
 msgstr ""
 
-#: aleksis/core/models.py:100
+#: aleksis/core/models.py:102
 msgid "Start date"
 msgstr ""
 
-#: aleksis/core/models.py:101
+#: aleksis/core/models.py:103
 msgid "End date"
 msgstr ""
 
-#: aleksis/core/models.py:120
+#: aleksis/core/models.py:122
 msgid "The start date must be earlier than the end date."
 msgstr ""
 
-#: aleksis/core/models.py:127
+#: aleksis/core/models.py:129
 msgid "There is already a school term for this time or a part of this time."
 msgstr ""
 
-#: aleksis/core/models.py:156 aleksis/core/models.py:1017
+#: aleksis/core/models.py:158 aleksis/core/models.py:1019
+#: aleksis/core/models.py:1371
 msgid "Person"
 msgstr ""
 
-#: aleksis/core/models.py:159
+#: aleksis/core/models.py:161
 msgid "Can view address"
 msgstr ""
 
-#: aleksis/core/models.py:160
+#: aleksis/core/models.py:162
 msgid "Can view contact details"
 msgstr ""
 
-#: aleksis/core/models.py:161
+#: aleksis/core/models.py:163
 msgid "Can view photo"
 msgstr ""
 
-#: aleksis/core/models.py:162
+#: aleksis/core/models.py:164
 msgid "Can view avatar image"
 msgstr ""
 
-#: aleksis/core/models.py:163
+#: aleksis/core/models.py:165
 msgid "Can view persons groups"
 msgstr ""
 
-#: aleksis/core/models.py:164
+#: aleksis/core/models.py:166
 msgid "Can view personal details"
 msgstr ""
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "female"
 msgstr ""
 
-#: aleksis/core/models.py:174
+#: aleksis/core/models.py:176
 msgid "male"
 msgstr ""
 
-#: aleksis/core/models.py:182 aleksis/core/models.py:1271
+#: aleksis/core/models.py:184 aleksis/core/models.py:1273
 msgid "Linked user"
 msgstr ""
 
-#: aleksis/core/models.py:188
+#: aleksis/core/models.py:190
 msgid "Additional name(s)"
 msgstr ""
 
-#: aleksis/core/models.py:192 aleksis/core/models.py:504
+#: aleksis/core/models.py:194 aleksis/core/models.py:506
 msgid "Short name"
 msgstr ""
 
-#: aleksis/core/models.py:195
+#: aleksis/core/models.py:197
 msgid "Street"
 msgstr ""
 
-#: aleksis/core/models.py:196
+#: aleksis/core/models.py:198
 msgid "Street number"
 msgstr ""
 
-#: aleksis/core/models.py:197
+#: aleksis/core/models.py:199
 msgid "Postal code"
 msgstr ""
 
-#: aleksis/core/models.py:198
+#: aleksis/core/models.py:200
 msgid "Place"
 msgstr ""
 
-#: aleksis/core/models.py:200 aleksis/core/templates/core/person/full.html:160
+#: aleksis/core/models.py:202 aleksis/core/templates/core/person/full.html:160
 msgid "Home phone"
 msgstr ""
 
-#: aleksis/core/models.py:201 aleksis/core/templates/core/person/full.html:170
+#: aleksis/core/models.py:203 aleksis/core/templates/core/person/full.html:170
 msgid "Mobile phone"
 msgstr ""
 
-#: aleksis/core/models.py:205
+#: aleksis/core/models.py:207
 msgid "Date of birth"
 msgstr ""
 
-#: aleksis/core/models.py:206
+#: aleksis/core/models.py:208
 msgid "Place of birth"
 msgstr ""
 
-#: aleksis/core/models.py:207
+#: aleksis/core/models.py:209
 msgid "Sex"
 msgstr ""
 
-#: aleksis/core/models.py:214 aleksis/core/models.py:543
+#: aleksis/core/models.py:216 aleksis/core/models.py:545
 msgid "This is an official photo, used for official documents and for internal use cases."
 msgstr ""
 
-#: aleksis/core/models.py:219 aleksis/core/models.py:547
+#: aleksis/core/models.py:221 aleksis/core/models.py:549
 msgid "Display picture / Avatar"
 msgstr ""
 
-#: aleksis/core/models.py:222 aleksis/core/models.py:550
+#: aleksis/core/models.py:224 aleksis/core/models.py:552
 msgid "This is a picture or an avatar for public display."
 msgstr ""
 
-#: aleksis/core/models.py:227 aleksis/core/templates/core/person/full.html:235
+#: aleksis/core/models.py:229 aleksis/core/templates/core/person/full.html:235
 msgid "Guardians / Parents"
 msgstr ""
 
-#: aleksis/core/models.py:234
+#: aleksis/core/models.py:236
 msgid "Primary group"
 msgstr ""
 
-#: aleksis/core/models.py:237 aleksis/core/models.py:717
-#: aleksis/core/models.py:741 aleksis/core/models.py:832
-#: aleksis/core/models.py:1092
+#: aleksis/core/models.py:239 aleksis/core/models.py:719
+#: aleksis/core/models.py:743 aleksis/core/models.py:834
+#: aleksis/core/models.py:1094
 msgid "Description"
 msgstr ""
 
-#: aleksis/core/models.py:457
+#: aleksis/core/models.py:459
 msgid "Title of field"
 msgstr ""
 
-#: aleksis/core/models.py:459
+#: aleksis/core/models.py:461
 msgid "Type of field"
 msgstr ""
 
-#: aleksis/core/models.py:461
+#: aleksis/core/models.py:463
 msgid "Required"
 msgstr ""
 
-#: aleksis/core/models.py:462
+#: aleksis/core/models.py:464
 msgid "Help text / description"
 msgstr ""
 
-#: aleksis/core/models.py:468
+#: aleksis/core/models.py:470
 msgid "Addtitional field for groups"
 msgstr ""
 
-#: aleksis/core/models.py:469
+#: aleksis/core/models.py:471
 msgid "Addtitional fields for groups"
 msgstr ""
 
-#: aleksis/core/models.py:489
+#: aleksis/core/models.py:491
 msgid "Can assign child groups to groups"
 msgstr ""
 
-#: aleksis/core/models.py:490
+#: aleksis/core/models.py:492
 msgid "Can view statistics about group."
 msgstr ""
 
-#: aleksis/core/models.py:502
+#: aleksis/core/models.py:504
 msgid "Long name"
 msgstr ""
 
-#: aleksis/core/models.py:512 aleksis/core/templates/core/group/full.html:85
+#: aleksis/core/models.py:514 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
 msgstr ""
 
-#: aleksis/core/models.py:515 aleksis/core/templates/core/group/full.html:82
+#: aleksis/core/models.py:517 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
 msgstr ""
 
-#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:55
+#: aleksis/core/models.py:524 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
 msgstr ""
 
-#: aleksis/core/models.py:530
+#: aleksis/core/models.py:532
 msgid "Type of group"
 msgstr ""
 
-#: aleksis/core/models.py:716 aleksis/core/models.py:740
-#: aleksis/core/models.py:831
+#: aleksis/core/models.py:718 aleksis/core/models.py:742
+#: aleksis/core/models.py:833
 #: aleksis/core/templates/core/announcement/list.html:18
 msgid "Title"
 msgstr ""
 
-#: aleksis/core/models.py:719
+#: aleksis/core/models.py:721
 msgid "Application"
 msgstr ""
 
-#: aleksis/core/models.py:725
+#: aleksis/core/models.py:727
 msgid "Activity"
 msgstr ""
 
-#: aleksis/core/models.py:726
+#: aleksis/core/models.py:728
 msgid "Activities"
 msgstr ""
 
-#: aleksis/core/models.py:732
+#: aleksis/core/models.py:734
 msgid "Sender"
 msgstr ""
 
-#: aleksis/core/models.py:737
+#: aleksis/core/models.py:739
 msgid "Recipient"
 msgstr ""
 
-#: aleksis/core/models.py:742 aleksis/core/models.py:1069
+#: aleksis/core/models.py:744 aleksis/core/models.py:1071
 msgid "Link"
 msgstr ""
 
-#: aleksis/core/models.py:744
+#: aleksis/core/models.py:746
 msgid "Send notification at"
 msgstr ""
 
-#: aleksis/core/models.py:746
+#: aleksis/core/models.py:748
 msgid "Read"
 msgstr ""
 
-#: aleksis/core/models.py:747
+#: aleksis/core/models.py:749
 msgid "Sent"
 msgstr ""
 
-#: aleksis/core/models.py:764
+#: aleksis/core/models.py:766
 msgid "Notification"
 msgstr ""
 
-#: aleksis/core/models.py:833
+#: aleksis/core/models.py:767 aleksis/core/preferences.py:29
+#: aleksis/core/templates/core/base.html:81
+#: aleksis/core/templates/core/notifications.html:4
+#: aleksis/core/templates/core/notifications.html:5
+msgid "Notifications"
+msgstr ""
+
+#: aleksis/core/models.py:835
 msgid "Link to detailed view"
 msgstr ""
 
-#: aleksis/core/models.py:836
+#: aleksis/core/models.py:838
 msgid "Date and time from when to show"
 msgstr ""
 
-#: aleksis/core/models.py:839
+#: aleksis/core/models.py:841
 msgid "Date and time until when to show"
 msgstr ""
 
-#: aleksis/core/models.py:864
+#: aleksis/core/models.py:866
 msgid "Announcement"
 msgstr ""
 
-#: aleksis/core/models.py:902
+#: aleksis/core/models.py:904
 msgid "Announcement recipient"
 msgstr ""
 
-#: aleksis/core/models.py:903
+#: aleksis/core/models.py:905
 msgid "Announcement recipients"
 msgstr ""
 
-#: aleksis/core/models.py:925
+#: aleksis/core/models.py:927
 msgid "Widget Title"
 msgstr ""
 
-#: aleksis/core/models.py:926
+#: aleksis/core/models.py:928
 msgid "Activate Widget"
 msgstr ""
 
-#: aleksis/core/models.py:927
+#: aleksis/core/models.py:929
 msgid "Widget is broken"
 msgstr ""
 
-#: aleksis/core/models.py:930
+#: aleksis/core/models.py:932
 msgid "Size on mobile devices"
 msgstr ""
 
-#: aleksis/core/models.py:931
+#: aleksis/core/models.py:933
 msgid "<= 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:936
+#: aleksis/core/models.py:938
 msgid "Size on tablet devices"
 msgstr ""
 
-#: aleksis/core/models.py:937
+#: aleksis/core/models.py:939
 msgid "> 600 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:942
+#: aleksis/core/models.py:944
 msgid "Size on desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:943
+#: aleksis/core/models.py:945
 msgid "> 992 px, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:948
+#: aleksis/core/models.py:950
 msgid "Size on large desktop devices"
 msgstr ""
 
-#: aleksis/core/models.py:949
+#: aleksis/core/models.py:951
 msgid "> 1200 px>, 12 columns"
 msgstr ""
 
-#: aleksis/core/models.py:980
+#: aleksis/core/models.py:982
 msgid "Can edit default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:981
+#: aleksis/core/models.py:983
 msgid "Dashboard Widget"
 msgstr ""
 
-#: aleksis/core/models.py:982
+#: aleksis/core/models.py:984
 msgid "Dashboard Widgets"
 msgstr ""
 
-#: aleksis/core/models.py:988
+#: aleksis/core/models.py:990
 msgid "URL"
 msgstr ""
 
-#: aleksis/core/models.py:989
+#: aleksis/core/models.py:991
 msgid "Icon URL"
 msgstr ""
 
-#: aleksis/core/models.py:995
+#: aleksis/core/models.py:997
 msgid "External link widget"
 msgstr ""
 
-#: aleksis/core/models.py:996
+#: aleksis/core/models.py:998
 msgid "External link widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1002
+#: aleksis/core/models.py:1004
 msgid "Content"
 msgstr ""
 
-#: aleksis/core/models.py:1008
+#: aleksis/core/models.py:1010
 msgid "Static content widget"
 msgstr ""
 
-#: aleksis/core/models.py:1009
+#: aleksis/core/models.py:1011
 msgid "Static content widgets"
 msgstr ""
 
-#: aleksis/core/models.py:1014
+#: aleksis/core/models.py:1016
 msgid "Dashboard widget"
 msgstr ""
 
-#: aleksis/core/models.py:1019
+#: aleksis/core/models.py:1021
 msgid "Order"
 msgstr ""
 
-#: aleksis/core/models.py:1020
+#: aleksis/core/models.py:1022
 msgid "Part of the default dashboard"
 msgstr ""
 
-#: aleksis/core/models.py:1035
+#: aleksis/core/models.py:1037
 msgid "Dashboard widget order"
 msgstr ""
 
-#: aleksis/core/models.py:1036
+#: aleksis/core/models.py:1038
 msgid "Dashboard widget orders"
 msgstr ""
 
-#: aleksis/core/models.py:1042
+#: aleksis/core/models.py:1044
 msgid "Menu ID"
 msgstr ""
 
-#: aleksis/core/models.py:1055
+#: aleksis/core/models.py:1057
 msgid "Custom menu"
 msgstr ""
 
-#: aleksis/core/models.py:1056
+#: aleksis/core/models.py:1058
 msgid "Custom menus"
 msgstr ""
 
-#: aleksis/core/models.py:1066
+#: aleksis/core/models.py:1068
 msgid "Menu"
 msgstr ""
 
-#: aleksis/core/models.py:1070 aleksis/core/models.py:1318
+#: aleksis/core/models.py:1072 aleksis/core/models.py:1320
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
 msgstr ""
 
-#: aleksis/core/models.py:1076
+#: aleksis/core/models.py:1078
 msgid "Custom menu item"
 msgstr ""
 
-#: aleksis/core/models.py:1077
+#: aleksis/core/models.py:1079
 msgid "Custom menu items"
 msgstr ""
 
-#: aleksis/core/models.py:1091
+#: aleksis/core/models.py:1093
 msgid "Title of type"
 msgstr ""
 
-#: aleksis/core/models.py:1098 aleksis/core/templates/core/group/full.html:47
+#: aleksis/core/models.py:1100 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
 msgstr ""
 
-#: aleksis/core/models.py:1112
+#: aleksis/core/models.py:1114
 msgid "Can view system status"
 msgstr ""
 
-#: aleksis/core/models.py:1113
+#: aleksis/core/models.py:1115
 msgid "Can manage data"
 msgstr ""
 
-#: aleksis/core/models.py:1114
+#: aleksis/core/models.py:1116
 msgid "Can impersonate"
 msgstr ""
 
-#: aleksis/core/models.py:1115
+#: aleksis/core/models.py:1117
 msgid "Can use search"
 msgstr ""
 
-#: aleksis/core/models.py:1116
+#: aleksis/core/models.py:1118
 msgid "Can change site preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1117
+#: aleksis/core/models.py:1119
 msgid "Can change person preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1118
+#: aleksis/core/models.py:1120
 msgid "Can change group preferences"
 msgstr ""
 
-#: aleksis/core/models.py:1119
+#: aleksis/core/models.py:1121
 msgid "Can test PDF generation"
 msgstr ""
 
-#: aleksis/core/models.py:1120
+#: aleksis/core/models.py:1122
 msgid "Can invite persons"
 msgstr ""
 
-#: aleksis/core/models.py:1156
+#: aleksis/core/models.py:1158
 msgid "Related data check task"
 msgstr ""
 
-#: aleksis/core/models.py:1164
+#: aleksis/core/models.py:1166
 msgid "Issue solved"
 msgstr ""
 
-#: aleksis/core/models.py:1165
+#: aleksis/core/models.py:1167
 msgid "Notification sent"
 msgstr ""
 
-#: aleksis/core/models.py:1178
+#: aleksis/core/models.py:1180
 msgid "Data check result"
 msgstr ""
 
-#: aleksis/core/models.py:1179
+#: aleksis/core/models.py:1181
 msgid "Data check results"
 msgstr ""
 
-#: aleksis/core/models.py:1181
+#: aleksis/core/models.py:1183
 msgid "Can run data checks"
 msgstr ""
 
-#: aleksis/core/models.py:1182
+#: aleksis/core/models.py:1184
 msgid "Can solve data check problems"
 msgstr ""
 
-#: aleksis/core/models.py:1189
+#: aleksis/core/models.py:1191
 msgid "E-Mail address"
 msgstr ""
 
-#: aleksis/core/models.py:1221
+#: aleksis/core/models.py:1223
 msgid "Owner"
 msgstr ""
 
-#: aleksis/core/models.py:1225
+#: aleksis/core/models.py:1227
 msgid "File expires at"
 msgstr ""
 
-#: aleksis/core/models.py:1227
+#: aleksis/core/models.py:1229
 msgid "Generated HTML file"
 msgstr ""
 
-#: aleksis/core/models.py:1229
+#: aleksis/core/models.py:1231
 msgid "Generated PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1236
+#: aleksis/core/models.py:1238
 msgid "PDF file"
 msgstr ""
 
-#: aleksis/core/models.py:1237
+#: aleksis/core/models.py:1239
 msgid "PDF files"
 msgstr ""
 
-#: aleksis/core/models.py:1242
+#: aleksis/core/models.py:1244
 msgid "Task result"
 msgstr ""
 
-#: aleksis/core/models.py:1245
+#: aleksis/core/models.py:1247
 msgid "Task user"
 msgstr ""
 
-#: aleksis/core/models.py:1257
+#: aleksis/core/models.py:1259
 msgid "Task user assignment"
 msgstr ""
 
-#: aleksis/core/models.py:1258
+#: aleksis/core/models.py:1260
 msgid "Task user assignments"
 msgstr ""
 
-#: aleksis/core/models.py:1274
+#: aleksis/core/models.py:1276
 msgid "Additional attributes"
 msgstr ""
 
-#: aleksis/core/models.py:1312
+#: aleksis/core/models.py:1314
 msgid "Allowed scopes that clients can request"
 msgstr ""
 
-#: aleksis/core/models.py:1322
+#: aleksis/core/models.py:1324
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
 msgstr ""
 
+#: aleksis/core/models.py:1373
+msgid "UUID"
+msgstr ""
+
+#: aleksis/core/models.py:1377
+msgid "Selected ICal feed"
+msgstr ""
+
+#: aleksis/core/models.py:1386
+msgid "Personal Calendar URL"
+msgstr ""
+
+#: aleksis/core/models.py:1387
+msgid "Personal Calendar URLs"
+msgstr ""
+
 #: aleksis/core/preferences.py:25
 msgid "General"
 msgstr ""
@@ -1518,7 +1558,7 @@ msgid "Publish new announcement"
 msgstr ""
 
 #: aleksis/core/templates/core/announcement/form.html:34
-msgid "Save und publish announcement"
+msgid "Save and publish announcement"
 msgstr ""
 
 #: aleksis/core/templates/core/announcement/list.html:19
@@ -1820,6 +1860,40 @@ msgstr ""
 msgid "Create group type"
 msgstr ""
 
+#: aleksis/core/templates/core/ical/ical_create.html:4
+#: aleksis/core/templates/core/ical/ical_create.html:5
+#: aleksis/core/templates/core/ical/ical_list.html:12
+msgid "Create iCal URL"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_create.html:16
+#: aleksis/core/templates/core/ical/ical_edit.html:16
+#: aleksis/core/templates/oauth2_provider/application/create.html:14
+#: aleksis/core/templates/oauth2_provider/application/edit.html:14
+#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
+#: aleksis/core/templates/two_factor/_wizard_actions.html:6
+msgid "Cancel"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_edit.html:4
+#: aleksis/core/templates/core/ical/ical_edit.html:5
+#, python-format
+msgid "Edit iCal URL %(object)s"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:4
+#: aleksis/core/templates/core/ical/ical_list.html:5
+msgid "ICal Feeds"
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:8
+msgid "These are URLs for different Calendar Feeds in the iCal (.ics) format. You can create as many as you want and import them in your calendar software."
+msgstr ""
+
+#: aleksis/core/templates/core/ical/ical_list.html:14
+msgid "Your iCal URLs"
+msgstr ""
+
 #: aleksis/core/templates/core/index.html:4
 msgid "Home"
 msgstr ""
@@ -2296,13 +2370,6 @@ msgstr ""
 msgid "Register OAuth2 Application"
 msgstr ""
 
-#: aleksis/core/templates/oauth2_provider/application/create.html:14
-#: aleksis/core/templates/oauth2_provider/application/edit.html:14
-#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
-#: aleksis/core/templates/two_factor/_wizard_actions.html:6
-msgid "Cancel"
-msgstr ""
-
 #: aleksis/core/templates/oauth2_provider/application/detail.html:5
 msgid "OAuth2 Application"
 msgstr ""
@@ -3022,156 +3089,168 @@ msgstr ""
 msgid "Download PDF"
 msgstr ""
 
-#: aleksis/core/views.py:289
+#: aleksis/core/views.py:292
 msgid "The school term has been created."
 msgstr ""
 
-#: aleksis/core/views.py:301
+#: aleksis/core/views.py:304
 msgid "The school term has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:421
+#: aleksis/core/views.py:424
 msgid "The child groups were successfully saved."
 msgstr ""
 
-#: aleksis/core/views.py:440 aleksis/core/views.py:450
+#: aleksis/core/views.py:443 aleksis/core/views.py:453
 msgid "The person has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:500
+#: aleksis/core/views.py:503
 msgid "The group has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:597
+#: aleksis/core/views.py:600
 msgid "The announcement has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:613
+#: aleksis/core/views.py:616
 msgid "The announcement has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:681
+#: aleksis/core/views.py:684
 msgid "The requested preference registry does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:700
+#: aleksis/core/views.py:703
 msgid "The preferences have been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:724
+#: aleksis/core/views.py:727
 msgid "The person has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:738
+#: aleksis/core/views.py:741
 msgid "The group has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:770
+#: aleksis/core/views.py:773
 msgid "The additional_field has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:804
+#: aleksis/core/views.py:807
 msgid "The additional field has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:829
+#: aleksis/core/views.py:832
 msgid "The group type has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:859
+#: aleksis/core/views.py:862
 msgid "The group type has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:892
+#: aleksis/core/views.py:895
 msgid "Progress: Run data checks"
 msgstr ""
 
-#: aleksis/core/views.py:893
+#: aleksis/core/views.py:896
 msgid "Run data checks …"
 msgstr ""
 
-#: aleksis/core/views.py:894
+#: aleksis/core/views.py:897
 msgid "The data checks were run successfully."
 msgstr ""
 
-#: aleksis/core/views.py:895
+#: aleksis/core/views.py:898
 msgid "There was a problem while running data checks."
 msgstr ""
 
-#: aleksis/core/views.py:911
+#: aleksis/core/views.py:914
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
 msgstr ""
 
-#: aleksis/core/views.py:921
+#: aleksis/core/views.py:924
 msgid "The requested solve option does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:953
+#: aleksis/core/views.py:956
 msgid "The dashboard widget has been saved."
 msgstr ""
 
-#: aleksis/core/views.py:983
+#: aleksis/core/views.py:986
 msgid "The dashboard widget has been created."
 msgstr ""
 
-#: aleksis/core/views.py:993
+#: aleksis/core/views.py:996
 msgid "The dashboard widget has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1064
+#: aleksis/core/views.py:1067
 msgid "Your dashboard configuration has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1066
+#: aleksis/core/views.py:1069
 msgid "The configuration of the default dashboard has been saved successfully."
 msgstr ""
 
-#: aleksis/core/views.py:1142
+#: aleksis/core/views.py:1145
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
 msgstr ""
 
-#: aleksis/core/views.py:1233
+#: aleksis/core/views.py:1236
 msgid "We have successfully assigned the permissions."
 msgstr ""
 
-#: aleksis/core/views.py:1243
+#: aleksis/core/views.py:1246
 msgid "The global user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1253
+#: aleksis/core/views.py:1256
 msgid "The global group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1263
+#: aleksis/core/views.py:1266
 msgid "The object user permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1273
+#: aleksis/core/views.py:1276
 msgid "The object group permission has been deleted."
 msgstr ""
 
-#: aleksis/core/views.py:1341
+#: aleksis/core/views.py:1344
 msgid "The requested PDF file does not exist"
 msgstr ""
 
-#: aleksis/core/views.py:1350 aleksis/core/views.py:1354
+#: aleksis/core/views.py:1353 aleksis/core/views.py:1357
 msgid "The requested task does not exist or is not accessible"
 msgstr ""
 
-#: aleksis/core/views.py:1406
+#: aleksis/core/views.py:1409
 msgid "The third-party account could not be disconnected because it is the only login method available."
 msgstr ""
 
-#: aleksis/core/views.py:1413
+#: aleksis/core/views.py:1416
 msgid "The third-party account has been successfully disconnected."
 msgstr ""
 
-#: aleksis/core/views.py:1484
+#: aleksis/core/views.py:1487
 msgid "Person was invited successfully and an email with further instructions has been send to them."
 msgstr ""
 
-#: aleksis/core/views.py:1495
+#: aleksis/core/views.py:1498
 msgid "Person was already invited."
 msgstr ""
+
+#: aleksis/core/views.py:1598
+msgid "ICal feed updated successfully"
+msgstr ""
+
+#: aleksis/core/views.py:1608
+msgid "ICal feed deleted successfully"
+msgstr ""
+
+#: aleksis/core/views.py:1616
+msgid "ICal feed created successfully"
+msgstr ""
diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po
index f3df4c3fc6d2848a739ddd1faac44cb9048c97b2..509b8a65f4bdbc6ac9c1ec0282c1ff99b6f1f8c1 100644
--- a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-23 11:20+0100\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/aleksis/core/locale/uk/LC_MESSAGES/django.po b/aleksis/core/locale/uk/LC_MESSAGES/django.po
index 8cde48de60636d01ae2049f4bf2f25a58b16e65f..e1e5eae2902fb86eaab8b557974fd5fc1d93e4c5 100644
--- a/aleksis/core/locale/uk/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/uk/LC_MESSAGES/django.po
@@ -7,19 +7,15 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-04-23 12:58+0000\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: 2022-05-23 10:28+0000\n"
 "Last-Translator: Serhii Horichenko <m@sgg.im>\n"
-"Language-Team: Ukrainian <https://translate.edugit.org/projects/aleksis/"
-"aleksis-core/uk/>\n"
+"Language-Team: Ukrainian <https://translate.edugit.org/projects/aleksis/aleksis-core/uk/>\n"
 "Language: uk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 "
-"? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > "
-"14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % "
-"100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
 "X-Generator: Weblate 4.12.1\n"
 
 #: aleksis/core/apps.py:166
@@ -256,7 +252,9 @@ msgid "You must grant the permission to all objects and/or to some objects."
 msgstr "Ви повинні надати дозвіл до всіх об'єктів або до деяких."
 
 #: aleksis/core/forms.py:586
-msgid "Adress data"
+#, fuzzy
+#| msgid "Adress data"
+msgid "Address data"
 msgstr "Дані адреси"
 
 #: aleksis/core/forms.py:598
@@ -609,8 +607,7 @@ msgstr "Стать"
 
 #: aleksis/core/models.py:216 aleksis/core/models.py:545
 msgid "This is an official photo, used for official documents and for internal use cases."
-msgstr ""
-"Це офіційне фото, яке використовується для документів та внутрішніх потреб."
+msgstr "Це офіційне фото, яке використовується для документів та внутрішніх потреб."
 
 #: aleksis/core/models.py:221 aleksis/core/models.py:549
 msgid "Display picture / Avatar"
@@ -1022,9 +1019,7 @@ msgstr "Дозволені межі дії, які можуть запитува
 
 #: aleksis/core/models.py:1324
 msgid "This image will be shown as icon in the authorization flow. It should be squared."
-msgstr ""
-"Це зображення буде виглядати іконкою під час авторизації. Повинне бути "
-"квадратним."
+msgstr "Це зображення буде виглядати іконкою під час авторизації. Повинне бути квадратним."
 
 #: aleksis/core/models.py:1373
 msgid "UUID"
@@ -1144,8 +1139,7 @@ msgstr "Нові особи для нових користувачів ство
 
 #: aleksis/core/preferences.py:241
 msgid "Automatically link existing persons to new users by their e-mail address"
-msgstr ""
-"Пов'язувати існуючих осіб з новими користувачами автоматично за ел.адресами"
+msgstr "Пов'язувати існуючих осіб з новими користувачами автоматично за ел.адресами"
 
 #: aleksis/core/preferences.py:252
 msgid "Display name of the school"
@@ -1336,8 +1330,7 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Адміністратори сайту будуть сповіщені щодо цієї помилки "
-"автоматично\n"
+"            Адміністратори сайту будуть сповіщені щодо цієї помилки автоматично\n"
 "            Ви також можете звернутися до них безпосередньо:\n"
 "          "
 
@@ -1360,8 +1353,7 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Ця сторінка наразі недоступна. Якщо ця помилка виникне знову, "
-"зверніться до адміністраторів сайту:\n"
+"            Ця сторінка наразі недоступна. Якщо ця помилка виникне знову, зверніться до адміністраторів сайту:\n"
 "          "
 
 #: aleksis/core/templates/account/account_inactive.html:5
@@ -1403,17 +1395,12 @@ msgstr "Підтвердити"
 #: aleksis/core/templates/account/email_confirm.html:12
 #, python-format
 msgid "Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail address for user %(user_display)s."
-msgstr ""
-"Підтвердіть, будь ласка, що <a href=\"mailto:%(email)s\">%(email)s</a> є "
-"адресою ел.пошти для користувача %(user_display)s."
+msgstr "Підтвердіть, будь ласка, що <a href=\"mailto:%(email)s\">%(email)s</a> є адресою ел.пошти для користувача %(user_display)s."
 
 #: aleksis/core/templates/account/email_confirm.html:25
 #, python-format
 msgid "This e-mail confirmation link expired or is invalid. Please <a href=\"%(email_url)s\">issue a new e-mail confirmation request</a>."
-msgstr ""
-"Це посилання для підтвердження ел.пошти протерміноване або недійсне. "
-"Зробіть, будь ласка, для підтвердження <a href=\"%(email_url)s\">новий "
-"запит</a>."
+msgstr "Це посилання для підтвердження ел.пошти протерміноване або недійсне. Зробіть, будь ласка, для підтвердження <a href=\"%(email_url)s\">новий запит</a>."
 
 #: aleksis/core/templates/account/password_change.html:12
 msgid "Forgot your current password? Click here to reset it:"
@@ -1441,8 +1428,7 @@ msgid ""
 msgstr ""
 "\n"
 "            Користувачам не дозволяється змінювати свої паролі.\n"
-"            Якщо Ви думаєте, що це помилка, зверніться до адміністраторів "
-"сайту.\n"
+"            Якщо Ви думаєте, що це помилка, зверніться до адміністраторів сайту.\n"
 "          "
 
 #: aleksis/core/templates/account/password_reset.html:5
@@ -1457,9 +1443,7 @@ msgstr "Скинути пароль"
 
 #: aleksis/core/templates/account/password_reset.html:17
 msgid "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it."
-msgstr ""
-"Забули пароль? Вкажіть нижче свою ел.пошту і ми надішлемо Вам листа для "
-"скидання пароля."
+msgstr "Забули пароль? Вкажіть нижче свою ел.пошту і ми надішлемо Вам листа для скидання пароля."
 
 #: aleksis/core/templates/account/password_reset.html:30
 msgid ""
@@ -1483,8 +1467,7 @@ msgid ""
 msgstr ""
 "\n"
 "            Ми надіслали Вам ел.листа. Якщо Ви його не отримаєте протягом\n"
-"            декількох хвилин, зверніться, будь ласка, до адміністраторів "
-"сайту.\n"
+"            декількох хвилин, зверніться, будь ласка, до адміністраторів сайту.\n"
 "          "
 
 #: aleksis/core/templates/account/password_reset_from_key.html:15
@@ -1500,10 +1483,8 @@ msgid ""
 "            "
 msgstr ""
 "\n"
-"              Посилання на скидання пароля недійсне або, ймовірно, вже "
-"використане. Зробіть, будь ласка, <a href=\"%(passwd_reset_url)s\"\n"
-"              class=\"blue-text text-lighten-2\">новий запит на скидання "
-"пароля</a>.\n"
+"              Посилання на скидання пароля недійсне або, ймовірно, вже використане. Зробіть, будь ласка, <a href=\"%(passwd_reset_url)s\"\n"
+"              class=\"blue-text text-lighten-2\">новий запит на скидання пароля</a>.\n"
 "            "
 
 #: aleksis/core/templates/account/password_reset_from_key.html:25
@@ -1553,8 +1534,7 @@ msgstr "Реєстрація"
 #: aleksis/core/templates/account/signup.html:12
 #, python-format
 msgid "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>."
-msgstr ""
-"Вже маєте обліковий запис? Тоді можете <a href=\"%(login_url)s\">увіти</a>."
+msgstr "Вже маєте обліковий запис? Тоді можете <a href=\"%(login_url)s\">увіти</a>."
 
 #: aleksis/core/templates/account/signup_closed.html:5
 #: aleksis/core/templates/account/signup_closed.html:6
@@ -1598,10 +1578,8 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Ця частина сайту вимагає перевірки, що Ви - саме той/та, хто має "
-"бути.\n"
-"            Саме для цього нам необхідно перевірити, що адреса ел.пошти "
-"належить саме Вам.\n"
+"            Ця частина сайту вимагає перевірки, що Ви - саме той/та, хто має бути.\n"
+"            Саме для цього нам необхідно перевірити, що адреса ел.пошти належить саме Вам.\n"
 "          "
 
 #: aleksis/core/templates/account/verification_sent.html:22
@@ -1614,10 +1592,8 @@ msgid ""
 msgstr ""
 "\n"
 "            Ми надіслали Вам для перевірки ел.листа.\n"
-"            Будь ласка, перейдіть за вказаним там посиланням. Якщо Ви не "
-"отримаєте\n"
-"            листа протягом декількох хвилин, зверніться, будь ласка, до нас."
-"\n"
+"            Будь ласка, перейдіть за вказаним там посиланням. Якщо Ви не отримаєте\n"
+"            листа протягом декількох хвилин, зверніться, будь ласка, до нас.\n"
 "          "
 
 #: aleksis/core/templates/core/additional_field/edit.html:6
@@ -1644,7 +1620,9 @@ msgid "Publish new announcement"
 msgstr "Розмістити нове оголошення"
 
 #: aleksis/core/templates/core/announcement/form.html:34
-msgid "Save und publish announcement"
+#, fuzzy
+#| msgid "Save und publish announcement"
+msgid "Save and publish announcement"
 msgstr "Зберегти та розмістити оголошення"
 
 #: aleksis/core/templates/core/announcement/list.html:19
@@ -1800,10 +1778,8 @@ msgid ""
 "        "
 msgstr ""
 "\n"
-"          На цій сторінці Ви можете впорядкувати свою інформпанель. "
-"Перетягуйте будь-які елементи з \"Доступних віджетів\"\n"
-"          до \"Своєї інформпанелі\" або змінюйте порядок, перетягуючи "
-"віджети. Після закінчення не забудьте натиснути\n"
+"          На цій сторінці Ви можете впорядкувати свою інформпанель. Перетягуйте будь-які елементи з \"Доступних віджетів\"\n"
+"          до \"Своєї інформпанелі\" або змінюйте порядок, перетягуючи віджети. Після закінчення не забудьте натиснути\n"
 "          \"Зберегти\".\n"
 "        "
 
@@ -1816,12 +1792,9 @@ msgid ""
 "        "
 msgstr ""
 "\n"
-"          На цій сторінці Ви можете впорядкувати типову/стандартну "
-"інформпанель, яка відображається, якщо користувач\n"
-"          не впорядкував власну. Перетягуйте будь-які елементи з \"Доступних "
-"віджетів\" до \"Типової інформпанелі\" або змінюйте \n"
-"          порядок, перетягуючи віджети. Після закінчення не забудьте "
-"натиснути \"Зберегти\".\n"
+"          На цій сторінці Ви можете впорядкувати типову/стандартну інформпанель, яка відображається, якщо користувач\n"
+"          не впорядкував власну. Перетягуйте будь-які елементи з \"Доступних віджетів\" до \"Типової інформпанелі\" або змінюйте \n"
+"          порядок, перетягуючи віджети. Після закінчення не забудьте натиснути \"Зберегти\".\n"
 "        "
 
 #: aleksis/core/templates/core/edit_dashboard.html:48
@@ -1844,10 +1817,8 @@ msgid ""
 "        "
 msgstr ""
 "\n"
-"          Ви можете скористатися цим для призначення підлеглих груп до "
-"основних. Для обрання груп,\n"
-"          які хочете змінити, скористайтеся, будь ласка, фільтрами, що нижче "
-"та натисність \"Далі\".\n"
+"          Ви можете скористатися цим для призначення підлеглих груп до основних. Для обрання груп,\n"
+"          які хочете змінити, скористайтеся, будь ласка, фільтрами, що нижче та натисність \"Далі\".\n"
 "        "
 
 #: aleksis/core/templates/core/group/child_groups.html:31
@@ -1873,8 +1844,7 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Оберіть, будь ласка, декілька груп у порядку, за яким призначати."
-"\n"
+"            Оберіть, будь ласка, декілька груп у порядку, за яким призначати.\n"
 "          "
 
 #: aleksis/core/templates/core/group/child_groups.html:72
@@ -1894,10 +1864,8 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Якщо натиснете \"Назад\" або \"Далі\" призначення цієї групи не "
-"збережуться.\n"
-"            Якщо натиснете \"Зберегти\", усі існуючі зв'язки підлеглої групи "
-"з цією групою будуть замінені на\n"
+"            Якщо натиснете \"Назад\" або \"Далі\" призначення цієї групи не збережуться.\n"
+"            Якщо натиснете \"Зберегти\", усі існуючі зв'язки підлеглої групи з цією групою будуть замінені на\n"
 "            обрані на цій сторінці.\n"
 "          "
 
@@ -2033,8 +2001,7 @@ msgid ""
 "      "
 msgstr ""
 "\n"
-"        Ви ще не налаштували свою інформпанель, тож поки що бачите типову/"
-"стандартну. Для налаштування \n"
+"        Ви ще не налаштували свою інформпанель, тож поки що бачите типову/стандартну. Для налаштування \n"
 "         власної інформпанелі клацніть \"Редагувати інформпанель\".\n"
 "      "
 
@@ -2081,10 +2048,8 @@ msgid ""
 "            "
 msgstr ""
 "\n"
-"              Ця платформа базується на AlekSIS®, веб-інструменті "
-"інформаційної системи для навчання (SIS) за допомогою якої\n"
-"              можна керувати та/або висвітлювати організаційні елементи "
-"навчальних закладів. AlekSIS - безплатне ПЗ\n"
+"              Ця платформа базується на AlekSIS®, веб-інструменті інформаційної системи для навчання (SIS) за допомогою якої\n"
+"              можна керувати та/або висвітлювати організаційні елементи навчальних закладів. AlekSIS - безплатне ПЗ\n"
 "              і ним може користуватися будь-хто.\n"
 "            "
 
@@ -2332,10 +2297,8 @@ msgid ""
 msgstr ""
 "\n"
 "            Ваш обліковий запис не пов'язаний з фізособою. Це означає,\n"
-"            що Ви не маєте жодного доступу до навчальної інформації. "
-"Зверніться,\n"
-"            будь ласка, до адміністраторів AlekSIS у Вашому навчальному "
-"закладі.\n"
+"            що Ви не маєте жодного доступу до навчальної інформації. Зверніться,\n"
+"            будь ласка, до адміністраторів AlekSIS у Вашому навчальному закладі.\n"
 "          "
 
 #: aleksis/core/templates/core/perms/assign.html:12
@@ -2623,10 +2586,8 @@ msgid ""
 "    "
 msgstr ""
 "\n"
-"      Під час доступу до цієї сторінки виникла помилка. Можливо, у Вас "
-"проблема з інтернетом. Переконайтеся, що Ваш WiFi\n"
-"      або мобільний увімкнені та спробуйте ще раз. Якщо Ви думаєте, що із "
-"з'єднанням все добре, зверніться\n"
+"      Під час доступу до цієї сторінки виникла помилка. Можливо, у Вас проблема з інтернетом. Переконайтеся, що Ваш WiFi\n"
+"      або мобільний увімкнені та спробуйте ще раз. Якщо Ви думаєте, що із з'єднанням все добре, зверніться\n"
 "      до системних адміністраторів:\n"
 "    "
 
@@ -2667,8 +2628,7 @@ msgid ""
 "          "
 msgstr ""
 "\n"
-"            Під час спроби входу з Вашим стороннім обліковим записом виникла "
-"помилка входу.\n"
+"            Під час спроби входу з Вашим стороннім обліковим записом виникла помилка входу.\n"
 "            Зверніться, будь ласка, до адміністратора сайту.\n"
 "          "
 
@@ -3090,12 +3050,9 @@ msgid ""
 "        "
 msgstr ""
 "\n"
-"          Ми помітили, що існує проблема з використанням обраного методу "
-"авторизації. Поверніться,\n"
-"          будь ласка, назад, та переконайтеся, що необхідні дані вказані "
-"правильно\n"
-"          і спробуйте увійте ще раз, або ж скористайтеся іншим варіантом "
-"входу. Якщо ж\n"
+"          Ми помітили, що існує проблема з використанням обраного методу авторизації. Поверніться,\n"
+"          будь ласка, назад, та переконайтеся, що необхідні дані вказані правильно\n"
+"          і спробуйте увійте ще раз, або ж скористайтеся іншим варіантом входу. Якщо ж\n"
 "          проблема залишається, зверніться до адміністратора сайту.\n"
 "        "
 
diff --git a/aleksis/core/locale/uk/LC_MESSAGES/djangojs.po b/aleksis/core/locale/uk/LC_MESSAGES/djangojs.po
index fb86a6c606be93efcaa83dd2cd9e65f9489fa157..c50840b81bb5cc5c95e636872762e449c9790c82 100644
--- a/aleksis/core/locale/uk/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/uk/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-04-23 12:58+0000\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,10 +16,8 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != "
-"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % "
-"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || "
-"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
+
 #: aleksis/core/static/js/main.js:66
 msgid "Today"
 msgstr ""