diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 18c5ea9a0a1b3b6727cb9c57db4ed64930aa1048..471650a9a23bdb75186c4d919c35f9cf99c1848b 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -12,6 +12,34 @@ Unreleased
 Added
 ~~~~~
 
+* Add Ukrainian locale (contributed by Sergiy Gorichenko from Fre(i)e Software GmbH).
+* Add third gender to gender choices
+* Add DataCheck to validate specific fields of specific models
+
+Changed
+~~~~~~~
+
+* Restructure group page and show more information about members.
+* django-two-factor-auth >= 1.14.0 is now required due to a
+  backwards-incompatible breakage in that library
+
+Fixed
+~~~~~~~
+
+* Password change view did not redirect to login when accessed unauthenticated.
+* Sorting icons were inlined into stylesheet
+
+Changed
+~~~~~~~
+
+* Update icon choices for models to new icon set
+
+`2.9`_ - 2022-05-25
+-------------------
+
+Added
+~~~~~
+
 * Allow to disable exception mails to admins
 * Add possibility to create iCal feeds in all apps and dynamically create user-specific urls.
 
@@ -21,19 +49,34 @@ Fixed
 * The menu button used to be displayed twice on smaller screens.
 * The icons were loaded from external servers instead from local server.
 * Weekdays were not translated if system locales were missing
+
   * Added locales-all to base image and note to docs
+
 * The icons in the account menu were still the old ones.
 * Due to a merge error, the once removed account menu in the sidenav appeared again.
 * Scheduled notifications were shown on dashboard before time.
 * Remove broken notifications menu item in favor of item next to account menu.
+* [OAuth2] Resources which are protected with client credentials
+  allowed access if no scopes were allowed (CVE-2022-29773).
+* The site logo could overlap with the menu for logos with an unexpected aspect ratio.
+* Some OAuth2 views stopped working with long scope names.
+* Resetting password was impossible due to a missing rule
+* Language selection was broken when only one language was enabled in
+  preferences.
+
+Removed
+~~~~~~~
+
+* Remove option to limit available languages in preferences.
 
 Changed
 ~~~~~~~
 
 * [Dev] ActionForm now checks permissions on objects before executing
 * [Dev] ActionForm now returns a proper return value from the executed action
+* Pin version of javascript dependencies
 
-2.8.1`_ - 2022-03-13
+`2.8.1`_ - 2022-03-13
 --------------------
 
 Changed
@@ -821,3 +864,4 @@ Fixed
 .. _2.7.4: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.4
 .. _2.8: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.8
 .. _2.8.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.8.1
+.. _2.9: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.9
diff --git a/aleksis/core/data_checks.py b/aleksis/core/data_checks.py
index d82c30d5ddf0b5ab11e7b1b5f8c2a595838c07e1..47194ece7a30b3bdf6a4fa6fc9624fd9851d2be9 100644
--- a/aleksis/core/data_checks.py
+++ b/aleksis/core/data_checks.py
@@ -3,8 +3,11 @@ from datetime import timedelta
 
 from django.apps import apps
 from django.contrib.contenttypes.models import ContentType
+from django.core.exceptions import ValidationError
+from django.db.models import Model
 from django.db.models.aggregates import Count
 from django.utils.functional import classproperty
+from django.utils.text import slugify
 from django.utils.translation import gettext as _
 
 import reversion
@@ -316,3 +319,31 @@ class BrokenDashboardWidgetDataCheck(DataCheck):
         for widget in broken_widgets:
             logging.info("Check DashboardWidget %s", widget)
             cls.register_result(widget)
+
+
+def field_validation_data_check_factory(app_name: str, model_name: str, field_name: str) -> type:
+    from django.apps import apps
+
+    class FieldValidationDataCheck(DataCheck):
+        name = f"field_validation_{slugify(model_name)}_{slugify(field_name)}"
+        verbose_name = _(
+            "Validate field %s of model %s." % (field_name, app_name + "." + model_name)
+        )
+        problem_name = _("The field %s couldn't be validated successfully." % field_name)
+        solve_options = {
+            IgnoreSolveOption.name: IgnoreSolveOption,
+        }
+
+        @classmethod
+        def check_data(cls):
+            model: Model = apps.get_model(app_name, model_name)
+            for obj in model.objects.all():
+                try:
+                    model._meta.get_field(field_name).validate(getattr(obj, field_name), obj)
+                except ValidationError as e:
+                    logging.info(f"Check {model_name} {obj}")
+                    cls.register_result(obj)
+
+    FieldValidationDataCheck.__name__ = model_name + "FieldValidationDataCheck"
+
+    return FieldValidationDataCheck
diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py
index 3fb938822b093e250299a3fac04f0e0358e6f47a..b3c3493e7d5ee0ee7f9b0fe7d01258a5459f26cf 100644
--- a/aleksis/core/forms.py
+++ b/aleksis/core/forms.py
@@ -583,7 +583,7 @@ class AccountRegisterForm(SignupForm, ExtensibleForm):
             "short_name",
         ),
         Fieldset(
-            _("Adress data"),
+            _("Address data"),
             Row("street", "housenumber"),
             Row("postal_code", "place"),
         ),
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..7656a3fde8cfff230195b6ec413433dc985fdc2d 100644
--- a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ 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"
-"PO-Revision-Date: 2022-03-23 11:06+0000\n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
+"PO-Revision-Date: 2022-05-24 17:52+0000\n"
 "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n"
 "Language-Team: German <https://translate.edugit.org/projects/aleksis/"
 "aleksis-core/de/>\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.8\n"
+"X-Generator: Weblate 4.12.1\n"
 
 #: aleksis/core/apps.py:166
 msgid "OpenID Connect scope"
@@ -39,8 +39,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 +67,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 "Geburtstagskalender"
+
+#: aleksis/core/feeds.py:53
+msgid "A Calendar of Birthdays"
+msgstr "Ein Kalender mit Geburtstagen"
+
+#: aleksis/core/feeds.py:66
+#, python-format
+msgid "%(name)s's birthday"
+msgstr "%(name)ss Geburtstag"
+
+#: aleksis/core/feeds.py:71
+#, python-format
+msgid "%(name)s was born on %(birthday)s"
+msgstr "%(name)s wurde am %(birthday)s geborgen"
+
 #: 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 +110,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 +150,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 +159,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 +169,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 +216,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 +253,7 @@ 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"
+msgid "Address data"
 msgstr "Adressdaten"
 
 #: aleksis/core/forms.py:598
@@ -256,9 +274,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 +300,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 +436,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 "Kalender-Feeds"
+
+#: aleksis/core/menus.py:318
 msgid "Logout"
 msgstr "Abmelden"
 
@@ -445,559 +458,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 "UUID"
+
+#: aleksis/core/models.py:1377
+msgid "Selected ICal feed"
+msgstr "Ausgewählter iCal-Feed"
+
+#: aleksis/core/models.py:1386
+msgid "Personal Calendar URL"
+msgstr "Persönliche Kalender-URL"
+
+#: aleksis/core/models.py:1387
+msgid "Personal Calendar URLs"
+msgstr "Persönliche Kalender-URLs"
+
 #: aleksis/core/preferences.py:25
 msgid "General"
 msgstr "Allgemein"
@@ -1580,7 +1618,7 @@ msgid "Publish new announcement"
 msgstr "Neue Ankündigung veröffentlichen"
 
 #: aleksis/core/templates/core/announcement/form.html:34
-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 +1951,43 @@ 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 "iCal-URL erstellen"
+
+#: 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 "iCal-URL %(object)s bearbeiten"
+
+#: aleksis/core/templates/core/ical/ical_list.html:4
+#: aleksis/core/templates/core/ical/ical_list.html:5
+msgid "ICal Feeds"
+msgstr "iCal-Feeds"
+
+#: 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 ""
+"Dies sind URLs für verschiedene Kalender-Feeds im iCal-Format (.ics). Sie "
+"können so viele erstellen, wie sie wollen, und in Ihre Kalender-Software "
+"importieren."
+
+#: aleksis/core/templates/core/ical/ical_list.html:14
+msgid "Your iCal URLs"
+msgstr "Deine iCal-URLs"
+
 #: 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,178 @@ 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
+msgid "ICal feed updated successfully"
+msgstr "Der iCal-Feed wurde erfolgreich aktualisiert"
+
+#: aleksis/core/views.py:1608
+msgid "ICal feed deleted successfully"
+msgstr "Der iCal-Feed wurde erfolgreich gelöscht"
+
+#: aleksis/core/views.py:1616
+msgid "ICal feed created successfully"
+msgstr "Der iCal-Feed wurde erfolgreich erstellt"
+
 #~ 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..6582e048b98e35a122c8c015c91a1e0fc5283362 100644
--- a/aleksis/core/locale/ru/LC_MESSAGES/djangojs.po
+++ b/aleksis/core/locale/ru/LC_MESSAGES/djangojs.po
@@ -3,34 +3,38 @@
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-04-23 12:58+0000\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
+"PO-Revision-Date: 2022-06-03 01:59+0000\n"
+"Last-Translator: Serhii Horichenko <m@sgg.im>\n"
+"Language-Team: Russian <https://translate.edugit.org/projects/aleksis/"
+"aleksis-core-js/ru/>\n"
+"Language: ru\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%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
 "%100>=11 && n%100<=14)? 2 : 3);\n"
+"X-Generator: Weblate 4.12.1\n"
+
 #: aleksis/core/static/js/main.js:66
 msgid "Today"
-msgstr ""
+msgstr "Сегодня"
 
 #: aleksis/core/static/js/main.js:67
 msgid "Cancel"
-msgstr ""
+msgstr "Отменить"
 
 #: aleksis/core/static/js/main.js:68
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 #: aleksis/core/static/js/main.js:195
 msgid "This page may contain outdated information since there is no internet connection."
 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 319c980c3d781e1c6bfb89b8dbd54945d8abc736..2334b98a3d6953ce835a80369615359e8ac25d5e 100644
--- a/aleksis/core/locale/uk/LC_MESSAGES/django.po
+++ b/aleksis/core/locale/uk/LC_MESSAGES/django.po
@@ -3,89 +3,90 @@
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-04-23 12:58+0000\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
+"POT-Creation-Date: 2022-05-24 19:37+0200\n"
+"PO-Revision-Date: 2022-06-01 17:35+0000\n"
+"Last-Translator: Serhii Horichenko <m@sgg.im>\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
 msgid "OpenID Connect scope"
-msgstr ""
+msgstr "Межа дії OpenID Connect"
 
 #: aleksis/core/apps.py:167
 msgid "Given name, family name, link to profile and picture if existing."
-msgstr ""
+msgstr "Ім'я, прізвище, посилання на профіль та фото, якщо є в наявності."
 
 #: aleksis/core/apps.py:168
 msgid "Full home postal address"
-msgstr ""
+msgstr "Повна домашня поштова адреса"
 
 #: aleksis/core/apps.py:169
 msgid "Email address"
-msgstr ""
+msgstr "Ел.адреса"
 
 #: aleksis/core/apps.py:170
 msgid "Home and mobile phone"
-msgstr ""
+msgstr "Домашній та мобільний телефон"
 
 #: 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"
-msgstr ""
+msgstr "Групи"
 
 #: aleksis/core/data_checks.py:56
 msgid "Ignore problem"
-msgstr ""
+msgstr "Ігнорувати проблему"
 
 #: aleksis/core/data_checks.py:185
 #, python-brace-format
 msgid "Solve option '{solve_option_obj.verbose_name}' "
-msgstr ""
+msgstr "Варіант розв'язання '{solve_option_obj.verbose_name}' "
 
 #: aleksis/core/data_checks.py:291
 msgid "Deactivate DashboardWidget"
-msgstr ""
+msgstr "Вимкнути віджет інформпанелі"
 
 #: aleksis/core/data_checks.py:303
 msgid "Ensure that there are no broken DashboardWidgets."
-msgstr ""
+msgstr "Переконайтеся у відсутності збійних віджетів на інформпанелі."
 
 #: aleksis/core/data_checks.py:304
 msgid "The DashboardWidget was reported broken automatically."
-msgstr ""
+msgstr "Віджет інформпанелі повідомив про збій в автоматичному режимі."
 
 #: aleksis/core/feeds.py:52
 msgid "Birthday Calendar"
-msgstr ""
+msgstr "Календар Днів Народження"
 
 #: aleksis/core/feeds.py:53
 msgid "A Calendar of Birthdays"
-msgstr ""
+msgstr "Календар Днів Народження"
 
 #: aleksis/core/feeds.py:66
 #, python-format
 msgid "%(name)s's birthday"
-msgstr ""
+msgstr "%(name)s має День Народження"
 
 #: aleksis/core/feeds.py:71
 #, python-format
 msgid "%(name)s was born on %(birthday)s"
-msgstr ""
+msgstr "%(name)s народився(-лася) %(birthday)s"
 
 #: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:139
 #: aleksis/core/templates/core/base.html:140
@@ -94,337 +95,337 @@ msgstr ""
 #: aleksis/core/templates/search/search.html:7
 #: aleksis/core/templates/search/search.html:22
 msgid "Search"
-msgstr ""
+msgstr "Пошук"
 
 #: aleksis/core/filters.py:59
 msgid "Search by name"
-msgstr ""
+msgstr "Пошук за ім'ям"
 
 #: aleksis/core/filters.py:71
 msgid "Search by contact details"
-msgstr ""
+msgstr "Пошук за контактними даними"
 
 #: aleksis/core/filters.py:92
 msgid "Permission"
-msgstr ""
+msgstr "Дозвіл"
 
 #: aleksis/core/filters.py:100
 msgid "Content type"
-msgstr ""
+msgstr "Тип змісту"
 
 #: aleksis/core/filters.py:113 aleksis/core/models.py:715
 msgid "User"
-msgstr ""
+msgstr "Користувач"
 
 #: aleksis/core/filters.py:135 aleksis/core/models.py:488
 msgid "Group"
-msgstr ""
+msgstr "Група"
 
 #: aleksis/core/forms.py:50 aleksis/core/forms.py:581
 msgid "Base data"
-msgstr ""
+msgstr "Основні дані"
 
 #: aleksis/core/forms.py:55
 msgid "Address"
-msgstr ""
+msgstr "Адреса"
 
 #: aleksis/core/forms.py:56 aleksis/core/forms.py:590
 msgid "Contact data"
-msgstr ""
+msgstr "Контактні дані"
 
 #: aleksis/core/forms.py:58
 msgid "Advanced personal data"
-msgstr ""
+msgstr "Додаткові особисті дані"
 
 #: aleksis/core/forms.py:106
 msgid "New user"
-msgstr ""
+msgstr "Новий користувач"
 
 #: aleksis/core/forms.py:106
 msgid "Create a new account"
-msgstr ""
+msgstr "Створити новий обліковий запис"
 
 #: aleksis/core/forms.py:132
 msgid "You cannot set a new username when also selecting an existing user."
-msgstr ""
+msgstr "Обравши вже існуючого користувача неможливо створити новий логін."
 
 #: aleksis/core/forms.py:136
 msgid "This username is already in use."
-msgstr ""
+msgstr "Такий логін вже зайнятий."
 
 #: aleksis/core/forms.py:153 aleksis/core/models.py:136
 msgid "School term"
-msgstr ""
+msgstr "Навчальний рік"
 
 #: aleksis/core/forms.py:154
 msgid "Common data"
-msgstr ""
+msgstr "Загальні дані"
 
 #: aleksis/core/forms.py:155 aleksis/core/forms.py:207
 #: 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"
-msgstr ""
+msgstr "Особи"
 
 #: aleksis/core/forms.py:156 aleksis/core/forms.py:592
 msgid "Additional data"
-msgstr ""
+msgstr "Додаткові дані"
 
 #: aleksis/core/forms.py:157 aleksis/core/models.py:212
 #: aleksis/core/models.py:541
 msgid "Photo"
-msgstr ""
+msgstr "Фото"
 
 #: aleksis/core/forms.py:199 aleksis/core/forms.py:202
 #: aleksis/core/models.py:79
 msgid "Date"
-msgstr ""
+msgstr "Дата"
 
 #: aleksis/core/forms.py:200 aleksis/core/forms.py:203
 #: aleksis/core/models.py:87
 msgid "Time"
-msgstr ""
+msgstr "Час"
 
 #: aleksis/core/forms.py:233
 msgid "From when until when should the announcement be displayed?"
-msgstr ""
+msgstr "З якого по який час повинно відображатися це оголошення?"
 
 #: aleksis/core/forms.py:236
 msgid "Who should see the announcement?"
-msgstr ""
+msgstr "Хто повинен бачити це оголошення?"
 
 #: aleksis/core/forms.py:237
 msgid "Write your announcement:"
-msgstr ""
+msgstr "Складіть своє оголошеня:"
 
 #: aleksis/core/forms.py:276
 msgid "You are not allowed to create announcements which are only valid in the past."
-msgstr ""
+msgstr "Оголошення для минулого Вам створювати не дозволено."
 
 #: aleksis/core/forms.py:280
 msgid "The from date and time must be earlier then the until date and time."
-msgstr ""
+msgstr "Дата і час початку повинні бути раніше за дату і час закінчення."
 
 #: aleksis/core/forms.py:289
 msgid "You need at least one recipient."
-msgstr ""
+msgstr "Вам потрібен принаймні один отримувач."
 
 #: aleksis/core/forms.py:398
 msgid "Invitation code"
-msgstr ""
+msgstr "Код запрошення"
 
 #: aleksis/core/forms.py:399
 msgid "Please enter your invitation code."
-msgstr ""
+msgstr "Напишіть, будь ласка, свій код запрошення."
 
 #: aleksis/core/forms.py:418 aleksis/core/models.py:187
 msgid "First name"
-msgstr ""
+msgstr "Ім'я"
 
 #: aleksis/core/forms.py:419 aleksis/core/models.py:188
 msgid "Last name"
-msgstr ""
+msgstr "Прізвище"
 
 #: aleksis/core/forms.py:428
 msgid "A person is using this e-mail address"
-msgstr ""
+msgstr "Особа користується цією ел.адресою"
 
 #: aleksis/core/forms.py:456
 msgid "Who should get the permission?"
-msgstr ""
+msgstr "Хто повинен отримати такий дозвіл?"
 
 #: aleksis/core/forms.py:457
 msgid "On what?"
-msgstr ""
+msgstr "В разі чого?"
 
 #: aleksis/core/forms.py:483
 msgid "Select objects which the permission should be granted for:"
-msgstr ""
+msgstr "Оберіть об'єкти, до яких буде наданий дозвіл:"
 
 #: aleksis/core/forms.py:486
 msgid "Grant the permission for all objects"
-msgstr ""
+msgstr "Надати дозвіл до всіх об'єктів"
 
 #: aleksis/core/forms.py:494
 msgid "You must select at least one group or person which should get the permission."
-msgstr ""
+msgstr "Ви повинні обрати принаймні одну групу або особу, хто буде мати дозвіл."
 
 #: aleksis/core/forms.py:499
 msgid "You must grant the permission to all objects and/or to some objects."
-msgstr ""
+msgstr "Ви повинні надати дозвіл до всіх об'єктів або до деяких."
 
 #: aleksis/core/forms.py:586
-msgid "Adress data"
-msgstr ""
+msgid "Address data"
+msgstr "Дані адреси"
 
 #: aleksis/core/forms.py:598
 msgid "Account data"
-msgstr ""
+msgstr "Дані облікового запису"
 
 #: aleksis/core/forms.py:605
 msgid "Password"
-msgstr ""
+msgstr "Пароль"
 
 #: aleksis/core/forms.py:608
 msgid "Password (again)"
-msgstr ""
+msgstr "Пароль (ще раз)"
 
 #: aleksis/core/forms.py:728
 msgid "The selected action does not exist."
-msgstr ""
+msgstr "Обрана дія не існує."
 
 #: aleksis/core/forms.py:739
 msgid "You do not have permission to run {} on all selected objects."
-msgstr ""
+msgstr "У Вас відсутній дозвіл на запуск {} на усіх обраних об'єктах."
 
 #: aleksis/core/forms.py:795
 msgid "No valid selection."
-msgstr ""
+msgstr "Неправильний вибір."
 
 #: aleksis/core/health_checks.py:21
 msgid "There are unresolved data problems."
-msgstr ""
+msgstr "Існують нерозв'язані проблеми з даними."
 
 #: aleksis/core/health_checks.py:40
 msgid "Error accessing backup storage: {}"
-msgstr ""
+msgstr "Помилка доступу до резервного сховища: {}"
 
 #: aleksis/core/health_checks.py:50
 msgid "Last backup {}!"
-msgstr ""
+msgstr "Остання резервна копія {}!"
 
 #: aleksis/core/health_checks.py:52
 msgid "No backup found!"
-msgstr ""
+msgstr "Резервна копія не знайдена!"
 
 #: aleksis/core/health_checks.py:79
 msgid "No backup result found!"
-msgstr ""
+msgstr "Результат резервного копіювання не знайдений!"
 
 #: 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 ""
+msgstr "Увійти"
 
 #: aleksis/core/menus.py:13 aleksis/core/templates/account/signup.html:22
 #: aleksis/core/templates/socialaccount/signup.html:23
 msgid "Sign up"
-msgstr ""
+msgstr "Зареєструватися"
 
 #: aleksis/core/menus.py:22 aleksis/core/templates/invitations/enter.html:7
 msgid "Accept invitation"
-msgstr ""
+msgstr "Прийняти запрошення"
 
 #: aleksis/core/menus.py:31
 msgid "Dashboard"
-msgstr ""
+msgstr "Інформпанель"
 
 #: aleksis/core/menus.py:39
 msgid "Admin"
-msgstr ""
+msgstr "Адмін"
 
 #: 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 ""
+msgstr "Оголошення"
 
 #: 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 ""
+msgstr "Навчальний рік"
 
 #: 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 ""
+msgstr "Віджети інформпанелі"
 
 #: 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 ""
+msgstr "Керування даними"
 
 #: 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 ""
+msgstr "Стан системи"
 
 #: aleksis/core/menus.py:102
 msgid "Configuration"
-msgstr ""
+msgstr "Конфігурація"
 
 #: 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 ""
+msgstr "Первірки даних"
 
 #: 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 ""
+msgstr "Керування дозволами"
 
 #: aleksis/core/menus.py:130
 msgid "Backend Admin"
-msgstr ""
+msgstr "Адміністрування бекенду"
 
 #: 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 ""
+msgstr "Додатки OAuth2"
 
 #: aleksis/core/menus.py:151
 msgid "People"
-msgstr ""
+msgstr "Люди"
 
 #: 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 ""
+msgstr "Типи груп"
 
 #: aleksis/core/menus.py:193
 msgid "Groups and child groups"
-msgstr ""
+msgstr "Групи та підлеглі групи"
 
 #: 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 ""
+msgstr "Додаткові поля"
 
 #: aleksis/core/menus.py:215
 msgid "Invite person"
-msgstr ""
+msgstr "Запросити особу"
 
 #: 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 ""
+msgstr "Призначити підлеглі групи до груп"
 
 #: aleksis/core/menus.py:240
 msgid "Stop impersonation"
-msgstr ""
+msgstr "Зупинити маскування"
 
 #: aleksis/core/menus.py:249
 msgid "Account"
-msgstr ""
+msgstr "Обліковий запис"
 
 #: aleksis/core/menus.py:258
 #: aleksis/core/templates/dynamic_preferences/form.html:5
 msgid "Preferences"
-msgstr ""
+msgstr "Властивості"
 
 #: aleksis/core/menus.py:267
 msgid "2FA"
-msgstr ""
+msgstr "2FA"
 
 #: aleksis/core/menus.py:275
 #: aleksis/core/templates/account/password_change.html:5
@@ -436,819 +437,819 @@ msgstr ""
 #: aleksis/core/templates/account/password_reset_from_key_done.html:5
 #: aleksis/core/templates/account/password_reset_from_key_done.html:6
 msgid "Change password"
-msgstr ""
+msgstr "Змінити пароль"
 
 #: aleksis/core/menus.py:287
 msgid "Third-party accounts"
-msgstr ""
+msgstr "Обліковки третіх сторін"
 
 #: 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 ""
+msgstr "Авторизовані додатки"
 
 #: aleksis/core/menus.py:305
 msgid "Calendar Feeds"
-msgstr ""
+msgstr "Канали календарів"
 
 #: aleksis/core/menus.py:318
 msgid "Logout"
-msgstr ""
+msgstr "Вийти"
 
 #: aleksis/core/mixins.py:511
 msgid "Linked school term"
-msgstr ""
+msgstr "Пов'язаний навчальний рік"
 
 #: aleksis/core/models.py:77
 msgid "Boolean (Yes/No)"
-msgstr ""
+msgstr "Логічне (Так/Ні)"
 
 #: aleksis/core/models.py:78
 msgid "Text (one line)"
-msgstr ""
+msgstr "Текст (один рядок)"
 
 #: aleksis/core/models.py:80
 msgid "Date and time"
-msgstr ""
+msgstr "Дата і час"
 
 #: aleksis/core/models.py:81
 msgid "Decimal number"
-msgstr ""
+msgstr "Десятичне число"
 
 #: aleksis/core/models.py:82 aleksis/core/models.py:205
 msgid "E-mail address"
-msgstr ""
+msgstr "Адреса ел.пошти"
 
 #: aleksis/core/models.py:83
 msgid "Integer"
-msgstr ""
+msgstr "Ціле"
 
 #: aleksis/core/models.py:84
 msgid "IP address"
-msgstr ""
+msgstr "IP адреса"
 
 #: aleksis/core/models.py:85
 msgid "Boolean or empty (Yes/No/Neither)"
-msgstr ""
+msgstr "Логічне або порожнє (Так/Ні/Нічого)"
 
 #: aleksis/core/models.py:86
 msgid "Text (multi-line)"
-msgstr ""
+msgstr "Текст (багаторядковий)"
 
 #: aleksis/core/models.py:88
 msgid "URL / Link"
-msgstr ""
+msgstr "URL / Посилання"
 
 #: aleksis/core/models.py:100 aleksis/core/models.py:1070
 #: aleksis/core/models.py:1374
 msgid "Name"
-msgstr ""
+msgstr "Повне ім'я"
 
 #: aleksis/core/models.py:102
 msgid "Start date"
-msgstr ""
+msgstr "Дата початку"
 
 #: aleksis/core/models.py:103
 msgid "End date"
-msgstr ""
+msgstr "Дата закінчення"
 
 #: aleksis/core/models.py:122
 msgid "The start date must be earlier than the end date."
-msgstr ""
+msgstr "Початкова дата повинна бути раніше кінцевої."
 
 #: aleksis/core/models.py:129
 msgid "There is already a school term for this time or a part of this time."
-msgstr ""
+msgstr "На цей час або на частину цього часу вже припадає навчальний рік."
 
 #: aleksis/core/models.py:158 aleksis/core/models.py:1019
 #: aleksis/core/models.py:1371
 msgid "Person"
-msgstr ""
+msgstr "Особа"
 
 #: aleksis/core/models.py:161
 msgid "Can view address"
-msgstr ""
+msgstr "Може бачити адресу"
 
 #: aleksis/core/models.py:162
 msgid "Can view contact details"
-msgstr ""
+msgstr "Може бачити контактні дані"
 
 #: aleksis/core/models.py:163
 msgid "Can view photo"
-msgstr ""
+msgstr "Може бачити фото"
 
 #: aleksis/core/models.py:164
 msgid "Can view avatar image"
-msgstr ""
+msgstr "Може бачити аватар"
 
 #: aleksis/core/models.py:165
 msgid "Can view persons groups"
-msgstr ""
+msgstr "Може бачити групи особи"
 
 #: aleksis/core/models.py:166
 msgid "Can view personal details"
-msgstr ""
+msgstr "Може бачити особисті дані"
 
 #: aleksis/core/models.py:176
 msgid "female"
-msgstr ""
+msgstr "жін"
 
 #: aleksis/core/models.py:176
 msgid "male"
-msgstr ""
+msgstr "чол"
 
 #: aleksis/core/models.py:184 aleksis/core/models.py:1273
 msgid "Linked user"
-msgstr ""
+msgstr "Пов'язаний користувач"
 
 #: aleksis/core/models.py:190
 msgid "Additional name(s)"
-msgstr ""
+msgstr "Додаткові імена"
 
 #: aleksis/core/models.py:194 aleksis/core/models.py:506
 msgid "Short name"
-msgstr ""
+msgstr "Коротке ім'я"
 
 #: aleksis/core/models.py:197
 msgid "Street"
-msgstr ""
+msgstr "Вулиця"
 
 #: aleksis/core/models.py:198
 msgid "Street number"
-msgstr ""
+msgstr "Номер будинку"
 
 #: aleksis/core/models.py:199
 msgid "Postal code"
-msgstr ""
+msgstr "Поштовий індекс"
 
 #: aleksis/core/models.py:200
 msgid "Place"
-msgstr ""
+msgstr "Місто"
 
 #: aleksis/core/models.py:202 aleksis/core/templates/core/person/full.html:160
 msgid "Home phone"
-msgstr ""
+msgstr "Домашній телефон"
 
 #: aleksis/core/models.py:203 aleksis/core/templates/core/person/full.html:170
 msgid "Mobile phone"
-msgstr ""
+msgstr "Мобільний телефон"
 
 #: aleksis/core/models.py:207
 msgid "Date of birth"
-msgstr ""
+msgstr "Дата народження"
 
 #: aleksis/core/models.py:208
 msgid "Place of birth"
-msgstr ""
+msgstr "Місце народження"
 
 #: aleksis/core/models.py:209
 msgid "Sex"
-msgstr ""
+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"
-msgstr ""
+msgstr "Відобразити фото/аватар"
 
 #: aleksis/core/models.py:224 aleksis/core/models.py:552
 msgid "This is a picture or an avatar for public display."
-msgstr ""
+msgstr "Це фото або аватар для загального відображення."
 
 #: aleksis/core/models.py:229 aleksis/core/templates/core/person/full.html:235
 msgid "Guardians / Parents"
-msgstr ""
+msgstr "Опікуни / батьки"
 
 #: aleksis/core/models.py:236
 msgid "Primary group"
-msgstr ""
+msgstr "Основна група"
 
 #: 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 ""
+msgstr "Опис"
 
 #: aleksis/core/models.py:459
 msgid "Title of field"
-msgstr ""
+msgstr "Назва поля"
 
 #: aleksis/core/models.py:461
 msgid "Type of field"
-msgstr ""
+msgstr "Тип поля"
 
 #: aleksis/core/models.py:463
 msgid "Required"
-msgstr ""
+msgstr "Необхідне"
 
 #: aleksis/core/models.py:464
 msgid "Help text / description"
-msgstr ""
+msgstr "Допоміжний текст/опис"
 
 #: aleksis/core/models.py:470
 msgid "Addtitional field for groups"
-msgstr ""
+msgstr "Додаткове поле для груп"
 
 #: aleksis/core/models.py:471
 msgid "Addtitional fields for groups"
-msgstr ""
+msgstr "Додаткові поля для груп"
 
 #: aleksis/core/models.py:491
 msgid "Can assign child groups to groups"
-msgstr ""
+msgstr "Може призначати підлеглі групи до груп"
 
 #: aleksis/core/models.py:492
 msgid "Can view statistics about group."
-msgstr ""
+msgstr "Може бачити статистику групи."
 
 #: aleksis/core/models.py:504
 msgid "Long name"
-msgstr ""
+msgstr "Довге ім'я"
 
 #: aleksis/core/models.py:514 aleksis/core/templates/core/group/full.html:85
 msgid "Members"
-msgstr ""
+msgstr "Учасники"
 
 #: aleksis/core/models.py:517 aleksis/core/templates/core/group/full.html:82
 msgid "Owners"
-msgstr ""
+msgstr "Власники"
 
 #: aleksis/core/models.py:524 aleksis/core/templates/core/group/full.html:55
 msgid "Parent groups"
-msgstr ""
+msgstr "Батьківські групи"
 
 #: aleksis/core/models.py:532
 msgid "Type of group"
-msgstr ""
+msgstr "Тип групи"
 
 #: 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 ""
+msgstr "Назва"
 
 #: aleksis/core/models.py:721
 msgid "Application"
-msgstr ""
+msgstr "Додаток"
 
 #: aleksis/core/models.py:727
 msgid "Activity"
-msgstr ""
+msgstr "Активність"
 
 #: aleksis/core/models.py:728
 msgid "Activities"
-msgstr ""
+msgstr "Активності"
 
 #: aleksis/core/models.py:734
 msgid "Sender"
-msgstr ""
+msgstr "Відправник"
 
 #: aleksis/core/models.py:739
 msgid "Recipient"
-msgstr ""
+msgstr "Отримувач"
 
 #: aleksis/core/models.py:744 aleksis/core/models.py:1071
 msgid "Link"
-msgstr ""
+msgstr "Посилання"
 
 #: aleksis/core/models.py:746
 msgid "Send notification at"
-msgstr ""
+msgstr "Надіслати сповіщення о"
 
 #: aleksis/core/models.py:748
 msgid "Read"
-msgstr ""
+msgstr "Читати"
 
 #: aleksis/core/models.py:749
 msgid "Sent"
-msgstr ""
+msgstr "Надіслано"
 
 #: aleksis/core/models.py:766
 msgid "Notification"
-msgstr ""
+msgstr "Сповіщення"
 
 #: 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 ""
+msgstr "Сповіщення"
 
 #: aleksis/core/models.py:835
 msgid "Link to detailed view"
-msgstr ""
+msgstr "Посилання на детальний перегляд"
 
 #: aleksis/core/models.py:838
 msgid "Date and time from when to show"
-msgstr ""
+msgstr "Дата і час, з якого показувати"
 
 #: aleksis/core/models.py:841
 msgid "Date and time until when to show"
-msgstr ""
+msgstr "Дата і час, до якого показувати"
 
 #: aleksis/core/models.py:866
 msgid "Announcement"
-msgstr ""
+msgstr "Оголошення"
 
 #: aleksis/core/models.py:904
 msgid "Announcement recipient"
-msgstr ""
+msgstr "Отримувач оголошення"
 
 #: aleksis/core/models.py:905
 msgid "Announcement recipients"
-msgstr ""
+msgstr "Отримувачі оголошення"
 
 #: aleksis/core/models.py:927
 msgid "Widget Title"
-msgstr ""
+msgstr "Назва віджета"
 
 #: aleksis/core/models.py:928
 msgid "Activate Widget"
-msgstr ""
+msgstr "Активувати віджет"
 
 #: aleksis/core/models.py:929
 msgid "Widget is broken"
-msgstr ""
+msgstr "Віджет зламався"
 
 #: aleksis/core/models.py:932
 msgid "Size on mobile devices"
-msgstr ""
+msgstr "Розмір на мобільних"
 
 #: aleksis/core/models.py:933
 msgid "<= 600 px, 12 columns"
-msgstr ""
+msgstr "<= 600 пікс, 12 стовпчиків"
 
 #: aleksis/core/models.py:938
 msgid "Size on tablet devices"
-msgstr ""
+msgstr "Розмір на планшетах"
 
 #: aleksis/core/models.py:939
 msgid "> 600 px, 12 columns"
-msgstr ""
+msgstr "> 600 пікс, 12 стовпчиків"
 
 #: aleksis/core/models.py:944
 msgid "Size on desktop devices"
-msgstr ""
+msgstr "Розмір на ПК"
 
 #: aleksis/core/models.py:945
 msgid "> 992 px, 12 columns"
-msgstr ""
+msgstr "> 992 пікс, 12 стовпчиків"
 
 #: aleksis/core/models.py:950
 msgid "Size on large desktop devices"
-msgstr ""
+msgstr "Розмір на великих екранах"
 
 #: aleksis/core/models.py:951
 msgid "> 1200 px>, 12 columns"
-msgstr ""
+msgstr "> 1200 пікс, 12 стовпчиків"
 
 #: aleksis/core/models.py:982
 msgid "Can edit default dashboard"
-msgstr ""
+msgstr "Може редагувати типову/стандартну інформпанель"
 
 #: aleksis/core/models.py:983
 msgid "Dashboard Widget"
-msgstr ""
+msgstr "Віджет інформпанелі"
 
 #: aleksis/core/models.py:984
 msgid "Dashboard Widgets"
-msgstr ""
+msgstr "Віджети інформпанелі"
 
 #: aleksis/core/models.py:990
 msgid "URL"
-msgstr ""
+msgstr "URL"
 
 #: aleksis/core/models.py:991
 msgid "Icon URL"
-msgstr ""
+msgstr "Іконка URL"
 
 #: aleksis/core/models.py:997
 msgid "External link widget"
-msgstr ""
+msgstr "Зовнішнє посилання на віджет"
 
 #: aleksis/core/models.py:998
 msgid "External link widgets"
-msgstr ""
+msgstr "Зовнішні посилання на віджети"
 
 #: aleksis/core/models.py:1004
 msgid "Content"
-msgstr ""
+msgstr "Зміст"
 
 #: aleksis/core/models.py:1010
 msgid "Static content widget"
-msgstr ""
+msgstr "Віджет з постійним змістом"
 
 #: aleksis/core/models.py:1011
 msgid "Static content widgets"
-msgstr ""
+msgstr "Віджети з постійним змістом"
 
 #: aleksis/core/models.py:1016
 msgid "Dashboard widget"
-msgstr ""
+msgstr "Віджет інформпанелі"
 
 #: aleksis/core/models.py:1021
 msgid "Order"
-msgstr ""
+msgstr "Порядок"
 
 #: aleksis/core/models.py:1022
 msgid "Part of the default dashboard"
-msgstr ""
+msgstr "Частина типової інформпанелі"
 
 #: aleksis/core/models.py:1037
 msgid "Dashboard widget order"
-msgstr ""
+msgstr "Порядок віджету на інформпанелі"
 
 #: aleksis/core/models.py:1038
 msgid "Dashboard widget orders"
-msgstr ""
+msgstr "Порядок віджетів на інформпанелі"
 
 #: aleksis/core/models.py:1044
 msgid "Menu ID"
-msgstr ""
+msgstr "Меню ID"
 
 #: aleksis/core/models.py:1057
 msgid "Custom menu"
-msgstr ""
+msgstr "Користувацьке меню"
 
 #: aleksis/core/models.py:1058
 msgid "Custom menus"
-msgstr ""
+msgstr "Користувацькі меню"
 
 #: aleksis/core/models.py:1068
 msgid "Menu"
-msgstr ""
+msgstr "Меню"
 
 #: aleksis/core/models.py:1072 aleksis/core/models.py:1320
 #: aleksis/core/templates/oauth2_provider/application/detail.html:26
 msgid "Icon"
-msgstr ""
+msgstr "Іконка"
 
 #: aleksis/core/models.py:1078
 msgid "Custom menu item"
-msgstr ""
+msgstr "Пункт користувацького меню"
 
 #: aleksis/core/models.py:1079
 msgid "Custom menu items"
-msgstr ""
+msgstr "Пункти користувацького меню"
 
 #: aleksis/core/models.py:1093
 msgid "Title of type"
-msgstr ""
+msgstr "Назва типу"
 
 #: aleksis/core/models.py:1100 aleksis/core/templates/core/group/full.html:47
 msgid "Group type"
-msgstr ""
+msgstr "Тип групи"
 
 #: aleksis/core/models.py:1114
 msgid "Can view system status"
-msgstr ""
+msgstr "Може переглядати стан системи"
 
 #: aleksis/core/models.py:1115
 msgid "Can manage data"
-msgstr ""
+msgstr "Може керувати даними"
 
 #: aleksis/core/models.py:1116
 msgid "Can impersonate"
-msgstr ""
+msgstr "Може маскуватися"
 
 #: aleksis/core/models.py:1117
 msgid "Can use search"
-msgstr ""
+msgstr "Може шукати"
 
 #: aleksis/core/models.py:1118
 msgid "Can change site preferences"
-msgstr ""
+msgstr "Може змінювати властивості сайту"
 
 #: aleksis/core/models.py:1119
 msgid "Can change person preferences"
-msgstr ""
+msgstr "Може змінювати властивості особи"
 
 #: aleksis/core/models.py:1120
 msgid "Can change group preferences"
-msgstr ""
+msgstr "Може змінювати властивості групи"
 
 #: aleksis/core/models.py:1121
 msgid "Can test PDF generation"
-msgstr ""
+msgstr "Може генерувати тестові PDF"
 
 #: aleksis/core/models.py:1122
 msgid "Can invite persons"
-msgstr ""
+msgstr "Може запрошувати осіб"
 
 #: aleksis/core/models.py:1158
 msgid "Related data check task"
-msgstr ""
+msgstr "Завдання перевірки пов'язаних даних"
 
 #: aleksis/core/models.py:1166
 msgid "Issue solved"
-msgstr ""
+msgstr "Проблема вирішена"
 
 #: aleksis/core/models.py:1167
 msgid "Notification sent"
-msgstr ""
+msgstr "Сповіщення надіслане"
 
 #: aleksis/core/models.py:1180
 msgid "Data check result"
-msgstr ""
+msgstr "Результат перевірки даних"
 
 #: aleksis/core/models.py:1181
 msgid "Data check results"
-msgstr ""
+msgstr "Результати перевірки даних"
 
 #: aleksis/core/models.py:1183
 msgid "Can run data checks"
-msgstr ""
+msgstr "Може запускати перевірки даних"
 
 #: aleksis/core/models.py:1184
 msgid "Can solve data check problems"
-msgstr ""
+msgstr "Може розв'язувати проблеми перевірки даних"
 
 #: aleksis/core/models.py:1191
 msgid "E-Mail address"
-msgstr ""
+msgstr "Адреса ел.пошти"
 
 #: aleksis/core/models.py:1223
 msgid "Owner"
-msgstr ""
+msgstr "Власник"
 
 #: aleksis/core/models.py:1227
 msgid "File expires at"
-msgstr ""
+msgstr "Файл дійсний до"
 
 #: aleksis/core/models.py:1229
 msgid "Generated HTML file"
-msgstr ""
+msgstr "Згенерований файл HTML"
 
 #: aleksis/core/models.py:1231
 msgid "Generated PDF file"
-msgstr ""
+msgstr "Згенерований файл PDF"
 
 #: aleksis/core/models.py:1238
 msgid "PDF file"
-msgstr ""
+msgstr "Файл PDF"
 
 #: aleksis/core/models.py:1239
 msgid "PDF files"
-msgstr ""
+msgstr "Файли PDF"
 
 #: aleksis/core/models.py:1244
 msgid "Task result"
-msgstr ""
+msgstr "Результат завдання"
 
 #: aleksis/core/models.py:1247
 msgid "Task user"
-msgstr ""
+msgstr "Користувач завдання"
 
 #: aleksis/core/models.py:1259
 msgid "Task user assignment"
-msgstr ""
+msgstr "Призначення користувача завдання"
 
 #: aleksis/core/models.py:1260
 msgid "Task user assignments"
-msgstr ""
+msgstr "Призначення користувачів завдання"
 
 #: aleksis/core/models.py:1276
 msgid "Additional attributes"
-msgstr ""
+msgstr "Додаткові атрибути"
 
 #: aleksis/core/models.py:1314
 msgid "Allowed scopes that clients can request"
-msgstr ""
+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"
-msgstr ""
+msgstr "UUID"
 
 #: aleksis/core/models.py:1377
 msgid "Selected ICal feed"
-msgstr ""
+msgstr "Стрічка обраного ICal"
 
 #: aleksis/core/models.py:1386
 msgid "Personal Calendar URL"
-msgstr ""
+msgstr "URL-посилання особистого календаря"
 
 #: aleksis/core/models.py:1387
 msgid "Personal Calendar URLs"
-msgstr ""
+msgstr "URL-посилання особистих календарів"
 
 #: aleksis/core/preferences.py:25
 msgid "General"
-msgstr ""
+msgstr "Загальне"
 
 #: aleksis/core/preferences.py:26
 msgid "School"
-msgstr ""
+msgstr "Школа / навч.заклад"
 
 #: aleksis/core/preferences.py:27
 msgid "Theme"
-msgstr ""
+msgstr "Тема"
 
 #: aleksis/core/preferences.py:28
 msgid "Mail"
-msgstr ""
+msgstr "Пошта"
 
 #: aleksis/core/preferences.py:30
 msgid "Footer"
-msgstr ""
+msgstr "Нижній колонтитул (footer)"
 
 #: aleksis/core/preferences.py:31
 msgid "Accounts"
-msgstr ""
+msgstr "Облікові записи"
 
 #: aleksis/core/preferences.py:32
 msgid "Authentication"
-msgstr ""
+msgstr "Авторизація"
 
 #: aleksis/core/preferences.py:33
 msgid "Internationalisation"
-msgstr ""
+msgstr "Інтернаціоналізація"
 
 #: aleksis/core/preferences.py:43
 msgid "Site title"
-msgstr ""
+msgstr "Назва сайту"
 
 #: aleksis/core/preferences.py:55
 msgid "Site description"
-msgstr ""
+msgstr "Опис сайту"
 
 #: aleksis/core/preferences.py:65
 msgid "Primary colour"
-msgstr ""
+msgstr "Основний колір"
 
 #: aleksis/core/preferences.py:77
 msgid "Secondary colour"
-msgstr ""
+msgstr "Додатковий колір"
 
 #: aleksis/core/preferences.py:89
 msgid "Logo"
-msgstr ""
+msgstr "Логотип"
 
 #: aleksis/core/preferences.py:100
 msgid "Favicon"
-msgstr ""
+msgstr "Favicon"
 
 #: aleksis/core/preferences.py:111
 msgid "PWA-Icon"
-msgstr ""
+msgstr "Іконка PWA"
 
 #: aleksis/core/preferences.py:121
 msgid "PWA-Icon is maskable"
-msgstr ""
+msgstr "Іконка PWA може бути з маскою"
 
 #: aleksis/core/preferences.py:133
 msgid "Mail out name"
-msgstr ""
+msgstr "Ім'я відправника"
 
 #: aleksis/core/preferences.py:144
 msgid "Mail out address"
-msgstr ""
+msgstr "Адреса відправника"
 
 #: aleksis/core/preferences.py:157
 msgid "Link to privacy policy"
-msgstr ""
+msgstr "Посилання на політику приватності"
 
 #: aleksis/core/preferences.py:169
 msgid "Link to imprint"
-msgstr ""
+msgstr "Посилання на відбиток"
 
 #: aleksis/core/preferences.py:180
 msgid "Name format for addressing"
-msgstr ""
+msgstr "Формат імені у листуванні"
 
 #: aleksis/core/preferences.py:197
 msgid "Channels to use for notifications"
-msgstr ""
+msgstr "Канали для сповіщень"
 
 #: aleksis/core/preferences.py:209
 msgid "Regular expression to match primary group, e.g. '^Class .*'"
-msgstr ""
+msgstr "Регулярний вираз для пошуку основної групи, напр. '^Class .*'"
 
 #: aleksis/core/preferences.py:220
 msgid "Field on person to match primary group against"
-msgstr ""
+msgstr "Поле щодо особи для співставлення з основною групою"
 
 #: aleksis/core/preferences.py:232
 msgid "Automatically create new persons for new users"
-msgstr ""
+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"
-msgstr ""
+msgstr "Назва школи / навч.закладу для відображення"
 
 #: aleksis/core/preferences.py:263
 msgid "Official name of the school, e.g. as given by supervisory authority"
-msgstr ""
+msgstr "Офіційна назва школи / навч.закладу, напр. як у державному свідоцтві"
 
 #: aleksis/core/preferences.py:271
 msgid "Allow users to change their passwords"
-msgstr ""
+msgstr "Дозволити користувачам змінювати свої паролі"
 
 #: aleksis/core/preferences.py:279
 msgid "Allow users to reset their passwords"
-msgstr ""
+msgstr "Дозволити користувачам скидати свої паролі"
 
 #: aleksis/core/preferences.py:287
 msgid "Enable signup"
-msgstr ""
+msgstr "Увімкнути реєстрацію"
 
 #: aleksis/core/preferences.py:295
 msgid "Regular expression for allowed usernames"
-msgstr ""
+msgstr "Регулярний вираз для дозволених логінів"
 
 #: aleksis/core/preferences.py:303
 msgid "Enable invitations"
-msgstr ""
+msgstr "Увімкнути запрошення"
 
 #: aleksis/core/preferences.py:311
 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)"
-msgstr ""
+msgstr "Довжина запрошувального коду. (Типово 3: abcde-acbde-abcde)"
 
 #: aleksis/core/preferences.py:319
 msgid "Size of packets. (Default 5: abcde)"
-msgstr ""
+msgstr "Розмір пакетів. (Типово 5: abcde)"
 
 #: aleksis/core/preferences.py:330
 msgid "Allowed Grant Flows for OAuth applications"
-msgstr ""
+msgstr "Дозволені потоки грантів для додатків з OAuth"
 
 #: aleksis/core/preferences.py:344
 msgid "Available languages"
-msgstr ""
+msgstr "Доступні мови"
 
 #: aleksis/core/preferences.py:357
 msgid "Send emails if data checks detect problems"
-msgstr ""
+msgstr "В разі виявлення проблем під час перевірки даних надіслати ел.лист"
 
 #: aleksis/core/preferences.py:368
 msgid "Email recipients for data checks problem emails"
-msgstr ""
+msgstr "Ел.адреси отримувачів для листів з проблемами перевірки даних"
 
 #: aleksis/core/preferences.py:379
 msgid "Email recipient groups for data checks problem emails"
-msgstr ""
+msgstr "Ел.адреси груп для листів з проблемами перевірки даних"
 
 #: aleksis/core/preferences.py:388
 msgid "Show dashboard to users without login"
-msgstr ""
+msgstr "Відображати інформпанель анонімним користувачам"
 
 #: aleksis/core/preferences.py:397
 msgid "Allow users to edit their dashboard"
-msgstr ""
+msgstr "Дозволити користувачам редагувати свою інформпанель"
 
 #: aleksis/core/preferences.py:408
 msgid "Fields on person model which are editable by themselves."
-msgstr ""
+msgstr "Поля з описом особи, які можна редагувати самостійно."
 
 #: aleksis/core/preferences.py:423
 msgid "Editable fields on person model which should trigger a notification on change"
-msgstr ""
+msgstr "Змінювані поля з описом особи, які повинні сповіщати щодо редагування"
 
 #: aleksis/core/preferences.py:437
 msgid "Contact for notification if a person changes their data"
-msgstr ""
+msgstr "Контакт для сповіщень, якщо хтось змінює свої дані"
 
 #: aleksis/core/preferences.py:448
 msgid "Prefer personal photos over avatars"
-msgstr ""
+msgstr "Віддавати перевагу особистим фото замість аватарів"
 
 #: aleksis/core/preferences.py:458
 msgid "PDF file expiration duration"
-msgstr ""
+msgstr "Термін придатності файла PDF"
 
 #: aleksis/core/preferences.py:459
 msgid "in minutes"
-msgstr ""
+msgstr "у хвилинах"
 
 #: aleksis/core/preferences.py:469
 msgid "Automatically update the dashboard and its widgets"
-msgstr ""
+msgstr "Автоматично оновлювати інформпанель та її віджети"
 
 #: aleksis/core/preferences.py:479
 msgid "Automatically update the dashboard and its widgets sitewide"
-msgstr ""
+msgstr "Автоматично оновлювати інформпанель та її віджети (для всього сайту)"
 
 #: aleksis/core/preferences.py:489
 msgid "Country for phone number parsing"
-msgstr ""
+msgstr "Країна для аналізу номера телефона"
 
 #: aleksis/core/settings.py:540
 msgid "English"
-msgstr ""
+msgstr "Англійська"
 
 #: aleksis/core/settings.py:541
 msgid "German"
-msgstr ""
+msgstr "Німецька"
 
 #: aleksis/core/tables.py:24
 #: aleksis/core/templates/core/announcement/list.html:36
@@ -1257,13 +1258,13 @@ msgstr ""
 #: aleksis/core/templates/core/person/full.html:86
 #: aleksis/core/templates/oauth2_provider/application/detail.html:17
 msgid "Edit"
-msgstr ""
+msgstr "Редагувати"
 
 #: aleksis/core/tables.py:26 aleksis/core/tables.py:94
 #: aleksis/core/tables.py:138
 #: aleksis/core/templates/core/announcement/list.html:22
 msgid "Actions"
-msgstr ""
+msgstr "Дії"
 
 #: aleksis/core/tables.py:61 aleksis/core/tables.py:62
 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92
@@ -1275,19 +1276,21 @@ msgstr ""
 #: aleksis/core/templates/core/person/full.html:93
 #: aleksis/core/templates/oauth2_provider/application/detail.html:21
 msgid "Delete"
-msgstr ""
+msgstr "Видалити"
 
 #: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10
 #: aleksis/core/templates/oauth2_provider/authorize.html:54
 #: aleksis/core/templates/oauth2_provider/authorized-oob.html:24
 msgid "Error"
-msgstr ""
+msgstr "Помилка"
 
 #: aleksis/core/templates/403.html:14
 msgid ""
 "You are not allowed to access the requested page or\n"
 "          object."
 msgstr ""
+"У Вас немає доступу до запитуваної сторінки або\n"
+"          об'єкту."
 
 #: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16
 msgid ""
@@ -1296,6 +1299,10 @@ msgid ""
 "            administrators:\n"
 "          "
 msgstr ""
+"\n"
+"            Якщо Ви думаєте, що це помилка AlekSIS, зверніться, будь ласка,\n"
+"            до адміністраторів сайту:\n"
+"          "
 
 #: aleksis/core/templates/404.html:12
 msgid ""
@@ -1304,12 +1311,18 @@ msgid ""
 "            it is possible that that link was outdated.\n"
 "          "
 msgstr ""
+"\n"
+"            Якщо Ви були перенаправлені посиланням із зовнішньої сторінки,\n"
+"            ймовірно, це посилання вже застаріло.\n"
+"          "
 
 #: aleksis/core/templates/500.html:10
 msgid ""
 "An unexpected error has\n"
 "          occured."
 msgstr ""
+"Сталася неочікувана\n"
+"          помилка."
 
 #: aleksis/core/templates/500.html:13
 msgid ""
@@ -1318,16 +1331,22 @@ msgid ""
 "            error. You can also contact them directly:\n"
 "          "
 msgstr ""
+"\n"
+"            Адміністратори сайту будуть сповіщені щодо цієї помилки автоматично\n"
+"            Ви також можете звернутися до них безпосередньо:\n"
+"          "
 
 #: aleksis/core/templates/500.html:21
 msgid "Retry"
-msgstr ""
+msgstr "Спробувати ще"
 
 #: aleksis/core/templates/503.html:10
 msgid ""
 "The maintenance mode is currently enabled. Please try again\n"
 "          later."
 msgstr ""
+"Сайт перебуває зараз на обслуговуванні. Спробуйте зайти\n"
+"          пізніше."
 
 #: aleksis/core/templates/503.html:13
 msgid ""
@@ -1335,15 +1354,18 @@ msgid ""
 "            This page is currently unavailable. If this error persists, contact your site administrators:\n"
 "          "
 msgstr ""
+"\n"
+"            Ця сторінка наразі недоступна. Якщо ця помилка виникне знову, зверніться до адміністраторів сайту:\n"
+"          "
 
 #: aleksis/core/templates/account/account_inactive.html:5
 #: aleksis/core/templates/account/account_inactive.html:6
 msgid "Account inactive"
-msgstr ""
+msgstr "Обліковий запис неактивний"
 
 #: aleksis/core/templates/account/account_inactive.html:14
 msgid "Account inactive."
-msgstr ""
+msgstr "Обліковий запис неактивний."
 
 #: aleksis/core/templates/account/account_inactive.html:17
 msgid ""
@@ -1352,48 +1374,52 @@ msgid ""
 "            error, please contact one of your site administrators.\n"
 "          "
 msgstr ""
+"\n"
+"            Цей обліковий запис наразі неактивний. Якщо Ви думаєте,\n"
+"            що це помилка, зверніться до адміністраторів сайту.\n"
+"          "
 
 #: aleksis/core/templates/account/email/base_message.txt:5
 msgid "Hello!"
-msgstr ""
+msgstr "Привіт!"
 
 #: aleksis/core/templates/account/email/base_message.txt:9
 msgid "Your AlekSIS team"
-msgstr ""
+msgstr "Команда AlekSIS"
 
 #: aleksis/core/templates/account/email_confirm.html:5
 #: aleksis/core/templates/account/email_confirm.html:6
 #: aleksis/core/templates/account/email_confirm.html:17
 #: aleksis/core/templates/socialaccount/login.html:17
 msgid "Confirm"
-msgstr ""
+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 ""
+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 ""
+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:"
-msgstr ""
+msgstr "Забули свій пароль? Натисніть тут для скидання:"
 
 #: aleksis/core/templates/account/password_change.html:12
 msgid "Forgot Password?"
-msgstr ""
+msgstr "Забули пароль?"
 
 #: aleksis/core/templates/account/password_change_disabled.html:5
 #: aleksis/core/templates/account/password_change_disabled.html:6
 msgid "Changing of password disabled"
-msgstr ""
+msgstr "Зміна паролю вимкнена"
 
 #: aleksis/core/templates/account/password_change_disabled.html:13
 msgid "Changing of password disabled."
-msgstr ""
+msgstr "Зміна паролю вимкнена."
 
 #: aleksis/core/templates/account/password_change_disabled.html:15
 msgid ""
@@ -1402,6 +1428,10 @@ msgid ""
 "            this is an error please contact one of your site administrators.\n"
 "          "
 msgstr ""
+"\n"
+"            Користувачам не дозволяється змінювати свої паролі.\n"
+"            Якщо Ви думаєте, що це помилка, зверніться до адміністраторів сайту.\n"
+"          "
 
 #: aleksis/core/templates/account/password_reset.html:5
 #: aleksis/core/templates/account/password_reset.html:15
@@ -1411,21 +1441,23 @@ msgstr ""
 #: aleksis/core/templates/account/verification_email_required.html:6
 #: aleksis/core/templates/two_factor/core/login.html:100
 msgid "Reset password"
-msgstr ""
+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 ""
 "Please contact one of your site administrators, if you\n"
 "        have any trouble resetting your password:"
 msgstr ""
+"Якщо у Вас виникла проблема зі скиданням пароля,\n"
+"        зверніться, будь ласка, до адміністраторів сайту:"
 
 #: aleksis/core/templates/account/password_reset_done.html:15
 msgid "Password reset mail sent"
-msgstr ""
+msgstr "Лист для скидання пароля надісланий"
 
 #: aleksis/core/templates/account/password_reset_done.html:18
 #: aleksis/core/templates/account/verification_email_required.html:16
@@ -1435,10 +1467,14 @@ msgid ""
 "            administrators if you do not receive it within a few minutes.\n"
 "          "
 msgstr ""
+"\n"
+"            Ми надіслали Вам ел.листа. Якщо Ви його не отримаєте протягом\n"
+"            декількох хвилин, зверніться, будь ласка, до адміністраторів сайту.\n"
+"          "
 
 #: aleksis/core/templates/account/password_reset_from_key.html:15
 msgid "Bad token"
-msgstr ""
+msgstr "Несправний токен"
 
 #: aleksis/core/templates/account/password_reset_from_key.html:19
 #, python-format
@@ -1448,6 +1484,10 @@ msgid ""
 "              class=\"blue-text text-lighten-2\">new password reset</a>.\n"
 "            "
 msgstr ""
+"\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
 msgid ""
@@ -1456,6 +1496,10 @@ msgid ""
 "              administrators\n"
 "            "
 msgstr ""
+"\n"
+"              Якщо проблема досі присутня, зверніться, будь ласка, до\n"
+"              адміністраторів сайту\n"
+"            "
 
 #: aleksis/core/templates/account/password_reset_from_key.html:56
 #: aleksis/core/templates/account/password_reset_from_key_done.html:15
@@ -1464,41 +1508,44 @@ msgid ""
 "            Your password is now changed!\n"
 "          "
 msgstr ""
+"\n"
+"            Ваш пароль змінений!\n"
+"          "
 
 #: aleksis/core/templates/account/password_reset_from_key.html:61
 msgid "Back to login"
-msgstr ""
+msgstr "Назад до входу"
 
 #: aleksis/core/templates/account/password_reset_from_key_done.html:13
 msgid "Password changed!"
-msgstr ""
+msgstr "Пароль змінений!"
 
 #: aleksis/core/templates/account/password_set.html:5
 #: aleksis/core/templates/account/password_set.html:6
 #: aleksis/core/templates/account/password_set.html:12
 msgid "Set password"
-msgstr ""
+msgstr "Налаштування пароля"
 
 #: aleksis/core/templates/account/signup.html:5
 #: aleksis/core/templates/account/signup.html:6
 #: aleksis/core/templates/socialaccount/signup.html:5
 #: aleksis/core/templates/socialaccount/signup.html:6
 msgid "Signup"
-msgstr ""
+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 ""
+msgstr "Вже маєте обліковий запис? Тоді можете <a href=\"%(login_url)s\">увіти</a>."
 
 #: aleksis/core/templates/account/signup_closed.html:5
 #: aleksis/core/templates/account/signup_closed.html:6
 msgid "Signup closed"
-msgstr ""
+msgstr "Реєстрація закрита"
 
 #: aleksis/core/templates/account/signup_closed.html:14
 msgid "Signup closed."
-msgstr ""
+msgstr "Реєстрація закрита."
 
 #: aleksis/core/templates/account/signup_closed.html:17
 msgid ""
@@ -1507,19 +1554,23 @@ msgid ""
 "            error, please contact one of your site administrators.\n"
 "          "
 msgstr ""
+"\n"
+"            Реєстрація наразі закрита. Якщо Ви думаєте, що це помилка,\n"
+"            можете звернутися до адміністраторів сайту.\n"
+"          "
 
 #: aleksis/core/templates/account/verification_email_required.html:14
 msgid "Password reset mail sent!"
-msgstr ""
+msgstr "Лист для скидання пароля надісланий!"
 
 #: aleksis/core/templates/account/verification_sent.html:5
 #: aleksis/core/templates/account/verification_sent.html:6
 msgid "Verify your email address"
-msgstr ""
+msgstr "Перевірте свою адресу ел.пошти"
 
 #: aleksis/core/templates/account/verification_sent.html:14
 msgid "Verify your email!"
-msgstr ""
+msgstr "Перевірте свою ел.пошту!"
 
 #: aleksis/core/templates/account/verification_sent.html:16
 msgid ""
@@ -1528,6 +1579,10 @@ msgid ""
 "            For this purpose, we require that you verify ownership of your e-mail address.\n"
 "          "
 msgstr ""
+"\n"
+"            Ця частина сайту вимагає перевірки, що Ви - саме той/та, хто має бути.\n"
+"            Саме для цього нам необхідно перевірити, що адреса ел.пошти належить саме Вам.\n"
+"          "
 
 #: aleksis/core/templates/account/verification_sent.html:22
 msgid ""
@@ -1537,75 +1592,80 @@ msgid ""
 "            contact us if you do not receive it within a few minutes.\n"
 "          "
 msgstr ""
+"\n"
+"            Ми надіслали Вам для перевірки ел.листа.\n"
+"            Будь ласка, перейдіть за вказаним там посиланням. Якщо Ви не отримаєте\n"
+"            листа протягом декількох хвилин, зверніться, будь ласка, до нас.\n"
+"          "
 
 #: aleksis/core/templates/core/additional_field/edit.html:6
 #: aleksis/core/templates/core/additional_field/edit.html:7
 msgid "Edit additional field"
-msgstr ""
+msgstr "Редагування додаткового поля"
 
 #: aleksis/core/templates/core/additional_field/list.html:14
 msgid "Create additional field"
-msgstr ""
+msgstr "Створити додаткове поле"
 
 #: aleksis/core/templates/core/announcement/form.html:14
 #: aleksis/core/templates/core/announcement/form.html:21
 msgid "Edit announcement"
-msgstr ""
+msgstr "Редагування оголошення"
 
 #: aleksis/core/templates/core/announcement/form.html:16
 msgid "Publish announcement"
-msgstr ""
+msgstr "Розміщення оголошення"
 
 #: aleksis/core/templates/core/announcement/form.html:23
 #: aleksis/core/templates/core/announcement/list.html:13
 msgid "Publish new announcement"
-msgstr ""
+msgstr "Розмістити нове оголошення"
 
 #: aleksis/core/templates/core/announcement/form.html:34
-msgid "Save und publish announcement"
-msgstr ""
+msgid "Save and publish announcement"
+msgstr "Зберегти та розмістити оголошення"
 
 #: aleksis/core/templates/core/announcement/list.html:19
 msgid "Valid from"
-msgstr ""
+msgstr "Дійсне з"
 
 #: aleksis/core/templates/core/announcement/list.html:20
 msgid "Valid until"
-msgstr ""
+msgstr "Дійсне до"
 
 #: aleksis/core/templates/core/announcement/list.html:21
 msgid "Recipients"
-msgstr ""
+msgstr "Отримувачі"
 
 #: aleksis/core/templates/core/announcement/list.html:50
 msgid "There are no announcements."
-msgstr ""
+msgstr "Оголошень немає."
 
 #: aleksis/core/templates/core/base.html:213
 msgid "About AlekSIS® — The Free School Information System"
-msgstr ""
+msgstr "Щодо AlekSIS® — The Free School Information System"
 
 #: aleksis/core/templates/core/base.html:221
 msgid "Imprint"
-msgstr ""
+msgstr "Відбиток"
 
 #: aleksis/core/templates/core/base.html:229
 msgid "Privacy Policy"
-msgstr ""
+msgstr "Політика приватності"
 
 #: aleksis/core/templates/core/base_print.html:74
 msgid "Powered by AlekSIS®"
-msgstr ""
+msgstr "Базується на AlekSIS®"
 
 #: aleksis/core/templates/core/dashboard_widget/create.html:8
 #: aleksis/core/templates/core/dashboard_widget/create.html:12
 #, python-format
 msgid "Create %(widget)s"
-msgstr ""
+msgstr "Створити %(widget)s"
 
 #: aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html:10
 msgid "This widget is currently not available."
-msgstr ""
+msgstr "Цей віджет зараз недоступний."
 
 #: aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html:14
 #, python-format
@@ -1615,77 +1675,83 @@ msgid ""
 "            There is no need for you to take any action.\n"
 "          "
 msgstr ""
+"\n"
+"            Під час отримання віджета \"%(title)s\" виникла проблема.\n"
+"            Вам нічого робити не потрібно.\n"
+"          "
 
 #: aleksis/core/templates/core/dashboard_widget/edit.html:8
 #: aleksis/core/templates/core/dashboard_widget/edit.html:12
 #, python-format
 msgid "Edit %(widget)s"
-msgstr ""
+msgstr "Редагувати %(widget)s"
 
 #: aleksis/core/templates/core/dashboard_widget/list.html:15
 msgid "Create dashboard widget"
-msgstr ""
+msgstr "Створити віджет для інформпанелі"
 
 #: aleksis/core/templates/core/dashboard_widget/list.html:22
 #, python-format
 msgid "Create %(name)s"
-msgstr ""
+msgstr "Створити %(name)s"
 
 #: aleksis/core/templates/core/dashboard_widget/list.html:32
 #: aleksis/core/templates/core/edit_dashboard.html:8
 #: aleksis/core/templates/core/edit_dashboard.html:15
 msgid "Edit default dashboard"
-msgstr ""
+msgstr "Редагувати типову/стандартну інформпанель"
 
 #: aleksis/core/templates/core/data_check/list.html:15
 msgid "Check data again"
-msgstr ""
+msgstr "Перевірити дані ще раз"
 
 #: aleksis/core/templates/core/data_check/list.html:22
 msgid "The system detected some problems with your data."
-msgstr ""
+msgstr "Система виявила деякі проблеми з Вашими даними."
 
 #: aleksis/core/templates/core/data_check/list.html:23
 msgid ""
 "Please go through all data and check whether some extra action is\n"
 "          needed."
 msgstr ""
+"Будь ласка, уважно перегляньте усі дані і перевірте чи не потрібно\n"
+"          щось зробити."
 
 #: aleksis/core/templates/core/data_check/list.html:31
 msgid "Everything is fine."
-msgstr ""
+msgstr "Все чудово."
 
 #: aleksis/core/templates/core/data_check/list.html:32
 msgid "The system hasn't detected any problems with your data."
-msgstr ""
+msgstr "Система не виявила жодних проблем з Вашими даними."
 
 #: aleksis/core/templates/core/data_check/list.html:40
 msgid "Detected problems"
-msgstr ""
+msgstr "Виявлені проблеми"
 
 #: aleksis/core/templates/core/data_check/list.html:45
 msgid "Affected object"
-msgstr ""
+msgstr "Залежні об'єкти"
 
 #: aleksis/core/templates/core/data_check/list.html:46
 msgid "Detected problem"
-msgstr ""
+msgstr "Виявлена проблема"
 
 #: aleksis/core/templates/core/data_check/list.html:47
 msgid "Show details"
-msgstr ""
+msgstr "Детальніше"
 
 #: aleksis/core/templates/core/data_check/list.html:48
 msgid "Options to solve the problem"
-msgstr ""
+msgstr "Варіанти вирішення проблеми"
 
 #: aleksis/core/templates/core/data_check/list.html:63
 msgid "Show object"
-msgstr ""
+msgstr "Переглянути об'єкт"
 
 #: aleksis/core/templates/core/data_check/list.html:86
 msgid "Registered checks"
-msgstr ""
+msgstr "Зареєстровані перевірки"
 
 #: aleksis/core/templates/core/data_check/list.html:90
 msgid ""
@@ -1693,12 +1759,15 @@ msgid ""
 "            The system will check for the following problems:\n"
 "          "
 msgstr ""
+"\n"
+"            Система перевірить наявність таких проблеми:\n"
+"          "
 
 #: aleksis/core/templates/core/edit_dashboard.html:6
 #: aleksis/core/templates/core/edit_dashboard.html:13
 #: aleksis/core/templates/core/index.html:17
 msgid "Edit dashboard"
-msgstr ""
+msgstr "Редагувати інформпанель"
 
 #: aleksis/core/templates/core/edit_dashboard.html:24
 msgid ""
@@ -1708,6 +1777,11 @@ msgid ""
 "          \"Save\".\n"
 "        "
 msgstr ""
+"\n"
+"          На цій сторінці Ви можете впорядкувати свою інформпанель. Перетягуйте будь-які елементи з \"Доступних віджетів\"\n"
+"          до \"Своєї інформпанелі\" або змінюйте порядок, перетягуючи віджети. Після закінчення не забудьте натиснути\n"
+"          \"Зберегти\".\n"
+"        "
 
 #: aleksis/core/templates/core/edit_dashboard.html:30
 msgid ""
@@ -1717,18 +1791,23 @@ msgid ""
 "          by moving the widgets. After you have finished, please don't forget to click on \"Save\".\n"
 "        "
 msgstr ""
+"\n"
+"          На цій сторінці Ви можете впорядкувати типову/стандартну інформпанель, яка відображається, якщо користувач\n"
+"          не впорядкував власну. Перетягуйте будь-які елементи з \"Доступних віджетів\" до \"Типової інформпанелі\" або змінюйте \n"
+"          порядок, перетягуючи віджети. Після закінчення не забудьте натиснути \"Зберегти\".\n"
+"        "
 
 #: aleksis/core/templates/core/edit_dashboard.html:48
 msgid "Available widgets"
-msgstr ""
+msgstr "Доступні віджети"
 
 #: aleksis/core/templates/core/edit_dashboard.html:57
 msgid "Your dashboard"
-msgstr ""
+msgstr "Ваша інформпанель"
 
 #: aleksis/core/templates/core/edit_dashboard.html:59
 msgid "Default dashboard"
-msgstr ""
+msgstr "Типова інформпанель"
 
 #: aleksis/core/templates/core/group/child_groups.html:18
 msgid ""
@@ -1737,22 +1816,26 @@ msgid ""
 "          change and click \"Next\".\n"
 "        "
 msgstr ""
+"\n"
+"          Ви можете скористатися цим для призначення підлеглих груп до основних. Для обрання груп,\n"
+"          які хочете змінити, скористайтеся, будь ласка, фільтрами, що нижче та натисність \"Далі\".\n"
+"        "
 
 #: aleksis/core/templates/core/group/child_groups.html:31
 msgid "Update selection"
-msgstr ""
+msgstr "Оновити вибір"
 
 #: aleksis/core/templates/core/group/child_groups.html:35
 msgid "Clear all filters"
-msgstr ""
+msgstr "Очистити фільтри"
 
 #: aleksis/core/templates/core/group/child_groups.html:39
 msgid "Currently selected groups"
-msgstr ""
+msgstr "Позначені зараз групи"
 
 #: aleksis/core/templates/core/group/child_groups.html:52
 msgid "Start assigning child groups for this groups"
-msgstr ""
+msgstr "Розпочати призначення підлеглих груп до цих груп"
 
 #: aleksis/core/templates/core/group/child_groups.html:61
 msgid ""
@@ -1760,14 +1843,17 @@ msgid ""
 "            Please select some groups in order to go on with assigning.\n"
 "          "
 msgstr ""
+"\n"
+"            Оберіть, будь ласка, декілька груп у порядку, за яким призначати.\n"
+"          "
 
 #: aleksis/core/templates/core/group/child_groups.html:72
 msgid "Current group:"
-msgstr ""
+msgstr "Поточна група:"
 
 #: aleksis/core/templates/core/group/child_groups.html:78
 msgid "Please be careful!"
-msgstr ""
+msgstr "Обережно, будь ласка!"
 
 #: aleksis/core/templates/core/group/child_groups.html:79
 msgid ""
@@ -1777,6 +1863,11 @@ msgid ""
 "            selected on this page.\n"
 "          "
 msgstr ""
+"\n"
+"            Якщо натиснете \"Назад\" або \"Далі\" призначення цієї групи не збережуться.\n"
+"            Якщо натиснете \"Зберегти\", усі існуючі зв'язки підлеглої групи з цією групою будуть замінені на\n"
+"            обрані на цій сторінці.\n"
+"          "
 
 #: aleksis/core/templates/core/group/child_groups.html:93
 #: aleksis/core/templates/core/group/child_groups.html:128
@@ -1784,91 +1875,91 @@ msgstr ""
 #: aleksis/core/templates/two_factor/_wizard_actions.html:15
 #: aleksis/core/templates/two_factor/_wizard_actions.html:20
 msgid "Back"
-msgstr ""
+msgstr "Назад"
 
 #: aleksis/core/templates/core/group/child_groups.html:99
 #: aleksis/core/templates/core/group/child_groups.html:134
 #: aleksis/core/templates/two_factor/_wizard_actions.html:26
 msgid "Next"
-msgstr ""
+msgstr "Наступний"
 
 #: aleksis/core/templates/core/group/child_groups.html:106
 #: aleksis/core/templates/core/group/child_groups.html:141
 #: aleksis/core/templates/core/partials/save_button.html:3
 msgid "Save"
-msgstr ""
+msgstr "Зберегти"
 
 #: aleksis/core/templates/core/group/child_groups.html:112
 #: aleksis/core/templates/core/group/child_groups.html:147
 msgid "Save and next"
-msgstr ""
+msgstr "Зберегти і йти далі"
 
 #: aleksis/core/templates/core/group/edit.html:11
 #: aleksis/core/templates/core/group/edit.html:12
 msgid "Edit group"
-msgstr ""
+msgstr "Редагувати групу"
 
 #: aleksis/core/templates/core/group/full.html:38
 #: aleksis/core/templates/core/person/full.html:40
 #: aleksis/core/templates/core/person/full.html:100
 msgid "Change preferences"
-msgstr ""
+msgstr "Змінити властивості"
 
 #: aleksis/core/templates/core/group/full.html:64
 msgid "Statistics"
-msgstr ""
+msgstr "Статистика"
 
 #: aleksis/core/templates/core/group/full.html:67
 msgid "Count of members"
-msgstr ""
+msgstr "Кількість учасників"
 
 #: aleksis/core/templates/core/group/full.html:71
 msgid "Average age"
-msgstr ""
+msgstr "Середній вік"
 
 #: aleksis/core/templates/core/group/full.html:76
 msgid "Age range"
-msgstr ""
+msgstr "Віковий діапазон"
 
 #: aleksis/core/templates/core/group/full.html:76
 msgid "years to"
-msgstr ""
+msgstr "–"
 
 #: aleksis/core/templates/core/group/full.html:76
 msgid "years "
-msgstr ""
+msgstr "рр. "
 
 #: aleksis/core/templates/core/group/list.html:14
 msgid "Create group"
-msgstr ""
+msgstr "Створити групу"
 
 #: aleksis/core/templates/core/group/list.html:17
 msgid "Filter groups"
-msgstr ""
+msgstr "Фільтрувати групи"
 
 #: aleksis/core/templates/core/group/list.html:24
 #: aleksis/core/templates/core/person/list.html:28
 msgid "Clear"
-msgstr ""
+msgstr "Очистити"
 
 #: aleksis/core/templates/core/group/list.html:28
 msgid "Selected groups"
-msgstr ""
+msgstr "Обрані групи"
 
 #: aleksis/core/templates/core/group_type/edit.html:6
 #: aleksis/core/templates/core/group_type/edit.html:7
 msgid "Edit group type"
-msgstr ""
+msgstr "Редагувати тип групи"
 
 #: aleksis/core/templates/core/group_type/list.html:14
 msgid "Create group type"
-msgstr ""
+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 ""
+msgstr "Створити посилання iCal"
 
 #: aleksis/core/templates/core/ical/ical_create.html:16
 #: aleksis/core/templates/core/ical/ical_edit.html:16
@@ -1877,30 +1968,33 @@ msgstr ""
 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24
 #: aleksis/core/templates/two_factor/_wizard_actions.html:6
 msgid "Cancel"
-msgstr ""
+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 ""
+msgstr "Редагувати посилання iCal %(object)s"
 
 #: aleksis/core/templates/core/ical/ical_list.html:4
 #: aleksis/core/templates/core/ical/ical_list.html:5
 msgid "ICal Feeds"
-msgstr ""
+msgstr "iCal-стрічки"
 
 #: 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 ""
+"Тут містяться посилання на різні стрічки календарів у форматі iCal (.ics). "
+"Ви можете створити їх стільки, скільки Вам необхідно та імпортувати їх у ПЗ "
+"для роботи з календарями."
 
 #: aleksis/core/templates/core/ical/ical_list.html:14
 msgid "Your iCal URLs"
-msgstr ""
+msgstr "Ваші посилання iCal"
 
 #: aleksis/core/templates/core/index.html:4
 msgid "Home"
-msgstr ""
+msgstr "Додому"
 
 #: aleksis/core/templates/core/index.html:49
 msgid ""
@@ -1909,40 +2003,44 @@ msgid ""
 "        customise your personal dashboard.\n"
 "      "
 msgstr ""
+"\n"
+"        Ви ще не налаштували свою інформпанель, тож поки що бачите типову/стандартну. Для налаштування \n"
+"         власної інформпанелі клацніть \"Редагувати інформпанель\".\n"
+"      "
 
 #: aleksis/core/templates/core/index.html:59
 msgid "Last activities"
-msgstr ""
+msgstr "Останні дії"
 
 #: aleksis/core/templates/core/index.html:77
 msgid "No activities available yet."
-msgstr ""
+msgstr "Дії поки що не доступні."
 
 #: aleksis/core/templates/core/index.html:82
 msgid "Recent notifications"
-msgstr ""
+msgstr "Свіжі сповіщення"
 
 #: aleksis/core/templates/core/index.html:98
 #: aleksis/core/templates/core/notifications.html:23
 msgid "More information →"
-msgstr ""
+msgstr "Більше інформації →"
 
 #: aleksis/core/templates/core/index.html:105
 #: aleksis/core/templates/core/notifications.html:30
 msgid "No notifications available yet."
-msgstr ""
+msgstr "Сповіщення поки що не доступні."
 
 #: aleksis/core/templates/core/pages/about.html:6
 msgid "About AlekSIS®"
-msgstr ""
+msgstr "Щодо AlekSIS®"
 
 #: aleksis/core/templates/core/pages/about.html:7
 msgid "AlekSIS® – The Free School Information System"
-msgstr ""
+msgstr "AlekSIS® – The Free School Information System"
 
 #: aleksis/core/templates/core/pages/about.html:15
 msgid "About AlekSIS"
-msgstr ""
+msgstr "Щодо AlekSIS"
 
 #: aleksis/core/templates/core/pages/about.html:17
 msgid ""
@@ -1952,6 +2050,11 @@ msgid ""
 "              can be used by anyone.\n"
 "            "
 msgstr ""
+"\n"
+"              Ця платформа базується на AlekSIS®, веб-інструменті інформаційної системи для навчання (SIS) за допомогою якої\n"
+"              можна керувати та/або висвітлювати організаційні елементи навчальних закладів. AlekSIS - безплатне ПЗ\n"
+"              і ним може користуватися будь-хто.\n"
+"            "
 
 #: aleksis/core/templates/core/pages/about.html:24
 msgid ""
@@ -1959,18 +2062,22 @@ msgid ""
 "              AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.\n"
 "            "
 msgstr ""
+"\n"
+"              AlekSIS® – зареєстрована торгова марка проекту з відкритим "
+"програмним кодом AlekSIS, що представлена Teckids e.V.\n"
+"            "
 
 #: aleksis/core/templates/core/pages/about.html:30
 msgid "Website of AlekSIS"
-msgstr ""
+msgstr "Веб-сайт AlekSIS"
 
 #: aleksis/core/templates/core/pages/about.html:31
 msgid "Source code"
-msgstr ""
+msgstr "Програмний код"
 
 #: aleksis/core/templates/core/pages/about.html:40
 msgid "Licence information"
-msgstr ""
+msgstr "Ліцензійна інформація"
 
 #: aleksis/core/templates/core/pages/about.html:42
 msgid ""
@@ -1980,22 +2087,29 @@ msgid ""
 "              licences are marked like this:\n"
 "            "
 msgstr ""
+"\n"
+"              Ядро та офіційні додатки AlekSIS ліцензовані EUPL, версії 1.2 "
+"та новіше. Для отримання інформації\n"
+"              щодо додатків третіх сторін, якщо такі встановлені, зверніться "
+"до відповідних компонентів нижче.\n"
+"              Ці ліцензії мають таку позначку:\n"
+"            "
 
 #: aleksis/core/templates/core/pages/about.html:50
 msgid "Free/Open Source Licence"
-msgstr ""
+msgstr "Безкоштовна або Ліцензія Відкритого Коду (Open Source)"
 
 #: aleksis/core/templates/core/pages/about.html:51
 msgid "Other Licence"
-msgstr ""
+msgstr "Інша ліцензія"
 
 #: aleksis/core/templates/core/pages/about.html:55
 msgid "Full licence text"
-msgstr ""
+msgstr "Повний текст ліцензії"
 
 #: aleksis/core/templates/core/pages/about.html:56
 msgid "More information about the EUPL"
-msgstr ""
+msgstr "Більше інформації щодо EUPL"
 
 #: aleksis/core/templates/core/pages/about.html:95
 #, python-format
@@ -2004,11 +2118,14 @@ msgid ""
 "                    This app is licenced under %(licence)s.\n"
 "                  "
 msgstr ""
+"\n"
+"                    Цей додаток ліцензований під %(licence)s.\n"
+"                  "
 
 #: aleksis/core/templates/core/pages/delete.html:6
 #, python-format
 msgid "Delete %(object_name)s"
-msgstr ""
+msgstr "Видалити %(object_name)s"
 
 #: aleksis/core/templates/core/pages/delete.html:13
 #, python-format
@@ -2017,6 +2134,9 @@ msgid ""
 "      Do you really want to delete the %(object_name)s \"%(object)s\"?\n"
 "    "
 msgstr ""
+"\n"
+"      Ви дійно хочете видалити %(object_name)s \"%(object)s\"?\n"
+"    "
 
 #: aleksis/core/templates/core/pages/progress.html:27
 msgid ""
@@ -2024,19 +2144,23 @@ msgid ""
 "              Without activated JavaScript the progress status can't be updated.\n"
 "            "
 msgstr ""
+"\n"
+"              Без активованого JavaScript статус виконання не зможе "
+"оновлюватися.\n"
+"            "
 
 #: aleksis/core/templates/core/pages/progress.html:47
 #: aleksis/core/templates/two_factor/core/otp_required.html:19
 msgid "Go back"
-msgstr ""
+msgstr "Назад"
 
 #: aleksis/core/templates/core/pages/system_status.html:12
 msgid "System checks"
-msgstr ""
+msgstr "Системні перевірки"
 
 #: aleksis/core/templates/core/pages/system_status.html:22
 msgid "Maintenance mode enabled"
-msgstr ""
+msgstr "Активований режим обслуговування"
 
 #: aleksis/core/templates/core/pages/system_status.html:24
 msgid ""
@@ -2044,18 +2168,22 @@ msgid ""
 "                Only admin and visitors from internal IPs can access thesite.\n"
 "              "
 msgstr ""
+"\n"
+"                Доступ до сайту мають лише адміністратор та відвідувачі з "
+"внутрішніми IP-адресами.\n"
+"              "
 
 #: aleksis/core/templates/core/pages/system_status.html:36
 msgid "Maintenance mode disabled"
-msgstr ""
+msgstr "Режим обслуговування деактивований"
 
 #: aleksis/core/templates/core/pages/system_status.html:37
 msgid "Everyone can access the site."
-msgstr ""
+msgstr "Доступ до сайту мають усі."
 
 #: aleksis/core/templates/core/pages/system_status.html:47
 msgid "Debug mode enabled"
-msgstr ""
+msgstr "Активований режим налагодження"
 
 #: aleksis/core/templates/core/pages/system_status.html:49
 msgid ""
@@ -2063,10 +2191,14 @@ msgid ""
 "                The web server throws back debug information on errors. Do not use in production!\n"
 "              "
 msgstr ""
+"\n"
+"                Веб-сервер кидає під час помилок інформацію щодо "
+"налагодження. Не використовуйте в продакшені!\n"
+"              "
 
 #: aleksis/core/templates/core/pages/system_status.html:56
 msgid "Debug mode disabled"
-msgstr ""
+msgstr "Режим налагодження деактивований"
 
 #: aleksis/core/templates/core/pages/system_status.html:58
 msgid ""
@@ -2074,50 +2206,54 @@ msgid ""
 "                Debug mode is disabled. Default error pages are displayed on errors.\n"
 "              "
 msgstr ""
+"\n"
+"                Режим налагодження деактивований. В разі збоїв "
+"відображатимуться типові сторінки помилок.\n"
+"              "
 
 #: aleksis/core/templates/core/pages/system_status.html:71
 msgid "System health checks"
-msgstr ""
+msgstr "Перевірки роботи системи"
 
 #: aleksis/core/templates/core/pages/system_status.html:77
 msgid "Service"
-msgstr ""
+msgstr "Служба"
 
 #: aleksis/core/templates/core/pages/system_status.html:78
 #: aleksis/core/templates/core/pages/system_status.html:119
 msgid "Status"
-msgstr ""
+msgstr "Стан"
 
 #: aleksis/core/templates/core/pages/system_status.html:79
 msgid "Time taken"
-msgstr ""
+msgstr "Тривалість"
 
 #: aleksis/core/templates/core/pages/system_status.html:100
 msgid "seconds"
-msgstr ""
+msgstr "сек"
 
 #: aleksis/core/templates/core/pages/system_status.html:111
 msgid "Celery task results"
-msgstr ""
+msgstr "Результати виконання Celery"
 
 #: aleksis/core/templates/core/pages/system_status.html:116
 #: aleksis/core/templates/templated_email/celery_failure.email:9
 #: aleksis/core/templates/templated_email/celery_failure.email:28
 msgid "Task"
-msgstr ""
+msgstr "Завдання"
 
 #: aleksis/core/templates/core/pages/system_status.html:117
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 #: aleksis/core/templates/core/pages/system_status.html:118
 msgid "Date done"
-msgstr ""
+msgstr "Час завершення"
 
 #: aleksis/core/templates/core/pages/test_pdf.html:7
 #: aleksis/core/templates/core/pages/test_pdf.html:8
 msgid "Test PDF generation"
-msgstr ""
+msgstr "Спроба генерації PDF"
 
 #: aleksis/core/templates/core/pages/test_pdf.html:14
 msgid ""
@@ -2125,6 +2261,10 @@ msgid ""
 "        This simple view can be used to ensure the correct function of the built-in PDF generation system.\n"
 "      "
 msgstr ""
+"\n"
+"        Цей простий вигляд допоможе перевірити коректність налаштувань "
+"вбудованої системи генерації PDF.\n"
+"      "
 
 #: aleksis/core/templates/core/partials/announcements.html:8
 #: aleksis/core/templates/core/partials/announcements.html:35
@@ -2134,6 +2274,9 @@ msgid ""
 "              Valid for %(from)s\n"
 "            "
 msgstr ""
+"\n"
+"              Дійсний на %(from)s\n"
+"            "
 
 #: aleksis/core/templates/core/partials/announcements.html:12
 #, python-format
@@ -2142,6 +2285,9 @@ msgid ""
 "              Valid from %(from)s until %(until)s\n"
 "            "
 msgstr ""
+"\n"
+"              Дійсний з %(from)s до %(until)s\n"
+"            "
 
 #: aleksis/core/templates/core/partials/announcements.html:39
 #, python-format
@@ -2150,34 +2296,37 @@ msgid ""
 "              Valid for %(from)s – %(until)s\n"
 "            "
 msgstr ""
+"\n"
+"              Дійсний на %(from)s – %(until)s\n"
+"            "
 
 #: aleksis/core/templates/core/partials/avatar_content.html:14
 #: aleksis/core/templates/core/partials/avatar_content.html:15
 #: aleksis/core/templates/core/person/full.html:213
 #: aleksis/core/templates/core/person/full.html:214
 msgid "Avatar"
-msgstr ""
+msgstr "Аватар"
 
 #: aleksis/core/templates/core/partials/avatar_content.html:19
 #: aleksis/core/templates/core/partials/avatar_content.html:20
 msgid "Identicon"
-msgstr ""
+msgstr "Ідентифікатор (іконка)"
 
 #: aleksis/core/templates/core/partials/crud_events.html:15
 msgid "Changed by"
-msgstr ""
+msgstr "Змінене"
 
 #: aleksis/core/templates/core/partials/crud_events.html:15
 msgid "Unknown"
-msgstr ""
+msgstr "Невідомо"
 
 #: aleksis/core/templates/core/partials/language_form.html:15
 msgid "Language"
-msgstr ""
+msgstr "Мова"
 
 #: aleksis/core/templates/core/partials/language_form.html:27
 msgid "Select language"
-msgstr ""
+msgstr "Оберіть мову"
 
 #: aleksis/core/templates/core/partials/no_person.html:12
 msgid ""
@@ -2186,6 +2335,11 @@ msgid ""
 "            a dummy person has been linked to your account.\n"
 "          "
 msgstr ""
+"\n"
+"            Ваш адміністративний обліковий запис не поєднаний з жодною "
+"особою. Через це\n"
+"            до Вашого облікового запису приєднана фейкова особа.\n"
+"          "
 
 #: aleksis/core/templates/core/partials/no_person.html:19
 msgid ""
@@ -2195,140 +2349,145 @@ msgid ""
 "            the managers of AlekSIS at your school.\n"
 "          "
 msgstr ""
+"\n"
+"            Ваш обліковий запис не пов'язаний з фізособою. Це означає,\n"
+"            що Ви не маєте жодного доступу до навчальної інформації. Зверніться,\n"
+"            будь ласка, до адміністраторів AlekSIS у Вашому навчальному закладі.\n"
+"          "
 
 #: aleksis/core/templates/core/perms/assign.html:12
 #: aleksis/core/templates/core/perms/assign.html:13
 msgid "Assign permission"
-msgstr ""
+msgstr "Призначити дозвіл"
 
 #: aleksis/core/templates/core/perms/assign.html:17
 msgid "Selected permission"
-msgstr ""
+msgstr "Обраний дозвіл"
 
 #: aleksis/core/templates/core/perms/assign.html:26
 msgid "Assign"
-msgstr ""
+msgstr "Призначити"
 
 #: aleksis/core/templates/core/perms/list.html:21
 msgid "Assign a new permission"
-msgstr ""
+msgstr "Призначити новий дозвіл"
 
 #: aleksis/core/templates/core/perms/list.html:25
 msgid "Select"
-msgstr ""
+msgstr "Обрати"
 
 #: aleksis/core/templates/core/perms/list.html:34
 msgid "Global (user)"
-msgstr ""
+msgstr "Глобально (користувач)"
 
 #: aleksis/core/templates/core/perms/list.html:38
 msgid "Global (group)"
-msgstr ""
+msgstr "Глобально (група)"
 
 #: aleksis/core/templates/core/perms/list.html:42
 msgid "Object (user)"
-msgstr ""
+msgstr "Об'єкт (користувач)"
 
 #: aleksis/core/templates/core/perms/list.html:46
 msgid "Object (group)"
-msgstr ""
+msgstr "Об'єкт (група)"
 
 #: aleksis/core/templates/core/perms/list.html:52
 msgid "Filter permissions"
-msgstr ""
+msgstr "Фільтр дозволів"
 
 #: aleksis/core/templates/core/perms/list.html:58
 msgid "Update"
-msgstr ""
+msgstr "Оновити"
 
 #: aleksis/core/templates/core/person/create.html:12
 #: aleksis/core/templates/core/person/create.html:13
 #: aleksis/core/templates/core/person/list.html:17
 msgid "Create person"
-msgstr ""
+msgstr "Створити особу"
 
 #: aleksis/core/templates/core/person/edit.html:12
 #: aleksis/core/templates/core/person/edit.html:13
 msgid "Edit person"
-msgstr ""
+msgstr "Редагувати особу"
 
 #: aleksis/core/templates/core/person/full.html:47
 #: aleksis/core/templates/core/person/full.html:107
 msgid "Impersonate"
-msgstr ""
+msgstr "Маскування"
 
 #: aleksis/core/templates/core/person/full.html:54
 #: aleksis/core/templates/core/person/full.html:114
 msgid "Invite user"
-msgstr ""
+msgstr "Запрошення користувача"
 
 #: aleksis/core/templates/core/person/full.html:121
 msgid "Contact details"
-msgstr ""
+msgstr "Контактні дані"
 
 #: aleksis/core/templates/core/person/full.html:220
 msgid "This person didn't upload a personal photo."
-msgstr ""
+msgstr "Ця особа не завантажила особисте фото."
 
 #: aleksis/core/templates/core/person/full.html:228
 msgid "Children"
-msgstr ""
+msgstr "Діти"
 
 #: aleksis/core/templates/core/person/list.html:21
 msgid "Filter persons"
-msgstr ""
+msgstr "Фільтр осіб"
 
 #: aleksis/core/templates/core/person/list.html:32
 msgid "Selected persons"
-msgstr ""
+msgstr "Позначені особи"
 
 #: aleksis/core/templates/core/school_term/create.html:6
 #: aleksis/core/templates/core/school_term/create.html:7
 #: aleksis/core/templates/core/school_term/list.html:14
 msgid "Create school term"
-msgstr ""
+msgstr "Створити Навчальний рік"
 
 #: aleksis/core/templates/core/school_term/edit.html:6
 #: aleksis/core/templates/core/school_term/edit.html:7
 msgid "Edit school term"
-msgstr ""
+msgstr "Редагувати Навчальний рік"
 
 #: aleksis/core/templates/dynamic_preferences/form.html:9
 msgid "Site preferences"
-msgstr ""
+msgstr "Властивості сайту"
 
 #: aleksis/core/templates/dynamic_preferences/form.html:11
 msgid "My preferences"
-msgstr ""
+msgstr "Мої властивості"
 
 #: aleksis/core/templates/dynamic_preferences/form.html:13
 #, python-format
 msgid "Preferences for %(instance)s"
-msgstr ""
+msgstr "Властивості %(instance)s"
 
 #: aleksis/core/templates/dynamic_preferences/form.html:25
 msgid "Save preferences"
-msgstr ""
+msgstr "Зберегти властивості"
 
 #: aleksis/core/templates/invitations/disabled.html:5
 msgid "The invite feature is disabled"
-msgstr ""
+msgstr "Функція запрошення вимкнена"
 
 #: aleksis/core/templates/invitations/disabled.html:13
 msgid "The invite feature is disabled."
-msgstr ""
+msgstr "Функція запрошення деактивована."
 
 #: aleksis/core/templates/invitations/disabled.html:15
 msgid "To enable it, switch on the corresponding checkbox in the authentication section of the "
-msgstr ""
+msgstr "Для активації увімкніть відповідний чекбокс в розділі авторизації "
 
 #: aleksis/core/templates/invitations/disabled.html:16
 msgid "site preferences page"
-msgstr ""
+msgstr "сторінка властивостей сайту"
 
 #: aleksis/core/templates/invitations/enter.html:21
 msgid "Accept your invitation"
-msgstr ""
+msgstr "Прийняття Вашого запрошення"
 
 #: aleksis/core/templates/invitations/enter.html:25
 msgid ""
@@ -2337,140 +2496,144 @@ msgid ""
 "                your new user account:\n"
 "              "
 msgstr ""
+"\n"
+"                Для реєстрації Вашого нового облікового запису\n"
+"                напишіть свій код запрошення:\n"
+"              "
 
 #: aleksis/core/templates/invitations/enter.html:37
 msgid "Accept invite"
-msgstr ""
+msgstr "Прийняття запрошення"
 
 #: aleksis/core/templates/invitations/forms/_invite.html:9
 #: aleksis/core/templates/invitations/forms/_invite.html:10
 #: aleksis/core/templates/invitations/forms/_invite.html:21
 msgid "Invite"
-msgstr ""
+msgstr "Запрошення"
 
 #: aleksis/core/templates/invitations/forms/_invite.html:17
 msgid "Invite by email address"
-msgstr ""
+msgstr "Запрошення ел.поштою"
 
 #: aleksis/core/templates/invitations/forms/_invite.html:26
 msgid "Generate invitation code"
-msgstr ""
+msgstr "Створити код запрошення"
 
 #: aleksis/core/templates/invitations/forms/_invite.html:29
 msgid "Generate code"
-msgstr ""
+msgstr "Генерація коду"
 
 #: aleksis/core/templates/invitations/forms/_invite.html:33
 msgid "Invitations"
-msgstr ""
+msgstr "Запрошення"
 
 #: aleksis/core/templates/invitations/messages/invite_accepted.txt:3
 #, python-format
 msgid "The invitation for %(email)s has been accepted."
-msgstr ""
+msgstr "Запрошення для %(email)s було прийняте."
 
 #: aleksis/core/templates/oauth2_provider/application/create.html:5
 #: aleksis/core/templates/oauth2_provider/application/create.html:6
 msgid "Register OAuth2 Application"
-msgstr ""
+msgstr "Реєстрація додатку OAuth2"
 
 #: aleksis/core/templates/oauth2_provider/application/detail.html:5
 msgid "OAuth2 Application"
-msgstr ""
+msgstr "Додаток OAuth2"
 
 #: aleksis/core/templates/oauth2_provider/application/detail.html:39
 msgid "Client id"
-msgstr ""
+msgstr "Клієнтське ID"
 
 #: aleksis/core/templates/oauth2_provider/application/detail.html:47
 msgid "Client secret"
-msgstr ""
+msgstr "Клієнтський секрет"
 
 #: aleksis/core/templates/oauth2_provider/application/detail.html:55
 msgid "Client type"
-msgstr ""
+msgstr "Клієнтський тип"
 
 #: aleksis/core/templates/oauth2_provider/application/detail.html:63
 msgid "Allowed scopes"
-msgstr ""
+msgstr "Дозволені межі дії"
 
 #: aleksis/core/templates/oauth2_provider/application/detail.html:71
 msgid "Redirect URIs"
-msgstr ""
+msgstr "URI-адреси перенаправлення"
 
 #: aleksis/core/templates/oauth2_provider/application/detail.html:79
 msgid "Skip Authorisation"
-msgstr ""
+msgstr "Пропустити авторизацію"
 
 #: aleksis/core/templates/oauth2_provider/application/edit.html:5
 #: aleksis/core/templates/oauth2_provider/application/edit.html:6
 msgid "Edit OAuth2 Application"
-msgstr ""
+msgstr "Редагувати додаток OAuth2"
 
 #: aleksis/core/templates/oauth2_provider/application/list.html:11
 msgid "Register new application"
-msgstr ""
+msgstr "Зареєструвати новий додаток"
 
 #: aleksis/core/templates/oauth2_provider/application/list.html:25
 msgid "No applications defined."
-msgstr ""
+msgstr "Додатки не визначені."
 
 #: aleksis/core/templates/oauth2_provider/authorize.html:5
 #: aleksis/core/templates/socialaccount/login.html:5
 #: aleksis/core/templates/socialaccount/login.html:6
 msgid "Authorize"
-msgstr ""
+msgstr "Авторизувати"
 
 #: aleksis/core/templates/oauth2_provider/authorize.html:23
 #, python-format
 msgid "Authorize %(name)s"
-msgstr ""
+msgstr "Авторизувати %(name)s"
 
 #: aleksis/core/templates/oauth2_provider/authorize.html:25
 msgid "The application requests access to the following scopes:"
-msgstr ""
+msgstr "Додаток запитує дозвіл до таких меж дії:"
 
 #: aleksis/core/templates/oauth2_provider/authorize.html:40
 msgid "Allow"
-msgstr ""
+msgstr "Дозволити"
 
 #: aleksis/core/templates/oauth2_provider/authorize.html:43
 msgid "Disallow"
-msgstr ""
+msgstr "Заборонити"
 
 #: aleksis/core/templates/oauth2_provider/authorized-oob.html:12
 msgid "Success!"
-msgstr ""
+msgstr "Успіх!"
 
 #: aleksis/core/templates/oauth2_provider/authorized-oob.html:14
 msgid "Please return to your application and enter this code:"
-msgstr ""
+msgstr "Поверніться, будь ласка, до свого додатку та впишіть цей код:"
 
 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5
 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23
 msgid "Revoke access"
-msgstr ""
+msgstr "Відкликати доступ"
 
 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12
 msgid "Are you sure to revoke the access for this application?"
-msgstr ""
+msgstr "Ви дійсно хочете відкликати доступ для цього додатку?"
 
 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20
 msgid "Revoke"
-msgstr ""
+msgstr "Відкликати"
 
 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33
 msgid "No authorized applications."
-msgstr ""
+msgstr "Авторизованих додатків немає."
 
 #: aleksis/core/templates/offline.html:5
 msgid "Network error"
-msgstr ""
+msgstr "Помилка мережі"
 
 #: aleksis/core/templates/offline.html:10
 msgid "No internet connection."
-msgstr ""
+msgstr "Немає інтернет-з'єднання."
 
 #: aleksis/core/templates/offline.html:14
 msgid ""
@@ -2480,35 +2643,40 @@ msgid ""
 "      administrators:\n"
 "    "
 msgstr ""
+"\n"
+"      Під час доступу до цієї сторінки виникла помилка. Можливо, у Вас проблема з інтернетом. Переконайтеся, що Ваш WiFi\n"
+"      або мобільний увімкнені та спробуйте ще раз. Якщо Ви думаєте, що із з'єднанням все добре, зверніться\n"
+"      до системних адміністраторів:\n"
+"    "
 
 #: aleksis/core/templates/search/search.html:8
 msgid "Global Search"
-msgstr ""
+msgstr "Глобальний пошук"
 
 #: aleksis/core/templates/search/search.html:15
 msgid "Search Term"
-msgstr ""
+msgstr "Пошуковий термін"
 
 #: aleksis/core/templates/search/search.html:26
 msgid "Results"
-msgstr ""
+msgstr "Результати"
 
 #: aleksis/core/templates/search/search.html:38
 msgid "No search results could be found to your search."
-msgstr ""
+msgstr "За Вашим пошуковим запитом результатів немає."
 
 #: aleksis/core/templates/search/search.html:87
 msgid "Please enter a search term above."
-msgstr ""
+msgstr "Напишіть, будь ласка, вище пошуковий термін."
 
 #: aleksis/core/templates/socialaccount/authentication_error.html:5
 #: aleksis/core/templates/socialaccount/authentication_error.html:6
 msgid "Third-party Account Login Failure"
-msgstr ""
+msgstr "Помилка входу стороннього облікового запису"
 
 #: aleksis/core/templates/socialaccount/authentication_error.html:13
 msgid "Third-party Account Login Failure."
-msgstr ""
+msgstr "Помилка входу облікового запису третьої сторони."
 
 #: aleksis/core/templates/socialaccount/authentication_error.html:15
 msgid ""
@@ -2517,43 +2685,50 @@ msgid ""
 "            Please contact one of your site administrators.\n"
 "          "
 msgstr ""
+"\n"
+"            Під час спроби входу з Вашим стороннім обліковим записом виникла помилка входу.\n"
+"            Зверніться, будь ласка, до адміністратора сайту.\n"
+"          "
 
 #: aleksis/core/templates/socialaccount/connections.html:5
 #: aleksis/core/templates/socialaccount/connections.html:6
 msgid "Connections"
-msgstr ""
+msgstr "З'єднання"
 
 #: aleksis/core/templates/socialaccount/connections.html:24
 msgid "Remove"
-msgstr ""
+msgstr "Видалити"
 
 #: aleksis/core/templates/socialaccount/connections.html:34
 msgid "You currently have no third-party accounts connected to this account."
 msgstr ""
+"Зараз у Вас немає облікових записів третіх сторін, з'єднаних з цим обліковим "
+"записом."
 
 #: aleksis/core/templates/socialaccount/connections.html:37
 msgid "Add a Third-party Account"
-msgstr ""
+msgstr "Додати сторонній обліковий запис"
 
 #: aleksis/core/templates/socialaccount/login.html:12
 #, python-format
 msgid "You are about to connect a new third party account from %(provider)s."
-msgstr ""
+msgstr "Ви приєднуєте новий обліковий запис третьої сторони від %(provider)s."
 
 #: aleksis/core/templates/socialaccount/login.html:23
 #, python-format
 msgid "You are about to sign in using a third party account from %(provider)s."
 msgstr ""
+"Ви авторизуєтеся за допомогою стороннього облікового запису від %(provider)s."
 
 #: aleksis/core/templates/socialaccount/login.html:28
 msgid "Continue"
-msgstr ""
+msgstr "Продовжити"
 
 #: aleksis/core/templates/socialaccount/login_cancelled.html:5
 #: aleksis/core/templates/socialaccount/login_cancelled.html:6
 #: aleksis/core/templates/socialaccount/login_cancelled.html:13
 msgid "Login cancelled"
-msgstr ""
+msgstr "Вхід скасований"
 
 #: aleksis/core/templates/socialaccount/login_cancelled.html:15
 #, python-format
@@ -2562,6 +2737,11 @@ msgid ""
 "            You decided to cancel logging in to our site using one of your existing accounts. If this was a mistake, please proceed to <a href=\"%(login_url)s\">sign in</a>.\n"
 "          "
 msgstr ""
+"\n"
+"            Схоже, що Ви скасували вхід до нашого сайту з одним із Ваших "
+"облікових записів. Якщо це сталося помилково, Ви можете <a href=\""
+"%(login_url)s\">продовжити вхід тут</a>.\n"
+"          "
 
 #: aleksis/core/templates/socialaccount/signup.html:12
 #, python-format
@@ -2569,6 +2749,9 @@ msgid ""
 "You are about to use your %(provider_name)s account to login to\n"
 "        %(site_name)s. As a final step, please complete the following form:"
 msgstr ""
+"Ви на шляху до використання свого облікового запису у %(provider_name)s\n"
+"        для входу на %(site_name)s. Заповніть, будь ласка, для завершення цю "
+"форму:"
 
 #: aleksis/core/templates/socialaccount/snippets/provider_list.html:12
 #, python-format
@@ -2577,6 +2760,9 @@ msgid ""
 "                Login with %(name)s\n"
 "              "
 msgstr ""
+"\n"
+"                Вхід з %(name)s\n"
+"              "
 
 #: aleksis/core/templates/socialaccount/snippets/provider_list.html:21
 #, python-format
@@ -2585,6 +2771,9 @@ msgid ""
 "            Login with %(name)s\n"
 "          "
 msgstr ""
+"\n"
+"            Вхід з %(name)s\n"
+"          "
 
 #: aleksis/core/templates/socialaccount/snippets/provider_list.html:30
 msgid ""
@@ -2592,41 +2781,44 @@ msgid ""
 "          No third-party account providers available.\n"
 "        "
 msgstr ""
+"\n"
+"          Провайдери сторонніх облікових записів недоступні.\n"
+"        "
 
 #: aleksis/core/templates/templated_email/base.email:5
 #: aleksis/core/templates/templated_email/base.email:16
 msgid "Hello"
-msgstr ""
+msgstr "Привіт"
 
 #: aleksis/core/templates/templated_email/celery_failure.email:4
 #, python-format
 msgid "Celery task %(task_name)s failed!"
-msgstr ""
+msgstr "Збій у завдання Celery з назвою %(task_name)s!"
 
 #: aleksis/core/templates/templated_email/celery_failure.email:7
 #, python-format
 msgid "the celery task %(task_name)s failed with following information:"
-msgstr ""
+msgstr "у завдання Celery %(task_name)s виникла проблема:"
 
 #: aleksis/core/templates/templated_email/celery_failure.email:10
 #: aleksis/core/templates/templated_email/celery_failure.email:29
 msgid "Task ID"
-msgstr ""
+msgstr "ID завдання"
 
 #: aleksis/core/templates/templated_email/celery_failure.email:11
 #: aleksis/core/templates/templated_email/celery_failure.email:30
 msgid "Raised exception"
-msgstr ""
+msgstr "Викинутий виняток"
 
 #: aleksis/core/templates/templated_email/celery_failure.email:12
 #: aleksis/core/templates/templated_email/celery_failure.email:31
 msgid "Positional arguments"
-msgstr ""
+msgstr "Аргументи"
 
 #: aleksis/core/templates/templated_email/celery_failure.email:15
 #: aleksis/core/templates/templated_email/celery_failure.email:38
 msgid "Keyword arguments"
-msgstr ""
+msgstr "Аргументи з ключовими словами"
 
 #: aleksis/core/templates/templated_email/celery_failure.email:22
 #, python-format
@@ -2635,16 +2827,22 @@ msgid ""
 "      the celery task %(task_name)s failed with following information:\n"
 "    "
 msgstr ""
+"\n"
+"      у завдання Celery %(task_name)s виникла проблема:\n"
+"    "
 
 #: aleksis/core/templates/templated_email/data_checks.email:3
 msgid "The system detected some new problems with your data."
-msgstr ""
+msgstr "Система виявила деякі нові проблеми з Вашими даними."
 
 #: aleksis/core/templates/templated_email/data_checks.email:6
 msgid ""
 "the system detected some new problems with your data.\n"
 "Please take some time to inspect them and solve the issues or mark them as ignored."
 msgstr ""
+"система виявила деякі нові проблеми з Вашими даними.\n"
+"Приділіть, будь ласка, трохи часу для їх перевірки та вирішення проблем або "
+"позначте їх для ігнору."
 
 #: aleksis/core/templates/templated_email/data_checks.email:15
 msgid ""
@@ -2653,39 +2851,44 @@ msgid ""
 "   Please take some time to inspect them and solve the issues or mark them as ignored.\n"
 "  "
 msgstr ""
+"\n"
+"   система виявила деякі нові проблеми з Вашими даними.\n"
+"   Приділіть, будь ласка, трохи часу для їх перевірки та вирішення проблем "
+"або позначте їх для ігнору.\n"
+"  "
 
 #: aleksis/core/templates/templated_email/data_checks.email:23
 msgid "Problem description"
-msgstr ""
+msgstr "Опис проблеми"
 
 #: aleksis/core/templates/templated_email/data_checks.email:24
 msgid "Count of objects with new problems"
-msgstr ""
+msgstr "Кількість об'єктів з новими проблемами"
 
 #: aleksis/core/templates/templated_email/notification.email:4
 msgid "New notification for"
-msgstr ""
+msgstr "Нове сповіщення для"
 
 #: aleksis/core/templates/templated_email/notification.email:6
 #: aleksis/core/templates/templated_email/notification.email:20
 #, python-format
 msgid "Hello %(notification_user)s,"
-msgstr ""
+msgstr "Привіт, %(notification_user)s,"
 
 #: aleksis/core/templates/templated_email/notification.email:9
 #: aleksis/core/templates/templated_email/notification.email:23
 msgid "we got a new notification for you:"
-msgstr ""
+msgstr "у нас для тебе нове сповіщення:"
 
 #: aleksis/core/templates/templated_email/notification.email:15
 #: aleksis/core/templates/templated_email/notification.email:29
 msgid "More information"
-msgstr ""
+msgstr "Більше інформаціЇ"
 
 #: aleksis/core/templates/templated_email/notification.email:17
 #, python-format
 msgid "Sent by %(trans_sender)s at %(trans_created_at)s"
-msgstr ""
+msgstr "Надіслано %(trans_sender)s о %(trans_created_at)s"
 
 #: aleksis/core/templates/templated_email/notification.email:34
 #, python-format
@@ -2694,16 +2897,19 @@ msgid ""
 "            Sent by %(trans_sender)s at %(trans_created_at)s\n"
 "        "
 msgstr ""
+"\n"
+"            Надіслано %(trans_sender)s о %(trans_created_at)s\n"
+"        "
 
 #: aleksis/core/templates/templated_email/person_changed.email:4
 #, python-format
 msgid "%(person)s changed their data!"
-msgstr ""
+msgstr "%(person)s змінили свої дані!"
 
 #: aleksis/core/templates/templated_email/person_changed.email:7
 #, python-format
 msgid "the person %(person)s recently changed the following fields:"
-msgstr ""
+msgstr "особа %(person)s щойно змінила такі поля:"
 
 #: aleksis/core/templates/templated_email/person_changed.email:15
 #, python-format
@@ -2712,19 +2918,22 @@ msgid ""
 "    the person %(person)s recently changed the following fields:\n"
 "  "
 msgstr ""
+"\n"
+"    особа %(person)s щойно змінила такі поля:\n"
+"  "
 
 #: aleksis/core/templates/two_factor/_base_focus.html:6
 #: aleksis/core/templates/two_factor/core/otp_required.html:22
 #: aleksis/core/templates/two_factor/core/setup.html:5
 #: aleksis/core/templates/two_factor/profile/profile.html:88
 msgid "Enable Two-Factor Authentication"
-msgstr ""
+msgstr "Увімкнути двох-факторну автентифікацію"
 
 #: aleksis/core/templates/two_factor/core/backup_tokens.html:5
 #: aleksis/core/templates/two_factor/core/backup_tokens.html:9
 #: aleksis/core/templates/two_factor/profile/profile.html:46
 msgid "Backup Tokens"
-msgstr ""
+msgstr "Бекап Токенів"
 
 #: aleksis/core/templates/two_factor/core/backup_tokens.html:14
 msgid ""
@@ -2736,6 +2945,17 @@ msgid ""
 "        below will be valid.\n"
 "      "
 msgstr ""
+"\n"
+"        Резервні токени можуть бути використані коли Ваші основний та "
+"резервний\n"
+"        телефонні номери не доступні. Резервні токени, що нижче, можуть бути "
+"використані\n"
+"        для перевірки на вході. Коли Ви використаєте усі резервні токени, "
+"Ви\n"
+"        зможете згенерувати новий набір резервних токенів. Дійсними будуть "
+"лише токени,\n"
+"        що нижче.\n"
+"      "
 
 #: aleksis/core/templates/two_factor/core/backup_tokens.html:33
 msgid ""
@@ -2743,41 +2963,48 @@ msgid ""
 "          Print these tokens and keep them somewhere safe.\n"
 "        "
 msgstr ""
+"\n"
+"          Роздрукуйте ці токени та збережіть в надійному місці.\n"
+"        "
 
 #: aleksis/core/templates/two_factor/core/backup_tokens.html:39
 msgid "You don't have any backup codes yet."
-msgstr ""
+msgstr "У Вас поки що немає бекапів кодів."
 
 #: aleksis/core/templates/two_factor/core/backup_tokens.html:45
 msgid "Back to Account Security"
-msgstr ""
+msgstr "Назад до безпеки облікового запису"
 
 #: aleksis/core/templates/two_factor/core/backup_tokens.html:49
 msgid "Generate Tokens"
-msgstr ""
+msgstr "Створити Токени"
 
 #: aleksis/core/templates/two_factor/core/login.html:27
 #, python-format
 msgid "Login for %(name)s"
-msgstr ""
+msgstr "Увійти для %(name)s"
 
 #: aleksis/core/templates/two_factor/core/login.html:30
 msgid "Login with username and password"
-msgstr ""
+msgstr "Увійдіть за допомогою логіна та пароля"
 
 #: aleksis/core/templates/two_factor/core/login.html:38
 msgid ""
 "You have no permission to view this page. Please login with an other\n"
 "                    account."
 msgstr ""
+"Ви не маєте дозволу на перегляд цієї сторінки. Увійдіть, будь ласка,\n"
+"                    з іншим обліковим записом."
 
 #: aleksis/core/templates/two_factor/core/login.html:47
 msgid "Please login with your account to use the external application."
 msgstr ""
+"Для використання зовнішнього додатку увійдіть, будь ласка, у свій обліковий "
+"запис."
 
 #: aleksis/core/templates/two_factor/core/login.html:54
 msgid "Please login to see this page."
-msgstr ""
+msgstr "Для перегляду цієї сторінки, будь ласка, увійдіть."
 
 #: aleksis/core/templates/two_factor/core/login.html:65
 msgid ""
@@ -2786,6 +3013,11 @@ msgid ""
 "                        digits you hear.\n"
 "                      "
 msgstr ""
+"\n"
+"                        Ми зателефонуємо зараз на Ваш номер. Напишіть, будь "
+"ласка, цифри,\n"
+"                        які Ви почуєте.\n"
+"                      "
 
 #: aleksis/core/templates/two_factor/core/login.html:70
 msgid ""
@@ -2794,6 +3026,11 @@ msgid ""
 "                        sent.\n"
 "                      "
 msgstr ""
+"\n"
+"                        Ми надіслали Вам текстове повідомлення. Напишіть, "
+"будь ласка, отриманий\n"
+"                        токен.\n"
+"                      "
 
 #: aleksis/core/templates/two_factor/core/login.html:75
 msgid ""
@@ -2802,6 +3039,10 @@ msgid ""
 "                        generator.\n"
 "                      "
 msgstr ""
+"\n"
+"                        Напишіть, будь ласка, токен, який Ви отримали своїм\n"
+"                        генератором токенів.\n"
+"                      "
 
 #: aleksis/core/templates/two_factor/core/login.html:81
 msgid ""
@@ -2811,30 +3052,38 @@ msgid ""
 "                      enter one of these backup tokens to login to your account.\n"
 "                    "
 msgstr ""
+"\n"
+"                      Для входу скористайтеся формою для введення резервних "
+"токенів.\n"
+"                      Ці токени були згенеровані Вам для друку та зберігання "
+"у надійному місці.\n"
+"                      Щоб увійти напишіть, будь ласка, один з резервних "
+"токенів.\n"
+"                    "
 
 #: aleksis/core/templates/two_factor/core/login.html:109
 msgid "Device currently not available?"
-msgstr ""
+msgstr "Зараз пристрій недоступний?"
 
 #: aleksis/core/templates/two_factor/core/login.html:111
 msgid "Or, alternatively, use one of your backup phones:"
-msgstr ""
+msgstr "Або можете скористатися одним зі своїх резервних телефонів:"
 
 #: aleksis/core/templates/two_factor/core/login.html:122
 msgid "As a last resort, you can use a backup token:"
-msgstr ""
+msgstr "В якості останньої можливості можете скористатися резервним токеном:"
 
 #: aleksis/core/templates/two_factor/core/login.html:125
 msgid "Use Backup Token"
-msgstr ""
+msgstr "Скористатися резервним токеном"
 
 #: aleksis/core/templates/two_factor/core/login.html:136
 msgid "Use alternative login options"
-msgstr ""
+msgstr "Скористайтеся альтернативними можливостями для входу"
 
 #: aleksis/core/templates/two_factor/core/otp_required.html:9
 msgid "Permission Denied"
-msgstr ""
+msgstr "Дозвіл відсутній"
 
 #: aleksis/core/templates/two_factor/core/otp_required.html:10
 msgid ""
@@ -2842,6 +3091,12 @@ msgid ""
 "          two-factor authentication for security reasons. You need to enable these\n"
 "          security features in order to access this page."
 msgstr ""
+"Для перегляду запитуванної сторінки, з огляду на безпеку, необхідна "
+"додаткова\n"
+"          перевірка користувача з використанням двохфакторної автентифікації."
+"\n"
+"          Для доступу до цієї сторінки Вам потрібно увімкнути ці функції "
+"безпеки."
 
 #: aleksis/core/templates/two_factor/core/otp_required.html:14
 msgid ""
@@ -2849,11 +3104,14 @@ msgid ""
 "          account. Enable two-factor authentication for enhanced account\n"
 "          security."
 msgstr ""
+"Двохфакторна автентифікація у Вашому обліковому записі\n"
+"          вимкнена. Для збільшення безпеки обліковки увімкніть двохфакторну\n"
+"          автентифікацію."
 
 #: aleksis/core/templates/two_factor/core/phone_register.html:5
 #: aleksis/core/templates/two_factor/core/phone_register.html:9
 msgid "Add Backup Phone"
-msgstr ""
+msgstr "Додати резервний телефон"
 
 #: aleksis/core/templates/two_factor/core/phone_register.html:12
 msgid ""
@@ -2861,12 +3119,17 @@ msgid ""
 "      account. This number will be used if your primary method of\n"
 "      registration is not available."
 msgstr ""
+"Ви додаєте у свій обліковий запис резервний номер телефону.\n"
+"      Він буде використаний в разі неможливості реєстрації з Вашим\n"
+"      основним номером."
 
 #: aleksis/core/templates/two_factor/core/phone_register.html:16
 msgid ""
 "We've sent a token to your phone number. Please\n"
 "      enter the token you've received."
 msgstr ""
+"Ми надіслали токен на Ваш номер. Напишіть,\n"
+"      будь ласка, отриманий токен."
 
 #: aleksis/core/templates/two_factor/core/setup.html:9
 msgid ""
@@ -2876,6 +3139,12 @@ msgid ""
 "        authentication.\n"
 "      "
 msgstr ""
+"\n"
+"        Ви встановлюєте для свого облікового запису новий рівень безпеки.\n"
+"        Для увімкнення двохфакторної автентифікації пройдіть декілька "
+"кроків\n"
+"        майстра налаштування.\n"
+"      "
 
 #: aleksis/core/templates/two_factor/core/setup.html:17
 msgid ""
@@ -2883,6 +3152,10 @@ msgid ""
 "        Please select which authentication method you would like to use:\n"
 "      "
 msgstr ""
+"\n"
+"        Оберіть, будь ласка, метод автентифікації, який Ви хочете "
+"використовувати:\n"
+"      "
 
 #: aleksis/core/templates/two_factor/core/setup.html:23
 msgid ""
@@ -2892,6 +3165,13 @@ msgid ""
 "        Then, enter the token generated by the app.\n"
 "      "
 msgstr ""
+"\n"
+"        Для того, щоби почати використання генератора токенів, скористйтеся, "
+"будь ласка, своїм\n"
+"        улюбленим додатком для двохфакторної автентифікації (TOTP) та "
+"відскануйте QR-код, що нижче.\n"
+"        Після цього напишіть отриманий генератором токен.\n"
+"      "
 
 #: aleksis/core/templates/two_factor/core/setup.html:34
 msgid ""
@@ -2900,6 +3180,11 @@ msgid ""
 "        text messages on. This number will be validated in the next step.\n"
 "      "
 msgstr ""
+"\n"
+"        Напишіть, будь ласка, номер телефону, на який Ви хочете\n"
+"        отримувати текстові повідомлення. На наступному кроці він буде "
+"перевірений.\n"
+"      "
 
 #: aleksis/core/templates/two_factor/core/setup.html:41
 msgid ""
@@ -2908,6 +3193,10 @@ msgid ""
 "        This number will be validated in the next step.\n"
 "      "
 msgstr ""
+"\n"
+"        Напишіть, будь ласка, номер телефону, на який Ви хочете\n"
+"        отримувати дзвінки. На наступному кроці він буде перевірений.\n"
+"      "
 
 #: aleksis/core/templates/two_factor/core/setup.html:50
 msgid ""
@@ -2915,6 +3204,10 @@ msgid ""
 "            We are calling your phone right now, please enter the digits you hear.\n"
 "          "
 msgstr ""
+"\n"
+"            Ми зараз телефонуємо на Ваш номер, – напишіть, будь ласка, "
+"цифри, які Ви почуєте.\n"
+"          "
 
 #: aleksis/core/templates/two_factor/core/setup.html:56
 msgid ""
@@ -2922,6 +3215,10 @@ msgid ""
 "            We sent you a text message, please enter the tokens we sent.\n"
 "          "
 msgstr ""
+"\n"
+"            Ми надіслали Вам текстове повідомлення. Напишіть, будь ласка, "
+"отримані токени.\n"
+"          "
 
 #: aleksis/core/templates/two_factor/core/setup.html:63
 msgid ""
@@ -2932,6 +3229,12 @@ msgid ""
 "          persists, contact the site administrator.\n"
 "        "
 msgstr ""
+"\n"
+"          Ми помітили, що існує проблема з використанням обраного методу авторизації. Поверніться,\n"
+"          будь ласка, назад, та переконайтеся, що необхідні дані вказані правильно\n"
+"          і спробуйте увійте ще раз, або ж скористайтеся іншим варіантом входу. Якщо ж\n"
+"          проблема залишається, зверніться до адміністратора сайту.\n"
+"        "
 
 #: aleksis/core/templates/two_factor/core/setup.html:73
 msgid ""
@@ -2941,11 +3244,16 @@ msgid ""
 "        account.\n"
 "      "
 msgstr ""
+"\n"
+"        Для ідентифікації та перевірки Вашого YubiKey напишіть,\n"
+"        будь ласка, нижче токен. Ваш YubiKey буде прив'язаний до Вашого\n"
+"        облікового запису.\n"
+"      "
 
 #: aleksis/core/templates/two_factor/core/setup_complete.html:5
 #: aleksis/core/templates/two_factor/core/setup_complete.html:9
 msgid "Two-Factor Authentication successfully enabled"
-msgstr ""
+msgstr "Двохфакторна автентифікація успішно увімкнена"
 
 #: aleksis/core/templates/two_factor/core/setup_complete.html:14
 msgid ""
@@ -2953,16 +3261,19 @@ msgid ""
 "        Congratulations, you've successfully enabled two-factor authentication.\n"
 "      "
 msgstr ""
+"\n"
+"        Вітаємо з успішним налаштуванням двохфакторної автентифікації.\n"
+"      "
 
 #: aleksis/core/templates/two_factor/core/setup_complete.html:24
 #: aleksis/core/templates/two_factor/core/setup_complete.html:44
 msgid "Back to Profile"
-msgstr ""
+msgstr "Назад до Профілю"
 
 #: aleksis/core/templates/two_factor/core/setup_complete.html:28
 #: aleksis/core/templates/two_factor/core/setup_complete.html:48
 msgid "Generate backup codes"
-msgstr ""
+msgstr "Створити резервні коди"
 
 #: aleksis/core/templates/two_factor/core/setup_complete.html:34
 msgid ""
@@ -2972,64 +3283,77 @@ msgid ""
 "          or add a phone number.\n"
 "        "
 msgstr ""
+"\n"
+"          Між іншим, може так статися, що Ви не матимете доступу до свого "
+"основного\n"
+"          пристрою з токенами. Для увімкнення відновлення обліковки створіть "
+"резервні коди\n"
+"          або додайте номер телефону.\n"
+"        "
 
 #: aleksis/core/templates/two_factor/core/setup_complete.html:52
 #: aleksis/core/templates/two_factor/profile/profile.html:41
 msgid "Add Phone Number"
-msgstr ""
+msgstr "Додати номер телефону"
 
 #: aleksis/core/templates/two_factor/profile/disable.html:5
 #: aleksis/core/templates/two_factor/profile/disable.html:9
 #: aleksis/core/templates/two_factor/profile/profile.html:63
 #: aleksis/core/templates/two_factor/profile/profile.html:73
 msgid "Disable Two-Factor Authentication"
-msgstr ""
+msgstr "Вимкнути двохфакторну автентифікацію"
 
 #: aleksis/core/templates/two_factor/profile/disable.html:12
 msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?"
 msgstr ""
+"Ви вимикаєте двохфакторну автентифікацію. Це знизить захист Вашого "
+"облікового запису. Ви впевнені?"
 
 #: aleksis/core/templates/two_factor/profile/disable.html:26
 msgid "Disable"
-msgstr ""
+msgstr "Вимкнути"
 
 #: aleksis/core/templates/two_factor/profile/profile.html:5
 #: aleksis/core/templates/two_factor/profile/profile.html:10
 msgid "Account Security"
-msgstr ""
+msgstr "Безпека облікового запису"
 
 #: aleksis/core/templates/two_factor/profile/profile.html:15
 msgid "Tokens will be generated by your token generator."
-msgstr ""
+msgstr "Токени будуть створені Вашим генератором токенів."
 
 #: aleksis/core/templates/two_factor/profile/profile.html:17
 #, python-format
 msgid "Primary method: %(primary)s"
-msgstr ""
+msgstr "Основний метод: %(primary)s"
 
 #: aleksis/core/templates/two_factor/profile/profile.html:19
 msgid "Tokens will be generated by your YubiKey."
-msgstr ""
+msgstr "Токени будуть створені Вашим YubiKey."
 
 #: aleksis/core/templates/two_factor/profile/profile.html:23
 msgid "Backup Phone Numbers"
-msgstr ""
+msgstr "Резервні номери телефонів"
 
 #: aleksis/core/templates/two_factor/profile/profile.html:24
 msgid ""
 "If your primary method is not available, we are able to\n"
 "        send backup tokens to the phone numbers listed below."
 msgstr ""
+"Якщо Ваш основний метод не буде доступний, ми зможемо\n"
+"        надіслати резервні токени на вказані нижче телефонні номери."
 
 #: aleksis/core/templates/two_factor/profile/profile.html:33
 msgid "Unregister"
-msgstr ""
+msgstr "Скасувати реєстрацію"
 
 #: aleksis/core/templates/two_factor/profile/profile.html:48
 msgid ""
 "If you don't have any device with you, you can access\n"
 "        your account using backup tokens."
 msgstr ""
+"Якщо у Вас немає з собою жодного пристрою, Ви можете\n"
+"        отримати доступ з використанням резервних токенів."
 
 #: aleksis/core/templates/two_factor/profile/profile.html:50
 #, python-format
@@ -3042,11 +3366,25 @@ msgid_plural ""
 "        You have %(counter)s backup tokens remaining.\n"
 "      "
 msgstr[0] ""
+"\n"
+"        У Вас залишився лише один резервний токен.\n"
+"      "
 msgstr[1] ""
+"\n"
+"        У Вас залишилися %(counter)s резервних токени.\n"
+"      "
+msgstr[2] ""
+"\n"
+"        У Вас залишилося %(counter)s резервних токенів.\n"
+"      "
+msgstr[3] ""
+"\n"
+"        У Вас залишився %(counter)s резервний токен.\n"
+"      "
 
 #: aleksis/core/templates/two_factor/profile/profile.html:59
 msgid "Show Codes"
-msgstr ""
+msgstr "Показати коди"
 
 #: aleksis/core/templates/two_factor/profile/profile.html:65
 msgid ""
@@ -3055,6 +3393,11 @@ msgid ""
 "        also disable two-factor authentication for your account.\n"
 "      "
 msgstr ""
+"\n"
+"        Хоча ми рішуче застерігаємо Вас це не робити, Ви можете \n"
+"        також вимкнути двохфакторну автентифікацію для свого облікового "
+"запису.\n"
+"      "
 
 #: aleksis/core/templates/two_factor/profile/profile.html:78
 msgid ""
@@ -3064,197 +3407,206 @@ msgid ""
 "        security.\n"
 "      "
 msgstr ""
+"\n"
+"        Двохфакторна автентифікація для вашого облікового запису\n"
+"        не активована. Для підвищення безпеки облікового запису увімкніть\n"
+"        двохфакторну автентифікацію.\n"
+"      "
 
 #: aleksis/core/util/notifications.py:64
 msgid "E-Mail"
-msgstr ""
+msgstr "Ел.пошта"
 
 #: aleksis/core/util/notifications.py:65
 msgid "SMS"
-msgstr ""
+msgstr "SMS"
 
 #: aleksis/core/util/pdf.py:118
 msgid "Progress: Generate PDF file"
-msgstr ""
+msgstr "Перебіг: Генерація файлу PDF"
 
 #: aleksis/core/util/pdf.py:119
 msgid "Generating PDF file …"
-msgstr ""
+msgstr "Створення файлу PDF …"
 
 #: aleksis/core/util/pdf.py:120
 msgid "The PDF file has been generated successfully."
-msgstr ""
+msgstr "Файл PDF успішно створений."
 
 #: aleksis/core/util/pdf.py:121
 msgid "There was a problem while generating the PDF file."
-msgstr ""
+msgstr "Під час створення файлу PDF виникла проблема."
 
 #: aleksis/core/util/pdf.py:124
 msgid "Download PDF"
-msgstr ""
+msgstr "Звантажити PDF"
 
 #: aleksis/core/views.py:292
 msgid "The school term has been created."
-msgstr ""
+msgstr "Навчальний рік створений."
 
 #: aleksis/core/views.py:304
 msgid "The school term has been saved."
-msgstr ""
+msgstr "Навчальний рік збережений."
 
 #: aleksis/core/views.py:424
 msgid "The child groups were successfully saved."
-msgstr ""
+msgstr "Підлеглі групи збережені."
 
 #: aleksis/core/views.py:443 aleksis/core/views.py:453
 msgid "The person has been saved."
-msgstr ""
+msgstr "Особа збережена."
 
 #: aleksis/core/views.py:503
 msgid "The group has been saved."
-msgstr ""
+msgstr "Група збережена."
 
 #: aleksis/core/views.py:600
 msgid "The announcement has been saved."
-msgstr ""
+msgstr "Оголошення збережене."
 
 #: aleksis/core/views.py:616
 msgid "The announcement has been deleted."
-msgstr ""
+msgstr "Оголошення видалене."
 
 #: aleksis/core/views.py:684
 msgid "The requested preference registry does not exist"
-msgstr ""
+msgstr "Журналу із запитаними властивостями не існує"
 
 #: aleksis/core/views.py:703
 msgid "The preferences have been saved successfully."
-msgstr ""
+msgstr "Властивості збережені."
 
 #: aleksis/core/views.py:727
 msgid "The person has been deleted."
-msgstr ""
+msgstr "Особа видалена."
 
 #: aleksis/core/views.py:741
 msgid "The group has been deleted."
-msgstr ""
+msgstr "Група видалена."
 
 #: aleksis/core/views.py:773
 msgid "The additional_field has been saved."
-msgstr ""
+msgstr "Додаткове поле збережене."
 
 #: aleksis/core/views.py:807
 msgid "The additional field has been deleted."
-msgstr ""
+msgstr "Додаткове поле видалене."
 
 #: aleksis/core/views.py:832
 msgid "The group type has been saved."
-msgstr ""
+msgstr "Тип групи збережений."
 
 #: aleksis/core/views.py:862
 msgid "The group type has been deleted."
-msgstr ""
+msgstr "Тип групи видалений."
 
 #: aleksis/core/views.py:895
 msgid "Progress: Run data checks"
-msgstr ""
+msgstr "Перебіг: Запуск перевірки даних"
 
 #: aleksis/core/views.py:896
 msgid "Run data checks …"
-msgstr ""
+msgstr "Запускається перевірка даних …"
 
 #: aleksis/core/views.py:897
 msgid "The data checks were run successfully."
-msgstr ""
+msgstr "Перевірка даних успішно запущена."
 
 #: aleksis/core/views.py:898
 msgid "There was a problem while running data checks."
-msgstr ""
+msgstr "Під час запуску перевірки даних виникла проблема."
 
 #: aleksis/core/views.py:914
 #, python-brace-format
 msgid "The solve option '{solve_option_obj.verbose_name}' "
-msgstr ""
+msgstr "Варіант розв'язання {solve_option_obj.verbose_name} "
 
 #: aleksis/core/views.py:924
 msgid "The requested solve option does not exist"
-msgstr ""
+msgstr "Запитаний варіант розв'язання не існує"
 
 #: aleksis/core/views.py:956
 msgid "The dashboard widget has been saved."
-msgstr ""
+msgstr "Віджет інформпанелі збережений."
 
 #: aleksis/core/views.py:986
 msgid "The dashboard widget has been created."
-msgstr ""
+msgstr "Віджет інформпанелі створений."
 
 #: aleksis/core/views.py:996
 msgid "The dashboard widget has been deleted."
-msgstr ""
+msgstr "Віджет інформпанелі видалений."
 
 #: aleksis/core/views.py:1067
 msgid "Your dashboard configuration has been saved successfully."
-msgstr ""
+msgstr "Ваша конфігурація інформпанелі збережена."
 
 #: aleksis/core/views.py:1069
 msgid "The configuration of the default dashboard has been saved successfully."
-msgstr ""
+msgstr "Конфігурація типової/стандартної інформпанелі збережена."
 
 #: aleksis/core/views.py:1145
 #, python-brace-format
 msgid "The invitation was successfully created. The invitation code is {code}"
-msgstr ""
+msgstr "Запрошення успішно створене. Код запрошення: {code}"
 
 #: aleksis/core/views.py:1236
 msgid "We have successfully assigned the permissions."
-msgstr ""
+msgstr "Ми успішно призначили дозволи."
 
 #: aleksis/core/views.py:1246
 msgid "The global user permission has been deleted."
-msgstr ""
+msgstr "Глобальний користувацький дозвіл видалений."
 
 #: aleksis/core/views.py:1256
 msgid "The global group permission has been deleted."
-msgstr ""
+msgstr "Глобальний груповий дозвіл видалений."
 
 #: aleksis/core/views.py:1266
 msgid "The object user permission has been deleted."
-msgstr ""
+msgstr "Об'єктний користувацький дозвіл видалений."
 
 #: aleksis/core/views.py:1276
 msgid "The object group permission has been deleted."
-msgstr ""
+msgstr "Об'єктний груповий дозвіл видалений."
 
 #: aleksis/core/views.py:1344
 msgid "The requested PDF file does not exist"
-msgstr ""
+msgstr "Запитаний файл PDF не існує"
 
 #: aleksis/core/views.py:1353 aleksis/core/views.py:1357
 msgid "The requested task does not exist or is not accessible"
-msgstr ""
+msgstr "Запитане завдання не існує або не доступне"
 
 #: 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:1416
 msgid "The third-party account has been successfully disconnected."
-msgstr ""
+msgstr "Обліковий запис третьої сторони успішно від'єднаний."
 
 #: 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:1498
 msgid "Person was already invited."
-msgstr ""
+msgstr "Особа вже була запрошена."
 
 #: aleksis/core/views.py:1598
 msgid "ICal feed updated successfully"
-msgstr ""
+msgstr "Стрічка iCal успішно оновлена"
 
 #: aleksis/core/views.py:1608
 msgid "ICal feed deleted successfully"
-msgstr ""
+msgstr "Стрічка iCal успішно видалена"
 
 #: aleksis/core/views.py:1616
 msgid "ICal feed created successfully"
-msgstr ""
+msgstr "Стрічка iCal успішно створена"
diff --git a/aleksis/core/locale/uk/LC_MESSAGES/djangojs.po b/aleksis/core/locale/uk/LC_MESSAGES/djangojs.po
index fb86a6c606be93efcaa83dd2cd9e65f9489fa157..c224b04ae5ef93df09b6ad7c76288e590557bf0c 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"
@@ -20,18 +20,23 @@ msgstr ""
 "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 ""
+msgstr "Сьогодні"
 
 #: aleksis/core/static/js/main.js:67
 msgid "Cancel"
-msgstr ""
+msgstr "Скасувати"
 
 #: aleksis/core/static/js/main.js:68
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 #: aleksis/core/static/js/main.js:195
-msgid "This page may contain outdated information since there is no internet connection."
+msgid ""
+"This page may contain outdated information since there is no internet "
+"connection."
 msgstr ""
+"Через відсутність інтернет-з'єднання ця сторінка може містити застарілу "
+"інформацію."
diff --git a/aleksis/core/migrations/0040_oauth_allowed_scopes_max_length_255.py b/aleksis/core/migrations/0040_oauth_allowed_scopes_max_length_255.py
new file mode 100644
index 0000000000000000000000000000000000000000..c978c3afc0c2faa7004e78466ec6022db44740bd
--- /dev/null
+++ b/aleksis/core/migrations/0040_oauth_allowed_scopes_max_length_255.py
@@ -0,0 +1,20 @@
+# Generated by Django 3.2.13 on 2022-04-19 16:50
+
+import django.contrib.postgres.fields
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0039_personal_ical_url'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='oauthapplication',
+            name='allowed_scopes',
+            field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=255), blank=True, null=True, size=None, verbose_name='Allowed scopes that clients can request'),
+        ),
+    ]
diff --git a/aleksis/core/migrations/0041_update_gender_choices.py b/aleksis/core/migrations/0041_update_gender_choices.py
new file mode 100644
index 0000000000000000000000000000000000000000..f9f3448ae5332da071e44318db97a0649ba487eb
--- /dev/null
+++ b/aleksis/core/migrations/0041_update_gender_choices.py
@@ -0,0 +1,19 @@
+# Generated by Django 3.2.13 on 2022-06-05 10:55
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0040_oauth_allowed_scopes_max_length_255'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='person',
+            name='sex',
+            field=models.CharField(blank=True, choices=[('f', 'female'), ('m', 'male'), ('x', 'other')], max_length=1, verbose_name='Sex'),
+        ),
+    ]
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index 963c60c99ef8e8b1a9b0ca7ebc31c7c8f298a2f5..2f603ae0d2e2813b50f2024056cb460d71b4e484 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -51,7 +51,12 @@ from oauth2_provider.models import (
 from phonenumber_field.modelfields import PhoneNumberField
 from polymorphic.models import PolymorphicModel
 
-from aleksis.core.data_checks import BrokenDashboardWidgetDataCheck, DataCheck, DataCheckRegistry
+from aleksis.core.data_checks import (
+    BrokenDashboardWidgetDataCheck,
+    DataCheck,
+    DataCheckRegistry,
+    field_validation_data_check_factory,
+)
 
 from .feeds import PersonalICalFeedBase
 from .managers import (
@@ -173,7 +178,7 @@ class Person(ExtensibleModel):
 
     icon_ = "person"
 
-    SEX_CHOICES = [("f", _("female")), ("m", _("male"))]
+    SEX_CHOICES = [("f", _("female")), ("m", _("male")), ("x", _("other"))]
 
     user = models.OneToOneField(
         get_user_model(),
@@ -1064,6 +1069,8 @@ class CustomMenu(ExtensibleModel):
 class CustomMenuItem(ExtensibleModel):
     """Single item in a custom menu."""
 
+    data_checks = [field_validation_data_check_factory("core", "CustomMenuItem", "icon")]
+
     menu = models.ForeignKey(
         CustomMenu, models.CASCADE, verbose_name=_("Menu"), related_name="items"
     )
@@ -1082,6 +1089,9 @@ class CustomMenuItem(ExtensibleModel):
             models.UniqueConstraint(fields=["menu", "name"], name="unique_name_per_menu"),
         ]
 
+    def get_absolute_url(self):
+        return reverse("admin:core_custommenuitem_change", args=[self.id])
+
 
 class GroupType(ExtensibleModel):
     """Group type model.
@@ -1310,7 +1320,7 @@ class OAuthApplication(AbstractApplication):
 
     # Optional list of alloewd scopes
     allowed_scopes = ArrayField(
-        models.CharField(max_length=32),
+        models.CharField(max_length=255),
         verbose_name=_("Allowed scopes that clients can request"),
         null=True,
         blank=True,
diff --git a/aleksis/core/preferences.py b/aleksis/core/preferences.py
index 78b1874356a3a11eab121a56963c9aaf3595d872..230e40686d0782151043723cef9edfffcf5a68b7 100644
--- a/aleksis/core/preferences.py
+++ b/aleksis/core/preferences.py
@@ -333,20 +333,6 @@ class OAuthAllowedGrants(MultipleChoicePreference):
     required = False
 
 
-@site_preferences_registry.register
-class AvailableLanguages(MultipleChoicePreference):
-    """Available languages  of your AlekSIS instance."""
-
-    section = internationalisation
-    name = "languages"
-    default = [code[0] for code in settings.LANGUAGES]
-    widget = SelectMultiple
-    verbose_name = _("Available languages")
-    field_attribute = {"initial": []}
-    choices = settings.LANGUAGES
-    required = True
-
-
 @site_preferences_registry.register
 class DataChecksSendEmails(BooleanPreference):
     """Enable email sending if data checks detect problems."""
diff --git a/aleksis/core/rules.py b/aleksis/core/rules.py
index a6b478f26144b9fdea74804dccdb7a1913b01c30..e12744ff6df91c72f8ec541b8f0c0672d2ddf273 100644
--- a/aleksis/core/rules.py
+++ b/aleksis/core/rules.py
@@ -326,6 +326,9 @@ rules.add_perm("core.can_register", can_register_predicate)
 can_change_password_predicate = is_site_preference_set(section="auth", pref="allow_password_change")
 rules.add_perm("core.can_change_password", can_change_password_predicate)
 
+can_reset_password_predicate = is_site_preference_set(section="auth", pref="allow_password_reset")
+rules.add_perm("core.can_reset_password", can_reset_password_predicate)
+
 # django-invitations
 invite_enabled_predicate = is_site_preference_set(section="auth", pref="invite_enabled")
 rules.add_perm("core.invite_enabled", invite_enabled_predicate)
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index 3fdcbd99316f7f70f6bf232e45509715735e428c..2f742cf2c531346b9ab8ae5e942a830720517cc8 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -144,6 +144,7 @@ INSTALLED_APPS = [
     "dynamic_preferences.users.apps.UserPreferencesConfig",
     "impersonate",
     "two_factor",
+    "two_factor.plugins.phonenumber",
     "material",
     "ckeditor",
     "ckeditor_uploader",
@@ -539,6 +540,7 @@ AUTHENTICATION_BACKENDS.append("allauth.account.auth_backends.AuthenticationBack
 LANGUAGES = [
     ("en", _("English")),
     ("de", _("German")),
+    ("uk", _("Ukrainian")),
 ]
 LANGUAGE_CODE = _settings.get("l10n.lang", "en")
 TIME_ZONE = _settings.get("l10n.tz", "UTC")
@@ -561,20 +563,20 @@ MEDIA_ROOT = _settings.get("media.root", os.path.join(BASE_DIR, "media"))
 NODE_MODULES_ROOT = _settings.get("node_modules.root", os.path.join(BASE_DIR, "node_modules"))
 
 YARN_INSTALLED_APPS = [
-    "cleave.js",
-    "@fontsource/roboto",
-    "jquery",
-    "@materializecss/materialize",
-    "material-design-icons-iconfont",
-    "select2",
-    "select2-materialize",
-    "paper-css",
-    "jquery-sortablejs",
-    "sortablejs",
-    "@sentry/tracing",
-    "luxon",
-    "@iconify/iconify",
-    "@iconify/json",
+    "cleave.js@^1.6.0",
+    "@fontsource/roboto@^4.5.5",
+    "jquery@^3.6.0",
+    "@materializecss/materialize@~1.0.0",
+    "material-design-icons-iconfont@^6.6.0",
+    "select2@^4.1.0-rc.0",
+    "select2-materialize@^0.1.8",
+    "paper-css@^0.4.1",
+    "jquery-sortablejs@^1.0.1",
+    "sortablejs@^1.15.0",
+    "@sentry/tracing@^6.19.6",
+    "luxon@^2.3.2",
+    "@iconify/iconify@^2.2.1",
+    "@iconify/json@^2.1.30",
 ]
 
 merge_app_settings("YARN_INSTALLED_APPS", YARN_INSTALLED_APPS, True)
@@ -629,6 +631,7 @@ SASS_PROCESSOR_INCLUDE_DIRS = [
 ]
 
 ICONIFY_JSON_ROOT = os.path.join(JS_ROOT, "@iconify", "json")
+ICONIFY_COLLECTIONS_ALLOWED = ["mdi"]
 
 ADMINS = _settings.get(
     "contact.admins", [(AUTH_INITIAL_SUPERUSER["username"], AUTH_INITIAL_SUPERUSER["email"])]
diff --git a/aleksis/core/static/public/style.scss b/aleksis/core/static/public/style.scss
index 5a35561c389f5656fd573e8f9b698ae456d42ad5..7aaff6575cbd675a891944a6767291854cc76f78 100644
--- a/aleksis/core/static/public/style.scss
+++ b/aleksis/core/static/public/style.scss
@@ -115,17 +115,15 @@ main {
 /* SIDENAV */
 /***********/
 
-ul.sidenav.sidenav-fixed li.logo {
-  margin-top: 32px;
-  margin-bottom: 50px;
-}
-
 ul.sidenav.sidenav-fixed .brand-logo {
   margin: 0;
+  height: 100%;
 }
 
 .logo img {
-  width: 250px;
+  width: 268px;
+  margin-block: 1em;
+  vertical-align: middle;
 }
 
 .sidenav a:not(.collapsible-header) {
@@ -435,15 +433,16 @@ th.orderable > a {
 
 th.orderable {
   background: no-repeat right center;
-  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M12,18.17L8.83,15L7.42,16.41L12,21L16.59,16.41L15.17,15M12,5.83L15.17,9L16.58,7.59L12,3L7.41,7.59L8.83,9L12,5.83Z' /%3E%3C/svg%3E");
+  background-image: url("../../__icons__/mdi/unfold-more-horizontal.svg");
+  background-size: 24px;
 }
 
 th.orderable.asc {
-  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z' /%3E%3C/svg%3E");
+  background-image: url("../../__icons__/mdi/chevron-up.svg");
 }
 
 th.orderable.desc {
-  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z' /%3E%3C/svg%3E");
+  background-image: url("../../__icons__/mdi/chevron-down.svg");
 }
 
 /*+++++++*/
@@ -991,3 +990,8 @@ p.ical-description {
   margin: 0;
   font-weight: 300;
 }
+
+.table-circle, .table-circle .materialize-circle {
+  height: 4em;
+  width: 4em;
+}
diff --git a/aleksis/core/tables.py b/aleksis/core/tables.py
index f08460bd8654907cb56f655e01014342f8e59ab5..a58c3fc443b3ad66c8df31109cbb6276192518ef 100644
--- a/aleksis/core/tables.py
+++ b/aleksis/core/tables.py
@@ -1,5 +1,6 @@
 from textwrap import wrap
 
+from django.template.loader import render_to_string
 from django.utils.translation import gettext_lazy as _
 
 import django_tables2 as tables
@@ -31,12 +32,65 @@ class PersonsTable(tables.Table):
     """Table to list persons."""
 
     class Meta:
+        model = Person
         attrs = {"class": "highlight"}
+        fields = []
 
     first_name = tables.LinkColumn("person_by_id", args=[A("id")])
     last_name = tables.LinkColumn("person_by_id", args=[A("id")])
 
 
+class FullPersonsTable(PersonsTable):
+    """Table to list persons."""
+
+    photo = tables.Column(verbose_name=_("Photo"), accessor="pk", orderable=False)
+    address = tables.Column(verbose_name=_("Address"), accessor="pk", orderable=False)
+
+    class Meta(PersonsTable.Meta):
+        fields = (
+            "photo",
+            "short_name",
+            "date_of_birth",
+            "sex",
+            "email",
+            "user__username",
+        )
+        sequence = ("photo", "first_name", "last_name", "short_name", "...")
+
+    def render_photo(self, value, record):
+        return render_to_string(
+            "core/partials/avatar_content.html",
+            {
+                "person_or_user": record,
+                "class": "materialize-circle table-circle",
+                "img_class": "materialize-circle",
+            },
+            self.request,
+        )
+
+    def render_address(self, value, record):
+        return render_to_string(
+            "core/partials/address.html",
+            {
+                "person": record,
+            },
+            self.request,
+        )
+
+    def before_render(self, request):
+        """Hide columns if user has no permission to view them."""
+        if not self.request.user.has_perm("core.view_person_rule"):
+            self.columns.hide("date_of_birth")
+            self.columns.hide("sex")
+        if not self.request.user.has_perm("core.view_contact_details_rule"):
+            self.columns.hide("email")
+        if not self.request.user.has_perm("core.view_address"):
+            self.columns.hide("street")
+            self.columns.hide("housenumber")
+            self.columns.hide("postal_code")
+            self.columns.hide("place")
+
+
 class GroupsTable(tables.Table):
     """Table to list groups."""
 
diff --git a/aleksis/core/templates/500.html b/aleksis/core/templates/500.html
index fee566258f556cf5ea2922abd170873d3c212733..d008cd5405f4e5eee73ddf175cab87057e563785 100644
--- a/aleksis/core/templates/500.html
+++ b/aleksis/core/templates/500.html
@@ -8,7 +8,7 @@
       <div class="card-content white-text">
         <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i>
         <span class="card-title">{% trans "Error" %} (500): {% blocktrans %}An unexpected error has
-          occured.{% endblocktrans %}</span>
+          occurred.{% endblocktrans %}</span>
         <p>
           {% blocktrans %}
             Your site administrators will automatically be notified about this
diff --git a/aleksis/core/templates/core/announcement/form.html b/aleksis/core/templates/core/announcement/form.html
index f085758a3395ca74de1dba8e0affec9fb453cc03..60d573d0f0de3cc2f4e3e8409beab1716690715c 100644
--- a/aleksis/core/templates/core/announcement/form.html
+++ b/aleksis/core/templates/core/announcement/form.html
@@ -31,7 +31,7 @@
 
     <button type="submit" class="btn green waves-effect waves-light">
       <i class="material-icons left iconify" data-icon="mdi:content-save-outline"></i>
-      {% trans "Save und publish announcement" %}
+      {% trans "Save and publish announcement" %}
     </button>
   </form>
   {% include_js "select2-materialize" %}
diff --git a/aleksis/core/templates/core/group/full.html b/aleksis/core/templates/core/group/full.html
index 3c6e5488d6174e30847eabcfda2e97b244112938..34b5e647590806e72666701ae0bd1ca1196d9638 100644
--- a/aleksis/core/templates/core/group/full.html
+++ b/aleksis/core/templates/core/group/full.html
@@ -9,7 +9,9 @@
 {% block browser_title %}{{ group.name }}{% endblock %}
 
 {% block content %}
-  <h1>{{ group.name }} <small class="grey-text">{{ group.short_name }}</small></h1>
+  <h1>{{ group.name }}
+    <small class="grey-text">{{ group.short_name }}</small>
+  </h1>
 
   {% has_perm 'core.edit_group_rule' user group as can_change_group %}
   {% has_perm 'core.change_group_preferences_rule' user group as can_change_group_preferences %}
@@ -44,39 +46,57 @@
   <table>
     <tr>
       <th>
-        <i class="material-icons iconify center" data-icon="mdi:shape-outline" title="{% trans "Group type" %}"></i>
+        <i class="material-icons iconify left" data-icon="mdi:shape-outline"></i>
+        {% trans "Group type" %}
       </th>
       <td>
-        {{ group.group_type }}
+        {{ group.group_type|default:"–" }}
       </td>
     </tr>
     <tr>
       <th>
-        <i class="material-icons iconify center" data-icon="mdi:format-vertical-align-top" title="{% trans "Parent groups" %}"></i>
+        <i class="material-icons iconify left" data-icon="mdi:format-vertical-align-top"></i>
+        {% trans "Parent groups" %}
       </th>
       <td>
-        {{ group.parent_groups.all|join:", " }}
+        {{ group.parent_groups.all|join:", "|default:"–" }}
       </td>
     </tr>
   </table>
 
   {% if can_view_group_stats %}
     <h2>{% blocktrans %}Statistics{% endblocktrans %}</h2>
-    <ul>
-      <li>
-        {% trans "Count of members" %}: {{ stats.members }}
-      </li>
+    <table>
+      <tr>
+        <th>
+          <i class="material-icons iconify left" data-icon="mdi:account-group-outline"></i>
+          {% trans "Count of members" %}
+        </th>
+        <td>{{ stats.members }}</td>
+      </tr>
       {% if stats.age_avg %}
-        <li>
-          {% trans "Average age" %}: {{ stats.age_avg|floatformat }}
-        </li>
+        <tr>
+          <th>
+            <i class="material-icons iconify left" data-icon="mdi:cake-variant-outline"></i>
+            {% trans "Average age" %}
+          </th>
+          <td>{{ stats.age_avg|floatformat }}</td>
+        </tr>
       {% endif %}
       {% if stats.age_range_min %}
-        <li>
-          {% trans "Age range" %}: {{ stats.age_range_min }} {% trans "years to" %} {{ stats.age_range_max }} {% trans "years "%}
-        </li>
+        <tr>
+          <th>
+            <i class="material-icons iconify left" data-icon="mdi:calendar-range-outline"></i>
+            {% trans "Age range" %}
+          </th>
+          <td>
+            {% blocktrans with min=stats.age_range_min max=stats.age_range_max %}
+              {{ min }} years to {{ max }} years
+            {% endblocktrans %}
+          </td>
+        </tr>
       {% endif %}
-    </ul>
+    </table>
   {% endif %}
 
   <h2>{% blocktrans %}Owners{% endblocktrans %}</h2>
diff --git a/aleksis/core/templates/core/ical/ical_list.html b/aleksis/core/templates/core/ical/ical_list.html
index 2388feb2daa9c4b31abb80bc830055e2d2d3efc6..3396515d77423542046f5702b14ead4f572aa805 100644
--- a/aleksis/core/templates/core/ical/ical_list.html
+++ b/aleksis/core/templates/core/ical/ical_list.html
@@ -1,8 +1,8 @@
 {% extends 'core/base.html' %}
 {% load i18n msg_box static html_helpers %}
 
-{% block page_title %}{% trans "ICal Feeds" %}{% endblock page_title %}
-{% block browser_title %}{% trans "ICal Feeds" %}{% endblock browser_title %}
+{% block page_title %}{% trans "iCal Feeds" %}{% endblock page_title %}
+{% block browser_title %}{% trans "iCal Feeds" %}{% endblock browser_title %}
 
 {% block content %}
   {% trans "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." as msg %}
diff --git a/aleksis/core/templates/core/partials/address.html b/aleksis/core/templates/core/partials/address.html
new file mode 100644
index 0000000000000000000000000000000000000000..74a01bde2494d94256432923f5f27c279da2e564
--- /dev/null
+++ b/aleksis/core/templates/core/partials/address.html
@@ -0,0 +1,2 @@
+{{ person.street }} {{ person.housenumber }}<br>
+{{ person.postal_code }} {{ person.place }}
diff --git a/aleksis/core/templates/core/partials/footer-menu.html b/aleksis/core/templates/core/partials/footer-menu.html
index 2db2689efed0b3488dc7ba4362d2ff6747863f0e..6a67fa8a8592c5686a1efda8bd0ea9a19e71155b 100644
--- a/aleksis/core/templates/core/partials/footer-menu.html
+++ b/aleksis/core/templates/core/partials/footer-menu.html
@@ -3,7 +3,7 @@
 {% for item in FOOTER_MENU.items.all %}
   <a class="blue-text text-lighten-4 btn-flat" href="{{ item.url }}">
     {% if item.icon %}
-      <i class="material-icons iconify footer-icon left" data-icon="{{ item.icon }}">{{ item.icon }}</i>
+      <i class="material-icons iconify footer-icon left" data-icon="mdi:{{ item.icon }}"></i>
     {% endif %}
     {{ item.name }}
   </a>
diff --git a/aleksis/core/templates/core/partials/language_form.html b/aleksis/core/templates/core/partials/language_form.html
index 197906bb09d6c43d187c63f118261eaf6bbead9e..247dfe386c6dc003e4436415afbf13c34a557612 100644
--- a/aleksis/core/templates/core/partials/language_form.html
+++ b/aleksis/core/templates/core/partials/language_form.html
@@ -8,7 +8,9 @@
   <input name="next" type="hidden" value="{{ request.get_full_path }}">
 
   {% get_current_language as LANGUAGE_CODE %}
-  {% get_language_info_list for request.site.preferences.internationalisation__languages as languages %}
+  {% get_available_languages as LANGUAGES %}
+  {% get_language_info_list for LANGUAGES as languages %}
+
 
   {# Select #}
   <div class="input-field language-field">
diff --git a/aleksis/core/templates/two_factor/core/login.html b/aleksis/core/templates/two_factor/core/login.html
index 77b135569d797181a45bd49d7fd7e9cded4e9a5c..6145855229d9fec9f15edbd8ee597811250e2140 100644
--- a/aleksis/core/templates/two_factor/core/login.html
+++ b/aleksis/core/templates/two_factor/core/login.html
@@ -1,6 +1,6 @@
 {# -*- engine:django -*- #}
 {% extends "two_factor/_base_focus.html" %}
-{% load i18n two_factor account socialaccount %}
+{% load i18n phonenumber account socialaccount %}
 
 {% block browser_title %}
   {% trans "Login" %}
diff --git a/aleksis/core/templates/two_factor/profile/profile.html b/aleksis/core/templates/two_factor/profile/profile.html
index dd9472e7fb9a09051b35d7be57f59dcab1549dae..fe96135d0dfae6fd16ffad4fece50148115c8b69 100644
--- a/aleksis/core/templates/two_factor/profile/profile.html
+++ b/aleksis/core/templates/two_factor/profile/profile.html
@@ -1,5 +1,5 @@
 {% extends "two_factor/_base_focus.html" %}
-{% load i18n two_factor %}
+{% load i18n phonenumber %}
 
 {% block browser_title %}
   {% trans "Account Security" %}
diff --git a/aleksis/core/tests/regression/test_regression.py b/aleksis/core/tests/regression/test_regression.py
index b9d33e6981312817324b92d4fe67176b96763cda..6d6056ad272fa87c9df9d4cf7ba16f87a70dbf40 100644
--- a/aleksis/core/tests/regression/test_regression.py
+++ b/aleksis/core/tests/regression/test_regression.py
@@ -1,10 +1,16 @@
+import base64
+
 from django.contrib.auth import get_user_model
 
 import pytest
 
-from aleksis.core.models import Group, Person
+from aleksis.core.models import Group, OAuthApplication, Person
 
 pytestmark = pytest.mark.django_db
+from django.http import HttpResponse
+from django.test import override_settings
+from django.urls import path, reverse
+from django.views.generic import View
 
 
 def test_all_settigns_registered():
@@ -82,3 +88,72 @@ def test_reassign_user_to_person():
     assert user2.groups.count() == 1
     assert user1.groups.first().name == "Group 2"
     assert user2.groups.first().name == "Group 1"
+
+
+@override_settings(ROOT_URLCONF="aleksis.core.tests.regression.view_oauth")
+def test_no_access_oauth2_client_credentials_without_allowed_scopes(client):
+    """Tests that ClientProtectedResourceMixin doesn't allow access if no allowed scopes are set.
+
+    https://edugit.org/AlekSIS/official/AlekSIS-Core/-/issues/688
+    """
+
+    wrong_application = OAuthApplication.objects.create(
+        name="Test Application",
+        allowed_scopes=[],
+        authorization_grant_type=OAuthApplication.GRANT_CLIENT_CREDENTIALS,
+        client_type=OAuthApplication.CLIENT_CONFIDENTIAL,
+        redirect_uris=["http://localhost:8000/"],
+    )
+    wrong_application_2 = OAuthApplication.objects.create(
+        name="Test Application",
+        allowed_scopes=["read"],
+        authorization_grant_type=OAuthApplication.GRANT_CLIENT_CREDENTIALS,
+        client_type=OAuthApplication.CLIENT_CONFIDENTIAL,
+        redirect_uris=["http://localhost:8000/"],
+    )
+    correct_application = OAuthApplication.objects.create(
+        name="Test Application",
+        allowed_scopes=["write"],
+        authorization_grant_type=OAuthApplication.GRANT_CLIENT_CREDENTIALS,
+        client_type=OAuthApplication.CLIENT_CONFIDENTIAL,
+        redirect_uris=["http://localhost:8000/"],
+    )
+
+    url = reverse("client_protected_resource_mixin_test")
+    auth_header = (
+        "Basic "
+        + base64.b64encode(
+            f"{wrong_application.client_id}:{wrong_application.client_secret}".encode()
+        ).decode()
+    )
+    r = client.get(url, HTTP_AUTHORIZATION=auth_header)
+    assert r.status_code == 403
+
+    auth_header = (
+        "Basic "
+        + base64.b64encode(
+            f"{wrong_application_2.client_id}:{wrong_application_2.client_secret}".encode()
+        ).decode()
+    )
+    r = client.get(url, HTTP_AUTHORIZATION=auth_header)
+    assert r.status_code == 403
+
+    auth_header = (
+        "Basic "
+        + base64.b64encode(
+            f"{correct_application.client_id}:{correct_application.client_secret}".encode()
+        ).decode()
+    )
+    r = client.get(url, HTTP_AUTHORIZATION=auth_header)
+    assert r.status_code == 200
+
+
+def test_change_password_not_logged_in(client):
+    """Tests that CustomPasswordChangeView redirects to login when accessed unauthenticated.
+
+    https://edugit.org/AlekSIS/official/AlekSIS-Core/-/issues/703
+    """
+    response = client.get(reverse("account_change_password"), follow=True)
+
+    assert response.status_code == 200
+    assert "Please login to see this page." in response.content.decode("utf-8")
diff --git a/aleksis/core/tests/regression/view_oauth.py b/aleksis/core/tests/regression/view_oauth.py
new file mode 100644
index 0000000000000000000000000000000000000000..d5671208e127e79c30d7bb179bbf2e82a35616fb
--- /dev/null
+++ b/aleksis/core/tests/regression/view_oauth.py
@@ -0,0 +1,24 @@
+from django.http import HttpResponse
+from django.test import override_settings
+from django.urls import path, reverse
+from django.views.generic import View
+
+from oauth2_provider.views.mixins import ScopedResourceMixin
+
+from aleksis.core.util.auth_helpers import ClientProtectedResourceMixin
+
+
+class TestViewClientProtectedResourceMixin(ScopedResourceMixin, ClientProtectedResourceMixin, View):
+    required_scopes = ["write"]
+
+    def get(self, request):
+        return HttpResponse("OK")
+
+
+urlpatterns = [
+    path(
+        "client_protected_resource_mixin_test/",
+        TestViewClientProtectedResourceMixin.as_view(),
+        name="client_protected_resource_mixin_test",
+    ),
+]
diff --git a/aleksis/core/util/auth_helpers.py b/aleksis/core/util/auth_helpers.py
index 6edfac83373882d077d0a588d822fd3a0d0cc9b4..ca80aeae4a59ac069023465559d599f929bab6d8 100644
--- a/aleksis/core/util/auth_helpers.py
+++ b/aleksis/core/util/auth_helpers.py
@@ -134,6 +134,10 @@ class ClientProtectedResourceMixin(_ClientProtectedResourceMixin):
         # Verify scopes of configured application
         # The OAuth request was enriched with a reference to the Application when using the
         #  validator above.
+        if not oauth_request.client.allowed_scopes:
+            # If there are no allowed scopes, the client is not allowed to access this resource
+            return False
+
         required_scopes = set(self.get_scopes() or [])
         allowed_scopes = set(AppScopes().get_available_scopes(oauth_request.client) or [])
         return required_scopes.issubset(allowed_scopes)
diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py
index ffdba5f45c55454489c8b21c81688458c9808163..67adbf943886d5e503a9009e56b8eeb7f1ed823c 100644
--- a/aleksis/core/util/core_helpers.py
+++ b/aleksis/core/util/core_helpers.py
@@ -23,8 +23,8 @@ from cachalot.signals import post_invalidation
 from cache_memoize import cache_memoize
 
 
-def copyright_years(years: Sequence[int], seperator: str = ", ", joiner: str = "–") -> str:
-    """Take a sequence of integegers and produces a string with ranges.
+def copyright_years(years: Sequence[int], separator: str = ", ", joiner: str = "–") -> str:
+    """Take a sequence of integers and produces a string with ranges.
 
     >>> copyright_years([1999, 2000, 2001, 2005, 2007, 2008, 2009])
     '1999–2001, 2005, 2007–2009'
@@ -38,11 +38,11 @@ def copyright_years(years: Sequence[int], seperator: str = ", ", joiner: str = "
         for range_ in ranges
     ]
 
-    return seperator.join(years_strs)
+    return separator.join(years_strs)
 
 
 def dt_show_toolbar(request: HttpRequest) -> bool:
-    """Add a helper to determin if Django debug toolbar should be displayed.
+    """Add a helper to determine if Django debug toolbar should be displayed.
 
     Extends the default behaviour by enabling DJDT for superusers independent
     of source IP.
diff --git a/aleksis/core/util/model_helpers.py b/aleksis/core/util/model_helpers.py
index 57fab43ab14b787b9300b523e963efbcb0cee121..f1732a72fb3e17ecdcfee18b59cb18d7fd98fd55 100644
--- a/aleksis/core/util/model_helpers.py
+++ b/aleksis/core/util/model_helpers.py
@@ -1,3 +1,5 @@
+from dj_iconify.util import icon_choices
+
 # Materialize colors (without accent, darken and lighten classes)
 COLOURS = [
     ("red", "red"),
@@ -24,938 +26,8 @@ COLOURS = [
     ("transparent", "transparent"),
 ]
 
-# About 1000 icon names from Google's github repository
-ICONS = [
-    ("3d_rotation", "3d_rotation"),
-    ("ac_unit", "ac_unit"),
-    ("access_alarm", "access_alarm"),
-    ("access_alarms", "access_alarms"),
-    ("access_time", "access_time"),
-    ("accessibility", "accessibility"),
-    ("accessible", "accessible"),
-    ("account_balance", "account_balance"),
-    ("account_balance_wallet", "account_balance_wallet"),
-    ("account_box", "account_box"),
-    ("account_circle", "account_circle"),
-    ("adb", "adb"),
-    ("add", "add"),
-    ("add_a_photo", "add_a_photo"),
-    ("add_alarm", "add_alarm"),
-    ("add_alert", "add_alert"),
-    ("add_box", "add_box"),
-    ("add_circle", "add_circle"),
-    ("add_circle_outline", "add_circle_outline"),
-    ("add_location", "add_location"),
-    ("add_shopping_cart", "add_shopping_cart"),
-    ("add_to_photos", "add_to_photos"),
-    ("add_to_queue", "add_to_queue"),
-    ("adjust", "adjust"),
-    ("airline_seat_flat", "airline_seat_flat"),
-    ("airline_seat_flat_angled", "airline_seat_flat_angled"),
-    ("airline_seat_individual_suite", "airline_seat_individual_suite"),
-    ("airline_seat_legroom_extra", "airline_seat_legroom_extra"),
-    ("airline_seat_legroom_normal", "airline_seat_legroom_normal"),
-    ("airline_seat_legroom_reduced", "airline_seat_legroom_reduced"),
-    ("airline_seat_recline_extra", "airline_seat_recline_extra"),
-    ("airline_seat_recline_normal", "airline_seat_recline_normal"),
-    ("airplanemode_active", "airplanemode_active"),
-    ("airplanemode_inactive", "airplanemode_inactive"),
-    ("airplay", "airplay"),
-    ("airport_shuttle", "airport_shuttle"),
-    ("alarm", "alarm"),
-    ("alarm_add", "alarm_add"),
-    ("alarm_off", "alarm_off"),
-    ("alarm_on", "alarm_on"),
-    ("album", "album"),
-    ("all_inclusive", "all_inclusive"),
-    ("all_out", "all_out"),
-    ("android", "android"),
-    ("announcement", "announcement"),
-    ("apps", "apps"),
-    ("archive", "archive"),
-    ("arrow_back", "arrow_back"),
-    ("arrow_downward", "arrow_downward"),
-    ("arrow_drop_down", "arrow_drop_down"),
-    ("arrow_drop_down_circle", "arrow_drop_down_circle"),
-    ("arrow_drop_up", "arrow_drop_up"),
-    ("arrow_forward", "arrow_forward"),
-    ("arrow_upward", "arrow_upward"),
-    ("art_track", "art_track"),
-    ("aspect_ratio", "aspect_ratio"),
-    ("assessment", "assessment"),
-    ("assignment", "assignment"),
-    ("assignment_ind", "assignment_ind"),
-    ("assignment_late", "assignment_late"),
-    ("assignment_return", "assignment_return"),
-    ("assignment_returned", "assignment_returned"),
-    ("assignment_turned_in", "assignment_turned_in"),
-    ("assistant", "assistant"),
-    ("assistant_photo", "assistant_photo"),
-    ("attach_file", "attach_file"),
-    ("attach_money", "attach_money"),
-    ("attachment", "attachment"),
-    ("audiotrack", "audiotrack"),
-    ("autorenew", "autorenew"),
-    ("av_timer", "av_timer"),
-    ("backspace", "backspace"),
-    ("backup", "backup"),
-    ("battery_alert", "battery_alert"),
-    ("battery_charging_full", "battery_charging_full"),
-    ("battery_full", "battery_full"),
-    ("battery_std", "battery_std"),
-    ("battery_unknown", "battery_unknown"),
-    ("beach_access", "beach_access"),
-    ("beenhere", "beenhere"),
-    ("block", "block"),
-    ("bluetooth", "bluetooth"),
-    ("bluetooth_audio", "bluetooth_audio"),
-    ("bluetooth_connected", "bluetooth_connected"),
-    ("bluetooth_disabled", "bluetooth_disabled"),
-    ("bluetooth_searching", "bluetooth_searching"),
-    ("blur_circular", "blur_circular"),
-    ("blur_linear", "blur_linear"),
-    ("blur_off", "blur_off"),
-    ("blur_on", "blur_on"),
-    ("book", "book"),
-    ("bookmark", "bookmark"),
-    ("bookmark_border", "bookmark_border"),
-    ("border_all", "border_all"),
-    ("border_bottom", "border_bottom"),
-    ("border_clear", "border_clear"),
-    ("border_color", "border_color"),
-    ("border_horizontal", "border_horizontal"),
-    ("border_inner", "border_inner"),
-    ("border_left", "border_left"),
-    ("border_outer", "border_outer"),
-    ("border_right", "border_right"),
-    ("border_style", "border_style"),
-    ("border_top", "border_top"),
-    ("border_vertical", "border_vertical"),
-    ("branding_watermark", "branding_watermark"),
-    ("brightness_1", "brightness_1"),
-    ("brightness_2", "brightness_2"),
-    ("brightness_3", "brightness_3"),
-    ("brightness_4", "brightness_4"),
-    ("brightness_5", "brightness_5"),
-    ("brightness_6", "brightness_6"),
-    ("brightness_7", "brightness_7"),
-    ("brightness_auto", "brightness_auto"),
-    ("brightness_high", "brightness_high"),
-    ("brightness_low", "brightness_low"),
-    ("brightness_medium", "brightness_medium"),
-    ("broken_image", "broken_image"),
-    ("brush", "brush"),
-    ("bubble_chart", "bubble_chart"),
-    ("bug_report", "bug_report"),
-    ("build", "build"),
-    ("burst_mode", "burst_mode"),
-    ("business", "business"),
-    ("business_center", "business_center"),
-    ("cached", "cached"),
-    ("cake", "cake"),
-    ("call", "call"),
-    ("call_end", "call_end"),
-    ("call_made", "call_made"),
-    ("call_merge", "call_merge"),
-    ("call_missed", "call_missed"),
-    ("call_missed_outgoing", "call_missed_outgoing"),
-    ("call_received", "call_received"),
-    ("call_split", "call_split"),
-    ("call_to_action", "call_to_action"),
-    ("camera", "camera"),
-    ("camera_alt", "camera_alt"),
-    ("camera_enhance", "camera_enhance"),
-    ("camera_front", "camera_front"),
-    ("camera_rear", "camera_rear"),
-    ("camera_roll", "camera_roll"),
-    ("cancel", "cancel"),
-    ("card_giftcard", "card_giftcard"),
-    ("card_membership", "card_membership"),
-    ("card_travel", "card_travel"),
-    ("casino", "casino"),
-    ("cast", "cast"),
-    ("cast_connected", "cast_connected"),
-    ("center_focus_strong", "center_focus_strong"),
-    ("center_focus_weak", "center_focus_weak"),
-    ("change_history", "change_history"),
-    ("chat", "chat"),
-    ("chat_bubble", "chat_bubble"),
-    ("chat_bubble_outline", "chat_bubble_outline"),
-    ("check", "check"),
-    ("check_box", "check_box"),
-    ("check_box_outline_blank", "check_box_outline_blank"),
-    ("check_circle", "check_circle"),
-    ("chevron_left", "chevron_left"),
-    ("chevron_right", "chevron_right"),
-    ("child_care", "child_care"),
-    ("child_friendly", "child_friendly"),
-    ("chrome_reader_mode", "chrome_reader_mode"),
-    ("class", "class"),
-    ("clear", "clear"),
-    ("clear_all", "clear_all"),
-    ("close", "close"),
-    ("closed_caption", "closed_caption"),
-    ("cloud", "cloud"),
-    ("cloud_circle", "cloud_circle"),
-    ("cloud_done", "cloud_done"),
-    ("cloud_download", "cloud_download"),
-    ("cloud_off", "cloud_off"),
-    ("cloud_queue", "cloud_queue"),
-    ("cloud_upload", "cloud_upload"),
-    ("code", "code"),
-    ("collections", "collections"),
-    ("collections_bookmark", "collections_bookmark"),
-    ("color_lens", "color_lens"),
-    ("colorize", "colorize"),
-    ("comment", "comment"),
-    ("compare", "compare"),
-    ("compare_arrows", "compare_arrows"),
-    ("computer", "computer"),
-    ("confirmation_number", "confirmation_number"),
-    ("contact_mail", "contact_mail"),
-    ("contact_phone", "contact_phone"),
-    ("contacts", "contacts"),
-    ("content_copy", "content_copy"),
-    ("content_cut", "content_cut"),
-    ("content_paste", "content_paste"),
-    ("control_point", "control_point"),
-    ("control_point_duplicate", "control_point_duplicate"),
-    ("copyright", "copyright"),
-    ("create", "create"),
-    ("create_new_folder", "create_new_folder"),
-    ("credit_card", "credit_card"),
-    ("crop", "crop"),
-    ("crop_16_9", "crop_16_9"),
-    ("crop_3_2", "crop_3_2"),
-    ("crop_5_4", "crop_5_4"),
-    ("crop_7_5", "crop_7_5"),
-    ("crop_din", "crop_din"),
-    ("crop_free", "crop_free"),
-    ("crop_landscape", "crop_landscape"),
-    ("crop_original", "crop_original"),
-    ("crop_portrait", "crop_portrait"),
-    ("crop_rotate", "crop_rotate"),
-    ("crop_square", "crop_square"),
-    ("dashboard", "dashboard"),
-    ("data_usage", "data_usage"),
-    ("date_range", "date_range"),
-    ("dehaze", "dehaze"),
-    ("delete", "delete"),
-    ("delete_forever", "delete_forever"),
-    ("delete_sweep", "delete_sweep"),
-    ("description", "description"),
-    ("desktop_mac", "desktop_mac"),
-    ("desktop_windows", "desktop_windows"),
-    ("details", "details"),
-    ("developer_board", "developer_board"),
-    ("developer_mode", "developer_mode"),
-    ("device_hub", "device_hub"),
-    ("devices", "devices"),
-    ("devices_other", "devices_other"),
-    ("dialer_sip", "dialer_sip"),
-    ("dialpad", "dialpad"),
-    ("directions", "directions"),
-    ("directions_bike", "directions_bike"),
-    ("directions_boat", "directions_boat"),
-    ("directions_bus", "directions_bus"),
-    ("directions_car", "directions_car"),
-    ("directions_railway", "directions_railway"),
-    ("directions_run", "directions_run"),
-    ("directions_subway", "directions_subway"),
-    ("directions_transit", "directions_transit"),
-    ("directions_walk", "directions_walk"),
-    ("disc_full", "disc_full"),
-    ("dns", "dns"),
-    ("do_not_disturb", "do_not_disturb"),
-    ("do_not_disturb_alt", "do_not_disturb_alt"),
-    ("do_not_disturb_off", "do_not_disturb_off"),
-    ("do_not_disturb_on", "do_not_disturb_on"),
-    ("dock", "dock"),
-    ("domain", "domain"),
-    ("done", "done"),
-    ("done_all", "done_all"),
-    ("donut_large", "donut_large"),
-    ("donut_small", "donut_small"),
-    ("drafts", "drafts"),
-    ("drag_handle", "drag_handle"),
-    ("drive_eta", "drive_eta"),
-    ("dvr", "dvr"),
-    ("edit", "edit"),
-    ("edit_location", "edit_location"),
-    ("eject", "eject"),
-    ("email", "email"),
-    ("enhanced_encryption", "enhanced_encryption"),
-    ("equalizer", "equalizer"),
-    ("error", "error"),
-    ("error_outline", "error_outline"),
-    ("euro_symbol", "euro_symbol"),
-    ("ev_station", "ev_station"),
-    ("event", "event"),
-    ("event_available", "event_available"),
-    ("event_busy", "event_busy"),
-    ("event_note", "event_note"),
-    ("event_seat", "event_seat"),
-    ("exit_to_app", "exit_to_app"),
-    ("expand_less", "expand_less"),
-    ("expand_more", "expand_more"),
-    ("explicit", "explicit"),
-    ("explore", "explore"),
-    ("exposure", "exposure"),
-    ("exposure_neg_1", "exposure_neg_1"),
-    ("exposure_neg_2", "exposure_neg_2"),
-    ("exposure_plus_1", "exposure_plus_1"),
-    ("exposure_plus_2", "exposure_plus_2"),
-    ("exposure_zero", "exposure_zero"),
-    ("extension", "extension"),
-    ("face", "face"),
-    ("fast_forward", "fast_forward"),
-    ("fast_rewind", "fast_rewind"),
-    ("favorite", "favorite"),
-    ("favorite_border", "favorite_border"),
-    ("featured_play_list", "featured_play_list"),
-    ("featured_video", "featured_video"),
-    ("feedback", "feedback"),
-    ("fiber_dvr", "fiber_dvr"),
-    ("fiber_manual_record", "fiber_manual_record"),
-    ("fiber_new", "fiber_new"),
-    ("fiber_pin", "fiber_pin"),
-    ("fiber_smart_record", "fiber_smart_record"),
-    ("file_download", "file_download"),
-    ("file_upload", "file_upload"),
-    ("filter", "filter"),
-    ("filter_1", "filter_1"),
-    ("filter_2", "filter_2"),
-    ("filter_3", "filter_3"),
-    ("filter_4", "filter_4"),
-    ("filter_5", "filter_5"),
-    ("filter_6", "filter_6"),
-    ("filter_7", "filter_7"),
-    ("filter_8", "filter_8"),
-    ("filter_9", "filter_9"),
-    ("filter_9_plus", "filter_9_plus"),
-    ("filter_b_and_w", "filter_b_and_w"),
-    ("filter_center_focus", "filter_center_focus"),
-    ("filter_drama", "filter_drama"),
-    ("filter_frames", "filter_frames"),
-    ("filter_hdr", "filter_hdr"),
-    ("filter_list", "filter_list"),
-    ("filter_none", "filter_none"),
-    ("filter_tilt_shift", "filter_tilt_shift"),
-    ("filter_vintage", "filter_vintage"),
-    ("find_in_page", "find_in_page"),
-    ("find_replace", "find_replace"),
-    ("fingerprint", "fingerprint"),
-    ("first_page", "first_page"),
-    ("fitness_center", "fitness_center"),
-    ("flag", "flag"),
-    ("flare", "flare"),
-    ("flash_auto", "flash_auto"),
-    ("flash_off", "flash_off"),
-    ("flash_on", "flash_on"),
-    ("flight", "flight"),
-    ("flight_land", "flight_land"),
-    ("flight_takeoff", "flight_takeoff"),
-    ("flip", "flip"),
-    ("flip_to_back", "flip_to_back"),
-    ("flip_to_front", "flip_to_front"),
-    ("folder", "folder"),
-    ("folder_open", "folder_open"),
-    ("folder_shared", "folder_shared"),
-    ("folder_special", "folder_special"),
-    ("font_download", "font_download"),
-    ("format_align_center", "format_align_center"),
-    ("format_align_justify", "format_align_justify"),
-    ("format_align_left", "format_align_left"),
-    ("format_align_right", "format_align_right"),
-    ("format_bold", "format_bold"),
-    ("format_clear", "format_clear"),
-    ("format_color_fill", "format_color_fill"),
-    ("format_color_reset", "format_color_reset"),
-    ("format_color_text", "format_color_text"),
-    ("format_indent_decrease", "format_indent_decrease"),
-    ("format_indent_increase", "format_indent_increase"),
-    ("format_italic", "format_italic"),
-    ("format_line_spacing", "format_line_spacing"),
-    ("format_list_bulleted", "format_list_bulleted"),
-    ("format_list_numbered", "format_list_numbered"),
-    ("format_paint", "format_paint"),
-    ("format_quote", "format_quote"),
-    ("format_shapes", "format_shapes"),
-    ("format_size", "format_size"),
-    ("format_strikethrough", "format_strikethrough"),
-    ("format_textdirection_l_to_r", "format_textdirection_l_to_r"),
-    ("format_textdirection_r_to_l", "format_textdirection_r_to_l"),
-    ("format_underlined", "format_underlined"),
-    ("forum", "forum"),
-    ("forward", "forward"),
-    ("forward_10", "forward_10"),
-    ("forward_30", "forward_30"),
-    ("forward_5", "forward_5"),
-    ("free_breakfast", "free_breakfast"),
-    ("fullscreen", "fullscreen"),
-    ("fullscreen_exit", "fullscreen_exit"),
-    ("functions", "functions"),
-    ("g_translate", "g_translate"),
-    ("gamepad", "gamepad"),
-    ("games", "games"),
-    ("gavel", "gavel"),
-    ("gesture", "gesture"),
-    ("get_app", "get_app"),
-    ("gif", "gif"),
-    ("golf_course", "golf_course"),
-    ("gps_fixed", "gps_fixed"),
-    ("gps_not_fixed", "gps_not_fixed"),
-    ("gps_off", "gps_off"),
-    ("grade", "grade"),
-    ("gradient", "gradient"),
-    ("grain", "grain"),
-    ("graphic_eq", "graphic_eq"),
-    ("grid_off", "grid_off"),
-    ("grid_on", "grid_on"),
-    ("group", "group"),
-    ("group_add", "group_add"),
-    ("group_work", "group_work"),
-    ("hd", "hd"),
-    ("hdr_off", "hdr_off"),
-    ("hdr_on", "hdr_on"),
-    ("hdr_strong", "hdr_strong"),
-    ("hdr_weak", "hdr_weak"),
-    ("headset", "headset"),
-    ("headset_mic", "headset_mic"),
-    ("healing", "healing"),
-    ("hearing", "hearing"),
-    ("help", "help"),
-    ("help_outline", "help_outline"),
-    ("high_quality", "high_quality"),
-    ("highlight", "highlight"),
-    ("highlight_off", "highlight_off"),
-    ("history", "history"),
-    ("home", "home"),
-    ("hot_tub", "hot_tub"),
-    ("hotel", "hotel"),
-    ("hourglass_empty", "hourglass_empty"),
-    ("hourglass_full", "hourglass_full"),
-    ("http", "http"),
-    ("https", "https"),
-    ("image", "image"),
-    ("image_aspect_ratio", "image_aspect_ratio"),
-    ("import_contacts", "import_contacts"),
-    ("import_export", "import_export"),
-    ("important_devices", "important_devices"),
-    ("inbox", "inbox"),
-    ("indeterminate_check_box", "indeterminate_check_box"),
-    ("info", "info"),
-    ("info_outline", "info_outline"),
-    ("input", "input"),
-    ("insert_chart", "insert_chart"),
-    ("insert_comment", "insert_comment"),
-    ("insert_drive_file", "insert_drive_file"),
-    ("insert_emoticon", "insert_emoticon"),
-    ("insert_invitation", "insert_invitation"),
-    ("insert_link", "insert_link"),
-    ("insert_photo", "insert_photo"),
-    ("invert_colors", "invert_colors"),
-    ("invert_colors_off", "invert_colors_off"),
-    ("iso", "iso"),
-    ("keyboard", "keyboard"),
-    ("keyboard_arrow_down", "keyboard_arrow_down"),
-    ("keyboard_arrow_left", "keyboard_arrow_left"),
-    ("keyboard_arrow_right", "keyboard_arrow_right"),
-    ("keyboard_arrow_up", "keyboard_arrow_up"),
-    ("keyboard_backspace", "keyboard_backspace"),
-    ("keyboard_capslock", "keyboard_capslock"),
-    ("keyboard_hide", "keyboard_hide"),
-    ("keyboard_return", "keyboard_return"),
-    ("keyboard_tab", "keyboard_tab"),
-    ("keyboard_voice", "keyboard_voice"),
-    ("kitchen", "kitchen"),
-    ("label", "label"),
-    ("label_outline", "label_outline"),
-    ("landscape", "landscape"),
-    ("language", "language"),
-    ("laptop", "laptop"),
-    ("laptop_chromebook", "laptop_chromebook"),
-    ("laptop_mac", "laptop_mac"),
-    ("laptop_windows", "laptop_windows"),
-    ("last_page", "last_page"),
-    ("launch", "launch"),
-    ("layers", "layers"),
-    ("layers_clear", "layers_clear"),
-    ("leak_add", "leak_add"),
-    ("leak_remove", "leak_remove"),
-    ("lens", "lens"),
-    ("library_add", "library_add"),
-    ("library_books", "library_books"),
-    ("library_music", "library_music"),
-    ("lightbulb_outline", "lightbulb_outline"),
-    ("line_style", "line_style"),
-    ("line_weight", "line_weight"),
-    ("linear_scale", "linear_scale"),
-    ("link", "link"),
-    ("linked_camera", "linked_camera"),
-    ("list", "list"),
-    ("live_help", "live_help"),
-    ("live_tv", "live_tv"),
-    ("local_activity", "local_activity"),
-    ("local_airport", "local_airport"),
-    ("local_atm", "local_atm"),
-    ("local_bar", "local_bar"),
-    ("local_cafe", "local_cafe"),
-    ("local_car_wash", "local_car_wash"),
-    ("local_convenience_store", "local_convenience_store"),
-    ("local_dining", "local_dining"),
-    ("local_drink", "local_drink"),
-    ("local_florist", "local_florist"),
-    ("local_gas_station", "local_gas_station"),
-    ("local_grocery_store", "local_grocery_store"),
-    ("local_hospital", "local_hospital"),
-    ("local_hotel", "local_hotel"),
-    ("local_laundry_service", "local_laundry_service"),
-    ("local_library", "local_library"),
-    ("local_mall", "local_mall"),
-    ("local_movies", "local_movies"),
-    ("local_offer", "local_offer"),
-    ("local_parking", "local_parking"),
-    ("local_pharmacy", "local_pharmacy"),
-    ("local_phone", "local_phone"),
-    ("local_pizza", "local_pizza"),
-    ("local_play", "local_play"),
-    ("local_post_office", "local_post_office"),
-    ("local_printshop", "local_printshop"),
-    ("local_see", "local_see"),
-    ("local_shipping", "local_shipping"),
-    ("local_taxi", "local_taxi"),
-    ("location_city", "location_city"),
-    ("location_disabled", "location_disabled"),
-    ("location_off", "location_off"),
-    ("location_on", "location_on"),
-    ("location_searching", "location_searching"),
-    ("lock", "lock"),
-    ("lock_open", "lock_open"),
-    ("lock_outline", "lock_outline"),
-    ("looks", "looks"),
-    ("looks_3", "looks_3"),
-    ("looks_4", "looks_4"),
-    ("looks_5", "looks_5"),
-    ("looks_6", "looks_6"),
-    ("looks_one", "looks_one"),
-    ("looks_two", "looks_two"),
-    ("loop", "loop"),
-    ("loupe", "loupe"),
-    ("low_priority", "low_priority"),
-    ("loyalty", "loyalty"),
-    ("mail", "mail"),
-    ("mail_outline", "mail_outline"),
-    ("map", "map"),
-    ("markunread", "markunread"),
-    ("markunread_mailbox", "markunread_mailbox"),
-    ("memory", "memory"),
-    ("menu", "menu"),
-    ("merge_type", "merge_type"),
-    ("message", "message"),
-    ("mic", "mic"),
-    ("mic_none", "mic_none"),
-    ("mic_off", "mic_off"),
-    ("mms", "mms"),
-    ("mode_comment", "mode_comment"),
-    ("mode_edit", "mode_edit"),
-    ("monetization_on", "monetization_on"),
-    ("money_off", "money_off"),
-    ("monochrome_photos", "monochrome_photos"),
-    ("mood", "mood"),
-    ("mood_bad", "mood_bad"),
-    ("more", "more"),
-    ("more_horiz", "more_horiz"),
-    ("more_vert", "more_vert"),
-    ("motorcycle", "motorcycle"),
-    ("mouse", "mouse"),
-    ("move_to_inbox", "move_to_inbox"),
-    ("movie", "movie"),
-    ("movie_creation", "movie_creation"),
-    ("movie_filter", "movie_filter"),
-    ("multiline_chart", "multiline_chart"),
-    ("music_note", "music_note"),
-    ("music_video", "music_video"),
-    ("my_location", "my_location"),
-    ("nature", "nature"),
-    ("nature_people", "nature_people"),
-    ("navigate_before", "navigate_before"),
-    ("navigate_next", "navigate_next"),
-    ("navigation", "navigation"),
-    ("near_me", "near_me"),
-    ("network_cell", "network_cell"),
-    ("network_check", "network_check"),
-    ("network_locked", "network_locked"),
-    ("network_wifi", "network_wifi"),
-    ("new_releases", "new_releases"),
-    ("next_week", "next_week"),
-    ("nfc", "nfc"),
-    ("no_encryption", "no_encryption"),
-    ("no_sim", "no_sim"),
-    ("not_interested", "not_interested"),
-    ("note", "note"),
-    ("note_add", "note_add"),
-    ("notifications", "notifications"),
-    ("notifications_active", "notifications_active"),
-    ("notifications_none", "notifications_none"),
-    ("notifications_off", "notifications_off"),
-    ("notifications_paused", "notifications_paused"),
-    ("offline_pin", "offline_pin"),
-    ("ondemand_video", "ondemand_video"),
-    ("opacity", "opacity"),
-    ("open_in_browser", "open_in_browser"),
-    ("open_in_new", "open_in_new"),
-    ("open_with", "open_with"),
-    ("pages", "pages"),
-    ("pageview", "pageview"),
-    ("palette", "palette"),
-    ("pan_tool", "pan_tool"),
-    ("panorama", "panorama"),
-    ("panorama_fish_eye", "panorama_fish_eye"),
-    ("panorama_horizontal", "panorama_horizontal"),
-    ("panorama_vertical", "panorama_vertical"),
-    ("panorama_wide_angle", "panorama_wide_angle"),
-    ("party_mode", "party_mode"),
-    ("pause", "pause"),
-    ("pause_circle_filled", "pause_circle_filled"),
-    ("pause_circle_outline", "pause_circle_outline"),
-    ("payment", "payment"),
-    ("people", "people"),
-    ("people_outline", "people_outline"),
-    ("perm_camera_mic", "perm_camera_mic"),
-    ("perm_contact_calendar", "perm_contact_calendar"),
-    ("perm_data_setting", "perm_data_setting"),
-    ("perm_device_information", "perm_device_information"),
-    ("perm_identity", "perm_identity"),
-    ("perm_media", "perm_media"),
-    ("perm_phone_msg", "perm_phone_msg"),
-    ("perm_scan_wifi", "perm_scan_wifi"),
-    ("person", "person"),
-    ("person_add", "person_add"),
-    ("person_outline", "person_outline"),
-    ("person_pin", "person_pin"),
-    ("person_pin_circle", "person_pin_circle"),
-    ("personal_video", "personal_video"),
-    ("pets", "pets"),
-    ("phone", "phone"),
-    ("phone_android", "phone_android"),
-    ("phone_bluetooth_speaker", "phone_bluetooth_speaker"),
-    ("phone_forwarded", "phone_forwarded"),
-    ("phone_in_talk", "phone_in_talk"),
-    ("phone_iphone", "phone_iphone"),
-    ("phone_locked", "phone_locked"),
-    ("phone_missed", "phone_missed"),
-    ("phone_paused", "phone_paused"),
-    ("phonelink", "phonelink"),
-    ("phonelink_erase", "phonelink_erase"),
-    ("phonelink_lock", "phonelink_lock"),
-    ("phonelink_off", "phonelink_off"),
-    ("phonelink_ring", "phonelink_ring"),
-    ("phonelink_setup", "phonelink_setup"),
-    ("photo", "photo"),
-    ("photo_album", "photo_album"),
-    ("photo_camera", "photo_camera"),
-    ("photo_filter", "photo_filter"),
-    ("photo_library", "photo_library"),
-    ("photo_size_select_actual", "photo_size_select_actual"),
-    ("photo_size_select_large", "photo_size_select_large"),
-    ("photo_size_select_small", "photo_size_select_small"),
-    ("picture_as_pdf", "picture_as_pdf"),
-    ("picture_in_picture", "picture_in_picture"),
-    ("picture_in_picture_alt", "picture_in_picture_alt"),
-    ("pie_chart", "pie_chart"),
-    ("pie_chart_outlined", "pie_chart_outlined"),
-    ("pin_drop", "pin_drop"),
-    ("place", "place"),
-    ("play_arrow", "play_arrow"),
-    ("play_circle_filled", "play_circle_filled"),
-    ("play_circle_outline", "play_circle_outline"),
-    ("play_for_work", "play_for_work"),
-    ("playlist_add", "playlist_add"),
-    ("playlist_add_check", "playlist_add_check"),
-    ("playlist_play", "playlist_play"),
-    ("plus_one", "plus_one"),
-    ("poll", "poll"),
-    ("polymer", "polymer"),
-    ("pool", "pool"),
-    ("portable_wifi_off", "portable_wifi_off"),
-    ("portrait", "portrait"),
-    ("power", "power"),
-    ("power_input", "power_input"),
-    ("power_settings_new", "power_settings_new"),
-    ("pregnant_woman", "pregnant_woman"),
-    ("present_to_all", "present_to_all"),
-    ("print", "print"),
-    ("priority_high", "priority_high"),
-    ("public", "public"),
-    ("publish", "publish"),
-    ("query_builder", "query_builder"),
-    ("question_answer", "question_answer"),
-    ("queue", "queue"),
-    ("queue_music", "queue_music"),
-    ("queue_play_next", "queue_play_next"),
-    ("radio", "radio"),
-    ("radio_button_checked", "radio_button_checked"),
-    ("radio_button_unchecked", "radio_button_unchecked"),
-    ("rate_review", "rate_review"),
-    ("receipt", "receipt"),
-    ("recent_actors", "recent_actors"),
-    ("record_voice_over", "record_voice_over"),
-    ("redeem", "redeem"),
-    ("redo", "redo"),
-    ("refresh", "refresh"),
-    ("remove", "remove"),
-    ("remove_circle", "remove_circle"),
-    ("remove_circle_outline", "remove_circle_outline"),
-    ("remove_from_queue", "remove_from_queue"),
-    ("remove_red_eye", "remove_red_eye"),
-    ("remove_shopping_cart", "remove_shopping_cart"),
-    ("reorder", "reorder"),
-    ("repeat", "repeat"),
-    ("repeat_one", "repeat_one"),
-    ("replay", "replay"),
-    ("replay_10", "replay_10"),
-    ("replay_30", "replay_30"),
-    ("replay_5", "replay_5"),
-    ("reply", "reply"),
-    ("reply_all", "reply_all"),
-    ("report", "report"),
-    ("report_problem", "report_problem"),
-    ("restaurant", "restaurant"),
-    ("restaurant_menu", "restaurant_menu"),
-    ("restore", "restore"),
-    ("restore_page", "restore_page"),
-    ("ring_volume", "ring_volume"),
-    ("room", "room"),
-    ("room_service", "room_service"),
-    ("rotate_90_degrees_ccw", "rotate_90_degrees_ccw"),
-    ("rotate_left", "rotate_left"),
-    ("rotate_right", "rotate_right"),
-    ("rounded_corner", "rounded_corner"),
-    ("router", "router"),
-    ("rowing", "rowing"),
-    ("rss_feed", "rss_feed"),
-    ("rv_hookup", "rv_hookup"),
-    ("satellite", "satellite"),
-    ("save", "save"),
-    ("scanner", "scanner"),
-    ("schedule", "schedule"),
-    ("school", "school"),
-    ("screen_lock_landscape", "screen_lock_landscape"),
-    ("screen_lock_portrait", "screen_lock_portrait"),
-    ("screen_lock_rotation", "screen_lock_rotation"),
-    ("screen_rotation", "screen_rotation"),
-    ("screen_share", "screen_share"),
-    ("sd_card", "sd_card"),
-    ("sd_storage", "sd_storage"),
-    ("search", "search"),
-    ("security", "security"),
-    ("select_all", "select_all"),
-    ("send", "send"),
-    ("sentiment_dissatisfied", "sentiment_dissatisfied"),
-    ("sentiment_neutral", "sentiment_neutral"),
-    ("sentiment_satisfied", "sentiment_satisfied"),
-    ("sentiment_very_dissatisfied", "sentiment_very_dissatisfied"),
-    ("sentiment_very_satisfied", "sentiment_very_satisfied"),
-    ("settings", "settings"),
-    ("settings_applications", "settings_applications"),
-    ("settings_backup_restore", "settings_backup_restore"),
-    ("settings_bluetooth", "settings_bluetooth"),
-    ("settings_brightness", "settings_brightness"),
-    ("settings_cell", "settings_cell"),
-    ("settings_ethernet", "settings_ethernet"),
-    ("settings_input_antenna", "settings_input_antenna"),
-    ("settings_input_component", "settings_input_component"),
-    ("settings_input_composite", "settings_input_composite"),
-    ("settings_input_hdmi", "settings_input_hdmi"),
-    ("settings_input_svideo", "settings_input_svideo"),
-    ("settings_overscan", "settings_overscan"),
-    ("settings_phone", "settings_phone"),
-    ("settings_power", "settings_power"),
-    ("settings_remote", "settings_remote"),
-    ("settings_system_daydream", "settings_system_daydream"),
-    ("settings_voice", "settings_voice"),
-    ("share", "share"),
-    ("shop", "shop"),
-    ("shop_two", "shop_two"),
-    ("shopping_basket", "shopping_basket"),
-    ("shopping_cart", "shopping_cart"),
-    ("short_text", "short_text"),
-    ("show_chart", "show_chart"),
-    ("shuffle", "shuffle"),
-    ("signal_cellular_4_bar", "signal_cellular_4_bar"),
-    ("signal_cellular_connected_no_internet_4_bar", "signal_cellular_connected_no_internet_4_bar"),
-    ("signal_cellular_no_sim", "signal_cellular_no_sim"),
-    ("signal_cellular_null", "signal_cellular_null"),
-    ("signal_cellular_off", "signal_cellular_off"),
-    ("signal_wifi_4_bar", "signal_wifi_4_bar"),
-    ("signal_wifi_4_bar_lock", "signal_wifi_4_bar_lock"),
-    ("signal_wifi_off", "signal_wifi_off"),
-    ("sim_card", "sim_card"),
-    ("sim_card_alert", "sim_card_alert"),
-    ("skip_next", "skip_next"),
-    ("skip_previous", "skip_previous"),
-    ("slideshow", "slideshow"),
-    ("slow_motion_video", "slow_motion_video"),
-    ("smartphone", "smartphone"),
-    ("smoke_free", "smoke_free"),
-    ("smoking_rooms", "smoking_rooms"),
-    ("sms", "sms"),
-    ("sms_failed", "sms_failed"),
-    ("snooze", "snooze"),
-    ("sort", "sort"),
-    ("sort_by_alpha", "sort_by_alpha"),
-    ("spa", "spa"),
-    ("space_bar", "space_bar"),
-    ("speaker", "speaker"),
-    ("speaker_group", "speaker_group"),
-    ("speaker_notes", "speaker_notes"),
-    ("speaker_notes_off", "speaker_notes_off"),
-    ("speaker_phone", "speaker_phone"),
-    ("spellcheck", "spellcheck"),
-    ("star", "star"),
-    ("star_border", "star_border"),
-    ("star_half", "star_half"),
-    ("stars", "stars"),
-    ("stay_current_landscape", "stay_current_landscape"),
-    ("stay_current_portrait", "stay_current_portrait"),
-    ("stay_primary_landscape", "stay_primary_landscape"),
-    ("stay_primary_portrait", "stay_primary_portrait"),
-    ("stop", "stop"),
-    ("stop_screen_share", "stop_screen_share"),
-    ("storage", "storage"),
-    ("store", "store"),
-    ("store_mall_directory", "store_mall_directory"),
-    ("straighten", "straighten"),
-    ("streetview", "streetview"),
-    ("strikethrough_s", "strikethrough_s"),
-    ("style", "style"),
-    ("subdirectory_arrow_left", "subdirectory_arrow_left"),
-    ("subdirectory_arrow_right", "subdirectory_arrow_right"),
-    ("subject", "subject"),
-    ("subscriptions", "subscriptions"),
-    ("subtitles", "subtitles"),
-    ("subway", "subway"),
-    ("supervisor_account", "supervisor_account"),
-    ("surround_sound", "surround_sound"),
-    ("swap_calls", "swap_calls"),
-    ("swap_horiz", "swap_horiz"),
-    ("swap_vert", "swap_vert"),
-    ("swap_vertical_circle", "swap_vertical_circle"),
-    ("switch_camera", "switch_camera"),
-    ("switch_video", "switch_video"),
-    ("sync", "sync"),
-    ("sync_disabled", "sync_disabled"),
-    ("sync_problem", "sync_problem"),
-    ("system_update", "system_update"),
-    ("system_update_alt", "system_update_alt"),
-    ("tab", "tab"),
-    ("tab_unselected", "tab_unselected"),
-    ("tablet", "tablet"),
-    ("tablet_android", "tablet_android"),
-    ("tablet_mac", "tablet_mac"),
-    ("tag_faces", "tag_faces"),
-    ("tap_and_play", "tap_and_play"),
-    ("terrain", "terrain"),
-    ("text_fields", "text_fields"),
-    ("text_format", "text_format"),
-    ("textsms", "textsms"),
-    ("texture", "texture"),
-    ("theaters", "theaters"),
-    ("thumb_down", "thumb_down"),
-    ("thumb_up", "thumb_up"),
-    ("thumbs_up_down", "thumbs_up_down"),
-    ("time_to_leave", "time_to_leave"),
-    ("timelapse", "timelapse"),
-    ("timeline", "timeline"),
-    ("timer", "timer"),
-    ("timer_10", "timer_10"),
-    ("timer_3", "timer_3"),
-    ("timer_off", "timer_off"),
-    ("title", "title"),
-    ("toc", "toc"),
-    ("today", "today"),
-    ("toll", "toll"),
-    ("tonality", "tonality"),
-    ("touch_app", "touch_app"),
-    ("toys", "toys"),
-    ("track_changes", "track_changes"),
-    ("traffic", "traffic"),
-    ("train", "train"),
-    ("tram", "tram"),
-    ("transfer_within_a_station", "transfer_within_a_station"),
-    ("transform", "transform"),
-    ("translate", "translate"),
-    ("trending_down", "trending_down"),
-    ("trending_flat", "trending_flat"),
-    ("trending_up", "trending_up"),
-    ("tune", "tune"),
-    ("turned_in", "turned_in"),
-    ("turned_in_not", "turned_in_not"),
-    ("tv", "tv"),
-    ("unarchive", "unarchive"),
-    ("undo", "undo"),
-    ("unfold_less", "unfold_less"),
-    ("unfold_more", "unfold_more"),
-    ("update", "update"),
-    ("usb", "usb"),
-    ("verified_user", "verified_user"),
-    ("vertical_align_bottom", "vertical_align_bottom"),
-    ("vertical_align_center", "vertical_align_center"),
-    ("vertical_align_top", "vertical_align_top"),
-    ("vibration", "vibration"),
-    ("video_call", "video_call"),
-    ("video_label", "video_label"),
-    ("video_library", "video_library"),
-    ("videocam", "videocam"),
-    ("videocam_off", "videocam_off"),
-    ("videogame_asset", "videogame_asset"),
-    ("view_agenda", "view_agenda"),
-    ("view_array", "view_array"),
-    ("view_carousel", "view_carousel"),
-    ("view_column", "view_column"),
-    ("view_comfy", "view_comfy"),
-    ("view_compact", "view_compact"),
-    ("view_day", "view_day"),
-    ("view_headline", "view_headline"),
-    ("view_list", "view_list"),
-    ("view_module", "view_module"),
-    ("view_quilt", "view_quilt"),
-    ("view_stream", "view_stream"),
-    ("view_week", "view_week"),
-    ("vignette", "vignette"),
-    ("visibility", "visibility"),
-    ("visibility_off", "visibility_off"),
-    ("voice_chat", "voice_chat"),
-    ("voicemail", "voicemail"),
-    ("volume_down", "volume_down"),
-    ("volume_mute", "volume_mute"),
-    ("volume_off", "volume_off"),
-    ("volume_up", "volume_up"),
-    ("vpn_key", "vpn_key"),
-    ("vpn_lock", "vpn_lock"),
-    ("wallpaper", "wallpaper"),
-    ("warning", "warning"),
-    ("watch", "watch"),
-    ("watch_later", "watch_later"),
-    ("wb_auto", "wb_auto"),
-    ("wb_cloudy", "wb_cloudy"),
-    ("wb_incandescent", "wb_incandescent"),
-    ("wb_iridescent", "wb_iridescent"),
-    ("wb_sunny", "wb_sunny"),
-    ("wc", "wc"),
-    ("web", "web"),
-    ("web_asset", "web_asset"),
-    ("weekend", "weekend"),
-    ("whatshot", "whatshot"),
-    ("widgets", "widgets"),
-    ("wifi", "wifi"),
-    ("wifi_lock", "wifi_lock"),
-    ("wifi_tethering", "wifi_tethering"),
-    ("work", "work"),
-    ("wrap_text", "wrap_text"),
-    ("youtube_searched_for", "youtube_searched_for"),
-    ("zoom_in", "zoom_in"),
-    ("zoom_out", "zoom_out"),
-    ("zoom_out_map", "zoom_out_map"),
-]
+try:
+    ICONS = icon_choices("mdi")
+except FileNotFoundError:
+    # If icons aren't installed yet, set choices to empty list
+    ICONS = []
diff --git a/aleksis/core/views.py b/aleksis/core/views.py
index ed20571dd83aee3bfc5d3bc4fd1dc2c8a7211b1d..38d8f8c7dac99a1f81d2b34d89dd65db078eda8c 100644
--- a/aleksis/core/views.py
+++ b/aleksis/core/views.py
@@ -4,6 +4,7 @@ from urllib.parse import urlencode, urlparse, urlunparse
 
 from django.apps import apps
 from django.conf import settings
+from django.contrib.auth.mixins import LoginRequiredMixin
 from django.contrib.auth.models import Group as DjangoGroup
 from django.contrib.auth.models import Permission, User
 from django.contrib.contenttypes.models import ContentType
@@ -115,6 +116,7 @@ from .registries import (
 from .tables import (
     AdditionalFieldsTable,
     DashboardWidgetTable,
+    FullPersonsTable,
     GroupGlobalPermissionTable,
     GroupObjectPermissionTable,
     GroupsTable,
@@ -358,7 +360,7 @@ def group(request: HttpRequest, id_: int) -> HttpResponse:
     members = group.members.all()
 
     # Build table
-    members_table = PersonsTable(members)
+    members_table = FullPersonsTable(members)
     RequestConfig(request).configure(members_table)
     context["members_table"] = members_table
 
@@ -366,7 +368,7 @@ def group(request: HttpRequest, id_: int) -> HttpResponse:
     owners = group.owners.all()
 
     # Build table
-    owners_table = PersonsTable(owners)
+    owners_table = FullPersonsTable(owners)
     RequestConfig(request).configure(owners_table)
     context["owners_table"] = owners_table
 
@@ -770,7 +772,7 @@ def edit_additional_field(request: HttpRequest, id_: Optional[int] = None) -> Ht
         if edit_additional_field_form.is_valid():
             edit_additional_field_form.save(commit=True)
 
-            messages.success(request, _("The additional_field has been saved."))
+            messages.success(request, _("The additional field has been saved."))
 
             return redirect("additional_fields")
 
@@ -1358,7 +1360,7 @@ class CeleryProgressView(View):
         return get_progress(request, task_id, *args, **kwargs)
 
 
-class CustomPasswordChangeView(PermissionRequiredMixin, PasswordChangeView):
+class CustomPasswordChangeView(LoginRequiredMixin, PermissionRequiredMixin, PasswordChangeView):
     """Custom password change view to allow to disable changing of password."""
 
     permission_required = "core.can_change_password"
@@ -1595,7 +1597,7 @@ class ICalFeedEditView(PermissionRequiredMixin, AdvancedEditView):
     model = PersonalICalUrl
     template_name = "core/ical/ical_edit.html"
     success_url = reverse_lazy("ical_feed_list")
-    success_message = _("ICal feed updated successfully")
+    success_message = _("iCal feed updated successfully")
     permission_required = "core.edit_ical_rule"
 
     fields = ["name", "ical_feed"]
@@ -1605,7 +1607,7 @@ class ICalFeedDeleteView(PermissionRequiredMixin, AdvancedDeleteView):
     model = PersonalICalUrl
     template_name = "core/pages/delete.html"
     success_url = reverse_lazy("ical_feed_list")
-    success_message = _("ICal feed deleted successfully")
+    success_message = _("iCal feed deleted successfully")
     permission_required = "core.delete_ical_rule"
 
 
@@ -1613,7 +1615,7 @@ class ICalFeedCreateView(PermissionRequiredMixin, AdvancedCreateView):
     model = PersonalICalUrl
     template_name = "core/ical/ical_create.html"
     success_url = reverse_lazy("ical_feed_list")
-    success_message = _("ICal feed created successfully")
+    success_message = _("iCal feed created successfully")
     permission_required = "core.create_ical_rule"
 
     fields = ["name", "ical_feed"]
diff --git a/docs/admin/01_core_concepts.rst b/docs/admin/01_core_concepts.rst
index cdd49c7183217897b09cf1fda5575307e0a5f08c..2d626927ae2845594a0a67525d213064f2581e97 100644
--- a/docs/admin/01_core_concepts.rst
+++ b/docs/admin/01_core_concepts.rst
@@ -1,3 +1,5 @@
+.. _core-concept:
+
 Concepts of the AlekSIS core
 ============================
 
@@ -93,7 +95,7 @@ In contrast to persons, groups are supposed to be **linked to school
 terms** (but they don’t have to be). For example, the composition of a
 class or a course varies from school term to school term. In order to
 archive historical data according to local laws, these groups have to be
-separeted which is solved by linking them to a school term.
+separated which is solved by linking them to a school term.
 
 Manage groups
 ~~~~~~~~~~~~~
diff --git a/docs/admin/10_install.rst b/docs/admin/10_install.rst
index f8b41d0d98efd5daa1df64a5fceea9ae5b86c662..05baa14a8c76f91b3407c47a97c2609c0decad6d 100644
--- a/docs/admin/10_install.rst
+++ b/docs/admin/10_install.rst
@@ -55,7 +55,8 @@ Install some packages from the Debian package system.
                chromium \
                redis-server \
                postgresql \
-               locales-all
+               locales-all \
+               celery
 
 Create PostgreSQL user and database
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -78,7 +79,6 @@ Create the directories for storage
             /usr/share/aleksis/{static,node_modules} \
             /var/lib/aleksis/media \
             /var/backups/aleksis
-   chown -R www-data:www-data /var/lib/aleksis
 
 Create AlekSIS configuration file
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -111,6 +111,18 @@ favourite text editor and adding the following configuration.
    password = "admin"
    email = "root@localhost"
 
+Make sure you specify the correct `allowed_hosts`. It is used for things like the OpenID Connect issuer and the standard mail domain.
+
+Generate OpenID Connect certificate
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+OpenID Connect needs a certificate, which you need to generate and assign required permissions.
+
+.. code-block:: shell
+
+   openssl genrsa -out /etc/aleksis/oidc.pem
+   chown www-data:www-data /etc/aleksis/oidc.pem
+
 Install AlekSIS itself
 ~~~~~~~~~~~~~~~~~~~~~~
 
@@ -119,14 +131,30 @@ They will pull the AlekSIS standard distribution from `PyPI`_ and install it to
 system-wide `dist-packages` of Python. Afterwards, it will download frontend dependencies
 from `yarnpkg`, collect static files, and migrate the database to the final schema.
 
+`aleksis` is a meta-package which will install the :ref:`core-concept`  and all official apps. If you want to install only the AlekSIS Core and your own set of apps, you can install `aleksis-core` instead of `aleksis`.
+
+You only need to install these additional dependencies if installing the meta-package:
+
 .. code-block:: shell
+   apt install libmariadb-dev libldap2-dev libsasl2-dev
+
+After that, you can install the aleksis meta-package, or only `aleksis-core`:
 
+.. code-block:: shell
    pip3 install aleksis
    aleksis-admin yarn install
    aleksis-admin collectstatic
    aleksis-admin migrate
    aleksis-admin createinitialrevisions
 
+Make dynamic content writable for webserver
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To make AlekSIS® able to write dynamic content, you need to assign permissions to the webserver user.
+
+.. code-block:: shell
+   chown -R www-data:www-data /var/lib/aleksis
+
 .. _core-configure-uwsgi:
 
 Configure uWSGI
diff --git a/docs/admin/21_ldap.rst b/docs/admin/21_ldap.rst
index 7b123a594154950482a6cdf7ac095a3030ee5359..389b3fca9c9c0f0af8f2f54fe448d87daf7bf776 100644
--- a/docs/admin/21_ldap.rst
+++ b/docs/admin/21_ldap.rst
@@ -13,7 +13,7 @@ the AlekSIS system (see below).
 Installing packages for LDAP support
 ------------------------------------
 
-Installing the necessary librairies for LDAP support unfortunately is not
+Installing the necessary libraries for LDAP support unfortunately is not
 very straightforward under all circumstances. On Debian, install these packages::
 
   sudo apt install python3-ldap libldap2-dev libssl-dev libsasl2-dev python3-dev
diff --git a/docs/admin/22_registration.rst b/docs/admin/22_registration.rst
index 510500f2198ec6377c91d97bf1be903411f0daea..84ae59f0c881772b72ca023bdb68c53c62717fca 100644
--- a/docs/admin/22_registration.rst
+++ b/docs/admin/22_registration.rst
@@ -4,7 +4,7 @@ Registration and user invitations
 In addition to central management of user accounts, AlekSIS allows self-registration
 by users. Registration can be either fully open, or based on personal invitations.
 
-In a system handling ciritcal data, access control should be as tight as possible.
+In a system handling critical data, access control should be as tight as possible.
 However, there are scenarios where central account creation is not feasible, e.g.
 for optional guardian accounts. In such a scenario, the invitation system allows
 for processes like handing out invitation codes as a letter or through e-mail
diff --git a/docs/admin/31_monitoring.rst b/docs/admin/31_monitoring.rst
index 1847297352a135aafdff954d98eb2a2cc1a69573..0d079bf4b615e2c4bebb0af1dca6f736d4fce49f 100644
--- a/docs/admin/31_monitoring.rst
+++ b/docs/admin/31_monitoring.rst
@@ -58,7 +58,7 @@ Monitoring with Icinga2
 
 As already mentioned, there is a JSON endpoint at
 https://aleksis.example.com/health/. You can use an json check plugin to
-check seperate health checks or just use a HTTP check to check if the
+check separate health checks or just use a HTTP check to check if the
 site returns HTTP 200.
 
 Performance monitoring with Prometheus
diff --git a/docs/conf.py b/docs/conf.py
index dc58a3b9a1acc1ecb89552e27e33a4c66dd48c96..b31ca6be5a35d2e169c9c13c52de1180b108b608 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -29,9 +29,9 @@ copyright = "2019-2022 The AlekSIS team"
 author = "The AlekSIS Team"
 
 # The short X.Y version
-version = "2.8"
+version = "2.9"
 # The full version, including alpha/beta/rc tags
-release = "2.8.2.dev0"
+release = "2.9.1.dev0"
 
 
 # -- General configuration ---------------------------------------------------
diff --git a/docs/dev/01_setup.rst b/docs/dev/01_setup.rst
index e52941af0c77b266ffd74bf410cccb0ef04b2678..75cf677a7f43703dc5e6a389e97be28fcf813a02 100644
--- a/docs/dev/01_setup.rst
+++ b/docs/dev/01_setup.rst
@@ -2,7 +2,7 @@ Setting up the development environment
 ======================================
 
 AlekSIS and all official apps use `Poetry`_ to manage virtualenvs and
-dependencies. You should make yourself a bit confortable with poetry
+dependencies. You should make yourself a bit comfortable with poetry
 by reading its documentation.
 
 Poetry makes a lot of stuff very easy, especially managing a virtual
diff --git a/docs/dev/03_run_tests.rst b/docs/dev/03_run_tests.rst
index c50eda52d1c04d183c518a938a6f6a7a1c579ab3..9d38bdf6382d250ce6d1d05dfae37e699c268afa 100644
--- a/docs/dev/03_run_tests.rst
+++ b/docs/dev/03_run_tests.rst
@@ -29,7 +29,7 @@ setting certain environment variables:
 
 Selenium tests are enabled if `TEST_SELENIUM_BROWSERS` is non-empty.
 
-To set variables, use env to wrap the tox ommand::
+To set variables, use env to wrap the tox command::
 
   TEST_SELENIUM_BROWSERS=chrome,firefox tox
 
@@ -69,5 +69,5 @@ look like they should or for documentation purposes.
 To enable screenshots, add the `TEST_SCREENSHOT_PATH` environment variable
 when running the tests.
 
-If runnin multiple browsers, screenshots are placed in separate directories
+If running multiple browsers, screenshots are placed in separate directories
 per browser.
diff --git a/docs/user/01_registration.rst b/docs/user/01_registration.rst
index 3beb4fb51621af47b97a51a1cb6719773249ecf7..19d0b7a893c00f12b0c92fc5f71b0209edbaab8d 100644
--- a/docs/user/01_registration.rst
+++ b/docs/user/01_registration.rst
@@ -15,7 +15,7 @@ AlekSIS account.
   :alt: Signup formular
 
 If enabled, you have to verify your email address after signup. To do so, click
-on the link you recieved on the email address you entered in the signup form.
+on the link you received on the email address you entered in the signup form.
 
 .. note::
    Normally, AlekSIS does not allow public registratio, and all accounts are
@@ -32,5 +32,5 @@ enter it. You will be redirected to the signup form.
   :width: 100%
   :alt: Accept invitation
 
-If you've recieved an invitation link (e.g. via email), clicking the link
+If you've received an invitation link (e.g. via email), clicking the link
 will redirect you to the signup form automatically.
diff --git a/docs/user/02_personal_account.rst b/docs/user/02_personal_account.rst
index a506b9e759ddf0b9f0e8235db784c51c150317c8..fe584615cefbaf284a6b3ba2cfd7babeca076f0d 100644
--- a/docs/user/02_personal_account.rst
+++ b/docs/user/02_personal_account.rst
@@ -90,6 +90,6 @@ Authorized applications
 -----------------------
 
 On the page ``Account → Authorized applications`` you can see all
-external applications you authorized to retreive data about you from
+external applications you authorized to retrieve data about you from
 AlekSIS. That can be services provided by your local institution like a
 chat platform, for example.
diff --git a/pyproject.toml b/pyproject.toml
index 1b73c5c2106156a4770b862f9a320b57159622ff..548e785e3db046aa57d0627239ad906452b79ce7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "AlekSIS-Core"
-version = "2.8.2.dev0"
+version = "2.9.1.dev0"
 packages = [
     { include = "aleksis" }
 ]
@@ -71,7 +71,7 @@ django-ipware = "^4.0"
 django-impersonate = "^1.4"
 psycopg2 = "^2.8"
 django_select2 = "^7.1"
-django-two-factor-auth = { version = "^1.12.1", extras = [ "yubikey", "phonenumbers", "call", "sms" ] }
+django-two-factor-auth = { version = "^1.14.0", extras = [ "yubikey", "phonenumbers", "call", "sms" ] }
 django-yarnpkg = "^6.0"
 django-material = "^1.6.0"
 django-dynamic-preferences = "^1.11"
@@ -88,7 +88,7 @@ django-celery-beat = "^2.2.0"
 django-celery-email = "^3.0.0"
 django-jsonstore = "^0.5.0"
 django-polymorphic = "^3.0.0"
-django-colorfield = "^0.6.0"
+django-colorfield = "^0.7.0"
 django-bleach = "^2.0.0"
 django-guardian = "^2.2.0"
 rules = "^3.0"
@@ -127,7 +127,7 @@ sentry-sdk = {version = "^1.4.3", optional = true}
 django-cte = "^1.1.5"
 pycountry = "^22.0.0"
 django-ical = "^1.8.3"
-django-iconify = "^0.2.0"
+django-iconify = "^0.3"
 customidenticon = "^0.1.5"
 
 [tool.poetry.extras]