diff --git a/gracedb/buildVOEvent.py b/gracedb/buildVOEvent.py
index db0226ac1df8d245e2bfa560e167bb0ed89a2b80..9209ea8af57fa01092797c2704bd2c477e2311ea 100755
--- a/gracedb/buildVOEvent.py
+++ b/gracedb/buildVOEvent.py
@@ -1,4 +1,7 @@
+
+# Taken from VOEventLib example code, which is:
 # Copyright 2010 Roy D. Williams
+# then modified
 """
 buildVOEvent: Creates a complex VOEvent with tables
 See the VOEvent specification for details
@@ -17,7 +20,7 @@ def buildVOEvent(gevent):
 
     ############ VOEvent header ############################
     v = VOEvent.VOEvent(version="2.0")
-    v.set_ivorn("ivo://ligo.org/gracedb#%s" % objid)
+    v.set_ivorn("ivo://ligo.org/gracedb#%s-dev" % objid)
     v.set_role("test")
     v.set_Description("LIGO / Virgo trigger")
 
@@ -101,11 +104,7 @@ def submitToSkyalert(gevent, validate_only=False):
         # Should alerts be run once the event is ingested?
         dict['doRules'] = 'on'
 
-    # open a file for the XML
-    #dict['xmlText'] = open('sample.xml').read()
     dict['xmlText'] = buildVOEvent(gevent)
-
-    # Now send it off and print the result
     params = urllib.urlencode(dict)
     f = urllib.urlopen(url, params)
     result = f.read()
diff --git a/gracedb/views.py b/gracedb/views.py
index 7240415aaaf5bc1eeb3b5a61095eba2c94aece2c..d4fe5a31eb8a7fd9ac7ad45b59de1313469fee5a 100644
--- a/gracedb/views.py
+++ b/gracedb/views.py
@@ -18,6 +18,9 @@ from translator import handle_uploaded_data
 import urllib
 
 import os
+import re
+from django.core.mail import mail_admins
+from django.conf import settings
 
 from buildVOEvent import buildVOEvent, submitToSkyalert
 
@@ -33,13 +36,105 @@ def index(request):
             {},
             context_instance=RequestContext(request))
 
+def skyalert_authorized(request):
+    try:
+        return request.ligouser.name in settings.SKYALERT_SUBMITTERS
+    except:
+        return False
+
 def voevent(request, graceid):
     event = Event.getByGraceid(graceid)
     return HttpResponse(buildVOEvent(event), content_type="application/xml")
 
+
 def skyalert(request, graceid):
     event = Event.getByGraceid(graceid)
-    return HttpResponse(submitToSkyalert(event), content_type="text/plain")
+    createLogEntry = True
+
+    if not event.gpstime:
+        request.session['flash_msg'] = "No GPS time.  Event not suitable for submission to SkyAlert"
+        return HttpResponseRedirect(reverse(view, args=[graceid]))
+
+    if not skyalert_authorized(request):
+        request.session['flash_msg'] = "You are not authorized for SkyAlert submission"
+        return HttpResponseRedirect(reverse(view, args=[graceid]))
+
+    try:
+        skyalert_response = submitToSkyalert(event)
+    except Exception, e:
+        message = "SkyAlert Submission Error"
+        skyalert_response = ""
+        mail_admins("SkyAlert Submission Error",
+                    "Event: %s\nExcption: %s\n" % (graceid, e),
+                    fail_silently=True)
+
+    if skyalert_response.find("Success") >= 0:
+        urlpat = re.compile('https://[^ ]*')
+        match = urlpat.search(skyalert_response)
+        if match:
+            message = "Submitted to Skyalert: %s" % match.group()
+        else:
+            message = "SkyAlert submission problem.  Cannot parse SkyAlert response."
+            mail_admins("SkyAlert response parsing problem",
+                        "Event: %s\nSkyAlert Response: %s\n" % (graceid, skyalert_response),
+                        fail_silently=True)
+    elif skyalert_response.find('already') >= 0:
+            message = "Event already submitted to SkyAlert"
+            createLogEntry = False
+    elif skyalert_response:
+        message = "Skyalert Submission Failed."
+        mail_admins("SkyAlert submission failed",
+                    "Event: %s\nSkyAlert Response: %s\n" % (graceid, skyalert_response),
+                    fail_silently=True)
+
+    request.session['flash_msg'] = message
+
+    if createLogEntry:
+        logentry = EventLog(event=event, issuer=request.ligouser, comment=message)
+        logentry.save()
+
+    return HttpResponseRedirect(reverse(view, args=[graceid]))
+
+
+def badskyalert(request, graceid):
+    event = Event.getByGraceid(graceid)
+
+    if not event.gpstime:
+        request.session['flash_msg'] = "No GPS time.  Event not suitable for submission to SkyAlert"
+        return HttpResponse("Ugh no gpstime")
+        return HttpResponseRedirect(reverse(view, args=[graceid]))
+
+    logentry = EventLog(event=event, issuer=request.ligouser, comment="TRYING TO SUMIT TO SKYALERT")
+    logentry.save()
+
+    skyalert_response = submitToSkyalert(event, validate_only="False")
+
+    if skyalert_response.find("Success") >= 0:
+        urlpat = re.compile('https://[^ ]*')
+        match = urlpat.search(skyalert_response)
+        if match:
+            try:
+                skyalert_url = match.group()
+            except:
+                skyalert_url = "fail match"
+            comment = "Submitted to SkyALert: %s" % skyalert_url
+            logentry = EventLog(event=event, issuer=request.ligouser, comment=comment)
+            logentry.save()
+            request.session['flash_msg'] = comment
+            return HttpResponse("OK " + skyalert_response + skyalert_url + logentry.comment)
+        else:
+            request.session['flash_msg'] = "Problem parsing skyalert response"
+            return HttpResponse('problem ' + skyalert_response)
+    elif skyalert_response.find('already found') >= 0:
+        request.session['flash_msg'] = "Event already submitted to SkyAlert " + skyalert_response
+        return HttpResponse('already done ' + skyalert_response)
+    else:
+        return HttpResponse('problem2 ' + skyalert_response)
+        request.session['flash_msg'] = "Unknown problem submitting to SkyAlert -- %s" % skyalert_response
+
+    #return HttpResponseRedirect(reverse(view, args=[graceid]))
+    return HttpResponse('how did we get here? ' + skyalert_response)
+    return view(request, graceid)
 
 def create(request):
     d = _create(request)
@@ -393,6 +488,7 @@ def view(request, graceid):
     context['userdesc'] = get_file(graceid, "user.log")
     context['nearby'] = [(event.gpstime - a.gpstime, event)
                             for event in a.neighbors()]
+    context['skyalert_authorized'] = skyalert_authorized(request)
     return render_to_response(
         'gracedb/event_detail.html',
         context,
diff --git a/settings.py b/settings.py
index c6e5d8ba6f0b7b779a0038c814a2696bc8a07f98..39f43800c4b60e965d2fb0094e056e4fece80aba 100644
--- a/settings.py
+++ b/settings.py
@@ -8,11 +8,13 @@ EMAIL_HOST = 'gravity.phys.uwm.edu'
 
 ADMINS = (
     ('Brian Moe', 'bmoe@gravity.phys.uwm.edu'),
-    ('Larry Price', 'larry@gravity.phys.uwm.edu'),
+#   ('Larry Price', 'larry@gravity.phys.uwm.edu'),
 )
 
 MANAGERS = ADMINS
 
+SKYALERT_SUBMITTERS = ['Patrick Brady', 'Brian Moe']
+
 ALERT_EMAIL_FROM = "GraCEDb <gracedb@archie.phys.uwm.edu>"
 ALERT_EMAIL_TO = [
                   "gracedb@listserv.ligo.org",
diff --git a/settings_dev.py b/settings_dev.py
index 173628c708039162e870ccdc134834c6fd486c15..97157756265464656eff4d4bef8df6a4ab35ed01 100644
--- a/settings_dev.py
+++ b/settings_dev.py
@@ -9,6 +9,8 @@ ADMINS = (
 
 MANAGERS = ADMINS
 
+SKYALERT_SUBMITTERS = ['Patrick Brady', 'Brian Moe']
+
 ALERT_EMAIL_FROM = "Dev Alert <root@moe.phys.uwm.edu>"
 ALERT_EMAIL_TO = [
     "Brian Moe <bmoe@gravity.phys.uwm.edu>",
diff --git a/templates/gracedb/event_detail.html b/templates/gracedb/event_detail.html
index c36e65d5a7edfce66c605597ffaa8050104bfa84..9fef6ef4fe516eca07b60d2ba2d5be0c4fbb699c 100644
--- a/templates/gracedb/event_detail.html
+++ b/templates/gracedb/event_detail.html
@@ -11,6 +11,12 @@
 <tr><td valign="top">
 
 <table class="event">
+    {% if skyalert_authorized  %}
+        <tr><td colspan="4">
+           <a href="{% url skyalert object.graceid %}"><button type="button">Submit to Skyalert</button></a>
+        </td></tr>
+    {% endif %}
+
     <tr>
             <th valign="top">UID</th>
             <th>Labels</th>