diff --git a/aleksis/apps/alsijil/managers.py b/aleksis/apps/alsijil/managers.py
index 76240edd640148eb9084e79489f30c7da2b26ed8..2e8b2e558e78c84ac83674840f0a3f8b2eb259c5 100644
--- a/aleksis/apps/alsijil/managers.py
+++ b/aleksis/apps/alsijil/managers.py
@@ -11,7 +11,7 @@ from django.utils.translation import gettext as _
 from calendarweek import CalendarWeek
 
 from aleksis.apps.chronos.managers import DateRangeQuerySetMixin
-from aleksis.core.managers import CurrentSiteManagerWithoutMigrations
+from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations
 
 if TYPE_CHECKING:
     from aleksis.core.models import Group
@@ -93,7 +93,7 @@ class RegisterObjectRelatedQuerySet(QuerySet):
         )
 
 
-class PersonalNoteManager(CurrentSiteManagerWithoutMigrations):
+class PersonalNoteManager(AlekSISBaseManagerWithoutMigrations):
     """Manager adding specific methods to personal notes."""
 
     def get_queryset(self):
@@ -126,7 +126,7 @@ class PersonalNoteQuerySet(RegisterObjectRelatedQuerySet, QuerySet):
         )
 
 
-class LessonDocumentationManager(CurrentSiteManagerWithoutMigrations):
+class LessonDocumentationManager(AlekSISBaseManagerWithoutMigrations):
     pass
 
 
@@ -136,7 +136,7 @@ class LessonDocumentationQuerySet(RegisterObjectRelatedQuerySet, QuerySet):
         return self.filter(~Q(topic="") | ~Q(group_note="") | ~Q(homework=""))
 
 
-class GroupRoleManager(CurrentSiteManagerWithoutMigrations):
+class GroupRoleManager(AlekSISBaseManagerWithoutMigrations):
     pass
 
 
@@ -160,7 +160,7 @@ class GroupRoleQuerySet(QuerySet):
         )
 
 
-class GroupRoleAssignmentManager(CurrentSiteManagerWithoutMigrations):
+class GroupRoleAssignmentManager(AlekSISBaseManagerWithoutMigrations):
     pass
 
 
diff --git a/aleksis/apps/alsijil/migrations/0001_initial.py b/aleksis/apps/alsijil/migrations/0001_initial.py
index e49edfac8a4cdb1f2684c3f2667d3e1ef18de003..344efdac0df75135647a3093ee20b8d228570b22 100644
--- a/aleksis/apps/alsijil/migrations/0001_initial.py
+++ b/aleksis/apps/alsijil/migrations/0001_initial.py
@@ -1,9 +1,10 @@
 # Generated by Django 3.0.6 on 2020-05-29 10:29
 
-import django.contrib.sites.managers
 import django.db.models.deletion
 from django.db import migrations, models
 
+import aleksis.core.managers
+
 import aleksis.apps.alsijil.models
 
 
@@ -14,7 +15,6 @@ class Migration(migrations.Migration):
     dependencies = [
         ("core", "0001_initial"),
         ("chronos", "0001_initial"),
-        ("sites", "0002_alter_domain_unique"),
     ]
 
     operations = [
@@ -60,22 +60,13 @@ class Migration(migrations.Migration):
                         max_length=100, unique=True, verbose_name="Match expression"
                     ),
                 ),
-                (
-                    "site",
-                    models.ForeignKey(
-                        default=1,
-                        editable=False,
-                        on_delete=django.db.models.deletion.CASCADE,
-                        to="sites.Site",
-                    ),
-                ),
             ],
             options={
                 "verbose_name": "Personal note filter",
                 "verbose_name_plural": "Personal note filters",
                 "ordering": ["identifier"],
             },
-            managers=[("objects", django.contrib.sites.managers.CurrentSiteManager()),],
+            managers=[("objects", aleksis.core.managers.AlekSISBaseManager()),],
         ),
         migrations.CreateModel(
             name="PersonalNote",
@@ -116,15 +107,6 @@ class Migration(migrations.Migration):
                         to="core.Person",
                     ),
                 ),
-                (
-                    "site",
-                    models.ForeignKey(
-                        default=1,
-                        editable=False,
-                        on_delete=django.db.models.deletion.CASCADE,
-                        to="sites.Site",
-                    ),
-                ),
             ],
             options={
                 "verbose_name": "Personal note",
@@ -180,15 +162,6 @@ class Migration(migrations.Migration):
                         to="chronos.LessonPeriod",
                     ),
                 ),
-                (
-                    "site",
-                    models.ForeignKey(
-                        default=1,
-                        editable=False,
-                        on_delete=django.db.models.deletion.CASCADE,
-                        to="sites.Site",
-                    ),
-                ),
             ],
             options={
                 "verbose_name": "Lesson documentation",
diff --git a/aleksis/apps/alsijil/migrations/0002_excuse_type.py b/aleksis/apps/alsijil/migrations/0002_excuse_type.py
index 395d2e323cb3396f434da5e0c3ebef768589331b..f480a7e4dc1f8739c7badd333e49423565f187cc 100644
--- a/aleksis/apps/alsijil/migrations/0002_excuse_type.py
+++ b/aleksis/apps/alsijil/migrations/0002_excuse_type.py
@@ -1,14 +1,14 @@
 # Generated by Django 3.0.8 on 2020-07-10 10:46
 
-import django.contrib.sites.managers
 import django.db.models.deletion
 from django.db import migrations, models
 
+import aleksis.core.managers
+
 
 class Migration(migrations.Migration):
 
     dependencies = [
-        ("sites", "0002_alter_domain_unique"),
         ("alsijil", "0001_initial"),
     ]
 
@@ -41,22 +41,13 @@ class Migration(migrations.Migration):
                     "name",
                     models.CharField(max_length=255, unique=True, verbose_name="Name"),
                 ),
-                (
-                    "site",
-                    models.ForeignKey(
-                        default=1,
-                        editable=False,
-                        on_delete=django.db.models.deletion.CASCADE,
-                        to="sites.Site",
-                    ),
-                ),
             ],
             options={
                 "verbose_name": "Excuse type",
                 "verbose_name_plural": "Excuse types",
                 "ordering": ["name"],
             },
-            managers=[("objects", django.contrib.sites.managers.CurrentSiteManager()),],
+            managers=[("objects", aleksis.core.managers.AlekSISBaseManager()),],
         ),
         migrations.AddField(
             model_name="personalnote",
diff --git a/aleksis/apps/alsijil/migrations/0003_extra_mark.py b/aleksis/apps/alsijil/migrations/0003_extra_mark.py
index e0da8d97ef6b5ec1b1e45f9e6e6f976864907626..fb77fadf29a1058ef9091b903efd84bb7924a210 100644
--- a/aleksis/apps/alsijil/migrations/0003_extra_mark.py
+++ b/aleksis/apps/alsijil/migrations/0003_extra_mark.py
@@ -1,14 +1,14 @@
 # Generated by Django 3.0.8 on 2020-07-12 12:43
 
-import django.contrib.sites.managers
 import django.db.models.deletion
 from django.db import migrations, models
 
+import aleksis.core.managers
+
 
 class Migration(migrations.Migration):
 
     dependencies = [
-        ("sites", "0002_alter_domain_unique"),
         ("alsijil", "0002_excuse_type"),
     ]
 
@@ -41,22 +41,13 @@ class Migration(migrations.Migration):
                     "name",
                     models.CharField(max_length=255, unique=True, verbose_name="Name"),
                 ),
-                (
-                    "site",
-                    models.ForeignKey(
-                        default=1,
-                        editable=False,
-                        on_delete=django.db.models.deletion.CASCADE,
-                        to="sites.Site",
-                    ),
-                ),
             ],
             options={
                 "verbose_name": "Extra mark",
                 "verbose_name_plural": "Extra marks",
                 "ordering": ["short_name"],
             },
-            managers=[("objects", django.contrib.sites.managers.CurrentSiteManager()),],
+            managers=[("objects", aleksis.core.managers.AlekSISBaseManager()),],
         ),
         migrations.AddField(
             model_name="personalnote",
diff --git a/aleksis/apps/alsijil/migrations/0008_global_permissions.py b/aleksis/apps/alsijil/migrations/0008_global_permissions.py
index a7d5ba1e39ef682dab13b242467621ebf8fd033d..bc4d56035d6acc92ce3610b038c042b2336e1654 100644
--- a/aleksis/apps/alsijil/migrations/0008_global_permissions.py
+++ b/aleksis/apps/alsijil/migrations/0008_global_permissions.py
@@ -1,8 +1,9 @@
 # Generated by Django 3.1.5 on 2021-01-21 14:55
 
-import django.contrib.sites.managers
 from django.db import migrations, models
 
+import aleksis.core.managers
+
 
 class Migration(migrations.Migration):
 
@@ -22,7 +23,7 @@ class Migration(migrations.Migration):
                 'managed': False,
             },
             managers=[
-                ('objects', django.contrib.sites.managers.CurrentSiteManager()),
+                ('objects', aleksis.core.managers.AlekSISBaseManager()),
             ],
         ),
     ]
diff --git a/aleksis/apps/alsijil/migrations/0009_group_roles.py b/aleksis/apps/alsijil/migrations/0009_group_roles.py
index 5bf3840bf7a4025db2ec5ef9211d4efa37aecff9..78f6f3666cb385a10e6d7101738e66b987fc68f2 100644
--- a/aleksis/apps/alsijil/migrations/0009_group_roles.py
+++ b/aleksis/apps/alsijil/migrations/0009_group_roles.py
@@ -11,7 +11,6 @@ class Migration(migrations.Migration):
 
     dependencies = [
         ('core', '0009_default_dashboard'),
-        ('sites', '0002_alter_domain_unique'),
         ('alsijil', '0008_global_permissions'),
     ]
 
@@ -24,7 +23,6 @@ class Migration(migrations.Migration):
                 ('name', models.CharField(max_length=255, verbose_name='Name')),
                 ('icon', models.CharField(blank=True, choices=(lambda: ICONS)(), max_length=50, verbose_name='Icon')),
                 ('colour', colorfield.fields.ColorField(blank=True, default='', max_length=18, verbose_name='Colour')),
-                ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')),
             ],
             options={
                 'verbose_name': 'Group role',
@@ -41,7 +39,6 @@ class Migration(migrations.Migration):
                 ('groups', models.ManyToManyField(related_name='group_roles', to='core.Group', verbose_name='Groups')),
                 ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='group_roles', to='core.person', verbose_name='Assigned person')),
                 ('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assignments', to='alsijil.grouprole', verbose_name='Group role')),
-                ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')),
             ],
             options={
                 'verbose_name': 'Group role assignment',
diff --git a/aleksis/apps/alsijil/migrations/0010_events_extra_lessons.py b/aleksis/apps/alsijil/migrations/0010_events_extra_lessons.py
index f0459292f8d754f1eb98522661dd7b630bd5f69c..1c3bf9ec00c3d3242fd17cbc2ef60d1b097a4458 100644
--- a/aleksis/apps/alsijil/migrations/0010_events_extra_lessons.py
+++ b/aleksis/apps/alsijil/migrations/0010_events_extra_lessons.py
@@ -1,7 +1,6 @@
 # Generated by Django 3.1.5 on 2021-01-10 15:48
 
 import aleksis.apps.chronos.util.date
-import django.contrib.sites.managers
 from django.db import migrations, models
 import django.db.models.deletion
 
diff --git a/aleksis/apps/alsijil/migrations/0013_fix_uniqueness_per_site.py b/aleksis/apps/alsijil/migrations/0013_fix_uniqueness_per_site.py
index ed4edc714dc1c9f7c5c82ca58d3edd6f1628891c..8eee63d2b57da80342e4949c4f416ffbf557bf86 100644
--- a/aleksis/apps/alsijil/migrations/0013_fix_uniqueness_per_site.py
+++ b/aleksis/apps/alsijil/migrations/0013_fix_uniqueness_per_site.py
@@ -20,23 +20,23 @@ class Migration(migrations.Migration):
         ),
         migrations.AddConstraint(
             model_name='excusetype',
-            constraint=models.UniqueConstraint(fields=('site_id', 'short_name'), name='unique_excuse_short_name'),
+            constraint=models.UniqueConstraint(fields=('short_name',), name='unique_excuse_short_name'),
         ),
         migrations.AddConstraint(
             model_name='excusetype',
-            constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_excuse_name'),
+            constraint=models.UniqueConstraint(fields=('name',), name='unique_excuse_name'),
         ),
         migrations.AddConstraint(
             model_name='extramark',
-            constraint=models.UniqueConstraint(fields=('site_id', 'short_name'), name='unique_mark_short_name'),
+            constraint=models.UniqueConstraint(fields=('short_name',), name='unique_mark_short_name'),
         ),
         migrations.AddConstraint(
             model_name='extramark',
-            constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_mark_name'),
+            constraint=models.UniqueConstraint(fields=('name',), name='unique_mark_name'),
         ),
         migrations.AddConstraint(
             model_name='grouprole',
-            constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_role_per_site'),
+            constraint=models.UniqueConstraint(fields=('name',), name='unique_role_per_site'),
         ),
         migrations.AddConstraint(
             model_name='lessondocumentation',
diff --git a/aleksis/apps/alsijil/migrations/0018_add_managed_by_app_label.py b/aleksis/apps/alsijil/migrations/0018_add_managed_by_app_label.py
new file mode 100644
index 0000000000000000000000000000000000000000..6dd931bdb1abcc253c9964cca778e146e49b56fc
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0018_add_managed_by_app_label.py
@@ -0,0 +1,46 @@
+# Generated by Django 4.2.3 on 2023-07-27 14:08
+
+import aleksis.core.managers
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0052_site_related_name'),
+        ('alsijil', '0017_rename_late_to_tardiness'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='excusetype',
+            name='managed_by_app_label',
+            field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'),
+        ),
+        migrations.AddField(
+            model_name='extramark',
+            name='managed_by_app_label',
+            field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'),
+        ),
+        migrations.AddField(
+            model_name='grouprole',
+            name='managed_by_app_label',
+            field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'),
+        ),
+        migrations.AddField(
+            model_name='grouproleassignment',
+            name='managed_by_app_label',
+            field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'),
+        ),
+        migrations.AddField(
+            model_name='lessondocumentation',
+            name='managed_by_app_label',
+            field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'),
+        ),
+        migrations.AddField(
+            model_name='personalnote',
+            name='managed_by_app_label',
+            field=models.CharField(blank=True, editable=False, max_length=255, verbose_name='App label of app responsible for managing this instance'),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/migrations/0019_drop_sites.py b/aleksis/apps/alsijil/migrations/0019_drop_sites.py
new file mode 100644
index 0000000000000000000000000000000000000000..f293977ae4625ebb6123530b181c57ad66850580
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0019_drop_sites.py
@@ -0,0 +1,85 @@
+# Generated by Django 4.2.9 on 2024-01-11 12:52
+
+import colorfield.fields
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('alsijil', '0018_add_managed_by_app_label'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='alsijilglobalpermissions',
+            options={'managed': False, 'permissions': (('view_lesson', 'Can view lesson overview'), ('view_week', 'Can view week overview'), ('view_full_register', 'Can view full register'), ('register_absence', 'Can register absence'), ('list_personal_note_filters', 'Can list all personal note filters'))},
+        ),
+        migrations.AlterModelOptions(
+            name='grouprole',
+            options={'permissions': (('assign_group_role', 'Can assign group role'),), 'verbose_name': 'Group role', 'verbose_name_plural': 'Group roles'},
+        ),
+        migrations.AlterModelManagers(
+            name='excusetype',
+            managers=[
+            ],
+        ),
+        migrations.AlterModelManagers(
+            name='extramark',
+            managers=[
+            ],
+        ),
+        migrations.RemoveConstraint(
+            model_name='excusetype',
+            name='unique_excuse_short_name',
+        ),
+        migrations.RemoveConstraint(
+            model_name='excusetype',
+            name='unique_excuse_name',
+        ),
+        migrations.RemoveConstraint(
+            model_name='extramark',
+            name='unique_mark_short_name',
+        ),
+        migrations.RemoveConstraint(
+            model_name='extramark',
+            name='unique_mark_name',
+        ),
+        migrations.RemoveConstraint(
+            model_name='grouprole',
+            name='unique_role_per_site',
+        ),
+    ] + [
+        migrations.RunSQL(
+            f"ALTER TABLE alsijil_{model_name} drop column if exists site_id;"
+        ) for model_name  in
+        [
+            "excusetype",
+            "personalnote",
+            "lessondocumentation",
+            "extramark",
+            "grouprole",
+            "grouproleassignment",
+        ]
+    ] +  [
+        migrations.AlterField(
+            model_name='excusetype',
+            name='count_as_absent',
+            field=models.BooleanField(default=True, help_text="If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report.", verbose_name='Count as absent'),
+        ),
+        migrations.AlterField(
+            model_name='grouprole',
+            name='colour',
+            field=colorfield.fields.ColorField(blank=True, default='', image_field=None, max_length=25, samples=None, verbose_name='Colour'),
+        ),
+        migrations.AlterField(
+            model_name='grouprole',
+            name='name',
+            field=models.CharField(max_length=255, unique=True, verbose_name='Name'),
+        ),
+        migrations.AlterField(
+            model_name='personalnote',
+            name='groups_of_person',
+            field=models.ManyToManyField(related_name='+', to='core.group'),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 9ffe57c86196479200e2f2d26f332a670ba7c3f1..17a2552567df74f80b4c7aecfcf5465f7dd0bc76 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -72,12 +72,6 @@ class ExcuseType(ExtensibleModel):
         ordering = ["name"]
         verbose_name = _("Excuse type")
         verbose_name_plural = _("Excuse types")
-        constraints = [
-            models.UniqueConstraint(
-                fields=("site_id", "short_name"), name="unique_excuse_short_name"
-            ),
-            models.UniqueConstraint(fields=("site_id", "name"), name="unique_excuse_name"),
-        ]
 
 
 lesson_related_constraint_q = (
@@ -443,12 +437,6 @@ class ExtraMark(ExtensibleModel):
         ordering = ["short_name"]
         verbose_name = _("Extra mark")
         verbose_name_plural = _("Extra marks")
-        constraints = [
-            models.UniqueConstraint(
-                fields=("site_id", "short_name"), name="unique_mark_short_name"
-            ),
-            models.UniqueConstraint(fields=("site_id", "name"), name="unique_mark_name"),
-        ]
 
 
 class GroupRole(ExtensibleModel):
@@ -456,7 +444,7 @@ class GroupRole(ExtensibleModel):
 
     objects = GroupRoleManager.from_queryset(GroupRoleQuerySet)()
 
-    name = models.CharField(max_length=255, verbose_name=_("Name"))
+    name = models.CharField(max_length=255, verbose_name=_("Name"), unique=True)
     icon = models.CharField(max_length=50, blank=True, choices=ICONS, verbose_name=_("Icon"))
     colour = ColorField(blank=True, verbose_name=_("Colour"))
 
@@ -466,9 +454,6 @@ class GroupRole(ExtensibleModel):
     class Meta:
         verbose_name = _("Group role")
         verbose_name_plural = _("Group roles")
-        constraints = [
-            models.UniqueConstraint(fields=("site_id", "name"), name="unique_role_per_site"),
-        ]
         permissions = (("assign_group_role", _("Can assign group role")),)
 
     def get_absolute_url(self) -> str:
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
index 056bea93ca036f54869ad037f84b7575f3a2123d..e4e3960c8a1325acdca09ddcff95d958657d0f62 100644
--- a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
@@ -30,7 +30,7 @@
           {% trans "Period" %}
         </a>
       </li>
-      {% if register_object.label_ != "lesson_period" or not register_object.get_substitution.cancelled or not request.site.preferences.alsijil__block_personal_notes_for_cancelled %}
+      {% if register_object.label_ != "lesson_period" or not register_object.get_substitution.cancelled or not SITE_PREFERENCES.alsijil__block_personal_notes_for_cancelled %}
         <li class="tab col">
           <a href="#personal-notes">
             <i class="material-icons iconify" data-icon="mdi:account-multiple-outline"></i>
@@ -86,7 +86,7 @@
           {% endwith %}
         {% endwith %}
 
-        {% if register_object.label_ != "lesson_period" or not register_object.get_substitution.cancelled or not request.site.preferences.alsijil__block_personal_notes_for_cancelled %}
+        {% if register_object.label_ != "lesson_period" or not register_object.get_substitution.cancelled or not SITE_PREFERENCES.alsijil__block_personal_notes_for_cancelled %}
           <div class="col s12 no-padding" id="personal-notes">
             {% include "alsijil/partials/lesson/tabs/notes.html" %}
           </div>
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
index d8c8273092fee51086fac6b24599da95fef486d0..081f38c5321359ca92241c21ba1f9b1fc71aa926 100644
--- a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
@@ -100,7 +100,7 @@
       <div class="col s12" id="week-overview">
         {% for weekday, objects in regrouped_objects.items %}
           {% with weekdays|get_dict:objects.0.weekday as advanced_weekday %}
-            {% if advanced_weekday.holiday and not request.site.preferences.alsijil__allow_entries_in_holidays %}
+            {% if advanced_weekday.holiday and not SITE_PREFERENCES.alsijil__allow_entries_in_holidays %}
               <div class="card">
                 <div class="card-content">
                     <span class="card-title">
diff --git a/pyproject.toml b/pyproject.toml
index 7472d80e44295737d87bb093b962dcc310c6f345..c19624053cb6d7c1c5779163f9cb66bda9bf9961 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "AlekSIS-App-Alsijil"
-version = "3.0.1.dev0"
+version = "4.0.dev0"
 packages = [
     { include = "aleksis" }
 ]
@@ -46,11 +46,12 @@ priority = "primary"
 name = "gitlab"
 url = "https://edugit.org/api/v4/projects/461/packages/pypi/simple"
 priority = "supplemental"
+
 [tool.poetry.dependencies]
 python = "^3.10"
-aleksis-core = "^3.0"
-aleksis-app-chronos = "^3.0"
-aleksis-app-stoelindeling = { version = "^2.0", optional = true }
+aleksis-core = "^4.0.0.dev2"
+aleksis-app-chronos = "^4.0.0.dev0"
+aleksis-app-stoelindeling = { version = "^3.0.dev1", optional = true }
 
 [tool.poetry.extras]
 seatingplans = ["aleksis-app-stoelindeling"]