diff --git a/gracedb/alert.py b/gracedb/alert.py
index 10dc7791fb6ced2a158913a27767deea394a7e17..4754d59944d03be1ccd8cfe435007bf2af22d590 100644
--- a/gracedb/alert.py
+++ b/gracedb/alert.py
@@ -82,8 +82,11 @@ def issueEmailAlert(event, location):
         triggers = atype.trigger_set.filter(labels=None)
         for trigger in triggers:
             for recip in trigger.contacts.all():
-                bccaddresses.append(recip.email)
-
+               if not trigger.farThresh:
+                   bccaddresses.append(recip.email)
+               else:
+                   if event.far and event.far < trigger.farThresh:
+                       bccaddresses.append(recip.email)
     subject = "[gracedb] %s event. ID: %s" % (event.get_analysisType_display(), event.graceid())
     message = """
 New Event
diff --git a/gracedb/models.py b/gracedb/models.py
index 746a2365c08b88ebb387d4a6889a0404c7c00399..9b0842f9235b00bd277bf1603cd374343cfcc3f5 100644
--- a/gracedb/models.py
+++ b/gracedb/models.py
@@ -89,6 +89,8 @@ class Event(models.Model):
             return "T%04d" % self.id
         elif self.analysisType == "HWINJ":
             return "H%04d" % self.id
+        elif self.analysisType == "GRB":
+            return "E%04d" % self.id
         return "G%04d" % self.id
 
     def weburl(self):
@@ -150,6 +152,8 @@ class Event(models.Model):
             return e
         if (id[0] == "H") and (e.analysisType == "HWINJ"):
             return e
+        if (id[0] == "E") and (e.analysisType == "GRB"):
+            return e
         if (id[0] == "G"):
             return e
         raise cls.DoesNotExist()
diff --git a/gracedb/query.py b/gracedb/query.py
index 65dfaed1182928d5fafe0e30425098d88154bee3..3da3accbf0743bd7d4c661b37e4c1b7a46b16c29 100644
--- a/gracedb/query.py
+++ b/gracedb/query.py
@@ -114,6 +114,12 @@ tidRange = tid + Suppress("..") + tid
 tidQ = Optional(Suppress(Keyword("tid:"))) + (tid^tidRange)
 tidQ = tidQ.setParseAction(maybeRange("tid", dbname="id"))
 
+# External trigger event id
+eid = Suppress("E")+Word("0123456789")
+eidRange = eid + Suppress("..") + eid
+eidQ = Optional(Suppress(Keyword("eid:"))) + (eid^eidRange)
+eidQ = eidQ.setParseAction(maybeRange("eid", dbname="id"))
+
 # Submitter
 submitter = QuotedString('"').setParseAction(lambda toks: Q(submitter__name=toks[0]))
 submitterQ = Optional(Suppress(Keyword("submitter:"))) + submitter
@@ -214,7 +220,7 @@ ifoQ = ifoListQ | nifoQ
 
 ###########################
 
-q = (ifoQ | hasfarQ | gidQ | hidQ | tidQ | labelQ | atypeQ | groupQ | gpsQ | createdQ | submitterQ | runQ | attributeQ).setName("query term")
+q = (ifoQ | hasfarQ | gidQ | hidQ | tidQ | eidQ | labelQ | atypeQ | groupQ | gpsQ | createdQ | submitterQ | runQ | attributeQ).setName("query term")
 
 #andTheseTags = ["attr"]
 andTheseTags = ["nevents"]
diff --git a/gracedb/translator.py b/gracedb/translator.py
index 6bb0582851dcd9ea25d071d18c3eaf5b0614f958..b13f6a519df11caf3e8385291d021f1adf1e3159 100644
--- a/gracedb/translator.py
+++ b/gracedb/translator.py
@@ -18,6 +18,10 @@ from glue.gracedb.utils import populate_inspiral_tables, \
                                populate_coinc_tables,    \
                                write_output_files
 
+from VOEventLib.VOEvent import *
+from VOEventLib.Vutil import *
+from utils import isoToGps
+
 def handle_uploaded_data(event, datafilename,
                          log_filename='event.log',
                          coinc_table_filename='coinc.xml'):
@@ -291,6 +295,13 @@ def handle_uploaded_data(event, datafilename,
             f.close()
         except:
             pass
+    elif event.analysisType == 'GRB':
+        # Get the event time from the VOEvent file
+        try:
+            event.gpstime = getGpsFromVOEvent(datafilename)
+        except:
+            event.gpstime = 0
+        event.save()
     else:
         # XXX should we do something here?
         pass
@@ -453,3 +464,8 @@ class CwbData(Translator):
     def writeCoincFile(self, path):
         pass
 
+def getGpsFromVOEvent(filename):
+    v = parse(filename)
+    wwd = getWhereWhen(v)
+    gpstime = isoToGps(wwd['time'])
+    return gpstime
diff --git a/gracedb/urls.py b/gracedb/urls.py
index 7c79a0ca409686ce4565528eca13ebc1d95a4a82..4113321928f46531b6de7e26b7eb99cd58348560 100644
--- a/gracedb/urls.py
+++ b/gracedb/urls.py
@@ -13,7 +13,7 @@ urlpatterns = patterns('gracedb.views',
     url (r'^voevent/(?P<graceid>[\w\d]+)', 'voevent', name="voevent"),
     url (r'^skyalert/(?P<graceid>[\w\d]+)', 'skyalert', name="skyalert"),
     url (r'^(?P<graceid>[\w\d]+)$', 'view', name="view2"),
-    url (r'^(?P<graceid>[\w\d]+)/files/(?P<filename>.+)$', download, name="file"),
+    url (r'^(?P<graceid>[\w\d]+)/files/(?P<filename>.*)$', download, name="file"),
     url (r'^(?P<graceid>[\w\d]+)/log/(?P<num>([\d]*|preview))$', 'logentry', name="logentry"),
 
 
diff --git a/settings/branson.py b/settings/branson.py
index dbe5521223275f9e62753a6995ad393c5f7aced7..dc87b5e3e4bf940dab496c180fc3129e21401c9e 100644
--- a/settings/branson.py
+++ b/settings/branson.py
@@ -8,7 +8,7 @@ DATABASES = {
     'default' : {
         'NAME'     : 'branson',
         'ENGINE'   : 'django.db.backends.mysql',
-        'USER'     : 'gracedb',
+        'USER'     : 'branson',
         'PASSWORD' : 'thinglet',
     }
 }
@@ -50,5 +50,5 @@ TEMPLATE_DIRS = (
     # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
     # Always use forward slashes, even on Windows.
     # Don't forget to use absolute paths, not relative paths.
-    "/homebransonbmoe/gracedb/templates",
+    "/home/branson/gracedbdev/templates",
 )
diff --git a/userprofile/forms.py b/userprofile/forms.py
index 87c571c88bce56efdb5aa69dd992bd3646603ee2..66b8d18cd3ac806dd9d6638e847a56cdda36c846 100644
--- a/userprofile/forms.py
+++ b/userprofile/forms.py
@@ -6,6 +6,7 @@ from django.forms.models import modelformset_factory
 
 def triggerFormFactory(postdata=None, user=None):
     class TF(forms.ModelForm):
+        farThresh = forms.FloatField(label='FAR Threshold')
         class Meta:
             model = Trigger
             exclude = ['user', 'triggerType']
diff --git a/userprofile/models.py b/userprofile/models.py
index dbabd67bfff5550932a19c270ef7ca62adc0e9b5..270be3dc10f15b264842ff04c854d1992457caba 100644
--- a/userprofile/models.py
+++ b/userprofile/models.py
@@ -46,6 +46,7 @@ class Trigger(models.Model):
     labels = models.ManyToManyField(Label, blank=True)
     atypes = models.ManyToManyField(AnalysisType, blank=True, verbose_name="Analysis Types")
     contacts = models.ManyToManyField(Contact, blank=True)
+    farThresh = models.FloatField(blank=True, null=True)
 
     def __unicode__(self):
         return ("%s: %s") % (
diff --git a/userprofile/views.py b/userprofile/views.py
index d2d3ddea758702ff3a9c22a6d0fe8f6042f97b19..7256f500de73e00f27b07cee9a90277194b6768a 100644
--- a/userprofile/views.py
+++ b/userprofile/views.py
@@ -31,6 +31,7 @@ def create(request):
             labels = form.cleaned_data['labels']
             atypes = form.cleaned_data['atypes']
             contacts = form.cleaned_data['contacts']
+            farThresh = form.cleaned_data['farThresh']
 
             if contacts and (labels or atypes):
                 t.save() # Need an id before relations can be set.
@@ -38,6 +39,7 @@ def create(request):
                     t.labels = labels
                     t.atypes = atypes
                     t.contacts = contacts
+                    t.farThresh = farThresh
                 except:
                     t.delete()
                 t.save()
diff --git a/utils/__init__.py b/utils/__init__.py
index 19adfb920bddcf494fbd2885b5c1383fc0074b2e..e4ac9a306852e17968d28cfb03e73d088a1559c9 100644
--- a/utils/__init__.py
+++ b/utils/__init__.py
@@ -11,6 +11,7 @@ import pytz
 import datetime
 
 import calendar
+from time import mktime
 
 gpsEpoch = calendar.timegm((1980, 1, 6, 0,  0,  0,  0,  0,  0))
 
@@ -51,4 +52,17 @@ def gpsToUtc(gpsTime):
     t = gpsToPosixTime(gpsTime)
     return datetime.datetime.fromtimestamp(t, pytz.utc)
 
-
+def isoToGps(t):
+    # The input is a string in ISO time format: 2012-10-28T05:04:31.91
+    # First strip out whitespace, then split off the factional 
+    # second.  We'll add that back later.
+    t=t.strip()
+    ISOTime = t.split('.')[0]
+    ISOTime = datetime.datetime.strptime(ISOTime,"%Y-%m-%dT%H:%M:%S")
+    sec_substr = t.split('.')[1]
+    if sec_substr:
+        fracSec = float('0.' + sec_substr)
+    else:
+        fracSec = 0
+    posixTime = mktime(ISOTime.timetuple()) + fracSec 
+    return int(round(posixToGpsTime(posixTime)))