diff --git a/gracedb/migrations/0001_initial.py b/gracedb/migrations/0001_initial.py
index 6dc69e8609e7ddc6643556eeebe0730cfe4655bd..c27acabde513472ca449a5b88ac2fe4cfd27f2ab 100644
--- a/gracedb/migrations/0001_initial.py
+++ b/gracedb/migrations/0001_initial.py
@@ -1,12 +1,16 @@
 # -*- coding: utf-8 -*-
+# Generated by Django 1.11.5 on 2017-10-25 18:57
 from __future__ import unicode_literals
 
-from django.db import models, migrations
 from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
 
 
 class Migration(migrations.Migration):
 
+    initial = True
+
     dependencies = [
         ('auth', '0008_auto_20171020_1045'),
     ]
@@ -15,23 +19,20 @@ class Migration(migrations.Migration):
         migrations.CreateModel(
             name='Approval',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('created', models.DateTimeField(auto_now_add=True)),
-                ('approvingCollaboration', models.CharField(max_length=1, choices=[(b'L', b'LIGO'), (b'V', b'Virgo')])),
+                ('approvingCollaboration', models.CharField(choices=[(b'L', b'LIGO'), (b'V', b'Virgo')], max_length=1)),
             ],
-            options={
-            },
-            bases=(models.Model,),
         ),
         migrations.CreateModel(
             name='EMBBEventLog',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('N', models.IntegerField()),
                 ('created', models.DateTimeField(auto_now_add=True)),
-                ('instrument', models.CharField(max_length=200, blank=True)),
+                ('instrument', models.CharField(blank=True, max_length=200)),
                 ('footprintID', models.TextField(blank=True)),
-                ('waveband', models.CharField(max_length=25, choices=[(b'em.gamma', b'Gamma rays part of the spectrum'), (b'em.gamma.soft', b'Soft gamma ray (120 - 500 keV)'), (b'em.gamma.hard', b'Hard gamma ray (>500 keV)'), (b'em.X-ray', b'X-ray part of the spectrum'), (b'em.X-ray.soft', b'Soft X-ray (0.12 - 2 keV)'), (b'em.X-ray.medium', b'Medium X-ray (2 - 12 keV)'), (b'em.X-ray.hard', b'Hard X-ray (12 - 120 keV)'), (b'em.UV', b'Ultraviolet part of the spectrum'), (b'em.UV.10-50nm', b'Ultraviolet between 10 and 50 nm'), (b'em.UV.50-100nm', b'Ultraviolet between 50 and 100 nm'), (b'em.UV.100-200nm', b'Ultraviolet between 100 and 200 nm'), (b'em.UV.200-300nm', b'Ultraviolet between 200 and 300 nm'), (b'em.UV.FUV', b'Far-Infrared, 30-100 microns'), (b'em.opt', b'Optical part of the spectrum'), (b'em.opt.U', b'Optical band between 300 and 400 nm'), (b'em.opt.B', b'Optical band between 400 and 500 nm'), (b'em.opt.V', b'Optical band between 500 and 600 nm'), (b'em.opt.R', b'Optical band between 600 and 750 nm'), (b'em.opt.I', b'Optical band between 750 and 1000 nm'), (b'em.IR', b'Infrared part of the spectrum'), (b'em.IR.NIR', b'Near-Infrared, 1-5 microns'), (b'em.IR.J', b'Infrared between 1.0 and 1.5 micron'), (b'em.IR.H', b'Infrared between 1.5 and 2 micron'), (b'em.IR.K', b'Infrared between 2 and 3 micron'), (b'em.IR.MIR', b'Medium-Infrared, 5-30 microns'), (b'em.IR.3-4um', b'Infrared between 3 and 4 micron'), (b'em.IR.4-8um', b'Infrared between 4 and 8 micron'), (b'em.IR.8-15um', b'Infrared between 8 and 15 micron'), (b'em.IR.15-30um', b'Infrared between 15 and 30 micron'), (b'em.IR.30-60um', b'Infrared between 30 and 60 micron'), (b'em.IR.60-100um', b'Infrared between 60 and 100 micron'), (b'em.IR.FIR', b'Far-Infrared, 30-100 microns'), (b'em.mm', b'Millimetric part of the spectrum'), (b'em.mm.1500-3000GHz', b'Millimetric between 1500 and 3000 GHz'), (b'em.mm.750-1500GHz', b'Millimetric between 750 and 1500 GHz'), (b'em.mm.400-750GHz', b'Millimetric between 400 and 750 GHz'), (b'em.mm.200-400GHz', b'Millimetric between 200 and 400 GHz'), (b'em.mm.100-200GHz', b'Millimetric between 100 and 200 GHz'), (b'em.mm.50-100GHz', b'Millimetric between 50 and 100 GHz'), (b'em.mm.30-50GHz', b'Millimetric between 30 and 50 GHz'), (b'em.radio', b'Radio part of the spectrum'), (b'em.radio.12-30GHz', b'Radio between 12 and 30 GHz'), (b'em.radio.6-12GHz', b'Radio between 6 and 12 GHz'), (b'em.radio.3-6GHz', b'Radio between 3 and 6 GHz'), (b'em.radio.1500-3000MHz', b'Radio between 1500 and 3000 MHz'), (b'em.radio.750-1500MHz', b'Radio between 750 and 1500 MHz'), (b'em.radio.400-750MHz', b'Radio between 400 and 750 MHz'), (b'em.radio.200-400MHz', b'Radio between 200 and 400 MHz'), (b'em.radio.100-200MHz', b'Radio between 100 and 200 MHz'), (b'em.radio.20-100MHz', b'Radio between 20 and 100 MHz')])),
+                ('waveband', models.CharField(choices=[(b'em.gamma', b'Gamma rays part of the spectrum'), (b'em.gamma.soft', b'Soft gamma ray (120 - 500 keV)'), (b'em.gamma.hard', b'Hard gamma ray (>500 keV)'), (b'em.X-ray', b'X-ray part of the spectrum'), (b'em.X-ray.soft', b'Soft X-ray (0.12 - 2 keV)'), (b'em.X-ray.medium', b'Medium X-ray (2 - 12 keV)'), (b'em.X-ray.hard', b'Hard X-ray (12 - 120 keV)'), (b'em.UV', b'Ultraviolet part of the spectrum'), (b'em.UV.10-50nm', b'Ultraviolet between 10 and 50 nm'), (b'em.UV.50-100nm', b'Ultraviolet between 50 and 100 nm'), (b'em.UV.100-200nm', b'Ultraviolet between 100 and 200 nm'), (b'em.UV.200-300nm', b'Ultraviolet between 200 and 300 nm'), (b'em.UV.FUV', b'Far-Infrared, 30-100 microns'), (b'em.opt', b'Optical part of the spectrum'), (b'em.opt.U', b'Optical band between 300 and 400 nm'), (b'em.opt.B', b'Optical band between 400 and 500 nm'), (b'em.opt.V', b'Optical band between 500 and 600 nm'), (b'em.opt.R', b'Optical band between 600 and 750 nm'), (b'em.opt.I', b'Optical band between 750 and 1000 nm'), (b'em.IR', b'Infrared part of the spectrum'), (b'em.IR.NIR', b'Near-Infrared, 1-5 microns'), (b'em.IR.J', b'Infrared between 1.0 and 1.5 micron'), (b'em.IR.H', b'Infrared between 1.5 and 2 micron'), (b'em.IR.K', b'Infrared between 2 and 3 micron'), (b'em.IR.MIR', b'Medium-Infrared, 5-30 microns'), (b'em.IR.3-4um', b'Infrared between 3 and 4 micron'), (b'em.IR.4-8um', b'Infrared between 4 and 8 micron'), (b'em.IR.8-15um', b'Infrared between 8 and 15 micron'), (b'em.IR.15-30um', b'Infrared between 15 and 30 micron'), (b'em.IR.30-60um', b'Infrared between 30 and 60 micron'), (b'em.IR.60-100um', b'Infrared between 60 and 100 micron'), (b'em.IR.FIR', b'Far-Infrared, 30-100 microns'), (b'em.mm', b'Millimetric part of the spectrum'), (b'em.mm.1500-3000GHz', b'Millimetric between 1500 and 3000 GHz'), (b'em.mm.750-1500GHz', b'Millimetric between 750 and 1500 GHz'), (b'em.mm.400-750GHz', b'Millimetric between 400 and 750 GHz'), (b'em.mm.200-400GHz', b'Millimetric between 200 and 400 GHz'), (b'em.mm.100-200GHz', b'Millimetric between 100 and 200 GHz'), (b'em.mm.50-100GHz', b'Millimetric between 50 and 100 GHz'), (b'em.mm.30-50GHz', b'Millimetric between 30 and 50 GHz'), (b'em.radio', b'Radio part of the spectrum'), (b'em.radio.12-30GHz', b'Radio between 12 and 30 GHz'), (b'em.radio.6-12GHz', b'Radio between 6 and 12 GHz'), (b'em.radio.3-6GHz', b'Radio between 3 and 6 GHz'), (b'em.radio.1500-3000MHz', b'Radio between 1500 and 3000 MHz'), (b'em.radio.750-1500MHz', b'Radio between 750 and 1500 MHz'), (b'em.radio.400-750MHz', b'Radio between 400 and 750 MHz'), (b'em.radio.200-400MHz', b'Radio between 200 and 400 MHz'), (b'em.radio.100-200MHz', b'Radio between 100 and 200 MHz'), (b'em.radio.20-100MHz', b'Radio between 20 and 100 MHz')], max_length=25)),
                 ('ra', models.FloatField(null=True)),
                 ('dec', models.FloatField(null=True)),
                 ('raWidth', models.FloatField(null=True)),
@@ -44,20 +45,19 @@ class Migration(migrations.Migration):
                 ('decWidthList', models.TextField(blank=True)),
                 ('gpstimeList', models.TextField(blank=True)),
                 ('durationList', models.TextField(blank=True)),
-                ('eel_status', models.CharField(max_length=2, choices=[(b'FO', b'FOOTPRINT'), (b'SO', b'SOURCE'), (b'CO', b'COMMENT'), (b'CI', b'CIRCULAR')])),
-                ('obs_status', models.CharField(max_length=2, choices=[(b'NA', b'NOT APPLICABLE'), (b'OB', b'OBSERVATION'), (b'TE', b'TEST'), (b'PR', b'PREDICTION')])),
+                ('eel_status', models.CharField(choices=[(b'FO', b'FOOTPRINT'), (b'SO', b'SOURCE'), (b'CO', b'COMMENT'), (b'CI', b'CIRCULAR')], max_length=2)),
+                ('obs_status', models.CharField(choices=[(b'NA', b'NOT APPLICABLE'), (b'OB', b'OBSERVATION'), (b'TE', b'TEST'), (b'PR', b'PREDICTION')], max_length=2)),
                 ('comment', models.TextField(blank=True)),
                 ('extra_info_dict', models.TextField(blank=True)),
             ],
             options={
                 'ordering': ['-created', '-N'],
             },
-            bases=(models.Model,),
         ),
         migrations.CreateModel(
             name='EMFootprint',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('N', models.IntegerField()),
                 ('ra', models.FloatField()),
                 ('dec', models.FloatField()),
@@ -69,22 +69,18 @@ class Migration(migrations.Migration):
             options={
                 'ordering': ['-N'],
             },
-            bases=(models.Model,),
         ),
         migrations.CreateModel(
             name='EMGroup',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
-                ('name', models.CharField(unique=True, max_length=20)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=50, unique=True)),
             ],
-            options={
-            },
-            bases=(models.Model,),
         ),
         migrations.CreateModel(
             name='EMObservation',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('N', models.IntegerField()),
                 ('created', models.DateTimeField(auto_now_add=True)),
                 ('ra', models.FloatField(null=True)),
@@ -96,47 +92,28 @@ class Migration(migrations.Migration):
             options={
                 'ordering': ['-created', '-N'],
             },
-            bases=(models.Model,),
         ),
         migrations.CreateModel(
             name='Event',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('created', models.DateTimeField(auto_now_add=True)),
                 ('instruments', models.CharField(default=b'', max_length=20)),
                 ('nevents', models.PositiveIntegerField(null=True)),
                 ('far', models.FloatField(null=True)),
                 ('likelihood', models.FloatField(null=True)),
-                ('gpstime', models.DecimalField(null=True, max_digits=16, decimal_places=6)),
+                ('gpstime', models.DecimalField(decimal_places=6, max_digits=16, null=True)),
                 ('perms', models.TextField(null=True)),
+                ('offline', models.BooleanField(default=False)),
             ],
             options={
                 'ordering': ['-id'],
             },
-            bases=(models.Model,),
-        ),
-        migrations.CreateModel(
-            name='CoincInspiralEvent',
-            fields=[
-                ('event_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='gracedb.Event')),
-                ('ifos', models.CharField(default=b'', max_length=20)),
-                ('end_time', models.PositiveIntegerField(null=True)),
-                ('end_time_ns', models.PositiveIntegerField(null=True)),
-                ('mass', models.FloatField(null=True)),
-                ('mchirp', models.FloatField(null=True)),
-                ('minimum_duration', models.FloatField(null=True)),
-                ('snr', models.FloatField(null=True)),
-                ('false_alarm_rate', models.FloatField(null=True)),
-                ('combined_far', models.FloatField(null=True)),
-            ],
-            options={
-            },
-            bases=('gracedb.event',),
         ),
         migrations.CreateModel(
             name='EventLog',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('created', models.DateTimeField(auto_now_add=True)),
                 ('filename', models.CharField(default=b'', max_length=100)),
                 ('comment', models.TextField()),
@@ -146,181 +123,63 @@ class Migration(migrations.Migration):
             options={
                 'ordering': ['-created', '-N'],
             },
-            bases=(models.Model,),
-        ),
-        migrations.CreateModel(
-            name='GrbEvent',
-            fields=[
-                ('event_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='gracedb.Event')),
-                ('ivorn', models.CharField(max_length=200, null=True)),
-                ('author_ivorn', models.CharField(max_length=200, null=True)),
-                ('author_shortname', models.CharField(max_length=200, null=True)),
-                ('observatory_location_id', models.CharField(max_length=200, null=True)),
-                ('coord_system', models.CharField(max_length=200, null=True)),
-                ('ra', models.FloatField(null=True)),
-                ('dec', models.FloatField(null=True)),
-                ('error_radius', models.FloatField(null=True)),
-                ('how_description', models.CharField(max_length=200, null=True)),
-                ('how_reference_url', models.URLField(null=True)),
-                ('trigger_duration', models.FloatField(null=True)),
-                ('t90', models.FloatField(null=True)),
-            ],
-            options={
-            },
-            bases=('gracedb.event',),
         ),
         migrations.CreateModel(
             name='Group',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('name', models.CharField(max_length=20)),
             ],
-            options={
-            },
-            bases=(models.Model,),
         ),
         migrations.CreateModel(
             name='Label',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
-                ('name', models.CharField(unique=True, max_length=20)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=20, unique=True)),
                 ('defaultColor', models.CharField(default=b'black', max_length=20)),
+                ('description', models.TextField()),
             ],
-            options={
-            },
-            bases=(models.Model,),
         ),
         migrations.CreateModel(
             name='Labelling',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('created', models.DateTimeField(auto_now_add=True)),
-                ('creator', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
+                ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
             ],
-            options={
-            },
-            bases=(models.Model,),
-        ),
-        migrations.CreateModel(
-            name='MultiBurstEvent',
-            fields=[
-                ('event_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='gracedb.Event')),
-                ('ifos', models.CharField(default=b'', max_length=20)),
-                ('start_time', models.PositiveIntegerField(null=True)),
-                ('start_time_ns', models.PositiveIntegerField(null=True)),
-                ('duration', models.FloatField(null=True)),
-                ('peak_time', models.PositiveIntegerField(null=True)),
-                ('peak_time_ns', models.PositiveIntegerField(null=True)),
-                ('central_freq', models.FloatField(null=True)),
-                ('bandwidth', models.FloatField(null=True)),
-                ('amplitude', models.FloatField(null=True)),
-                ('snr', models.FloatField(null=True)),
-                ('confidence', models.FloatField(null=True)),
-                ('false_alarm_rate', models.FloatField(null=True)),
-                ('ligo_axis_ra', models.FloatField(null=True)),
-                ('ligo_axis_dec', models.FloatField(null=True)),
-                ('ligo_angle', models.FloatField(null=True)),
-                ('ligo_angle_sig', models.FloatField(null=True)),
-            ],
-            options={
-            },
-            bases=('gracedb.event',),
         ),
         migrations.CreateModel(
             name='Pipeline',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('name', models.CharField(max_length=100)),
             ],
-            options={
-            },
-            bases=(models.Model,),
         ),
         migrations.CreateModel(
             name='Search',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('name', models.CharField(max_length=100)),
                 ('description', models.TextField(blank=True)),
             ],
-            options={
-            },
-            bases=(models.Model,),
         ),
         migrations.CreateModel(
-            name='SimInspiralEvent',
+            name='Signoff',
             fields=[
-                ('event_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='gracedb.Event')),
-                ('mass1', models.FloatField(null=True)),
-                ('mass2', models.FloatField(null=True)),
-                ('eta', models.FloatField(null=True)),
-                ('amp_order', models.IntegerField(null=True)),
-                ('coa_phase', models.FloatField(null=True)),
-                ('mchirp', models.FloatField(null=True)),
-                ('spin1y', models.FloatField(null=True)),
-                ('spin1x', models.FloatField(null=True)),
-                ('spin1z', models.FloatField(null=True)),
-                ('spin2x', models.FloatField(null=True)),
-                ('spin2y', models.FloatField(null=True)),
-                ('spin2z', models.FloatField(null=True)),
-                ('geocent_end_time', models.IntegerField(null=True)),
-                ('geocent_end_time_ns', models.IntegerField(null=True)),
-                ('end_time_gmst', models.FloatField(null=True)),
-                ('f_lower', models.FloatField(null=True)),
-                ('f_final', models.FloatField(null=True)),
-                ('distance', models.FloatField(null=True)),
-                ('latitude', models.FloatField(null=True)),
-                ('longitude', models.FloatField(null=True)),
-                ('polarization', models.FloatField(null=True)),
-                ('inclination', models.FloatField(null=True)),
-                ('theta0', models.FloatField(null=True)),
-                ('phi0', models.FloatField(null=True)),
-                ('waveform', models.CharField(default=b'', max_length=50, blank=True)),
-                ('numrel_mode_min', models.IntegerField(null=True)),
-                ('numrel_mode_max', models.IntegerField(null=True)),
-                ('numrel_data', models.CharField(default=b'', max_length=50, blank=True)),
-                ('source', models.CharField(default=b'', max_length=50, blank=True)),
-                ('taper', models.CharField(default=b'', max_length=50, blank=True)),
-                ('bandpass', models.IntegerField(null=True)),
-                ('alpha', models.FloatField(null=True)),
-                ('beta', models.FloatField(null=True)),
-                ('psi0', models.FloatField(null=True)),
-                ('psi3', models.FloatField(null=True)),
-                ('alpha1', models.FloatField(null=True)),
-                ('alpha2', models.FloatField(null=True)),
-                ('alpha3', models.FloatField(null=True)),
-                ('alpha4', models.FloatField(null=True)),
-                ('alpha5', models.FloatField(null=True)),
-                ('alpha6', models.FloatField(null=True)),
-                ('g_end_time', models.IntegerField(null=True)),
-                ('g_end_time_ns', models.IntegerField(null=True)),
-                ('h_end_time', models.IntegerField(null=True)),
-                ('h_end_time_ns', models.IntegerField(null=True)),
-                ('l_end_time', models.IntegerField(null=True)),
-                ('l_end_time_ns', models.IntegerField(null=True)),
-                ('t_end_time', models.IntegerField(null=True)),
-                ('t_end_time_ns', models.IntegerField(null=True)),
-                ('v_end_time', models.IntegerField(null=True)),
-                ('v_end_time_ns', models.IntegerField(null=True)),
-                ('eff_dist_g', models.FloatField(null=True)),
-                ('eff_dist_h', models.FloatField(null=True)),
-                ('eff_dist_l', models.FloatField(null=True)),
-                ('eff_dist_t', models.FloatField(null=True)),
-                ('eff_dist_v', models.FloatField(null=True)),
-                ('source_channel', models.CharField(default=b'', max_length=50, blank=True)),
-                ('destination_channel', models.CharField(default=b'', max_length=50, blank=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('signoff_type', models.CharField(choices=[(b'OP', b'operator'), (b'ADV', b'advocate')], max_length=3)),
+                ('instrument', models.CharField(blank=True, choices=[(b'H1', b'LHO'), (b'L1', b'LLO'), (b'V1', b'Virgo')], max_length=2)),
+                ('status', models.CharField(choices=[(b'OK', b'OKAY'), (b'NO', b'NOT OKAY')], max_length=2)),
+                ('comment', models.TextField(blank=True)),
             ],
-            options={
-            },
-            bases=('gracedb.event',),
         ),
         migrations.CreateModel(
             name='SingleInspiral',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('ifo', models.CharField(max_length=20, null=True)),
                 ('search', models.CharField(max_length=20, null=True)),
-                ('channel', models.CharField(max_length=20)),
+                ('channel', models.CharField(blank=True, max_length=20)),
                 ('end_time', models.IntegerField(null=True)),
                 ('end_time_ns', models.IntegerField(null=True)),
                 ('end_time_gmst', models.FloatField(null=True)),
@@ -380,168 +239,315 @@ class Migration(migrations.Migration):
                 ('spin2x', models.FloatField(null=True)),
                 ('spin2y', models.FloatField(null=True)),
                 ('spin2z', models.FloatField(null=True)),
-                ('event', models.ForeignKey(to='gracedb.Event')),
             ],
-            options={
-            },
-            bases=(models.Model,),
         ),
         migrations.CreateModel(
             name='Tag',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('name', models.CharField(max_length=100)),
                 ('displayName', models.CharField(max_length=200, null=True)),
                 ('eventlogs', models.ManyToManyField(to='gracedb.EventLog')),
             ],
-            options={
-            },
-            bases=(models.Model,),
         ),
         migrations.CreateModel(
             name='VOEvent',
             fields=[
-                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('created', models.DateTimeField(auto_now_add=True)),
                 ('ivorn', models.CharField(default=b'', max_length=200)),
                 ('filename', models.CharField(default=b'', max_length=100)),
                 ('file_version', models.IntegerField(null=True)),
                 ('N', models.IntegerField()),
-                ('voevent_type', models.CharField(max_length=2, choices=[(b'PR', b'preliminary'), (b'IN', b'initial'), (b'UP', b'update'), (b'RE', b'retraction')])),
-                ('event', models.ForeignKey(to='gracedb.Event')),
-                ('issuer', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
+                ('voevent_type', models.CharField(choices=[(b'PR', b'preliminary'), (b'IN', b'initial'), (b'UP', b'update'), (b'RE', b'retraction')], max_length=2)),
             ],
             options={
                 'ordering': ['-created', '-N'],
             },
-            bases=(models.Model,),
         ),
-        migrations.AlterUniqueTogether(
-            name='voevent',
-            unique_together=set([('event', 'N')]),
+        migrations.CreateModel(
+            name='CoincInspiralEvent',
+            fields=[
+                ('event_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='gracedb.Event')),
+                ('ifos', models.CharField(default=b'', max_length=20)),
+                ('end_time', models.PositiveIntegerField(null=True)),
+                ('end_time_ns', models.PositiveIntegerField(null=True)),
+                ('mass', models.FloatField(null=True)),
+                ('mchirp', models.FloatField(null=True)),
+                ('minimum_duration', models.FloatField(null=True)),
+                ('snr', models.FloatField(null=True)),
+                ('false_alarm_rate', models.FloatField(null=True)),
+                ('combined_far', models.FloatField(null=True)),
+            ],
+            bases=('gracedb.event',),
+        ),
+        migrations.CreateModel(
+            name='GrbEvent',
+            fields=[
+                ('event_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='gracedb.Event')),
+                ('ivorn', models.CharField(max_length=200, null=True)),
+                ('author_ivorn', models.CharField(max_length=200, null=True)),
+                ('author_shortname', models.CharField(max_length=200, null=True)),
+                ('observatory_location_id', models.CharField(max_length=200, null=True)),
+                ('coord_system', models.CharField(max_length=200, null=True)),
+                ('ra', models.FloatField(null=True)),
+                ('dec', models.FloatField(null=True)),
+                ('error_radius', models.FloatField(null=True)),
+                ('how_description', models.CharField(max_length=200, null=True)),
+                ('how_reference_url', models.URLField(null=True)),
+                ('trigger_duration', models.FloatField(null=True)),
+                ('t90', models.FloatField(null=True)),
+                ('designation', models.CharField(max_length=20, null=True)),
+                ('redshift', models.FloatField(null=True)),
+                ('trigger_id', models.CharField(max_length=25, null=True)),
+            ],
+            bases=('gracedb.event',),
+        ),
+        migrations.CreateModel(
+            name='LalInferenceBurstEvent',
+            fields=[
+                ('event_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='gracedb.Event')),
+                ('bci', models.FloatField(null=True)),
+                ('quality_mean', models.FloatField(null=True)),
+                ('quality_median', models.FloatField(null=True)),
+                ('bsn', models.FloatField(null=True)),
+                ('omicron_snr_network', models.FloatField(null=True)),
+                ('omicron_snr_H1', models.FloatField(null=True)),
+                ('omicron_snr_L1', models.FloatField(null=True)),
+                ('omicron_snr_V1', models.FloatField(null=True)),
+                ('hrss_mean', models.FloatField(null=True)),
+                ('hrss_median', models.FloatField(null=True)),
+                ('frequency_mean', models.FloatField(null=True)),
+                ('frequency_median', models.FloatField(null=True)),
+            ],
+            bases=('gracedb.event',),
+        ),
+        migrations.CreateModel(
+            name='MultiBurstEvent',
+            fields=[
+                ('event_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='gracedb.Event')),
+                ('ifos', models.CharField(default=b'', max_length=20)),
+                ('start_time', models.PositiveIntegerField(null=True)),
+                ('start_time_ns', models.PositiveIntegerField(null=True)),
+                ('duration', models.FloatField(null=True)),
+                ('peak_time', models.PositiveIntegerField(null=True)),
+                ('peak_time_ns', models.PositiveIntegerField(null=True)),
+                ('central_freq', models.FloatField(null=True)),
+                ('bandwidth', models.FloatField(null=True)),
+                ('amplitude', models.FloatField(null=True)),
+                ('snr', models.FloatField(null=True)),
+                ('confidence', models.FloatField(null=True)),
+                ('false_alarm_rate', models.FloatField(null=True)),
+                ('ligo_axis_ra', models.FloatField(null=True)),
+                ('ligo_axis_dec', models.FloatField(null=True)),
+                ('ligo_angle', models.FloatField(null=True)),
+                ('ligo_angle_sig', models.FloatField(null=True)),
+                ('single_ifo_times', models.CharField(default=b'', max_length=255)),
+            ],
+            bases=('gracedb.event',),
+        ),
+        migrations.CreateModel(
+            name='SimInspiralEvent',
+            fields=[
+                ('event_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='gracedb.Event')),
+                ('mass1', models.FloatField(null=True)),
+                ('mass2', models.FloatField(null=True)),
+                ('eta', models.FloatField(null=True)),
+                ('amp_order', models.IntegerField(null=True)),
+                ('coa_phase', models.FloatField(null=True)),
+                ('mchirp', models.FloatField(null=True)),
+                ('spin1y', models.FloatField(null=True)),
+                ('spin1x', models.FloatField(null=True)),
+                ('spin1z', models.FloatField(null=True)),
+                ('spin2x', models.FloatField(null=True)),
+                ('spin2y', models.FloatField(null=True)),
+                ('spin2z', models.FloatField(null=True)),
+                ('geocent_end_time', models.IntegerField(null=True)),
+                ('geocent_end_time_ns', models.IntegerField(null=True)),
+                ('end_time_gmst', models.FloatField(null=True)),
+                ('f_lower', models.FloatField(null=True)),
+                ('f_final', models.FloatField(null=True)),
+                ('distance', models.FloatField(null=True)),
+                ('latitude', models.FloatField(null=True)),
+                ('longitude', models.FloatField(null=True)),
+                ('polarization', models.FloatField(null=True)),
+                ('inclination', models.FloatField(null=True)),
+                ('theta0', models.FloatField(null=True)),
+                ('phi0', models.FloatField(null=True)),
+                ('waveform', models.CharField(blank=True, default=b'', max_length=50)),
+                ('numrel_mode_min', models.IntegerField(null=True)),
+                ('numrel_mode_max', models.IntegerField(null=True)),
+                ('numrel_data', models.CharField(blank=True, default=b'', max_length=50)),
+                ('source', models.CharField(blank=True, default=b'', max_length=50)),
+                ('taper', models.CharField(blank=True, default=b'', max_length=50)),
+                ('bandpass', models.IntegerField(null=True)),
+                ('alpha', models.FloatField(null=True)),
+                ('beta', models.FloatField(null=True)),
+                ('psi0', models.FloatField(null=True)),
+                ('psi3', models.FloatField(null=True)),
+                ('alpha1', models.FloatField(null=True)),
+                ('alpha2', models.FloatField(null=True)),
+                ('alpha3', models.FloatField(null=True)),
+                ('alpha4', models.FloatField(null=True)),
+                ('alpha5', models.FloatField(null=True)),
+                ('alpha6', models.FloatField(null=True)),
+                ('g_end_time', models.IntegerField(null=True)),
+                ('g_end_time_ns', models.IntegerField(null=True)),
+                ('h_end_time', models.IntegerField(null=True)),
+                ('h_end_time_ns', models.IntegerField(null=True)),
+                ('l_end_time', models.IntegerField(null=True)),
+                ('l_end_time_ns', models.IntegerField(null=True)),
+                ('t_end_time', models.IntegerField(null=True)),
+                ('t_end_time_ns', models.IntegerField(null=True)),
+                ('v_end_time', models.IntegerField(null=True)),
+                ('v_end_time_ns', models.IntegerField(null=True)),
+                ('eff_dist_g', models.FloatField(null=True)),
+                ('eff_dist_h', models.FloatField(null=True)),
+                ('eff_dist_l', models.FloatField(null=True)),
+                ('eff_dist_t', models.FloatField(null=True)),
+                ('eff_dist_v', models.FloatField(null=True)),
+                ('source_channel', models.CharField(blank=True, default=b'', max_length=50)),
+                ('destination_channel', models.CharField(blank=True, default=b'', max_length=50)),
+            ],
+            bases=('gracedb.event',),
+        ),
+        migrations.AddField(
+            model_name='voevent',
+            name='event',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.Event'),
+        ),
+        migrations.AddField(
+            model_name='voevent',
+            name='issuer',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+        ),
+        migrations.AddField(
+            model_name='singleinspiral',
+            name='event',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.Event'),
+        ),
+        migrations.AddField(
+            model_name='signoff',
+            name='event',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.Event'),
+        ),
+        migrations.AddField(
+            model_name='signoff',
+            name='submitter',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
         ),
         migrations.AddField(
             model_name='labelling',
             name='event',
-            field=models.ForeignKey(to='gracedb.Event'),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.Event'),
         ),
         migrations.AddField(
             model_name='labelling',
             name='label',
-            field=models.ForeignKey(to='gracedb.Label'),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.Label'),
         ),
         migrations.AddField(
             model_name='eventlog',
             name='event',
-            field=models.ForeignKey(to='gracedb.Event'),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.Event'),
         ),
         migrations.AddField(
             model_name='eventlog',
             name='issuer',
-            field=models.ForeignKey(to=settings.AUTH_USER_MODEL),
-            preserve_default=True,
-        ),
-        migrations.AlterUniqueTogether(
-            name='eventlog',
-            unique_together=set([('event', 'N')]),
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
         ),
         migrations.AddField(
             model_name='event',
             name='group',
-            field=models.ForeignKey(to='gracedb.Group'),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.Group'),
         ),
         migrations.AddField(
             model_name='event',
             name='labels',
-            field=models.ManyToManyField(to='gracedb.Label', through='gracedb.Labelling'),
-            preserve_default=True,
+            field=models.ManyToManyField(through='gracedb.Labelling', to='gracedb.Label'),
         ),
         migrations.AddField(
             model_name='event',
             name='pipeline',
-            field=models.ForeignKey(to='gracedb.Pipeline'),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.Pipeline'),
         ),
         migrations.AddField(
             model_name='event',
             name='search',
-            field=models.ForeignKey(to='gracedb.Search', null=True),
-            preserve_default=True,
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='gracedb.Search'),
         ),
         migrations.AddField(
             model_name='event',
             name='submitter',
-            field=models.ForeignKey(to=settings.AUTH_USER_MODEL),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
         ),
         migrations.AddField(
             model_name='emobservation',
             name='event',
-            field=models.ForeignKey(to='gracedb.Event'),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.Event'),
         ),
         migrations.AddField(
             model_name='emobservation',
             name='group',
-            field=models.ForeignKey(to='gracedb.EMGroup'),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.EMGroup'),
         ),
         migrations.AddField(
             model_name='emobservation',
             name='submitter',
-            field=models.ForeignKey(to=settings.AUTH_USER_MODEL),
-            preserve_default=True,
-        ),
-        migrations.AlterUniqueTogether(
-            name='emobservation',
-            unique_together=set([('event', 'N')]),
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
         ),
         migrations.AddField(
             model_name='emfootprint',
             name='observation',
-            field=models.ForeignKey(to='gracedb.EMObservation'),
-            preserve_default=True,
-        ),
-        migrations.AlterUniqueTogether(
-            name='emfootprint',
-            unique_together=set([('observation', 'N')]),
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.EMObservation'),
         ),
         migrations.AddField(
             model_name='embbeventlog',
             name='event',
-            field=models.ForeignKey(to='gracedb.Event'),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.Event'),
         ),
         migrations.AddField(
             model_name='embbeventlog',
             name='group',
-            field=models.ForeignKey(to='gracedb.EMGroup'),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.EMGroup'),
         ),
         migrations.AddField(
             model_name='embbeventlog',
             name='submitter',
-            field=models.ForeignKey(to=settings.AUTH_USER_MODEL),
-            preserve_default=True,
-        ),
-        migrations.AlterUniqueTogether(
-            name='embbeventlog',
-            unique_together=set([('event', 'N')]),
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
         ),
         migrations.AddField(
             model_name='approval',
             name='approvedEvent',
-            field=models.ForeignKey(to='gracedb.Event'),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gracedb.Event'),
         ),
         migrations.AddField(
             model_name='approval',
             name='approver',
-            field=models.ForeignKey(to=settings.AUTH_USER_MODEL),
-            preserve_default=True,
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+        ),
+        migrations.AlterUniqueTogether(
+            name='voevent',
+            unique_together=set([('event', 'N')]),
+        ),
+        migrations.AlterUniqueTogether(
+            name='signoff',
+            unique_together=set([('event', 'instrument')]),
+        ),
+        migrations.AlterUniqueTogether(
+            name='eventlog',
+            unique_together=set([('event', 'N')]),
+        ),
+        migrations.AlterUniqueTogether(
+            name='emobservation',
+            unique_together=set([('event', 'N')]),
+        ),
+        migrations.AlterUniqueTogether(
+            name='emfootprint',
+            unique_together=set([('observation', 'N')]),
+        ),
+        migrations.AlterUniqueTogether(
+            name='embbeventlog',
+            unique_together=set([('event', 'N')]),
         ),
     ]
diff --git a/gracedb/migrations/0008_add_AllSkyLong_search.py b/gracedb/migrations/0008_add_AllSkyLong_search.py
index 8c779a9d593a0be821fc5993c460a2e19bab14aa..dd0f05a7f615cc11db86d28d8beb97ceb8d2fe33 100644
--- a/gracedb/migrations/0008_add_AllSkyLong_search.py
+++ b/gracedb/migrations/0008_add_AllSkyLong_search.py
@@ -3,26 +3,35 @@ from __future__ import unicode_literals
 
 from django.db import migrations, models
 
-SEARCH = {'name': 'AllSkyLong',
-          'description': 'all-sky long burst online'
+# Add AllSkyLong search
+
+# Search name and description
+SEARCH = {
+    'name': 'AllSkyLong',
+    'description': 'all-sky long burst online'
 }
 
 def add_search(apps, schema_editor):
     Search = apps.get_model('gracedb','Search')
+
+    # Create search
     new_search, created = Search.objects.get_or_create(name=SEARCH['name'])
-    if created:
-        for key in SEARCH.keys():
-            setattr(new_search, key, SEARCH[key])
-        new_search.save()
+    new_search.description = SEARCH['description']
+    new_search.save()
 
 def remove_search(apps, schema_editor):
     Search = apps.get_model('gracedb','Search')
-    Search.objects.get(name=SEARCH['name']).delete()
+
+    # Delete search
+    try:
+        Search.objects.get(name=SEARCH['name']).delete()
+    except Search.DoesNotExist:
+        print("Error: can't 'get' search {0}, skipping".format(SEARCH['name']))
 
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('gracedb', '0010_lalinferenceburstevent'),
+        ('gracedb', '0007_initial_emgroup_data'),
     ]
 
     operations = [
diff --git a/gracedb/migrations/0009_add_em_sent_label.py b/gracedb/migrations/0009_add_em_sent_label.py
index 1272dc91baccaac29fdbde2476e37d958c3db1fa..b103c209fc024b1a279b983ea8d71c41ef60c683 100644
--- a/gracedb/migrations/0009_add_em_sent_label.py
+++ b/gracedb/migrations/0009_add_em_sent_label.py
@@ -3,26 +3,33 @@ from __future__ import unicode_literals
 
 from django.db import models, migrations
 
-labels = { 
-    'EM_SENT': 'green',
-}
+# Add EM_SENT label
+
+# Label name, default color, description
+LABELS = [
+    {'name': 'EM_SENT', 'defaultColor': 'green', 'description': 'Has been sent to MOU partners.'},
+]
 
 def add_labels(apps, schema_editor):
     Label = apps.get_model('gracedb', 'Label')
-    for name, color in labels.iteritems():
-        Label.objects.create(name=name, defaultColor=color)
+
+    # Create labels
+    for label_dict in LABELS:
+        l, created = Label.objects.get_or_create(name=label_dict['name'])
+        l.defaultColor = label_dict['defaultColor']
+        l.description = label_dict['description']
+        l.save()
 
 def remove_labels(apps, schema_editor):
     Label = apps.get_model('gracedb', 'Label')
 
-    for name, color in labels.iteritems():
-        l = Label.objects.get(name=name)
-        l.delete()
+    # Delete labels
+    Label.objects.filter(name__in=[l['name'] for l in LABELS]).delete()
 
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('gracedb', '0015_multiburstevent_single_ifo_times')
+        ('gracedb', '0008_add_AllSkyLong_search')
     ]
 
     operations = [
diff --git a/gracedb/migrations/0010_add_virgo_labels.py b/gracedb/migrations/0010_add_virgo_labels.py
index 4be35e4f6d3c7557b91b530989b815982c7d6cfd..df0e9a844e5baf0a1e28419c0ed0503817773cb1 100644
--- a/gracedb/migrations/0010_add_virgo_labels.py
+++ b/gracedb/migrations/0010_add_virgo_labels.py
@@ -3,33 +3,35 @@ from __future__ import unicode_literals
 
 from django.db import models, migrations
 
-ifos = ['V1']
-labels = {
-    'OPS': 'black',
-    'OK': 'green',
-    'NO': 'red',
-}
+# Add labels for Virgo operator signoff
+
+# Label names, default colors, and descriptions
+LABELS = [
+    {'name': 'V1OPS', 'defaultColor': 'black', 'description': 'V1 operator signoff requested.'},
+    {'name': 'V1OK', 'defaultColor': 'green', 'description': 'V1 operator says event is okay.'},
+    {'name': 'V1NO', 'defaultColor': 'red', 'description': 'V1 operator says event is not okay.'},
+]
 
 def add_labels(apps, schema_editor):
     Label = apps.get_model('gracedb', 'Label')
-    for ifo in ifos:
-        for name, color in labels.iteritems():
-            label_name = ifo + name
-            Label.objects.create(name=label_name, defaultColor=color)
+
+    # Create labels
+    for label_dict in LABELS:
+        l, created = Label.objects.get_or_create(name=label_dict['name'])
+        l.defaultColor = label_dict['defaultColor']
+        l.description = label_dict['description']
+        l.save()
 
 def remove_labels(apps, schema_editor):
     Label = apps.get_model('gracedb', 'Label')
 
-    for ifo in ifos:
-        for name, color in labels.iteritems():
-            label_name = ifo + name
-            l = Label.objects.get(name=label_name)
-            l.delete()
+    # Delete labels
+    Label.objects.filter(name__in=[l['name'] for l in LABELS]).delete()
 
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('gracedb', '0016_add_em_sent_label')
+        ('gracedb', '0009_add_em_sent_label')
     ]
 
     operations = [
diff --git a/gracedb/migrations/0011_add_O2VirgoTest_search.py b/gracedb/migrations/0011_add_O2VirgoTest_search.py
index 852bcfda3fc67d8c1e84082d587bca1350d7a9f5..85df13e44c24f042ee3c4f908417e1f92adeaed6 100644
--- a/gracedb/migrations/0011_add_O2VirgoTest_search.py
+++ b/gracedb/migrations/0011_add_O2VirgoTest_search.py
@@ -3,12 +3,19 @@ from __future__ import unicode_literals
 
 from django.db import migrations, models
 
-SEARCH = {'name': 'O2VirgoTest',
-          'description': 'Testing 3-IFO pipelines for adding Virgo in O2'
+# Add O2VirgoTest search for initial production tests of 3-IFO searches
+# May be removed at some point in the future?
+
+# Search name and description
+SEARCH = {
+    'name': 'O2VirgoTest',
+    'description': 'Testing 3-IFO pipelines for adding Virgo in O2'
 }
 
 def add_search(apps, schema_editor):
     Search = apps.get_model('gracedb','Search')
+
+    # Create search
     new_search, created = Search.objects.get_or_create(name=SEARCH['name'])
     if created:
         for key in SEARCH.keys():
@@ -17,12 +24,17 @@ def add_search(apps, schema_editor):
 
 def remove_search(apps, schema_editor):
     Search = apps.get_model('gracedb','Search')
-    Search.objects.get(name=SEARCH['name']).delete()
+
+    # Delete search
+    try:
+        Search.objects.get(name=SEARCH['name']).delete()
+    except Search.DoesNotExist:
+        print("Error: can't 'get' search {0}, skipping".format(SEARCH['name']))
 
 class Migration(migrations.Migration):
 
     dependencies = [
-        ('gracedb', '0021_event_offline'),
+        ('gracedb', '0010_add_virgo_labels'),
     ]
 
     operations = [
diff --git a/gracedb/migrations/0012_add_DESGW_to_EMGroups.py b/gracedb/migrations/0012_add_DESGW_to_EMGroups.py
index 7ec4c5d6f32b8e4c276e6262c2f8a162ab190250..e6ba659e43c4661b3e184da5eaa3fdbe41509d05 100644
--- a/gracedb/migrations/0012_add_DESGW_to_EMGroups.py
+++ b/gracedb/migrations/0012_add_DESGW_to_EMGroups.py
@@ -3,22 +3,30 @@ from __future__ import unicode_literals
 
 from django.db import migrations, models
 
+# Add DESGW to EMGroups
+
+# EMGroup name
 GROUP_NAME = "DESGW"
 
 def add_group(apps, schema_editor):
     EMGroup = apps.get_model('gracedb','EMGroup')
+
+    # Create group
     grp, created = EMGroup.objects.get_or_create(name=GROUP_NAME)
-    if created:
-        grp.save()
 
 def remove_group(apps, schema_editor):
     EMGroup = apps.get_model('gracedb','EMGroup')
-    EMGroup.objects.get(name=GROUP_NAME).delete()
+
+    # Delete group
+    try:
+        EMGroup.objects.get(name=GROUP_NAME).delete()
+    except EMGroup.DoesNotExist:
+        print("Error: can't 'get' EMGroup {0}, skipping".format(GROUP_NAME))
 
 class Migration(migrations.Migration):
 
     dependencies = [ 
-        ('gracedb', '0022_add_O2VirgoTest_search'),
+        ('gracedb', '0011_add_O2VirgoTest_search'),
     ]   
 
     operations = [