diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5a20caf47b9698349a20ce69cffbc7bb4342e111..c92010a470656ac845822406ec1787ea2274c850 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -17,9 +17,9 @@ before_script:
   - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
 
 .test: &test
-  image: ligo/base:stretch
+  image: igwn/base:stretch
   services:
-    - mysql:5.5
+    - mysql:5.6
   variables:
     AWS_SES_ACCESS_KEY_ID: "fake_aws_id"
     AWS_SES_SECRET_ACCESS_KEY: "fake_aws_key"
diff --git a/config/gunicorn_config.py b/config/gunicorn_config.py
index 507ab2262366309cd10bedcf0463fd80dd04ffad..af605e29aaa808c49888a0bb54b9d47a26c623e5 100644
--- a/config/gunicorn_config.py
+++ b/config/gunicorn_config.py
@@ -19,15 +19,15 @@ workers = multiprocessing.cpu_count()*2 + 1
 
 # Worker class.
 # 
-worker_class = 'gthread'
-threads = 2
+worker_class = 'sync'
+#threads = 2
 
 # Adding options for timeout. Not specified, the timeout default 
 # is 30 seconds. Source:
 #
 # https://gunicorn-docs.readthedocs.io/en/stable/settings.html#worker-processes
 #
-timeout = 120
+timeout = 300
 
 # Max requests settings - a worker restarts after handling this many
 # requests. May be useful if we have memory leak problems.
diff --git a/config/settings/base.py b/config/settings/base.py
index 33149a3386bddd516e9c1e6f2c0f2b8979769ab1..72ee6f067e395fe1d43d06ec7137a84459ea6598 100644
--- a/config/settings/base.py
+++ b/config/settings/base.py
@@ -319,6 +319,7 @@ MIDDLEWARE = [
     'django.middleware.common.CommonMiddleware',
     'core.middleware.proxy.XForwardedForMiddleware',
     'user_sessions.middleware.SessionMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'ligoauth.middleware.ShibbolethWebAuthMiddleware',
diff --git a/config/settings/container/base.py b/config/settings/container/base.py
index 97c75a62c263e164781d67e6f9498a3608370647..8c5fdd699fd737cebb5f7cabccd07b2cef152302 100644
--- a/config/settings/container/base.py
+++ b/config/settings/container/base.py
@@ -119,6 +119,7 @@ MIDDLEWARE = [
 
 
 
+
 # Priority server settings ----------------------------------------------------
 PRIORITY_SERVER = False
 is_priority_server = get_from_env('DJANGO_PRIORITY_SERVER', None,
@@ -172,10 +173,14 @@ try:
     # and then it should skip the rest:
 
     try:
-        AWS_ELASTICACHE_TIMEOUT = get_from_env('DJANGO_AWS_ELASTICACHE_TIMEOUT')
+        # This has to be an int, but it gets it from then env as a string.
+        AWS_ELASTICACHE_TIMEOUT = int(get_from_env('DJANGO_AWS_ELASTICACHE_TIMEOUT'))
     except:
         AWS_ELASTICACHE_TIMEOUT = 30
 
+    # Set the middleware timeout equal to the cache timeout:
+    CACHE_MIDDLEWARE_SECONDS = AWS_ELASTICACHE_TIMEOUT
+
     # Load modified caching middleware:
     MIDDLEWARE = [
         'core.middleware.maintenance.MaintenanceModeMiddleware',
@@ -187,6 +192,7 @@ try:
         'django.middleware.common.CommonMiddleware',
         'django.middleware.cache.FetchFromCacheMiddleware',
         'core.middleware.proxy.XForwardedForMiddleware',
+        'django.contrib.sessions.middleware.SessionMiddleware',
         'user_sessions.middleware.SessionMiddleware',
         'django.contrib.messages.middleware.MessageMiddleware',
         'django.contrib.auth.middleware.AuthenticationMiddleware',
diff --git a/config/settings/container/dev.py b/config/settings/container/dev.py
index b3ce05c527af22d7433b5277eaeceb3231d81e95..bbc4109c591a35374bf714f424b8a608c583752c 100644
--- a/config/settings/container/dev.py
+++ b/config/settings/container/dev.py
@@ -91,3 +91,4 @@ Events and associated data may change or be removed at any time.
 
 if AWS_ELASTICACHE_ADDR:
     CACHES['default']['KEY_PREFIX'] = '1'
+    CACHE_MIDDLEWARE_KEY_PREFIX = '1'
diff --git a/config/settings/container/playground.py b/config/settings/container/playground.py
index 6ff537127263032d87ca78251a7a803cd9820266..ce764332cadad77120af6100c5433f4f455f6d89 100644
--- a/config/settings/container/playground.py
+++ b/config/settings/container/playground.py
@@ -46,3 +46,4 @@ if (DEBUG == True):
 # Set elasticache prefix if the correct variables are set.
 if AWS_ELASTICACHE_ADDR:
     CACHES['default']['KEY_PREFIX'] = '3'
+    CACHE_MIDDLEWARE_KEY_PREFIX = '3'
diff --git a/config/settings/container/production.py b/config/settings/container/production.py
index 60ad8fa62b67e86094e7055ae16bde7a28d57473..8a8fe25c62df46f7b17d8dbdc2d6ea037be9b750 100644
--- a/config/settings/container/production.py
+++ b/config/settings/container/production.py
@@ -65,3 +65,4 @@ if (DEBUG == True):
 # Set elasticache prefix if the correct variables are set.
 if AWS_ELASTICACHE_ADDR:
     CACHES['default']['KEY_PREFIX'] = '4'
+    CACHE_MIDDLEWARE_KEY_PREFIX = '4'
diff --git a/config/settings/container/test.py b/config/settings/container/test.py
index a03510bf7b4ae06cb1a480b557bdaf4cd9be675a..291086cbbba53cc20364f11a3857215a42c8bfb5 100644
--- a/config/settings/container/test.py
+++ b/config/settings/container/test.py
@@ -91,3 +91,4 @@ to Playground or Production. Note, on this GraceDB instance:
 
 if AWS_ELASTICACHE_ADDR:
     CACHES['default']['KEY_PREFIX'] = '2'
+    CACHE_MIDDLEWARE_KEY_PREFIX  = '2'
diff --git a/gracedb/alerts/models.py b/gracedb/alerts/models.py
index ab4bc8858f8ad80c939ae97611899aa618bdd98d..e7c24a66f805206d5a3ef7072de2f53487f99f60 100644
--- a/gracedb/alerts/models.py
+++ b/gracedb/alerts/models.py
@@ -42,7 +42,7 @@ class Contact(CleanSaveModel):
     CODE_DIGITS = 6
 
     # Fields
-    user = models.ForeignKey(UserModel, null=False)
+    user = models.ForeignKey(UserModel, null=False, on_delete=models.CASCADE)
     description = models.CharField(max_length=30, blank=False, null=False)
     email = models.EmailField(blank=True, null=True)
     phone = PhoneNumberField(blank=True, max_length=255, null=True)
@@ -177,7 +177,7 @@ class Notification(models.Model):
         (NOTIFICATION_CATEGORY_EVENT, 'Event'),
         (NOTIFICATION_CATEGORY_SUPEREVENT, 'Superevent'),
     )
-    user = models.ForeignKey(UserModel, null=False)
+    user = models.ForeignKey(UserModel, null=False, on_delete=models.CASCADE)
     contacts = models.ManyToManyField(Contact)
     description = models.CharField(max_length=40, blank=False, null=False)
     far_threshold = models.FloatField(blank=True, null=True)
diff --git a/gracedb/api/v1/superevents/views.py b/gracedb/api/v1/superevents/views.py
index 86e36582a5eeae5fdb0e243456316a0eba1129ff..6b544174f1d255afe183ef7ac58f34c63dcd7dc3 100644
--- a/gracedb/api/v1/superevents/views.py
+++ b/gracedb/api/v1/superevents/views.py
@@ -51,6 +51,9 @@ from ..paginators import BasePaginationFactory, CustomLabelPagination, \
     CustomLogTagPagination
 from ...utils import api_reverse
 
+# Import rety decorator
+from retry import retry
+
 # Set up logger
 logger = logging.getLogger(__name__)
 
@@ -253,6 +256,14 @@ class SupereventFileViewSet(InheritDefaultPermissionsMixin,
         return get_objects_for_user(self.request.user,
             'superevents.view_log', log_queryset)
 
+    # This is a bandaid to overcome some very very
+    # intermittent errors we've been seeing on AWS.
+    # I'm going to let this play on playground and test
+    # and if it doesn't fail castastropically, I'll
+    # move it into production before the root cause
+    # can be determined.
+    
+    @retry(tries=5, delay=1.0, logger=logger)
     def list(self, request, *args, **kwargs):
         # Get logs which are viewable by the current user and
         # have files attached
@@ -270,6 +281,14 @@ class SupereventFileViewSet(InheritDefaultPermissionsMixin,
 
         return Response(file_dict)
 
+    # This is a bandaid to overcome some very very
+    # intermittent errors we've been seeing on AWS.
+    # I'm going to let this play on playground and test
+    # and if it doesn't fail castastropically, I'll
+    # move it into production before the root cause
+    # can be determined.
+    
+    @retry(tries=5, delay=1.0, logger=logger)
     def retrieve(self, request, *args, **kwargs):
         # Get parent superevent
         parent_superevent = self.get_parent_object()
diff --git a/gracedb/core/file_utils.py b/gracedb/core/file_utils.py
index c38a97c418f1fd1d2051550ad1474c83b020d3c0..813e2dda945103ec13ecff05afe0e37e167b7378 100644
--- a/gracedb/core/file_utils.py
+++ b/gracedb/core/file_utils.py
@@ -1,6 +1,5 @@
 import os
 
-
 def get_file_list(logs, file_dir):
     """
     For a queryset of logs (corresponding to a single event or superevent),
diff --git a/gracedb/core/models.py b/gracedb/core/models.py
index 7d346f658520fd4dd199eb374fed57a715abd162..ceb3239952d93a34c8507a47815f919220d92d2d 100644
--- a/gracedb/core/models.py
+++ b/gracedb/core/models.py
@@ -233,7 +233,7 @@ class LogBase(models.Model):
     Used in events.EventLog, superevents.Log
     """
     created = models.DateTimeField(auto_now_add=True)
-    issuer = models.ForeignKey(UserModel, null=False)
+    issuer = models.ForeignKey(UserModel, null=False, on_delete=models.CASCADE)
     filename = models.CharField(max_length=100, default="", blank=True)
     file_version = models.IntegerField(null=True, default=None, blank=True)
     comment = models.TextField(null=False)
@@ -275,7 +275,7 @@ class m2mThroughBase(models.Model):
     creation time.
     """
     creator = models.ForeignKey(UserModel, null=False, related_name=
-        '%(app_label)s_%(class)s_set')
+        '%(app_label)s_%(class)s_set', on_delete=models.CASCADE)
     created = models.DateTimeField(auto_now_add=True)
 
     class Meta:
diff --git a/gracedb/events/migrations/0033_pipelinelog_and_pipeline_enabled.py b/gracedb/events/migrations/0033_pipelinelog_and_pipeline_enabled.py
index 4ce9a33f5b1aa09c8f31cdd4b104129edf067066..b81fb2a938fe12a886a59b3b2099f47562a79b23 100644
--- a/gracedb/events/migrations/0033_pipelinelog_and_pipeline_enabled.py
+++ b/gracedb/events/migrations/0033_pipelinelog_and_pipeline_enabled.py
@@ -26,7 +26,8 @@ class Migration(migrations.Migration):
         ),
         migrations.AlterModelOptions(
             name='pipeline',
-            options={'permissions': (('manage_pipeline', 'Can enable or disable pipeline'),)},
+            #options={'permissions': (('manage_pipeline', 'Can enable or disable pipeline'),)},
+            options={'default_permissions': ('add', 'change', 'delete'), 'permissions': (('manage_pipeline', 'Can enable or disable pipeline'),)},
         ),
         migrations.AddField(
             model_name='pipeline',
diff --git a/gracedb/events/migrations/0048_auto_20200303_0151.py b/gracedb/events/migrations/0048_auto_20200303_0151.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ae63d8422a28494e9b6bd2854050b1a937b150b
--- /dev/null
+++ b/gracedb/events/migrations/0048_auto_20200303_0151.py
@@ -0,0 +1,42 @@
+# Generated by Django 2.2 on 2020-03-03 01:51
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('events', '0047_specify_integralagile_pipeline_types'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='pipeline',
+            options={'default_permissions': ('add', 'change', 'delete'), 'permissions': (('manage_pipeline', 'Can enable or disable pipeline'),)},
+        ),
+        migrations.AlterField(
+            model_name='voevent',
+            name='coinc_comment',
+            field=models.BooleanField(blank=True, default=False),
+        ),
+        migrations.AlterField(
+            model_name='voevent',
+            name='hardware_inj',
+            field=models.BooleanField(blank=True, default=False),
+        ),
+        migrations.AlterField(
+            model_name='voevent',
+            name='internal',
+            field=models.BooleanField(blank=True, default=True),
+        ),
+        migrations.AlterField(
+            model_name='voevent',
+            name='open_alert',
+            field=models.BooleanField(blank=True, default=False),
+        ),
+        migrations.AlterField(
+            model_name='voevent',
+            name='raven_coinc',
+            field=models.BooleanField(blank=True, default=False),
+        ),
+    ]
diff --git a/gracedb/events/migrations/0049_add_subgrbtargeted_search.py b/gracedb/events/migrations/0049_add_subgrbtargeted_search.py
new file mode 100644
index 0000000000000000000000000000000000000000..7a34b6439e6f35dc6391e81de9b36a5199c8acb9
--- /dev/null
+++ b/gracedb/events/migrations/0049_add_subgrbtargeted_search.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.5 on 2017-10-25 19:16
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+# Creates initial search instances
+
+# Search names and descriptions
+SEARCH_TYPES = [
+    {'name': 'SubGRBTargeted', 'description': 'Sub-Threshold Targeted GRB Search'},
+]
+
+def add_searches(apps, schema_editor):
+    Search = apps.get_model('events', 'Search')
+
+    # Create searches
+    for search_dict in SEARCH_TYPES:
+        search, created = Search.objects.get_or_create(name=search_dict['name'])
+        if 'description' in search_dict:
+            search.description = search_dict['description']
+            search.save()
+
+def remove_searches(apps, schema_editor):
+    Search = apps.get_model('events', 'Search')
+
+    # Delete searches
+    Search.objects.filter(name__in=[s['name'] for s in SEARCH_TYPES]).delete()
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('events', '0048_auto_20200303_0151'),
+    ]
+
+    operations = [
+        migrations.RunPython(add_searches, remove_searches),
+    ]
diff --git a/gracedb/events/models.py b/gracedb/events/models.py
index 6413e548d44b7d5a5eed2e58f6d0c452ec786c39..4b4f19d72dfec1a2de39e732eccbbdfafeb2c7cd 100644
--- a/gracedb/events/models.py
+++ b/gracedb/events/models.py
@@ -90,6 +90,7 @@ class Pipeline(models.Model):
     external_objects = ExternalPipelineManager()
 
     class Meta:
+        default_permissions = ('add', 'change', 'delete')
         permissions = (
             ('manage_pipeline', 'Can enable or disable pipeline'),
         )
@@ -105,8 +106,8 @@ class PipelineLog(models.Model):
         (PIPELINE_LOG_ACTION_DISABLE, 'disable'),
         (PIPELINE_LOG_ACTION_ENABLE, 'enable'),
     )
-    creator = models.ForeignKey(UserModel)
-    pipeline = models.ForeignKey(Pipeline)
+    creator = models.ForeignKey(UserModel, on_delete=models.CASCADE)
+    pipeline = models.ForeignKey(Pipeline, on_delete=models.CASCADE)
     created = models.DateTimeField(auto_now_add=True)
     action = models.CharField(max_length=10,
         choices=PIPELINE_LOG_ACTION_CHOICES)
@@ -173,9 +174,9 @@ class Event(models.Model):
 #    )
     DEFAULT_EVENT_NEIGHBORHOOD = (-5,5)
 
-    submitter = models.ForeignKey(UserModel)
+    submitter = models.ForeignKey(UserModel, on_delete=models.CASCADE)
     created = models.DateTimeField(auto_now_add=True)
-    group = models.ForeignKey(Group)
+    group = models.ForeignKey(Group, on_delete=models.CASCADE)
     #uid = models.CharField(max_length=20, default="")  # XXX deprecated.  should be removed.
     #analysisType = models.CharField(max_length=20, choices=ANALYSIS_TYPE_CHOICES)
 
@@ -188,8 +189,8 @@ class Event(models.Model):
     # that creates this column. After that, we can safely remove it.
     # The presence or absence of the default value has no effect on the DB
     # tables, so removing it does not necessitate a migration.
-    pipeline = models.ForeignKey(Pipeline) 
-    search = models.ForeignKey(Search, null=True)
+    pipeline = models.ForeignKey(Pipeline, on_delete=models.CASCADE) 
+    search = models.ForeignKey(Search, null=True, on_delete=models.CASCADE)
 
     # from coinc_event
     instruments = models.CharField(max_length=20, default="")
@@ -471,7 +472,7 @@ class EventLog(CleanSaveModel, LogBase, AutoIncrementModel):
     AUTO_CONSTRAINTS = ('event',)
 
     # Extra fields
-    event = models.ForeignKey(Event, null=False)
+    event = models.ForeignKey(Event, null=False, on_delete=models.CASCADE)
     tags = models.ManyToManyField('Tag', related_name='event_logs')
 
     class Meta(LogBase.Meta):
@@ -509,11 +510,11 @@ class EMObservationBase(models.Model):
     N = models.IntegerField(null=False, editable=False)
     created = models.DateTimeField(auto_now_add=True)
     submitter  = models.ForeignKey(UserModel, null=False,
-        related_name='%(app_label)s_%(class)s_set')
+        related_name='%(app_label)s_%(class)s_set', on_delete=models.CASCADE)
 
     # The MOU group responsible 
     group = models.ForeignKey(EMGroup, null=False,
-        related_name='%(app_label)s_%(class)s_set')
+        related_name='%(app_label)s_%(class)s_set', on_delete=models.CASCADE)
 
     # The following fields should be calculated from the footprint info
     # provided by the user. These fields are just for convenience and
@@ -635,8 +636,8 @@ class Labelling(m2mThroughBase):
     """
     Model which provides the "through" relationship between Events and Labels.
     """
-    event = models.ForeignKey(Event)
-    label = models.ForeignKey(Label)
+    event = models.ForeignKey(Event, on_delete=models.CASCADE)
+    label = models.ForeignKey(Label, on_delete=models.CASCADE)
 
     def __str__(self):
         return six.text_type(
@@ -711,7 +712,7 @@ class LalInferenceBurstEvent(Event):
     frequency_median    = models.FloatField(null=True)
 
 class SingleInspiral(models.Model):
-    event             = models.ForeignKey(Event, null=False)
+    event             = models.ForeignKey(Event, null=False, on_delete=models.CASCADE)
     ifo               = models.CharField(max_length=20, null=True)
     search            = models.CharField(max_length=20, null=True)
     channel           = models.CharField(max_length=100, blank=True)
@@ -970,7 +971,7 @@ class VOEventBase(CleanSaveModel):
     # Fields
     created = models.DateTimeField(auto_now_add=True)
     issuer = models.ForeignKey(UserModel, null=False,
-        related_name='%(app_label)s_%(class)s_set')
+        related_name='%(app_label)s_%(class)s_set', on_delete=models.CASCADE)
     ivorn = models.CharField(max_length=200, default="", blank=True,
         editable=False)
     filename = models.CharField(max_length=100, default="", blank=True,
@@ -1088,7 +1089,7 @@ class SignoffBase(models.Model):
 
     # Field definitions
     submitter = models.ForeignKey(UserModel, related_name=
-        '%(app_label)s_%(class)s_set')
+        '%(app_label)s_%(class)s_set', on_delete=models.CASCADE)
     comment = models.TextField(blank=True)
     instrument = models.CharField(max_length=2, blank=True,
         choices=INSTRUMENT_CHOICES)
@@ -1150,7 +1151,7 @@ class SignoffBase(models.Model):
 class Signoff(SignoffBase):
     """Class for Event signoffs"""
 
-    event = models.ForeignKey(Event)
+    event = models.ForeignKey(Event, on_delete=models.CASCADE)
 
     class Meta:
         unique_together = ('event', 'instrument')
@@ -1249,13 +1250,13 @@ class EMBBEventLog(AutoIncrementModel):
     created = models.DateTimeField(auto_now_add=True)
 
     # The gracedb event that this Eel relates to
-    event = models.ForeignKey(Event)
+    event = models.ForeignKey(Event, on_delete=models.CASCADE)
 
     # The responsible author of this communication
-    submitter  = models.ForeignKey(UserModel)  # from a table of people
+    submitter  = models.ForeignKey(UserModel, on_delete=models.CASCADE)  # from a table of people
 
     # The MOU group responsible 
-    group = models.ForeignKey(EMGroup)       # from a table of facilities
+    group = models.ForeignKey(EMGroup, on_delete=models.CASCADE)       # from a table of facilities
 
     # The instrument used or intended for the imaging implied by this footprint
     instrument = models.CharField(max_length=200, blank=True)
diff --git a/gracedb/events/translator.py b/gracedb/events/translator.py
index dfaba25be5979de0c8ce5bf380be20e98af17bd0..9bce5fd7ec449f50518cba282c01495202dd6ce9 100644
--- a/gracedb/events/translator.py
+++ b/gracedb/events/translator.py
@@ -646,5 +646,12 @@ def populateGrbEventFromVOEventFile(filename, event):
             break
     event.trigger_id = trigger_id
 
+    # Check for the existance of FAR in the VOEvent_params. if it exists,
+    # Then add it to the event. This change was made on 2/7/2020 in support
+    # of SWIFT event uploads. Note: FAR is in Hz.
+
+    if ('FAR' in VOEvent_params):
+        event.far = float(VOEvent_params.get('FAR').get('value'))
+
     # Save event
     event.save()
diff --git a/gracedb/ligoauth/models.py b/gracedb/ligoauth/models.py
index 9a3d18461a1bead652b8115c03fa1257d5880eef..1e2c727044c83fb0f4de66f0b5fa4c0d066ea08d 100644
--- a/gracedb/ligoauth/models.py
+++ b/gracedb/ligoauth/models.py
@@ -19,7 +19,7 @@ class LigoLdapUser(User):
 class X509Cert(models.Model):
     """Model for storing X.509 certificate subjects for API access"""
     subject = models.CharField(max_length=255, unique=True, null=False)
-    user = models.ForeignKey(User)
+    user = models.ForeignKey(User, on_delete=models.CASCADE)
 
 class AuthGroup(Group):
     """Enhanced version of Django Group model"""
@@ -33,7 +33,7 @@ class AuthGroup(Group):
     ldap_name = models.CharField(max_length=50, unique=True, null=True)
     # Tag used to expose access to log messages for group; if null, there is no
     # such tag and access is not granted via this mechanism
-    tag = models.ForeignKey('events.Tag', null=True)
+    tag = models.ForeignKey('events.Tag', null=True, on_delete=models.CASCADE)
 
     # Add custom managers, must manually define objects as well
     objects = models.Manager()
@@ -47,7 +47,7 @@ class AuthorizedLdapMember(models.Model):
     ldap_gname = models.CharField(max_length=50, unique=True, null=True)
 
     # Add support for authorized membership:
-    ldap_authgroup = models.ForeignKey(AuthGroup, null=True)
+    ldap_authgroup = models.ForeignKey(AuthGroup, null=True, on_delete=models.CASCADE)
 
     # Give it a name:
     name = models.CharField(max_length=50, unique=True, null=True)
diff --git a/gracedb/migrations/auth/0001_initial.py b/gracedb/migrations/auth/0001_initial.py
index 6fbd7fd0b4eea11d72c061926e596608ae309dad..74e636674ee23485b7e6d85986a82bf49a1e4ca8 100644
--- a/gracedb/migrations/auth/0001_initial.py
+++ b/gracedb/migrations/auth/0001_initial.py
@@ -54,7 +54,7 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
                 ('name', models.CharField(max_length=50, verbose_name='name')),
                 ('codename', models.CharField(max_length=100, verbose_name='codename')),
-                ('content_type', models.ForeignKey(to='contenttypes.ContentType')),
+                ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)),
             ],
             options={
                 'ordering': ('content_type__app_label', 'content_type__model', 'codename'),
diff --git a/gracedb/migrations/auth/0025_auto_20200229_1957.py b/gracedb/migrations/auth/0025_auto_20200229_1957.py
new file mode 100644
index 0000000000000000000000000000000000000000..1490df1bdce1e661ecf1a769b6cbc0870b4a601b
--- /dev/null
+++ b/gracedb/migrations/auth/0025_auto_20200229_1957.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.0 on 2020-02-29 19:57
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('auth', '0024_auto_20190919_1957'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='user',
+            name='last_name',
+            field=models.CharField(blank=True, max_length=150, verbose_name='last name'),
+        ),
+    ]
diff --git a/gracedb/migrations/auth/0026_auto_20200303_0151.py b/gracedb/migrations/auth/0026_auto_20200303_0151.py
new file mode 100644
index 0000000000000000000000000000000000000000..c2b95f1cc00f99e77986b3268107193e5fb5486e
--- /dev/null
+++ b/gracedb/migrations/auth/0026_auto_20200303_0151.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2 on 2020-03-03 01:51
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('auth', '0025_auto_20200229_1957'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='group',
+            name='name',
+            field=models.CharField(max_length=150, unique=True, verbose_name='name'),
+        ),
+    ]
diff --git a/gracedb/migrations/guardian/0011_auto_20200303_0151.py b/gracedb/migrations/guardian/0011_auto_20200303_0151.py
new file mode 100644
index 0000000000000000000000000000000000000000..6572ad5ba99c23d4325c3bdf660bf1597d49e310
--- /dev/null
+++ b/gracedb/migrations/guardian/0011_auto_20200303_0151.py
@@ -0,0 +1,21 @@
+# Generated by Django 2.2 on 2020-03-03 01:51
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('guardian', '0010_authorize_raven_users_to_populate_new_pipelines'),
+    ]
+
+    operations = [
+        migrations.AddIndex(
+            model_name='userobjectpermission',
+            index=models.Index(fields=['content_type', 'object_pk'], name='guardian_us_content_179ed2_idx'),
+        ),
+        migrations.AddIndex(
+            model_name='groupobjectpermission',
+            index=models.Index(fields=['content_type', 'object_pk'], name='guardian_gr_content_ae6aec_idx'),
+        ),
+    ]
diff --git a/gracedb/superevents/migrations/0001_initial.py b/gracedb/superevents/migrations/0001_initial.py
index 613b981596398b4bc98d8bd9e6e6a6fc9ab48f7f..3c78a8a9183bd0ae750bcec79218f4fa34502fae 100644
--- a/gracedb/superevents/migrations/0001_initial.py
+++ b/gracedb/superevents/migrations/0001_initial.py
@@ -76,6 +76,7 @@ class Migration(migrations.Migration):
             options={
                 'ordering': ['-created', '-N'],
                 'abstract': False,
+                'default_permissions': ('add', 'change', 'delete'),
                 'permissions': (('expose_log', 'Can expose a log to be viewed by external users'), ('hide_log', 'Can hide a log from external users'), ('tag_log', 'Add tag to log'), ('untag_log', 'Remove tag from log'), ('view_log', 'Can view log')),
             },
         ),
@@ -114,6 +115,7 @@ class Migration(migrations.Migration):
                 ('submitter', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='superevents_signoff_set', to=settings.AUTH_USER_MODEL)),
             ],
             options={
+                'default_permissions': ('add', 'change', 'delete'),
                 'permissions': (('view_signoff', 'Can view signoff'), ('do_H1_signoff', 'Can interact with H1 signoffs'), ('do_L1_signoff', 'Can interact with L1 signoffs'), ('do_V1_signoff', 'Can interact with V1 signoffs'), ('do_adv_signoff', 'Can interact with advocate signoffs')),
             },
         ),
@@ -139,6 +141,7 @@ class Migration(migrations.Migration):
             ],
             options={
                 'ordering': ['-id'],
+                'default_permissions': ('add', 'change', 'delete'),
                 'permissions': (('add_test_superevent', 'Can add test superevent'), ('add_mdc_superevent', 'Can add MDC superevent'), ('change_test_superevent', 'Can change test superevent'), ('change_mdc_superevent', 'Can change MDC superevent'), ('confirm_gw_superevent', 'Can confirm superevent as GW'), ('confirm_gw_test_superevent', 'Can confirm test superevent as GW'), ('confirm_gw_mdc_superevent', 'Can confirm MDC superevent as GW'), ('annotate_superevent', 'Can add log messages and EM observation data to uperevent'), ('expose_superevent', 'Can expose a superevent to be viewed by external users'), ('hide_superevent', 'Can hide a superevent from external users'), ('view_superevent', 'Can view superevent')),
             },
         ),
@@ -152,6 +155,7 @@ class Migration(migrations.Migration):
             ],
             options={
                 'abstract': False,
+                'default_permissions': ('add', 'change', 'delete'),
                 'permissions': (('view_supereventgroupobjectpermission', 'Can view superevent groupobjectpermission'),),
             },
         ),
diff --git a/gracedb/superevents/migrations/0007_auto_20200303_0151.py b/gracedb/superevents/migrations/0007_auto_20200303_0151.py
new file mode 100644
index 0000000000000000000000000000000000000000..4f002170b2ded7b3f87581696b352fb7056af069
--- /dev/null
+++ b/gracedb/superevents/migrations/0007_auto_20200303_0151.py
@@ -0,0 +1,54 @@
+# Generated by Django 2.2 on 2020-03-03 01:51
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('superevents', '0006_add_raven_voevent_sevent_fields'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='log',
+            options={'default_permissions': ('add', 'change', 'delete'), 'ordering': ['-created', '-N'], 'permissions': (('expose_log', 'Can expose a log to be viewed by external users'), ('hide_log', 'Can hide a log from external users'), ('tag_log', 'Add tag to log'), ('untag_log', 'Remove tag from log'), ('view_log', 'Can view log'))},
+        ),
+        migrations.AlterModelOptions(
+            name='signoff',
+            options={'default_permissions': ('add', 'change', 'delete'), 'permissions': (('view_signoff', 'Can view signoff'), ('do_H1_signoff', 'Can interact with H1 signoffs'), ('do_L1_signoff', 'Can interact with L1 signoffs'), ('do_V1_signoff', 'Can interact with V1 signoffs'), ('do_adv_signoff', 'Can interact with advocate signoffs'))},
+        ),
+        migrations.AlterModelOptions(
+            name='superevent',
+            options={'default_permissions': ('add', 'change', 'delete'), 'ordering': ['-id'], 'permissions': (('add_test_superevent', 'Can add test superevent'), ('add_mdc_superevent', 'Can add MDC superevent'), ('change_test_superevent', 'Can change test superevent'), ('change_mdc_superevent', 'Can change MDC superevent'), ('confirm_gw_superevent', 'Can confirm superevent as GW'), ('confirm_gw_test_superevent', 'Can confirm test superevent as GW'), ('confirm_gw_mdc_superevent', 'Can confirm MDC superevent as GW'), ('annotate_superevent', 'Can add log messages and EM observation data to superevent'), ('expose_superevent', 'Can expose a superevent to be viewed by external users'), ('hide_superevent', 'Can hide a superevent from external users'), ('view_superevent', 'Can view superevent'))},
+        ),
+        migrations.AlterModelOptions(
+            name='supereventgroupobjectpermission',
+            options={'default_permissions': ('add', 'change', 'delete'), 'permissions': (('view_supereventgroupobjectpermission', 'Can view superevent groupobjectpermission'),)},
+        ),
+        migrations.AlterField(
+            model_name='voevent',
+            name='coinc_comment',
+            field=models.BooleanField(blank=True, default=False),
+        ),
+        migrations.AlterField(
+            model_name='voevent',
+            name='hardware_inj',
+            field=models.BooleanField(blank=True, default=False),
+        ),
+        migrations.AlterField(
+            model_name='voevent',
+            name='internal',
+            field=models.BooleanField(blank=True, default=True),
+        ),
+        migrations.AlterField(
+            model_name='voevent',
+            name='open_alert',
+            field=models.BooleanField(blank=True, default=False),
+        ),
+        migrations.AlterField(
+            model_name='voevent',
+            name='raven_coinc',
+            field=models.BooleanField(blank=True, default=False),
+        ),
+    ]
diff --git a/gracedb/superevents/models.py b/gracedb/superevents/models.py
index ca3bdff0cc8f094b9fea4a1aaceec64036c7baa6..658bdd8e13e715a5d0c165a3bf99ebfbcf81801c 100644
--- a/gracedb/superevents/models.py
+++ b/gracedb/superevents/models.py
@@ -78,7 +78,7 @@ class Superevent(CleanSaveModel, AutoIncrementModel):
     AUTO_CONSTRAINTS = ('t_0_date', 'category',)
 
     # Fields ------------------------------------------------------------------
-    submitter = models.ForeignKey(UserModel)
+    submitter = models.ForeignKey(UserModel, on_delete=models.CASCADE)
     created = models.DateTimeField(auto_now_add=True)
 
     # Type of superevent (Production, Test, MDC)
@@ -132,6 +132,11 @@ class Superevent(CleanSaveModel, AutoIncrementModel):
             ('t_0_date', 'gw_letter_suffix', 'category'),
         )
 
+        # New in django 2.2: adds a view_* permission, so add the following
+        # line so the new default doesn't override the existing permission:
+
+        default_permissions = ('add', 'change', 'delete')
+
         # Extra permissions beyond the standard add, change, delete perms
         permissions = (
             ('add_test_superevent', 'Can add test superevent'),
@@ -467,6 +472,9 @@ class SupereventGroupObjectPermission(GroupObjectPermissionBase):
     content_object = models.ForeignKey(Superevent, on_delete=models.CASCADE)
 
     class Meta(GroupObjectPermissionBase.Meta):
+
+        default_permissions = ('add', 'change', 'delete')
+
         permissions = (
             ('view_supereventgroupobjectpermission',
                 'Can view superevent groupobjectpermission'),
@@ -489,6 +497,7 @@ class Log(CleanSaveModel, LogBase, AutoIncrementModel):
 
     class Meta(LogBase.Meta):
         unique_together = (('superevent', 'N'),)
+        default_permissions = ('add', 'change', 'delete')
         permissions = (
             ('expose_log', 'Can expose a log to be viewed by external users'),
             ('hide_log', 'Can hide a log from external users'),
@@ -555,6 +564,7 @@ class Signoff(CleanSaveModel, SignoffBase):
 
     class Meta:
         unique_together = (('superevent', 'instrument'),)
+        default_permissions = ('add', 'change', 'delete')
         permissions = (
             ('view_signoff', 'Can view signoff'),
             ('do_H1_signoff', 'Can interact with H1 signoffs'),
diff --git a/gracedb/templates/gracedb/event_detail_GRB.html b/gracedb/templates/gracedb/event_detail_GRB.html
index 29f3aba0b3310e75bb31d7192350a2ca162af768..11ced3472a77226860525a1b807a3bcc52649e2c 100644
--- a/gracedb/templates/gracedb/event_detail_GRB.html
+++ b/gracedb/templates/gracedb/event_detail_GRB.html
@@ -74,6 +74,9 @@
         {% if object.trigger_duration %}
 		<tr><th>Trigger duration</th><td colspan="2">{{object.trigger_duration}}</td></tr>
         {% endif %}
+        {% if object.far %}
+		<tr><th>FAR (Hz)</th><td colspan="2">{{object.far}}</td></tr>
+        {% endif %}
         {% if object.t90 %}
 		<tr><th>T90</th><td colspan="2">{{object.t90}}</td></tr>
         {% endif %}
diff --git a/requirements.txt b/requirements.txt
index 82001af7d1466f0895ac39f35e17700b2cef5c03..dae66809e84f50394cfd6ccf9e02d517a7e7269d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,8 +1,8 @@
 ConcurrentLogHandler==0.9.1
-Django==1.11.23
+Django==2.2.10
 django-debug-toolbar==1.9.1
 django-extensions==2.0.5
-django-guardian==1.4.9
+django-guardian==2.2.0
 django-model-utils==3.1.1
 django-ses==0.8.10
 django-silk==3.0.1
@@ -57,3 +57,5 @@ pyasn1==0.3.6
 pyasn1-modules==0.1.5
 # Installing futures for gunicorn gthreads (Python 2 only):
 futures==3.2.0; python_version < '3'
+# retry bandaid for efs errors:
+retry==0.9.2