diff --git a/gracedb/api.py b/gracedb/api.py
index 04495148f4d7425ce1c956da95cf4995435aac7e..bb9e71605874b63e60432e2c263a92a9325d0aed 100644
--- a/gracedb/api.py
+++ b/gracedb/api.py
@@ -16,7 +16,7 @@ from gracedb.models import Event, Group, Search, Pipeline, EventLog, Tag
 from gracedb.models import EMGroup, EMBBEventLog, EMSPECTRUM
 #from gracedb.models import EMObservation, EMFootprint
 from gracedb.models import VOEvent
-from view_logic import create_label, get_performance_info
+from view_logic import create_label, get_performance_info, delete_label
 from view_logic import _createEventFromForm
 from view_logic import create_eel
 from view_logic import create_emobservation
@@ -739,7 +739,15 @@ class EventLabel(APIView):
         return Response(rv, status=status.HTTP_201_CREATED)
 
     def delete(self, request, graceid, label):
-        return Response("Not Implemented", status=status.HTTP_501_NOT_IMPLEMENTED)
+        #return Response("Not Implemented", status=status.HTTP_501_NOT_IMPLEMENTED)
+        try:
+            event = Event.getByGraceid(graceid)
+            rv = delete_label(event, request, label)
+        except ValueError, e:
+            return Response(e.message,
+                        status=status.HTTP_400_BAD_REQUEST)
+
+        return Response(rv, status=status.HTTP_201_CREATED)
 
 #==================================================================
 # EventLog
diff --git a/gracedb/view_logic.py b/gracedb/view_logic.py
index 863e8eb2a8196e834df34953629674b6bfc8d320..cbe86ca3cfe5be7697245b968d321c821c84b39c 100644
--- a/gracedb/view_logic.py
+++ b/gracedb/view_logic.py
@@ -188,6 +188,43 @@ def create_label(event, request, labelName, doAlert=True, doXMPP=True):
     # XXX Strange return value.  Just warnings.  Can really be ignored, I think.
     return json.dumps(d)
 
+def delete_label(event, request, labelName):
+    # This function deletes a label. It starts out a lot like the create
+    # label function. First get user and event info:
+    creator = request.user
+    event_url = request.build_absolute_uri(reverse('view', args=[event.graceid()]))
+    d = {}
+
+    # First,throw out an error if the label doesn't exist in the list of available
+    # labels.
+    try:
+        label = Label.objects.filter(name=labelName)[0]
+    except IndexError:
+        raise ValueError("No such Label '%s'" % labelName)
+
+    # Next, check if the label is in the list of labels for the event. Throw out an
+    # error if it isn't. There might be a more elegant way of doing this.
+    if label not in event.labels.all():
+            d['warning'] = "No label '%s' associated with event %s" % (labelName, event.graceid())
+            raise ValueError( "No label '%s' associated with event %s" % (labelName, event.graceid()))
+    else:
+        this_label = Labelling.objects.get(
+                event = event,
+                label = label,
+            )
+        this_label.delete()
+        message = "Deleted label: %s" % label.name
+        log = EventLog(event=event, issuer=creator, comment=message)
+        try:
+            log.save()
+        except Exception as e:
+            # XXX This looks a bit odd to me. (<-- retained this message)
+            logger.exception('Problem saving log message')
+            d['error'] = str(e)
+
+    # Return the json for some reason. I don't do any alert stuff in here.
+    return json.dumps(d)
+
 def _createLog(request, graceid, comment, uploadedFile=None):
     response = HttpResponse(mimetype='application/json')
     rdict = {}
diff --git a/gracedb/view_utils.py b/gracedb/view_utils.py
index 9c06004b3ba51264479d8b0020592e0fef30e455..796133e81e99ac5b7b44b30cf8c75b3ecc4ae04e 100644
--- a/gracedb/view_utils.py
+++ b/gracedb/view_utils.py
@@ -302,6 +302,14 @@ def eventToDict(event, columns=None, request=None):
         si_set = event.singleinspiral_set.all()
         if si_set.count():
             rv['extra_attributes']['SingleInspiral'] = [ singleInspiralToDict(si) for si in si_set ]
+    elif request and request.user and is_external(request.user):
+        # Expose SingleInspiral times only for external users.
+        ext_keys = ['ifo','end_time','end_time_ns']
+        si_set = event.singleinspiral_set.all()
+        if si_set.count():
+            SingleInspiral_list = [ singleInspiralToDict(si) for si in si_set ]
+            for i, si in enumerate(SingleInspiral_list):
+                rv['extra_attributes']['SingleInspiral'] = { k: si[k] for k in ext_keys }
 
     rv['links'] = {
           "neighbors" : reverse("neighbors", args=[graceid], request=request),
diff --git a/gracedb/views.py b/gracedb/views.py
index 066ddcfd6b08f65f175da34ade9d49847db537be..9cc4f029f6fb662250f71d5d091ce12b65c46c96 100644
--- a/gracedb/views.py
+++ b/gracedb/views.py
@@ -22,7 +22,7 @@ from view_logic import get_performance_info
 from view_logic import get_lvem_perm_status
 from view_logic import create_eel
 from view_logic import create_emobservation
-from view_logic import create_label
+from view_logic import create_label, delete_label
 from view_utils import assembleLigoLw, get_file
 from view_utils import flexigridResponse, jqgridResponse
 from view_utils import get_recent_events_string