diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py
index c034717c5bc217a412aadbcb1d201b26dbb74ccb..12dfa55eccbdf2ddead0d2440ca5f797bebda7eb 100644
--- a/aleksis/core/mixins.py
+++ b/aleksis/core/mixins.py
@@ -143,6 +143,12 @@ class ExtensibleModel(CRUDMixin):
 
         cls._safe_add(func, func.__name__)
 
+    @classmethod
+    def class_method(cls, func: Callable[[], Any], name: Optional[str] = None) -> None:
+        """ Adds the passed callable as a classmethod. """
+
+        cls._safe_add(classmethod(func), func.__name__)
+
     @classmethod
     def field(cls, **kwargs) -> None:
         """ Adds the passed jsonstore field. Must be one of the fields in
diff --git a/apps/official/AlekSIS-App-Alsijil b/apps/official/AlekSIS-App-Alsijil
index bd516e09a6e651b7171a6d7b31f79c3e4a22892e..30e3f7163be7591d4770fc9621c75ded2108ee79 160000
--- a/apps/official/AlekSIS-App-Alsijil
+++ b/apps/official/AlekSIS-App-Alsijil
@@ -1 +1 @@
-Subproject commit bd516e09a6e651b7171a6d7b31f79c3e4a22892e
+Subproject commit 30e3f7163be7591d4770fc9621c75ded2108ee79
diff --git a/apps/official/AlekSIS-App-Chronos b/apps/official/AlekSIS-App-Chronos
index 455c9d1bb74ae0d727b654a54d8f7c0278308a4e..f899554d32d7948786522d8f66565d97aaeb5021 160000
--- a/apps/official/AlekSIS-App-Chronos
+++ b/apps/official/AlekSIS-App-Chronos
@@ -1 +1 @@
-Subproject commit 455c9d1bb74ae0d727b654a54d8f7c0278308a4e
+Subproject commit f899554d32d7948786522d8f66565d97aaeb5021
diff --git a/apps/official/AlekSIS-App-DashboardFeeds b/apps/official/AlekSIS-App-DashboardFeeds
index b89287de8e16e4f87691457a2569e3c16d728935..dd958dd14e76226516463a568d6a8db3c3c590de 160000
--- a/apps/official/AlekSIS-App-DashboardFeeds
+++ b/apps/official/AlekSIS-App-DashboardFeeds
@@ -1 +1 @@
-Subproject commit b89287de8e16e4f87691457a2569e3c16d728935
+Subproject commit dd958dd14e76226516463a568d6a8db3c3c590de
diff --git a/apps/official/AlekSIS-App-Exlibris b/apps/official/AlekSIS-App-Exlibris
index f1304db3bb4b8905269eb5f5079f3fe4630c4312..8cac01059cfdd9f89e0e8f020e9cccaf575bf534 160000
--- a/apps/official/AlekSIS-App-Exlibris
+++ b/apps/official/AlekSIS-App-Exlibris
@@ -1 +1 @@
-Subproject commit f1304db3bb4b8905269eb5f5079f3fe4630c4312
+Subproject commit 8cac01059cfdd9f89e0e8f020e9cccaf575bf534
diff --git a/poetry.lock b/poetry.lock
index 3cd63a6623ce450777912eb7b931eaa985778452..8dc3741ef2061bec976601d225826ba65ac368d2 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -318,17 +318,6 @@ version = "2.1.0"
 Django = ">=1.11"
 python-ldap = ">=3.1"
 
-[[package]]
-category = "main"
-description = "Bootstrap support for Django projects"
-name = "django-bootstrap4"
-optional = false
-python-versions = "*"
-version = "1.1.1"
-
-[package.dependencies]
-beautifulsoup4 = "*"
-
 [[package]]
 category = "main"
 description = "Bulk update using one query over Django ORM."
@@ -2118,10 +2107,6 @@ django-auth-ldap = [
     {file = "django-auth-ldap-2.1.0.tar.gz", hash = "sha256:5f48232c85ddfa33e3573153e6080526ac2eef5e7ec9cf42b5c4ba3c62afb96d"},
     {file = "django_auth_ldap-2.1.0-py3-none-any.whl", hash = "sha256:4d68d21058bd57a316a9e1fcd7a36d0f25d054d4d9d9ec85f766a4991176b454"},
 ]
-django-bootstrap4 = [
-    {file = "django-bootstrap4-1.1.1.tar.gz", hash = "sha256:39f97cbce85eb66f6d76be2029bae171bd3863d0c6932b1c2dae7f299c569b90"},
-    {file = "django_bootstrap4-1.1.1-py3-none-any.whl", hash = "sha256:0fcd84f8414a58b43df0b331c00c8b2f1786ae28f75f419b4d33b06fca43e0d1"},
-]
 django-bulk-update = [
     {file = "django-bulk-update-2.2.0.tar.gz", hash = "sha256:5ab7ce8a65eac26d19143cc189c0f041d5c03b9d1b290ca240dc4f3d6aaeb337"},
     {file = "django_bulk_update-2.2.0-py2.py3-none-any.whl", hash = "sha256:49a403392ae05ea872494d74fb3dfa3515f8df5c07cc277c3dc94724c0ee6985"},
diff --git a/pyproject.toml b/pyproject.toml
index 33df6f829b2f78fa42be8264d1df04e4d5218ed5..0bfbed2a18deb1643c9cefb51012603d1d504815 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -23,7 +23,6 @@ classifiers = [
 python = "^3.7"
 Django = "^3.0"
 django-any-js = "^1.0"
-django-bootstrap4 = "^1.0"
 django-debug-toolbar = "^2.0"
 django-easy-audit = {version ="^1.2rc1", allow-prereleases = true}
 django-middleware-global-request = "^0.1.2"