diff --git a/aleksis/apps/kort/migrations/0001_initial.py b/aleksis/apps/kort/migrations/0001_initial.py
index 00244defb0e16d9f3bb9c3cc72640c6260dbabc4..5b3518af1a8b2817a696d3aaac191f6a6b0e05fa 100644
--- a/aleksis/apps/kort/migrations/0001_initial.py
+++ b/aleksis/apps/kort/migrations/0001_initial.py
@@ -1,6 +1,5 @@
 # Generated by Django 3.2.9 on 2021-11-05 15:59
 
-import django.contrib.sites.managers
 from django.db import migrations, models
 import django.db.models.deletion
 
@@ -11,7 +10,6 @@ class Migration(migrations.Migration):
 
     dependencies = [
         ('core', '0022_public_favicon'),
-        ('sites', '0002_alter_domain_unique'),
     ]
 
     operations = [
@@ -24,14 +22,12 @@ class Migration(migrations.Migration):
                 ('valid_until', models.DateField(verbose_name='Valid until')),
                 ('deactivated', models.BooleanField(default=False, verbose_name='Deactivated')),
                 ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cards', to='core.person', verbose_name='Person')),
-                ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')),
             ],
             options={
                 'verbose_name': 'Card',
                 'verbose_name_plural': 'Cards',
             },
             managers=[
-                ('objects', django.contrib.sites.managers.CurrentSiteManager()),
             ],
         ),
     ]
diff --git a/aleksis/apps/kort/migrations/0002_card_printer.py b/aleksis/apps/kort/migrations/0002_card_printer.py
index bb3a6dea60bf735781e5fc44670ae9dea4d5d653..3f6a2972ac09d01dcd0422efb66240db0bf3ba01 100644
--- a/aleksis/apps/kort/migrations/0002_card_printer.py
+++ b/aleksis/apps/kort/migrations/0002_card_printer.py
@@ -1,6 +1,5 @@
 # Generated by Django 3.2.9 on 2021-11-30 20:07
 
-import django.contrib.sites.managers
 from django.db import migrations, models
 import django.db.models.deletion
 
@@ -8,7 +7,6 @@ import django.db.models.deletion
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('sites', '0002_alter_domain_unique'),
         ('kort', '0001_initial'),
     ]
 
@@ -34,14 +32,12 @@ class Migration(migrations.Migration):
                 ('status', models.CharField(choices=[('online', 'Online'), ('offline', 'Offline'), ('with_errors', 'With errors')], max_length=255, verbose_name='Status')),
                 ('status_text', models.TextField(blank=True, verbose_name='Status text')),
                 ('last_seen_at', models.DateTimeField(blank=True, null=True, verbose_name='Last seen at')),
-                ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')),
             ],
             options={
                 'verbose_name': 'Card printer',
                 'verbose_name_plural': 'Card printers',
             },
             managers=[
-                ('objects', django.contrib.sites.managers.CurrentSiteManager()),
             ],
         ),
         migrations.AddField(
diff --git a/aleksis/apps/kort/migrations/0003_auto_20220308_2023.py b/aleksis/apps/kort/migrations/0003_auto_20220308_2023.py
index 7f756afa38d142aed0e775db89ee7eff84022d8d..a05983040587ca727af9c938749ff775c2291eb5 100644
--- a/aleksis/apps/kort/migrations/0003_auto_20220308_2023.py
+++ b/aleksis/apps/kort/migrations/0003_auto_20220308_2023.py
@@ -1,6 +1,5 @@
 # Generated by Django 3.2.12 on 2022-03-08 19:23
 
-import django.contrib.sites.managers
 from django.db import migrations, models
 import django.db.models.deletion
 
@@ -8,7 +7,6 @@ import django.db.models.deletion
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('sites', '0002_alter_domain_unique'),
         ('kort', '0002_card_printer'),
     ]
 
@@ -33,13 +31,11 @@ class Migration(migrations.Migration):
                 ('name', models.CharField(max_length=255, verbose_name='Name')),
                 ('template', models.TextField(verbose_name='Template')),
                 ('css', models.TextField(blank=True, verbose_name='Custom CSS')),
-                ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')),
             ],
             options={
                 'abstract': False,
             },
             managers=[
-                ('objects', django.contrib.sites.managers.CurrentSiteManager()),
             ],
         ),
     ]
diff --git a/aleksis/apps/kort/migrations/0007_auto_20220315_1957.py b/aleksis/apps/kort/migrations/0007_auto_20220315_1957.py
index 5a5cef67ea2067c06c8d555f5c0f60996ec8c6e9..18d707c289a5b827fae0c7abf0d5899fdf0dcccc 100644
--- a/aleksis/apps/kort/migrations/0007_auto_20220315_1957.py
+++ b/aleksis/apps/kort/migrations/0007_auto_20220315_1957.py
@@ -1,7 +1,6 @@
 # Generated by Django 3.2.12 on 2022-03-15 18:57
 
 from django.conf import settings
-import django.contrib.sites.managers
 import django.core.validators
 from django.db import migrations, models
 import django.db.models.deletion
@@ -11,7 +10,6 @@ class Migration(migrations.Migration):
 
     dependencies = [
         migrations.swappable_dependency(settings.OAUTH2_PROVIDER_APPLICATION_MODEL),
-        ('sites', '0002_alter_domain_unique'),
         ('kort', '0006_auto_20220310_2003'),
     ]
 
@@ -36,14 +34,12 @@ class Migration(migrations.Migration):
                 ('status_text', models.TextField(blank=True, verbose_name='Status text')),
                 ('card', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='kort.card', verbose_name='Card')),
                 ('printer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='kort.cardprinter', verbose_name='Printer')),
-                ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')),
             ],
             options={
                 'verbose_name': 'Card print job',
                 'verbose_name_plural': 'Card print jobs',
             },
             managers=[
-                ('objects', django.contrib.sites.managers.CurrentSiteManager()),
             ],
         ),
     ]
diff --git a/aleksis/apps/kort/migrations/0012_auto_20220529_1435.py b/aleksis/apps/kort/migrations/0012_auto_20220529_1435.py
index da30961771e6d83b8ec254c8bc9adf070e658530..c976872990e10b0662093f7017bce120acf418f4 100644
--- a/aleksis/apps/kort/migrations/0012_auto_20220529_1435.py
+++ b/aleksis/apps/kort/migrations/0012_auto_20220529_1435.py
@@ -1,6 +1,5 @@
 # Generated by Django 3.2.13 on 2022-05-29 12:35
 
-import django.contrib.sites.managers
 from django.db import migrations, models
 import django.db.models.deletion
 
@@ -8,7 +7,6 @@ import django.db.models.deletion
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('sites', '0002_alter_domain_unique'),
         ('kort', '0011_cardprinter_card_detector'),
     ]
 
@@ -37,14 +35,12 @@ class Migration(migrations.Migration):
                 ('extended_data', models.JSONField(default=dict, editable=False)),
                 ('media_file', models.FileField(upload_to='card_layouts/media/', verbose_name='Media file')),
                 ('card_layout', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='media_files', to='kort.cardlayout', verbose_name='Card layout')),
-                ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')),
             ],
             options={
                 'verbose_name': 'Media file for a card layout',
                 'verbose_name_plural': 'Media files for card layouts',
             },
             managers=[
-                ('objects', django.contrib.sites.managers.CurrentSiteManager()),
             ],
         ),
     ]
diff --git a/aleksis/apps/kort/migrations/0016_cardprinter_oauth2_client_secret.py b/aleksis/apps/kort/migrations/0016_cardprinter_oauth2_client_secret.py
index 4e022e0596ee57df0abbd290a3601d23b7c7e7f7..50e23bf5d56af71c5abfe6c6101013577756d8be 100644
--- a/aleksis/apps/kort/migrations/0016_cardprinter_oauth2_client_secret.py
+++ b/aleksis/apps/kort/migrations/0016_cardprinter_oauth2_client_secret.py
@@ -7,7 +7,6 @@ import django.db.models.deletion
 class Migration(migrations.Migration):
 
     dependencies = [
-        ("sites", "0002_alter_domain_unique"),
         ("kort", "0015_migrate_scopes"),
     ]
 
diff --git a/aleksis/apps/kort/migrations/0017_managed_by_drop_sites.py b/aleksis/apps/kort/migrations/0017_managed_by_drop_sites.py
new file mode 100644
index 0000000000000000000000000000000000000000..258ef0a7960fae1efb2980d5fb79236cdfeecaef
--- /dev/null
+++ b/aleksis/apps/kort/migrations/0017_managed_by_drop_sites.py
@@ -0,0 +1,55 @@
+# Generated by Django 4.2.10 on 2024-02-24 11:58
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('kort', '0016_cardprinter_oauth2_client_secret'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='card',
+            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='cardlayout',
+            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='cardlayoutmediafile',
+            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='cardprinter',
+            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='cardprintjob',
+            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.AlterField(
+            model_name='cardprinter',
+            name='cups_printer',
+            field=models.CharField(blank=True, help_text='Leave blank to deactivate CUPS printing', max_length=255, verbose_name='CUPS printer'),
+        ),
+    ] + [
+        migrations.RunSQL(
+            f"ALTER TABLE kort_{model_name} drop column if exists site_id;"
+        ) for model_name  in
+        [
+            "cardprinter",
+            "cardlayoutmediafile",
+            "cardlayout",
+            "card",
+            "cardprintjob",
+        ]
+    ]
+
diff --git a/pyproject.toml b/pyproject.toml
index 17d1f7827a441a13794ff2713ecefaa61a19efed..2b0af72a58dfbcd45f6932af121c735134d5e01a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -27,9 +27,10 @@ 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-core = "^4.0.0.dev4"
 python-barcode = "^0.15.0"
 django-formtools = "^2.3"
 django-ace = "^1.0.12"
@@ -77,7 +78,6 @@ meta_viewport = true
 no_autofocus = true
 tabindex_no_positive = true
 
-
 [tool.ruff]
 exclude = ["migrations", "tests"]
 line-length = 100
@@ -92,6 +92,7 @@ section-order = ["future", "standard-library", "django", "third-party", "first-p
 
 [tool.ruff.isort.sections]
 django = ["django"]
+
 [build-system]
 requires = ["poetry-core>=1.0.0"]
 build-backend = "poetry.core.masonry.api"