diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index d75780ad34191d1f61cf384ba4136474855e9ece..fc5d823afdd0a646c8569c1b7497ac71bd228ea1 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -9,6 +9,34 @@ and this project adheres to `Semantic Versioning`_.
 Unreleased
 ----------
 
+Added
+~~~~~
+
+* Allow configuration of database options
+
+Fixed
+~~~~~
+
+* Correctly update theme colours on change again
+* Use correct favicon as default AlekSIS favicon
+* Show all years in a 200 year range around the current year in date pickers
+
+Removed
+~~~~~~~
+
+* Remove old generated AlekSIS icons
+* Imprint is now called "Imprint" and not "Impress".
+* Logo files weren't uploaded to public namespace.
+
+`2.3.1`_ – 2021-12-17
+---------------------
+
+Fixed
+~~~~~
+
+* Small files could fail to upload to S3 storage due to MemoryFileUploadHandler
+* Corrected typos in previous changelog
+
 `2.3`_ – 2021-12-15
 -------------------
 
@@ -534,4 +562,5 @@ Fixed
 .. _2.1.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.1.1
 .. _2.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.2
 .. _2.2.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.2.1
-.. _2.2.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.3
+.. _2.3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.3
+.. _2.3.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.3.1
diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py
index 3232aac4deb912dfb65f28d69831767bf2fd8445..c6cee9a8c6bbefed3439eef156b685f5484e4a13 100644
--- a/aleksis/core/mixins.py
+++ b/aleksis/core/mixins.py
@@ -1,5 +1,6 @@
 # flake8: noqa: DJ12
 
+import os
 from datetime import datetime
 from typing import Any, Callable, List, Optional, Union
 
@@ -21,6 +22,8 @@ from django.views.generic import CreateView, UpdateView
 from django.views.generic.edit import DeleteView, ModelFormMixin
 
 import reversion
+from dynamic_preferences.settings import preferences_settings
+from dynamic_preferences.types import FilePreference
 from guardian.admin import GuardedModelAdmin
 from guardian.core import ObjectPermissionChecker
 from jsonstore.fields import IntegerField, JSONFieldMixin
@@ -529,3 +532,14 @@ class SchoolTermRelatedExtensibleForm(ExtensibleForm):
             kwargs["initial"] = {"school_term": SchoolTerm.current}
 
         super().__init__(*args, **kwargs)
+
+
+class PublicFilePreferenceMixin(FilePreference):
+    """Uploads a file to the public namespace."""
+
+    upload_path = "public"
+
+    def get_upload_path(self):
+        return os.path.join(
+            self.upload_path, preferences_settings.FILE_PREFERENCE_UPLOAD_DIR, self.identifier()
+        )
diff --git a/aleksis/core/preferences.py b/aleksis/core/preferences.py
index a102cb39873bdeb492156fc60597ce728ffc853f..c16032349e58dc4134e6bba064864e1724f688fe 100644
--- a/aleksis/core/preferences.py
+++ b/aleksis/core/preferences.py
@@ -16,6 +16,7 @@ from dynamic_preferences.types import (
 )
 from oauth2_provider.models import AbstractApplication
 
+from .mixins import PublicFilePreferenceMixin
 from .models import Group, Person
 from .registries import person_preferences_registry, site_preferences_registry
 from .util.notifications import get_notification_choices_lazy
@@ -78,7 +79,7 @@ class ColourSecondary(StringPreference):
 
 
 @site_preferences_registry.register
-class Logo(FilePreference):
+class Logo(PublicFilePreferenceMixin, FilePreference):
     """Logo of your AlekSIS instance."""
 
     section = theme
@@ -88,7 +89,7 @@ class Logo(FilePreference):
 
 
 @site_preferences_registry.register
-class Favicon(FilePreference):
+class Favicon(PublicFilePreferenceMixin, FilePreference):
     """Favicon of your AlekSIS instance."""
 
     section = theme
@@ -98,7 +99,7 @@ class Favicon(FilePreference):
 
 
 @site_preferences_registry.register
-class PWAIcon(FilePreference):
+class PWAIcon(PublicFilePreferenceMixin, FilePreference):
     """PWA-Icon of your AlekSIS instance."""
 
     section = theme
diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index 52026cd4af12bd7003bea6fab07a370f5ed799df..5634286b0dffa0be97b58d70d82b43e7ef3d8e13 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -220,6 +220,7 @@ DATABASES = {
         "HOST": _settings.get("database.host", "127.0.0.1"),
         "PORT": _settings.get("database.port", "5432"),
         "CONN_MAX_AGE": _settings.get("database.conn_max_age", None),
+        "OPTIONS": _settings.get("database.options", {}),
     }
 }
 
@@ -330,8 +331,8 @@ SOCIALACCOUNT_EMAIL_REQUIRED = False
 # Cooldown for verification mails
 ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN = _settings.get("auth.registration.verification_cooldown", 180)
 
-# Require email verification after sigm up
-ACCOUNT_EMAIL_VERIFICATION = _settings.get("auth.registration.email_verification", "mandatory")
+# Require email verification after sign up
+ACCOUNT_EMAIL_VERIFICATION = _settings.get("auth.registration.email_verification", "optional")
 SOCIALACCOUNT_EMAIL_VERIFICATION = False
 
 # Email subject prefix for verification mails
@@ -408,7 +409,7 @@ if _settings.get("ldap.uri", None):
         AUTH_LDAP_BIND_DN = _settings.get("ldap.bind.dn")
         AUTH_LDAP_BIND_PASSWORD = _settings.get("ldap.bind.password")
 
-    # Keep local password for users to be required to proveide their old password on change
+    # Keep local password for users to be required to provide their old password on change
     AUTH_LDAP_SET_USABLE_PASSWORD = _settings.get("ldap.handle_passwords", True)
 
     # Keep bound as the authenticating user
@@ -482,7 +483,7 @@ if _settings.get("ldap.uri", None):
                 "is_superuser"
             ]
 
-# Add ModelBckend last so all other backends get a chance
+# Add ModelBackend last so all other backends get a chance
 # to verify passwords first
 AUTHENTICATION_BACKENDS.append("django.contrib.auth.backends.ModelBackend")
 
@@ -681,7 +682,7 @@ if _settings.get("dev.uwsgi.celery", DEBUG):
 
 DEFAULT_FAVICON_PATHS = {
     "pwa_icon": os.path.join(STATIC_ROOT, "img/aleksis-icon.png"),
-    "favicon": os.path.join(STATIC_ROOT, "img/aleksis-icon.png"),
+    "favicon": os.path.join(STATIC_ROOT, "img/aleksis-favicon.png"),
 }
 PWA_ICONS_CONFIG = {
     "android": [192, 512],
@@ -880,10 +881,16 @@ PROMETHEUS_METRICS_EXPORT_ADDRESS = _settings.get("prometheus.metrucs.address",
 
 SECURE_PROXY_SSL_HEADER = ("REQUEST_SCHEME", "https")
 
+FILE_UPLOAD_HANDLERS = [
+    "django.core.files.uploadhandler.MemoryFileUploadHandler",
+    "django.core.files.uploadhandler.TemporaryFileUploadHandler",
+]
+
 if _settings.get("storage.type", "").lower() == "s3":
     INSTALLED_APPS.append("storages")
 
     DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
+    FILE_UPLOAD_HANDLERS.remove("django.core.files.uploadhandler.MemoryFileUploadHandler")
 
     if _settings.get("storage.s3.static.enabled", False):
         STATICFILES_STORAGE = "storages.backends.s3boto3.S3StaticStorage"
diff --git a/aleksis/core/static/icons/android_192.png b/aleksis/core/static/icons/android_192.png
deleted file mode 100644
index b5f7fec68184883830f68dabc606f7a95c45e8bb..0000000000000000000000000000000000000000
Binary files a/aleksis/core/static/icons/android_192.png and /dev/null differ
diff --git a/aleksis/core/static/icons/android_512.png b/aleksis/core/static/icons/android_512.png
deleted file mode 100644
index 5e042b4f98ef6dd8056ce643ad16ba085658684e..0000000000000000000000000000000000000000
Binary files a/aleksis/core/static/icons/android_512.png and /dev/null differ
diff --git a/aleksis/core/static/icons/apple_114.png b/aleksis/core/static/icons/apple_114.png
deleted file mode 100644
index eb8db13ad567105a819dab802b4f7ddd360e34be..0000000000000000000000000000000000000000
Binary files a/aleksis/core/static/icons/apple_114.png and /dev/null differ
diff --git a/aleksis/core/static/icons/apple_152.png b/aleksis/core/static/icons/apple_152.png
deleted file mode 100644
index 51eaa8d28988a16629e2b884d8de4df58fbadccc..0000000000000000000000000000000000000000
Binary files a/aleksis/core/static/icons/apple_152.png and /dev/null differ
diff --git a/aleksis/core/static/icons/apple_180.png b/aleksis/core/static/icons/apple_180.png
deleted file mode 100644
index 5c6b70846586ef0bf4bd44d177f6f79b49d1cddd..0000000000000000000000000000000000000000
Binary files a/aleksis/core/static/icons/apple_180.png and /dev/null differ
diff --git a/aleksis/core/static/icons/apple_76.png b/aleksis/core/static/icons/apple_76.png
deleted file mode 100644
index 3751b84654d01943148fc6f1b90125a4195d4af9..0000000000000000000000000000000000000000
Binary files a/aleksis/core/static/icons/apple_76.png and /dev/null differ
diff --git a/aleksis/core/static/icons/favicon_16.png b/aleksis/core/static/icons/favicon_16.png
deleted file mode 100644
index f1d02a7a8a34825726d20eeb1f6a63922d1a848e..0000000000000000000000000000000000000000
Binary files a/aleksis/core/static/icons/favicon_16.png and /dev/null differ
diff --git a/aleksis/core/static/icons/favicon_32.png b/aleksis/core/static/icons/favicon_32.png
deleted file mode 100644
index edc72d4556cce0fde923a0ac3db4d0f94bb74412..0000000000000000000000000000000000000000
Binary files a/aleksis/core/static/icons/favicon_32.png and /dev/null differ
diff --git a/aleksis/core/static/icons/favicon_48.png b/aleksis/core/static/img/aleksis-favicon.png
similarity index 100%
rename from aleksis/core/static/icons/favicon_48.png
rename to aleksis/core/static/img/aleksis-favicon.png
diff --git a/aleksis/core/static/js/main.js b/aleksis/core/static/js/main.js
index 1d2a2fe28e3c4304e72d8abfc398f0fda3908586..119103b5ea3885f290410a42758a5f672caffdc4 100644
--- a/aleksis/core/static/js/main.js
+++ b/aleksis/core/static/js/main.js
@@ -19,7 +19,8 @@ function initDatePicker(sel) {
 
         // Set monday as first day of week
         firstDay: get_format('FIRST_DAY_OF_WEEK'),
-        autoClose: true
+        autoClose: true,
+        yearRange: [new Date().getFullYear() - 100, new Date().getFullYear() + 100],
     });
     el.datepicker("setDate", $(sel).val());
     return el;
diff --git a/aleksis/core/templates/core/base.html b/aleksis/core/templates/core/base.html
index 6c47c2a3bd0da7ba02e4c8aa96e7a5787cd933c0..06aebc4533369e9b7af39051dcb80713193f50d5 100644
--- a/aleksis/core/templates/core/base.html
+++ b/aleksis/core/templates/core/base.html
@@ -180,7 +180,7 @@
         <span id="doit"></span>
         {% if request.site.preferences.footer__imprint_url %}
           <a class="blue-text text-lighten-4" href="{{ request.site.preferences.footer__imprint_url }}">
-            {% trans "Impress" %}
+            {% trans "Imprint" %}
           </a>
         {% endif %}
         {% if request.site.preferences.footer__privacy_url and request.site.preferences.footer__imprint_url %}
diff --git a/aleksis/core/util/notifications.py b/aleksis/core/util/notifications.py
index 38d27057033752d6ae7cdefce9c53b4728447b80..dac344b7a2e2877d65ff1bc80b580b860bf1067f 100644
--- a/aleksis/core/util/notifications.py
+++ b/aleksis/core/util/notifications.py
@@ -21,7 +21,7 @@ except ImportError:
 def send_templated_sms(
     template_name: str, from_number: str, recipient_list: Sequence[str], context: dict
 ) -> None:
-    """Render a plan-text template and send via SMS to all recipients."""
+    """Render a plain-text template and send via SMS to all recipients."""
     template = get_template(template_name)
     text = template.render(context)
 
diff --git a/aleksis/core/util/sass_helpers.py b/aleksis/core/util/sass_helpers.py
index 2579ed83a6f7d7f143456e227f1c662987ba3f55..21e3d0bacd0700dc7c0db74182e547e6c885172c 100644
--- a/aleksis/core/util/sass_helpers.py
+++ b/aleksis/core/util/sass_helpers.py
@@ -23,7 +23,7 @@ def get_preference(section: str, name: str) -> str:
 def clean_scss(*args, **kwargs) -> None:
     """Unlink compiled CSS (i.e. cache invalidation)."""
     sass_storage = SassFileStorage()
-    __, files = sass_storage.listdir("")
+    __, files = sass_storage.listdir("public")
 
     for source_map in filter(lambda x: x.endswith(".css.map"), files):
-        sass_storage.delete(source_map)
+        sass_storage.delete(f"public/{source_map}")
diff --git a/poetry.lock b/poetry.lock
index e2ada35150452f88b9b938018d462f83ba6c94cb..ae88339c6c08269f7afd095c863bf502365245b6 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -13,7 +13,7 @@ reference = "gitlab"
 
 [[package]]
 name = "aleksis-builddeps"
-version = "5+20211215233237.4a1a3adc"
+version = "5+20211220215335.6c652982"
 description = "AlekSIS (School Information System) — Build/Dev dependencies for apps"
 category = "dev"
 optional = false
@@ -54,7 +54,7 @@ reference = "gitlab"
 
 [[package]]
 name = "amqp"
-version = "5.0.7"
+version = "5.0.9"
 description = "Low-level AMQP client for Python (fork of amqplib)."
 category = "main"
 optional = false
@@ -300,14 +300,14 @@ reference = "gitlab"
 
 [[package]]
 name = "boto3"
-version = "1.20.24"
+version = "1.20.25"
 description = "The AWS SDK for Python"
 category = "main"
 optional = true
 python-versions = ">= 3.6"
 
 [package.dependencies]
-botocore = ">=1.23.24,<1.24.0"
+botocore = ">=1.23.25,<1.24.0"
 jmespath = ">=0.7.1,<1.0.0"
 s3transfer = ">=0.5.0,<0.6.0"
 
@@ -321,7 +321,7 @@ reference = "gitlab"
 
 [[package]]
 name = "botocore"
-version = "1.23.24"
+version = "1.23.25"
 description = "Low-level, data-driven core of boto 3."
 category = "main"
 optional = true
@@ -374,19 +374,20 @@ reference = "gitlab"
 
 [[package]]
 name = "celery"
-version = "5.0.2"
+version = "5.1.2"
 description = "Distributed Task Queue."
 category = "main"
 optional = false
 python-versions = ">=3.6,"
 
 [package.dependencies]
-billiard = ">=3.6.3.0,<4.0"
-click = ">=7.0"
+billiard = ">=3.6.4.0,<4.0"
+click = ">=7.0,<8.0"
 click-didyoumean = ">=0.0.3"
+click-plugins = ">=1.1.1"
 click-repl = ">=0.1.6"
 Django = {version = ">=1.11", optional = true, markers = "extra == \"django\""}
-kombu = ">=5.0.0,<6.0"
+kombu = ">=5.1.0,<6.0"
 pytz = ">0.0-dev"
 redis = {version = ">=3.2.0", optional = true, markers = "extra == \"redis\""}
 vine = ">=5.0.0,<6.0"
@@ -394,10 +395,10 @@ vine = ">=5.0.0,<6.0"
 [package.extras]
 arangodb = ["pyArango (>=1.3.2)"]
 auth = ["cryptography"]
-azureblockblob = ["azure-storage (==0.36.0)", "azure-common (==1.1.5)", "azure-storage-common (==1.1.0)"]
+azureblockblob = ["azure-storage-blob (==12.6.0)"]
 brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"]
 cassandra = ["cassandra-driver (<3.21.0)"]
-consul = ["python-consul"]
+consul = ["python-consul2"]
 cosmosdbsql = ["pydocumentdb (==2.3.2)"]
 couchbase = ["couchbase (>=3.0.0)"]
 couchdb = ["pycouchdb"]
@@ -407,12 +408,12 @@ elasticsearch = ["elasticsearch"]
 eventlet = ["eventlet (>=0.26.1)"]
 gevent = ["gevent (>=1.0.0)"]
 librabbitmq = ["librabbitmq (>=1.5.0)"]
-lzma = ["backports.lzma"]
 memcache = ["pylibmc"]
 mongodb = ["pymongo[srv] (>=3.3.0)"]
 msgpack = ["msgpack"]
 pymemcache = ["python-memcached"]
 pyro = ["pyro4"]
+pytest = ["pytest-celery"]
 redis = ["redis (>=3.2.0)"]
 s3 = ["boto3 (>=1.9.125)"]
 slmq = ["softlayer-messaging (>=1.0.3)"]
@@ -512,14 +513,11 @@ reference = "gitlab"
 
 [[package]]
 name = "click"
-version = "8.0.3"
+version = "7.1.2"
 description = "Composable command line interface toolkit"
 category = "main"
 optional = false
-python-versions = ">=3.6"
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
 [package.source]
 type = "legacy"
@@ -542,6 +540,25 @@ type = "legacy"
 url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
 reference = "gitlab"
 
+[[package]]
+name = "click-plugins"
+version = "1.1.1"
+description = "An extension module for click to enable registering CLI commands via setuptools entry-points."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+click = ">=4.0"
+
+[package.extras]
+dev = ["pytest (>=3.6)", "pytest-cov", "wheel", "coveralls"]
+
+[package.source]
+type = "legacy"
+url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
+reference = "gitlab"
+
 [[package]]
 name = "click-repl"
 version = "0.2.0"
@@ -802,7 +819,7 @@ reference = "gitlab"
 
 [[package]]
 name = "django-auth-ldap"
-version = "3.0.0"
+version = "4.0.0"
 description = "Django LDAP authentication backend."
 category = "main"
 optional = true
@@ -1048,7 +1065,7 @@ reference = "gitlab"
 
 [[package]]
 name = "django-favicon-plus-reloaded"
-version = "1.1.3"
+version = "1.1.5"
 description = "simple Django app which allows you to upload a image and it renders a wide variety for html link tags to display the favicon"
 category = "main"
 optional = false
@@ -1174,7 +1191,7 @@ reference = "gitlab"
 
 [[package]]
 name = "django-ipware"
-version = "4.0.0"
+version = "4.0.2"
 description = "A Django application to retrieve user's IP address"
 category = "main"
 optional = false
@@ -1291,18 +1308,17 @@ reference = "gitlab"
 
 [[package]]
 name = "django-oauth-toolkit"
-version = "1.5.0"
+version = "1.6.0"
 description = "OAuth2 Provider for Django"
 category = "main"
 optional = false
 python-versions = "*"
 
 [package.dependencies]
-django = ">=2.2"
+django = ">=2.2,<4.0.0 || >4.0.0"
 jwcrypto = ">=0.8.0"
 oauthlib = ">=3.1.0"
 requests = ">=2.13.0"
-six = "*"
 
 [package.source]
 type = "legacy"
@@ -1384,7 +1400,7 @@ reference = "gitlab"
 
 [[package]]
 name = "django-prometheus"
-version = "2.1.0"
+version = "2.2.0"
 description = "Django middlewares to monitor your application with Prometheus.io."
 category = "main"
 optional = false
@@ -3965,7 +3981,7 @@ sentry = ["sentry-sdk"]
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.9"
-content-hash = "a862d441f977bd11bacc8f9e020f80a021feff42d9dc942b7aaa3b4de912cc78"
+content-hash = "497fd9e9a0ad8940bdf3a8014c0e22f26282b48acc983f553bcfcccb227cea83"
 
 [metadata.files]
 alabaster = [
@@ -3973,12 +3989,12 @@ alabaster = [
     {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"},
 ]
 aleksis-builddeps = [
-    {file = "AlekSIS-Builddeps-5+20211215233237.4a1a3adc.tar.gz", hash = "sha256:a015c947580768bf77c7c2e5bd2778ec55a909f19bcaf42f673d5d1d88ffd298"},
-    {file = "AlekSIS_Builddeps-5+20211215233237.4a1a3adc-py3-none-any.whl", hash = "sha256:93ff1acb87b349165e89a3bd459e9cb47ba092ac7d221da5d495bbc430ad40af"},
+    {file = "AlekSIS-Builddeps-5+20211220215335.6c652982.tar.gz", hash = "sha256:e1b5302b70315008077398ba08c4fa8524ef5e406cde4b3997396b9064b1e5bb"},
+    {file = "AlekSIS_Builddeps-5+20211220215335.6c652982-py3-none-any.whl", hash = "sha256:da831d7aa5fbbcb3994d5a0ece5e37e04dbd3908125285f549b003a4a7d45446"},
 ]
 amqp = [
-    {file = "amqp-5.0.7-py3-none-any.whl", hash = "sha256:4d9cb6b5d69183ba279e97382ff68a071864c25b561d206dab73499d3ed26d1c"},
-    {file = "amqp-5.0.7.tar.gz", hash = "sha256:d757b78fd7d3c6bb60e3ee811b68145583643747ed3ec253329f086aa3a72a5d"},
+    {file = "amqp-5.0.9-py3-none-any.whl", hash = "sha256:9cd81f7b023fc04bbb108718fbac674f06901b77bfcdce85b10e2a5d0ee91be5"},
+    {file = "amqp-5.0.9.tar.gz", hash = "sha256:1e5f707424e544078ca196e72ae6a14887ce74e02bd126be54b7c03c971bef18"},
 ]
 appnope = [
     {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"},
@@ -4037,12 +4053,12 @@ bleach = [
     {file = "boolean.py-3.8.tar.gz", hash = "sha256:cc24e20f985d60cd4a3a5a1c0956dd12611159d32a75081dabd0c9ab981acaa4"},
 ]
 boto3 = [
-    {file = "boto3-1.20.24-py3-none-any.whl", hash = "sha256:8f08e8e94bf107c5e9866684e9aadf8d9f60abed0cfe5c1dba4e7328674a1986"},
-    {file = "boto3-1.20.24.tar.gz", hash = "sha256:739705b28e6b2329ea3b481ba801d439c296aaf176f7850729147ba99bbf8a9a"},
+    {file = "boto3-1.20.25-py3-none-any.whl", hash = "sha256:a03ab82efcbf457c36dab4afc545d0ddb72b5140c9993cffc78bc23b8d8baa40"},
+    {file = "boto3-1.20.25.tar.gz", hash = "sha256:fa686e8e0a0559124aa9f19dcc25e6cc428f18ff11f779bb7346b883b353fdc2"},
 ]
 botocore = [
-    {file = "botocore-1.23.24-py3-none-any.whl", hash = "sha256:e78d48c50c8c013fb9b362c6202fece2fe868edfd89b51968080180bdff41617"},
-    {file = "botocore-1.23.24.tar.gz", hash = "sha256:43006b4f52d7bb655319d3da0f615cdbee7762853acc1ebcb1d49f962e6b4806"},
+    {file = "botocore-1.23.25-py3-none-any.whl", hash = "sha256:98f8a23ca035edfbd8a8028e624eaf08ba22452dd78ad62eeb03fcd0bbd5f58d"},
+    {file = "botocore-1.23.25.tar.gz", hash = "sha256:9eb71d5ee1ea335b3968751346601e923c66a7b324b1dc58e360d14e0d2ac136"},
 ]
 bs4 = [
     {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"},
@@ -4052,8 +4068,8 @@ calendarweek = [
     {file = "calendarweek-0.5.1.tar.gz", hash = "sha256:fffe2db46dc272f2ede867bfe20e9b07fb051429f25441fb45fb2a4dd69ee0c7"},
 ]
 celery = [
-    {file = "celery-5.0.2-py3-none-any.whl", hash = "sha256:930c3acd55349d028c4e7104a7d377729cbcca19d9fce470c17172d9e7f9a8b6"},
-    {file = "celery-5.0.2.tar.gz", hash = "sha256:012c814967fe89e3f5d2cf49df2dba3de5f29253a7f4f2270e8fce6b901b4ebf"},
+    {file = "celery-5.1.2-py3-none-any.whl", hash = "sha256:9dab2170b4038f7bf10ef2861dbf486ddf1d20592290a1040f7b7a1259705d42"},
+    {file = "celery-5.1.2.tar.gz", hash = "sha256:8d9a3de9162965e97f8e8cc584c67aad83b3f7a267584fa47701ed11c3e0d4b0"},
 ]
 celery-haystack-ng = [
     {file = "celery-haystack-ng-0.20.post2.tar.gz", hash = "sha256:d2e077851f13dddc36fc86134c7c8a937e46ae75e576eb8e77e03b03977fc7bb"},
@@ -4124,13 +4140,17 @@ charset-normalizer = [
     {file = "charset_normalizer-2.0.9-py3-none-any.whl", hash = "sha256:1eecaa09422db5be9e29d7fc65664e6c33bd06f9ced7838578ba40d58bdf3721"},
 ]
 click = [
-    {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"},
-    {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"},
+    {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
+    {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
 ]
 click-didyoumean = [
     {file = "click-didyoumean-0.3.0.tar.gz", hash = "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035"},
     {file = "click_didyoumean-0.3.0-py3-none-any.whl", hash = "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667"},
 ]
+click-plugins = [
+    {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"},
+    {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"},
+]
 click-repl = [
     {file = "click-repl-0.2.0.tar.gz", hash = "sha256:cd12f68d745bf6151210790540b4cb064c7b13e571bc64b6957d98d120dacfd8"},
     {file = "click_repl-0.2.0-py3-none-any.whl", hash = "sha256:94b3fbbc9406a236f176e0506524b2937e4b23b6f4c0c0b2a0a83f8a64e9194b"},
@@ -4253,8 +4273,8 @@ django-appconf = [
     {file = "django_appconf-1.0.5-py3-none-any.whl", hash = "sha256:ae9f864ee1958c815a965ed63b3fba4874eec13de10236ba063a788f9a17389d"},
 ]
 django-auth-ldap = [
-    {file = "django-auth-ldap-3.0.0.tar.gz", hash = "sha256:1f2d5c562d9ba9a5e9a64099ae9798e1a63840a11afe4d1c4a9c74121f066eaa"},
-    {file = "django_auth_ldap-3.0.0-py3-none-any.whl", hash = "sha256:19ee19034f344d9efd07ed88d3187e256ec33ae39d6a47222083b89f7d35c5f6"},
+    {file = "django-auth-ldap-4.0.0.tar.gz", hash = "sha256:276f79e624ce083ce13f161387f65ff1c0efe83ef8a42f2b9830d43317b15239"},
+    {file = "django_auth_ldap-4.0.0-py3-none-any.whl", hash = "sha256:94119c94981809124d3dc4bed974f71c7a980666896df626f556a88a5fe0b59c"},
 ]
 django-bleach = [
     {file = "django-bleach-1.0.0.tar.gz", hash = "sha256:2586b90d641d4d7e70ee353570ad33d3625ed4b97036a3ea5b03ea1bb5bbeccd"},
@@ -4312,8 +4332,8 @@ django-extensions = [
     {file = "django_extensions-3.1.5-py3-none-any.whl", hash = "sha256:9238b9e016bb0009d621e05cf56ea8ce5cce9b32e91ad2026996a7377ca28069"},
 ]
 django-favicon-plus-reloaded = [
-    {file = "django-favicon-plus-reloaded-1.1.3.tar.gz", hash = "sha256:36c2a1cefc201df8bd132492e2440ccdc3d9ceb8e421b2ca181a4704ebacd190"},
-    {file = "django_favicon_plus_reloaded-1.1.3-py3-none-any.whl", hash = "sha256:a60b438360e82bf7075b856ff6a80bae20c825373a58deac627810e478c42be3"},
+    {file = "django-favicon-plus-reloaded-1.1.5.tar.gz", hash = "sha256:0714bd22878617f8bb53333ddc06ae7b5071cebff5b5d2a9ebcb58b11c6632dd"},
+    {file = "django_favicon_plus_reloaded-1.1.5-py3-none-any.whl", hash = "sha256:b14eba8e4a52e00cf61bb50856f866c964673cd25f88175434854c55d8e1ba99"},
 ]
 django-filter = [
     {file = "django-filter-2.4.0.tar.gz", hash = "sha256:84e9d5bb93f237e451db814ed422a3a625751cbc9968b484ecc74964a8696b06"},
@@ -4342,8 +4362,8 @@ django-invitations = [
     {file = "django-invitations-1.9.3.tar.gz", hash = "sha256:6077807aa641c7abae9ca418e757c8e3940fb0ce60499dba24c100ad57c61442"},
 ]
 django-ipware = [
-    {file = "django-ipware-4.0.0.tar.gz", hash = "sha256:1294f916f3b3475e40e1b0ec1bd320aa2397978eae672721c81cbc2ed517e9ee"},
-    {file = "django_ipware-4.0.0-py2.py3-none-any.whl", hash = "sha256:116bd0d7940f09bf7ffd465943992e23d87e772a9d6c0d3a57b74040589a383b"},
+    {file = "django-ipware-4.0.2.tar.gz", hash = "sha256:602a58325a4808bd19197fef2676a0b2da2df40d0ecf21be414b2ff48c72ad05"},
+    {file = "django_ipware-4.0.2-py2.py3-none-any.whl", hash = "sha256:878dbb06a87e25550798e9ef3204ed70a200dd8b15e47dcef848cf08244f04c9"},
 ]
 django-js-asset = [
     {file = "django-js-asset-1.2.2.tar.gz", hash = "sha256:c163ae80d2e0b22d8fb598047cd0dcef31f81830e127cfecae278ad574167260"},
@@ -4373,8 +4393,8 @@ django-model-utils = [
     {file = "django_model_utils-4.2.0-py3-none-any.whl", hash = "sha256:a768a25c80514e0ad4e4a6f9c02c44498985f36c5dfdea47b5b1e8cf994beba6"},
 ]
 django-oauth-toolkit = [
-    {file = "django-oauth-toolkit-1.5.0.tar.gz", hash = "sha256:650e5ef2244d1d8db8f507137e0d1e8b8aad1f4086a4a610526e8851f9a38308"},
-    {file = "django_oauth_toolkit-1.5.0-py3-none-any.whl", hash = "sha256:b2e346a7c1e222774bfb370f21b556b92b408395b4c23914e2d1b241b2e5376a"},
+    {file = "django-oauth-toolkit-1.6.0.tar.gz", hash = "sha256:5e2a98518fcef3566d5632c7341fd2444323a0b2ae78fd77f89d0046a05905b8"},
+    {file = "django_oauth_toolkit-1.6.0-py3-none-any.whl", hash = "sha256:3a488cb87a4dd803487f735d88c21aeec563eac7fb603902031ee7fdb722ae3e"},
 ]
 django-otp = [
     {file = "django-otp-1.1.3.tar.gz", hash = "sha256:f002c71d4ea7f514590be00492980d3c87397b73dc20542e1c4fc00b66f2dda1"},
@@ -4393,8 +4413,8 @@ django-polymorphic = [
     {file = "django_polymorphic-3.1.0-py3-none-any.whl", hash = "sha256:08bc4f4f4a773a19b2deced5a56deddd1ef56ebd15207bf4052e2901c25ef57e"},
 ]
 django-prometheus = [
-    {file = "django-prometheus-2.1.0.tar.gz", hash = "sha256:dd3f8da1399140fbef5c00d1526a23d1ade286b144281c325f8e409a781643f2"},
-    {file = "django_prometheus-2.1.0-py2.py3-none-any.whl", hash = "sha256:c338d6efde1ca336e90c540b5e87afe9287d7bcc82d651a778f302b0be17a933"},
+    {file = "django-prometheus-2.2.0.tar.gz", hash = "sha256:240378a1307c408bd5fc85614a3a57f1ce633d4a222c9e291e2bbf325173b801"},
+    {file = "django_prometheus-2.2.0-py2.py3-none-any.whl", hash = "sha256:e6616770d8820b8834762764bf1b76ec08e1b98e72a6f359d488a2e15fe3537c"},
 ]
 django-redis = [
     {file = "django-redis-5.1.0.tar.gz", hash = "sha256:98fb3d31633a1addea1aeb558a647359908bbcf78c0833f99496c5348fe3c1b4"},
diff --git a/pyproject.toml b/pyproject.toml
index 927cc2722ab2370ab7f34c18ba41676ab8cd370a..6eb9353380ea0492f2f2886e0b25295749d23e64 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -57,7 +57,7 @@ django-sass-processor = "1.0"
 libsass = "^0.21.0"
 colour = "^0.1.5"
 dynaconf = {version = "^3.1", extras = ["yaml", "toml", "ini"]}
-django-auth-ldap = { version = "^3.0", optional = true }
+django-auth-ldap = { version = "^4.0", optional = true }
 django-maintenance-mode = "^0.16.0"
 django-ipware = "^4.0"
 django-impersonate = "^1.4"