diff --git a/README.rst b/README.rst
index 65525e3bbe9873c3c3cd1cac12ed8175b5c5e19d..0c06b7161fb0d0b0947cfba98c66837c77a19d1d 100644
--- a/README.rst
+++ b/README.rst
@@ -298,6 +298,12 @@ Please do not report security issues in public. Send security concerns via email
 Changelog
 =========
 
+2.5.4 - 2021-02-XX
+------------------
+
+* Fix bug with `config_id` migration where an entry was created _during_
+  the migration and did _not_ receive a valid UUID value.
+
 2.5.3 - 2021-01-26
 ------------------
 
diff --git a/lti_consumer/migrations/0008_fix_uuid_backfill.py b/lti_consumer/migrations/0008_fix_uuid_backfill.py
new file mode 100644
index 0000000000000000000000000000000000000000..e072f8fd1904b18d8dfdd9b0c2ed72bc4e7d2e6d
--- /dev/null
+++ b/lti_consumer/migrations/0008_fix_uuid_backfill.py
@@ -0,0 +1,31 @@
+from django.db import migrations, models
+import uuid
+
+
+def create_config_ids(apps, schema_editor):
+    LtiConfiguration = apps.get_model('lti_consumer', 'LtiConfiguration')
+    broken = LtiConfiguration.objects.filter(config_id__isnull=True)
+    for config in broken:
+        config.config_id = uuid.uuid4()
+        config.save()
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('lti_consumer', '0007_ltidlcontentitem'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='lticonfiguration',
+            name='config_id',
+            field=models.UUIDField(default=uuid.uuid4, editable=True, unique=True),
+        ),
+        migrations.RunPython(create_config_ids),
+        migrations.AlterField(
+            model_name='lticonfiguration',
+            name='config_id',
+            field=models.UUIDField(default=uuid.uuid4, editable=False, unique=True),
+        ),
+    ]