diff --git a/helios/migrations/0001_initial.py b/helios/migrations/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..58c8de62eae198a613ba4903b08964038481a6ec
--- /dev/null
+++ b/helios/migrations/0001_initial.py
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+import helios.datatypes.djangofield
+import helios_auth.jsonfield
+import helios.datatypes
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('helios_auth', '__first__'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='AuditedBallot',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('raw_vote', models.TextField()),
+                ('vote_hash', models.CharField(max_length=100)),
+                ('added_at', models.DateTimeField(auto_now_add=True)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='CastVote',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('vote', helios.datatypes.djangofield.LDObjectField()),
+                ('vote_hash', models.CharField(max_length=100)),
+                ('vote_tinyhash', models.CharField(max_length=50, unique=True, null=True)),
+                ('cast_at', models.DateTimeField(auto_now_add=True)),
+                ('quarantined_p', models.BooleanField(default=False)),
+                ('released_from_quarantine_at', models.DateTimeField(null=True)),
+                ('verified_at', models.DateTimeField(null=True)),
+                ('invalidated_at', models.DateTimeField(null=True)),
+            ],
+            options={
+                'abstract': False,
+            },
+            bases=(models.Model, helios.datatypes.LDObjectContainer),
+        ),
+        migrations.CreateModel(
+            name='Election',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('uuid', models.CharField(max_length=50)),
+                ('datatype', models.CharField(default=b'legacy/Election', max_length=250)),
+                ('short_name', models.CharField(max_length=100)),
+                ('name', models.CharField(max_length=250)),
+                ('election_type', models.CharField(default=b'election', max_length=250, choices=[(b'election', b'Election'), (b'referendum', b'Referendum')])),
+                ('private_p', models.BooleanField(default=False)),
+                ('description', models.TextField()),
+                ('public_key', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('private_key', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('questions', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('eligibility', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('openreg', models.BooleanField(default=False)),
+                ('featured_p', models.BooleanField(default=False)),
+                ('use_voter_aliases', models.BooleanField(default=False)),
+                ('use_advanced_audit_features', models.BooleanField(default=True)),
+                ('randomize_answer_order', models.BooleanField(default=False)),
+                ('cast_url', models.CharField(max_length=500)),
+                ('created_at', models.DateTimeField(auto_now_add=True)),
+                ('modified_at', models.DateTimeField(auto_now_add=True)),
+                ('frozen_at', models.DateTimeField(default=None, null=True)),
+                ('archived_at', models.DateTimeField(default=None, null=True)),
+                ('registration_starts_at', models.DateTimeField(default=None, null=True)),
+                ('voting_starts_at', models.DateTimeField(default=None, null=True)),
+                ('voting_ends_at', models.DateTimeField(default=None, null=True)),
+                ('complaint_period_ends_at', models.DateTimeField(default=None, null=True)),
+                ('tallying_starts_at', models.DateTimeField(default=None, null=True)),
+                ('voting_started_at', models.DateTimeField(default=None, null=True)),
+                ('voting_extended_until', models.DateTimeField(default=None, null=True)),
+                ('voting_ended_at', models.DateTimeField(default=None, null=True)),
+                ('tallying_started_at', models.DateTimeField(default=None, null=True)),
+                ('tallying_finished_at', models.DateTimeField(default=None, null=True)),
+                ('tallies_combined_at', models.DateTimeField(default=None, null=True)),
+                ('result_released_at', models.DateTimeField(default=None, null=True)),
+                ('voters_hash', models.CharField(max_length=100, null=True)),
+                ('encrypted_tally', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('result', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('result_proof', helios_auth.jsonfield.JSONField(null=True)),
+                ('help_email', models.EmailField(max_length=254, null=True)),
+                ('election_info_url', models.CharField(max_length=300, null=True)),
+                ('admin', models.ForeignKey(to='helios_auth.User')),
+            ],
+            options={
+                'abstract': False,
+            },
+            bases=(models.Model, helios.datatypes.LDObjectContainer),
+        ),
+        migrations.CreateModel(
+            name='ElectionLog',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('log', models.CharField(max_length=500)),
+                ('at', models.DateTimeField(auto_now_add=True)),
+                ('election', models.ForeignKey(to='helios.Election')),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Trustee',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('uuid', models.CharField(max_length=50)),
+                ('name', models.CharField(max_length=200)),
+                ('email', models.EmailField(max_length=254)),
+                ('secret', models.CharField(max_length=100)),
+                ('public_key', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('public_key_hash', models.CharField(max_length=100)),
+                ('secret_key', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('pok', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('decryption_factors', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('decryption_proofs', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('election', models.ForeignKey(to='helios.Election')),
+            ],
+            bases=(models.Model, helios.datatypes.LDObjectContainer),
+        ),
+        migrations.CreateModel(
+            name='Voter',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('uuid', models.CharField(max_length=50)),
+                ('voter_login_id', models.CharField(max_length=100, null=True)),
+                ('voter_password', models.CharField(max_length=100, null=True)),
+                ('voter_name', models.CharField(max_length=200, null=True)),
+                ('voter_email', models.CharField(max_length=250, null=True)),
+                ('alias', models.CharField(max_length=100, null=True)),
+                ('vote', helios.datatypes.djangofield.LDObjectField(null=True)),
+                ('vote_hash', models.CharField(max_length=100, null=True)),
+                ('cast_at', models.DateTimeField(null=True)),
+                ('election', models.ForeignKey(to='helios.Election')),
+                ('user', models.ForeignKey(to='helios_auth.User', null=True)),
+            ],
+            bases=(models.Model, helios.datatypes.LDObjectContainer),
+        ),
+        migrations.CreateModel(
+            name='VoterFile',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('voter_file', models.FileField(max_length=250, null=True, upload_to=b'voters/%Y/%m/%d')),
+                ('voter_file_content', models.TextField(null=True)),
+                ('uploaded_at', models.DateTimeField(auto_now_add=True)),
+                ('processing_started_at', models.DateTimeField(null=True)),
+                ('processing_finished_at', models.DateTimeField(null=True)),
+                ('num_voters', models.IntegerField(null=True)),
+                ('election', models.ForeignKey(to='helios.Election')),
+            ],
+        ),
+        migrations.AddField(
+            model_name='castvote',
+            name='voter',
+            field=models.ForeignKey(to='helios.Voter'),
+        ),
+        migrations.AddField(
+            model_name='auditedballot',
+            name='election',
+            field=models.ForeignKey(to='helios.Election'),
+        ),
+        migrations.AlterUniqueTogether(
+            name='voter',
+            unique_together=set([('election', 'voter_login_id')]),
+        ),
+        migrations.AlterUniqueTogether(
+            name='trustee',
+            unique_together=set([('election', 'email')]),
+        ),
+    ]
diff --git a/helios/migrations/__init__.py b/helios/migrations/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/helios_auth/migrations/0001_initial.py b/helios_auth/migrations/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..bf080cb68eeda7c2378e3a7f40dc9a272066acb9
--- /dev/null
+++ b/helios_auth/migrations/0001_initial.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+import helios_auth.jsonfield
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='User',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('user_type', models.CharField(max_length=50)),
+                ('user_id', models.CharField(max_length=100)),
+                ('name', models.CharField(max_length=200, null=True)),
+                ('info', helios_auth.jsonfield.JSONField()),
+                ('token', helios_auth.jsonfield.JSONField(null=True)),
+                ('admin_p', models.BooleanField(default=False)),
+            ],
+        ),
+        migrations.AlterUniqueTogether(
+            name='user',
+            unique_together=set([('user_type', 'user_id')]),
+        ),
+    ]
diff --git a/helios_auth/migrations/__init__.py b/helios_auth/migrations/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391