diff --git a/apps/official/BiscuIT-App-Alsijil b/apps/official/BiscuIT-App-Alsijil
index ce37273589eea83751beb9dc41c50617e8f74637..ebb022fec560eabea5cae2be1bc221d7e40eeb75 160000
--- a/apps/official/BiscuIT-App-Alsijil
+++ b/apps/official/BiscuIT-App-Alsijil
@@ -1 +1 @@
-Subproject commit ce37273589eea83751beb9dc41c50617e8f74637
+Subproject commit ebb022fec560eabea5cae2be1bc221d7e40eeb75
diff --git a/apps/official/BiscuIT-App-Chronos b/apps/official/BiscuIT-App-Chronos
index b4523e7bf88fba44d22ee54b0c30c5129c8001bc..36a3c81abaf85cf4f5a13fc0fd986a50824314f9 160000
--- a/apps/official/BiscuIT-App-Chronos
+++ b/apps/official/BiscuIT-App-Chronos
@@ -1 +1 @@
-Subproject commit b4523e7bf88fba44d22ee54b0c30c5129c8001bc
+Subproject commit 36a3c81abaf85cf4f5a13fc0fd986a50824314f9
diff --git a/apps/official/BiscuIT-App-Exlibris b/apps/official/BiscuIT-App-Exlibris
index 9d9500bd1b2c02cfb33aa5ed313c7d32a2bb975e..a6d9aa27b46c69d3305e2a29840caea0fef1eab7 160000
--- a/apps/official/BiscuIT-App-Exlibris
+++ b/apps/official/BiscuIT-App-Exlibris
@@ -1 +1 @@
-Subproject commit 9d9500bd1b2c02cfb33aa5ed313c7d32a2bb975e
+Subproject commit a6d9aa27b46c69d3305e2a29840caea0fef1eab7
diff --git a/biscuit/core/migrations/0001_initial.py b/biscuit/core/migrations/0001_initial.py
index ad78d125591b6c9e59be45f1ff8ff9477b2d253e..7a0f26b17a4c131bd5c135919549a2c35d759a2c 100644
--- a/biscuit/core/migrations/0001_initial.py
+++ b/biscuit/core/migrations/0001_initial.py
@@ -1,9 +1,18 @@
-# Generated by Django 2.1.5 on 2019-01-23 21:57
+# Generated by Django 2.2.5 on 2019-09-03 18:30
 
-import django.contrib.auth.models
-import django.contrib.auth.validators
+import biscuit.core.util.core_helpers
+from django.conf import settings
 from django.db import migrations, models
-import django.utils.timezone
+from django.utils.translation import ugettext_lazy as _
+import django.db.models.deletion
+import image_cropping.fields
+import phonenumber_field.modelfields
+
+
+def create_default_school(apps, schema_editor):
+    db_alias = schema_editor.connection.alias
+    School = apps.get_model('core', 'School')  # noqa
+    School.objects.using(db_alias).create(name=_('Default school'))
 
 
 class Migration(migrations.Migration):
@@ -11,44 +20,86 @@ class Migration(migrations.Migration):
     initial = True
 
     dependencies = [
-        ('auth', '0009_alter_user_last_name_max_length'),
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
     ]
 
     operations = [
         migrations.CreateModel(
-            name='Person',
+            name='School',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=30, verbose_name='Name')),
+                ('name_official', models.CharField(help_text='Official name of the school, e.g. as given by supervisory authority', max_length=200, verbose_name='Official name')),
+            ],
+            options={
+                'ordering': ['name', 'name_official'],
+            },
+        ),
+        migrations.RunPython(create_default_school),
+        migrations.CreateModel(
+            name='Group',
             fields=[
-                ('id', models.AutoField(auto_created=True,
-                                        primary_key=True, serialize=False, verbose_name='ID')),
-                ('password', models.CharField(max_length=128, verbose_name='password')),
-                ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
-                ('is_superuser', models.BooleanField(default=False,
-                                                     help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
-                ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.',
-                                              max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
-                ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
-                ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
-                ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
-                ('is_staff', models.BooleanField(default=False,
-                                                 help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
-                ('is_active', models.BooleanField(
-                    default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
-                ('date_joined', models.DateTimeField(
-                    default=django.utils.timezone.now, verbose_name='date joined')),
-                ('is_student', models.BooleanField(default=False)),
-                ('is_teacher', models.BooleanField(default=False)),
-                ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.',
-                                                  related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
-                ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.',
-                                                            related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=60, verbose_name='Long name of group')),
+                ('short_name', models.CharField(max_length=16, verbose_name='Short name of group')),
             ],
             options={
-                'verbose_name': 'user',
-                'verbose_name_plural': 'users',
-                'abstract': False,
+                'ordering': ['short_name', 'name'],
             },
-            managers=[
-                ('objects', django.contrib.auth.models.UserManager()),
+        ),
+        migrations.CreateModel(
+            name='Person',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('is_active', models.BooleanField(default=True, verbose_name='Is person active?')),
+                ('first_name', models.CharField(max_length=30, verbose_name='First name')),
+                ('last_name', models.CharField(max_length=30, verbose_name='Last name')),
+                ('additional_name', models.CharField(blank=True, max_length=30, verbose_name='Additional name(s)')),
+                ('short_name', models.CharField(blank=True, max_length=5, null=True, verbose_name='Short name')),
+                ('street', models.CharField(blank=True, max_length=30, verbose_name='Street')),
+                ('housenumber', models.CharField(blank=True, max_length=10, verbose_name='Street number')),
+                ('postal_code', models.CharField(blank=True, max_length=5, verbose_name='Postal code')),
+                ('place', models.CharField(blank=True, max_length=30, verbose_name='Place')),
+                ('phone_number', phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, region=None, verbose_name='Home phone')),
+                ('mobile_number', phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, region=None, verbose_name='Mobile phone')),
+                ('email', models.EmailField(blank=True, max_length=254, verbose_name='E-mail address')),
+                ('date_of_birth', models.DateField(blank=True, null=True, verbose_name='Date of birth')),
+                ('sex', models.CharField(blank=True, choices=[('f', 'female'), ('m', 'male')], max_length=1, verbose_name='Sex')),
+                ('photo', image_cropping.fields.ImageCropField(blank=True, null=True, upload_to='', verbose_name='Photo')),
+                ('photo_cropping', image_cropping.fields.ImageRatioField('photo', '600x800', adapt_rotation=False, allow_fullsize=False, free_crop=False, help_text=None, hide_image_field=False, size_warning=True, verbose_name='photo cropping')),
+                ('import_ref', models.CharField(blank=True, editable=False, max_length=64, null=True, verbose_name='Reference ID of import source')),
+                ('guardians', models.ManyToManyField(related_name='children', to='core.Person', verbose_name='Guardians / Parents')),
+                ('primary_group', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.Group')),
+                ('school', models.ForeignKey(default=biscuit.core.util.core_helpers.get_current_school, on_delete=django.db.models.deletion.CASCADE, to='core.School')),
+                ('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='person', to=settings.AUTH_USER_MODEL)),
             ],
+            options={
+                'ordering': ['last_name', 'first_name'],
+                'unique_together': {('school', 'import_ref'), ('school', 'short_name')},
+            },
+        ),
+        migrations.AddField(
+            model_name='group',
+            name='members',
+            field=models.ManyToManyField(related_name='member_of', to='core.Person'),
+        ),
+        migrations.AddField(
+            model_name='group',
+            name='owners',
+            field=models.ManyToManyField(related_name='owner_of', to='core.Person'),
+        ),
+        migrations.AddField(
+            model_name='group',
+            name='parent_groups',
+            field=models.ManyToManyField(related_name='child_groups', to='core.Group', verbose_name='Parent groups'),
+        ),
+        migrations.AddField(
+            model_name='group',
+            name='school',
+            field=models.ForeignKey(default=biscuit.core.util.core_helpers.get_current_school, on_delete=django.db.models.deletion.CASCADE, to='core.School'),
+        ),
+        migrations.AlterUniqueTogether(
+            name='group',
+            unique_together={('school', 'name'), ('school', 'short_name')},
         ),
     ]
diff --git a/biscuit/core/migrations/0002_fill_person_model.py b/biscuit/core/migrations/0002_fill_person_model.py
deleted file mode 100644
index a5a31991c0c8768a24901ad20996611406f46726..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0002_fill_person_model.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# Generated by Django 2.2.3 on 2019-07-15 11:27
-
-from django.conf import settings
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.RemoveField(
-            model_name='person',
-            name='is_student',
-        ),
-        migrations.RemoveField(
-            model_name='person',
-            name='is_teacher',
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='additional_name',
-            field=models.CharField(blank=True, max_length=30, verbose_name='Additional name(s)'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='date_of_birth',
-            field=models.DateField(blank=True, null=True, verbose_name='Date of birth'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='guardians',
-            field=models.ManyToManyField(
-                related_name='children', to=settings.AUTH_USER_MODEL, verbose_name='Guardians / Parents'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='housenumber',
-            field=models.CharField(blank=True, max_length=10, verbose_name='Street number'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='import_ref',
-            field=models.CharField(blank=True, editable=False, max_length=64,
-                                   verbose_name='Reference ID of import source'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='mobile_number',
-            field=models.CharField(blank=True, max_length=30, verbose_name='Mobile phone'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='phone_number',
-            field=models.CharField(blank=True, max_length=30, verbose_name='Home phone'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='photo',
-            field=models.ImageField(blank=True, null=True, upload_to='', verbose_name='Photo'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='place',
-            field=models.CharField(blank=True, max_length=30, verbose_name='Place'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='postal_code',
-            field=models.CharField(blank=True, max_length=5, verbose_name='Postal code'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='sex',
-            field=models.CharField(blank=True, choices=[(
-                'f', 'female'), ('m', 'male')], max_length=1, verbose_name='Sex'),
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='street',
-            field=models.CharField(blank=True, max_length=30, verbose_name='Street'),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0003_split_person_user.py b/biscuit/core/migrations/0003_split_person_user.py
deleted file mode 100644
index 2f09782caf3a5216922806aaf71ba75e23c8476a..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0003_split_person_user.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# Generated by Django 2.2.3 on 2019-07-15 21:26
-
-from django.db import migrations, models
-import phonenumber_field.modelfields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0002_fill_person_model'),
-    ]
-
-    operations = [
-        migrations.AlterModelOptions(
-            name='person',
-            options={},
-        ),
-        migrations.AlterModelManagers(
-            name='person',
-            managers=[
-            ],
-        ),
-        migrations.RemoveField(
-            model_name='person',
-            name='date_joined',
-        ),
-        migrations.RemoveField(
-            model_name='person',
-            name='groups',
-        ),
-        migrations.RemoveField(
-            model_name='person',
-            name='is_staff',
-        ),
-        migrations.RemoveField(
-            model_name='person',
-            name='is_superuser',
-        ),
-        migrations.RemoveField(
-            model_name='person',
-            name='last_login',
-        ),
-        migrations.RemoveField(
-            model_name='person',
-            name='password',
-        ),
-        migrations.RemoveField(
-            model_name='person',
-            name='user_permissions',
-        ),
-        migrations.RemoveField(
-            model_name='person',
-            name='username',
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='email',
-            field=models.EmailField(blank=True, max_length=254, verbose_name='E-mail address'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='first_name',
-            field=models.CharField(max_length=30, verbose_name='First name'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='guardians',
-            field=models.ManyToManyField(related_name='children',
-                                         to='core.Person', verbose_name='Guardians / Parents'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='is_active',
-            field=models.BooleanField(default=False, verbose_name='Is person active?'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='last_name',
-            field=models.CharField(max_length=30, verbose_name='Last name'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='mobile_number',
-            field=phonenumber_field.modelfields.PhoneNumberField(
-                blank=True, max_length=128, region=None, verbose_name='Mobile phone'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='phone_number',
-            field=phonenumber_field.modelfields.PhoneNumberField(
-                blank=True, max_length=128, region=None, verbose_name='Home phone'),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0004_group.py b/biscuit/core/migrations/0004_group.py
deleted file mode 100644
index 77013b2ecc08299c63a1120632c3a8065c20414b..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0004_group.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Generated by Django 2.2.3 on 2019-07-16 11:37
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0003_split_person_user'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='Group',
-            fields=[
-                ('id', models.AutoField(auto_created=True,
-                                        primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30, verbose_name='Long name of group')),
-                ('short_name', models.CharField(max_length=8, verbose_name='Short name of group')),
-                ('members', models.ManyToManyField(related_name='member_of', to='core.Person')),
-                ('owners', models.ManyToManyField(related_name='owner_of', to='core.Person')),
-            ],
-        ),
-    ]
diff --git a/biscuit/core/migrations/0005_person_short_name.py b/biscuit/core/migrations/0005_person_short_name.py
deleted file mode 100644
index 3ff36fc4483bf02cceb74b9bb571e0eb09b0700b..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0005_person_short_name.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Generated by Django 2.2.3 on 2019-07-16 12:31
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0004_group'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='person',
-            name='short_name',
-            field=models.CharField(blank=True, max_length=5, verbose_name='Short name'),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0006_make_unique.py b/biscuit/core/migrations/0006_make_unique.py
deleted file mode 100644
index b7df4f31eb6bfc6f053d608ed06545f18a0c3d30..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0006_make_unique.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# Generated by Django 2.2.3 on 2019-07-24 21:26
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0005_person_short_name'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='group',
-            name='name',
-            field=models.CharField(max_length=30, unique=True, verbose_name='Long name of group'),
-        ),
-        migrations.AlterField(
-            model_name='group',
-            name='short_name',
-            field=models.CharField(max_length=8, unique=True, verbose_name='Short name of group'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='import_ref',
-            field=models.CharField(blank=True, editable=False, max_length=64,
-                                   unique=True, verbose_name='Reference ID of import source'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='short_name',
-            field=models.CharField(blank=True, max_length=5, unique=True,
-                                   verbose_name='Short name'),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0007_school.py b/biscuit/core/migrations/0007_school.py
deleted file mode 100644
index 71cc5125de03bb5a3eab803786472664420ead78..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0007_school.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Generated by Django 2.2.3 on 2019-07-28 20:19
-# Manually edited to create default school
-
-from django.db import migrations, models
-from django.utils.translation import ugettext_lazy as _
-
-
-def create_default_school(apps, schema_editor):
-    db_alias = schema_editor.connection.alias
-    School = apps.get_model('core', 'School')  # noqa
-    School.objects.using(db_alias).create(name=_('Default school'))
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0006_make_unique'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='School',
-            fields=[
-                ('id', models.AutoField(auto_created=True,
-                                        primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30, verbose_name='Name')),
-                ('name_official', models.CharField(
-                    help_text='Official name of the school, e.g. as given by supervisory authority', max_length=200, verbose_name='Official name')),
-            ],
-        ),
-        migrations.RunPython(create_default_school)
-    ]
diff --git a/biscuit/core/migrations/0008_school_person_group.py b/biscuit/core/migrations/0008_school_person_group.py
deleted file mode 100644
index c0755f3f0bd9e7c49715a6c7223025f9a7b8cd57..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0008_school_person_group.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# Generated by Django 2.2.3 on 2019-07-28 20:52
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0007_school'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='group',
-            name='school',
-            field=models.ForeignKey(
-                default=1, on_delete=django.db.models.deletion.CASCADE, to='core.School'),
-            preserve_default=False,
-        ),
-        migrations.AddField(
-            model_name='person',
-            name='school',
-            field=models.ForeignKey(
-                default=1, on_delete=django.db.models.deletion.CASCADE, to='core.School'),
-            preserve_default=False,
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='import_ref',
-            field=models.CharField(blank=True, editable=False, max_length=64,
-                                   verbose_name='Reference ID of import source'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='short_name',
-            field=models.CharField(blank=True, max_length=5, verbose_name='Short name'),
-        ),
-        migrations.AlterUniqueTogether(
-            name='group',
-            unique_together={('school', 'short_name'), ('school', 'name')},
-        ),
-        migrations.AlterUniqueTogether(
-            name='person',
-            unique_together={('school', 'short_name'), ('school', 'import_ref')},
-        ),
-    ]
diff --git a/biscuit/core/migrations/0009_person_user.py b/biscuit/core/migrations/0009_person_user.py
deleted file mode 100644
index aaae472397851879e199aab5450cab63b879571c..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0009_person_user.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Generated by Django 2.2.3 on 2019-07-30 20:29
-
-from django.conf import settings
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
-        ('core', '0008_school_person_group'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='person',
-            name='user',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
-                                    related_name='person', to=settings.AUTH_USER_MODEL),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0010_user_one_to_one.py b/biscuit/core/migrations/0010_user_one_to_one.py
deleted file mode 100644
index d2f5ca6adc61c78348509296e9a68b5ee2180e5f..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0010_user_one_to_one.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# Generated by Django 2.2.3 on 2019-07-30 20:48
-
-from django.conf import settings
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0009_person_user'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='person',
-            name='user',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
-                                       related_name='person', to=settings.AUTH_USER_MODEL),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0011_default_school.py b/biscuit/core/migrations/0011_default_school.py
deleted file mode 100644
index 3c97ada1e3b5594fa7670d6bcb6fe318f5934410..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0011_default_school.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Generated by Django 2.2.3 on 2019-07-30 21:02
-
-import biscuit.core.util.core_helpers
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0010_user_one_to_one'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='group',
-            name='school',
-            field=models.ForeignKey(default=biscuit.core.util.core_helpers.get_current_school,
-                                    on_delete=django.db.models.deletion.CASCADE, to='core.School'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='school',
-            field=models.ForeignKey(default=biscuit.core.util.core_helpers.get_current_school,
-                                    on_delete=django.db.models.deletion.CASCADE, to='core.School'),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0012_allow_null.py b/biscuit/core/migrations/0012_allow_null.py
deleted file mode 100644
index ccf86ccfb7f86637bcef2da558a0e83bedf95edc..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0012_allow_null.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Generated by Django 2.2.4 on 2019-08-17 12:08
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0011_default_school'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='person',
-            name='import_ref',
-            field=models.CharField(blank=True, editable=False, max_length=64,
-                                   null=True, verbose_name='Reference ID of import source'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='short_name',
-            field=models.CharField(blank=True, max_length=5, null=True, verbose_name='Short name'),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0013_person_primary_group.py b/biscuit/core/migrations/0013_person_primary_group.py
deleted file mode 100644
index 88fac71f0a9cb0bf587cdf46aee882bdcc3aa5dd..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0013_person_primary_group.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Generated by Django 2.2.4 on 2019-08-21 14:18
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0012_allow_null'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='person',
-            name='primary_group',
-            field=models.ForeignKey(
-                null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.Group'),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0014_remove_unique.py b/biscuit/core/migrations/0014_remove_unique.py
deleted file mode 100644
index d985917972616b5c30cf700fb0333c7bf72f54da..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0014_remove_unique.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Generated by Django 2.2.4 on 2019-08-22 19:26
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0013_person_primary_group'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='group',
-            name='name',
-            field=models.CharField(max_length=30, verbose_name='Long name of group'),
-        ),
-        migrations.AlterField(
-            model_name='group',
-            name='short_name',
-            field=models.CharField(max_length=8, verbose_name='Short name of group'),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0015_person_photo_crop.py b/biscuit/core/migrations/0015_person_photo_crop.py
deleted file mode 100644
index b33929c85aeddbc5f579cc3bd30e1800062e3942..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0015_person_photo_crop.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Generated by Django 2.2.4 on 2019-08-29 12:12
-
-from django.db import migrations
-import image_cropping.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0014_remove_unique'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='person',
-            name='photo_cropping',
-            field=image_cropping.fields.ImageRatioField('photo', '600x800', adapt_rotation=False, allow_fullsize=False,
-                                                        free_crop=False, help_text=None, hide_image_field=False, size_warning=True, verbose_name='photo cropping'),
-        ),
-        migrations.AlterField(
-            model_name='person',
-            name='photo',
-            field=image_cropping.fields.ImageCropField(
-                blank=True, null=True, upload_to='', verbose_name='Photo'),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0016_parent_groups.py b/biscuit/core/migrations/0016_parent_groups.py
deleted file mode 100644
index a9067b2cbacd276e1f893d69315647b5108bb98b..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0016_parent_groups.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Generated by Django 2.2.4 on 2019-09-02 19:01
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0015_person_photo_crop'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='group',
-            name='parent_groups',
-            field=models.ManyToManyField(related_name='child_groups', to='core.Group', verbose_name='Parent groups'),
-        ),
-    ]
diff --git a/biscuit/core/migrations/0017_group_name_length.py b/biscuit/core/migrations/0017_group_name_length.py
deleted file mode 100644
index 5b00e3f7249cf46b24039161393a83820da5d8e0..0000000000000000000000000000000000000000
--- a/biscuit/core/migrations/0017_group_name_length.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Generated by Django 2.2.4 on 2019-09-02 19:37
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('core', '0016_parent_groups'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='group',
-            name='name',
-            field=models.CharField(max_length=60, verbose_name='Long name of group'),
-        ),
-        migrations.AlterField(
-            model_name='group',
-            name='short_name',
-            field=models.CharField(max_length=16, verbose_name='Short name of group'),
-        ),
-    ]