diff --git a/biscuit/core/apps.py b/biscuit/core/apps.py
index 2d6a4873e4da00c4d6dd7cd83dd0e100230e3e45..6adbc6b60f7ce859b2e073c35e719180b9e4771e 100644
--- a/biscuit/core/apps.py
+++ b/biscuit/core/apps.py
@@ -2,7 +2,7 @@ from glob import glob
 import os
 from warnings import warn
 
-from django.apps import AppConfig, apps
+from django.apps import AppConfig
 from django.conf import settings
 from django.db.utils import ProgrammingError
 
@@ -19,14 +19,5 @@ class CoreConfig(AppConfig):
                 # Ignore because old is better than nothing
                 pass  # noqa
 
-    def setup_data(self) -> None:
-        try:
-            apps.get_model('otp_yubikey', 'ValidationService').objects.update_or_create(
-                name='default', defaults={'use_ssl': True, 'param_sl': '', 'param_timeout': ''}
-            )
-        except ProgrammingError:
-            warn('Yubikey validation service could not be created yet. If you are currently in a migration, this is expected.')
-
     def ready(self) -> None:
         self.clean_scss()
-#        self.setup_data()
diff --git a/biscuit/core/migrations/0004_yubi_otp.py b/biscuit/core/migrations/0004_yubi_otp.py
new file mode 100644
index 0000000000000000000000000000000000000000..fa7c40346d627fbbe00f27122a979941334a5e86
--- /dev/null
+++ b/biscuit/core/migrations/0004_yubi_otp.py
@@ -0,0 +1,19 @@
+from django.db import migrations
+
+
+def create_validation_service(apps, schema_editor):
+    apps.get_model('otp_yubikey', 'ValidationService').objects.update_or_create(
+        name='default', defaults={'use_ssl': True, 'param_sl': '', 'param_timeout': ''}
+    )
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0003_school_logo'),
+        ('otp_yubikey', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.RunPython(create_validation_service),
+    ]