diff --git a/gracedb/api.py b/gracedb/api.py
index 30d71fc601aa1952f98e5546b19b2c45ed5b63f0..b44a50c2189c7b8db2339a731e0436de12fdadd0 100644
--- a/gracedb/api.py
+++ b/gracedb/api.py
@@ -15,6 +15,7 @@ from gracedb.views import create_label
 from translator import handle_uploaded_data
 
 from alert import issueAlertForUpdate
+from buildVOEvent import buildVOEvent
 
 import os
 import urllib
@@ -282,6 +283,34 @@ class TSVRenderer(BaseRenderer):
        
         return outTable
 
+# XXX this doesn't work because you don't have the request here. You could
+# try stuffing it into the renderer context, but that's really ugly. 
+#class VOEventRenderer(BaseRenderer):
+#    media_type = 'application/xml'
+#    format = 'xml'
+#
+#    def render(self, data, media_type=None, renderer_context=None):
+#        logger = logging.getLogger(__name__)
+#        logger.debug("inside voevent renderer")
+#        if 'error' in data.keys():
+#            return data['error']
+#
+#        outDoc = ''
+#        for e in data['events']:
+#            graceid = e['graceid']
+#
+#            try:
+#                # XXX If any part of this fails, the VOEvent will be empty.
+#                event = Event.getByGraceid(graceid)
+#                if not event.far or not event.gpstime:
+#                    raise Exception
+#                voevent = buildVOEvent(event, request)
+#            except:
+#                voevent = ''
+#            outDoc += voevent + '\n'
+#       
+#        return outDoc
+
 #==================================================================
 # Events
 
@@ -669,6 +698,36 @@ class EventDetail(APIView):
                     status=status.HTTP_400_BAD_REQUEST)
         return Response(status=status.HTTP_202_ACCEPTED)
 
+# FIXME or something.
+# This should really be a renderer and not a view. But the problem 
+# is that the renderer needs the request in order to build up URLs.
+# There must be a better way of doing this.
+class EventVODetail(APIView):
+    authentication_classes = (LigoAuthentication,)
+    #parser_classes = (LigoLwParser, RawdataParser)
+    parser_classes = (parsers.MultiPartParser,)
+    #serializer_class = EventSerializer
+    permission_classes = (IsAuthenticated,)
+    renderer_classes = (JSONRenderer, BrowsableAPIRenderer, )
+
+    def get(self, request, graceid):
+        try:
+            event = Event.getByGraceid(graceid)
+        except Event.DoesNotExist:
+            # XXX Real error message.
+            return Response("Event Not Found",
+                    status=status.HTTP_404_NOT_FOUND)
+
+        try:
+            voevent = buildVOEvent(event,request)
+        except Exception, e:
+            return Response("Problem building VOEvent: %s" % str(e),
+                    status=HTTP_500_INTERNAL_SERVER_ERROR)
+
+        response = Response(voevent)
+        response["Cache-Control"] = "no-cache"
+        return response
+
 #==================================================================
 # Neighbors
 
@@ -1188,6 +1247,8 @@ class GracedbRoot(APIView):
         # Is there better?
         detail = reverse("event-detail", args=["G1200"], request=request)
         detail = detail.replace("G1200", "{graceid}")
+        vo_detail = reverse("event-vo-detail", args=["G1200"], request=request)
+        vo_detail = vo_detail.replace("G1200", "{graceid}")
         log = reverse("eventlog-list", args=["G1200"], request=request)
         log = log.replace("G1200", "{graceid}")
 
@@ -1216,6 +1277,7 @@ class GracedbRoot(APIView):
 
         templates = {
                 "event-detail-template" : detail,
+                "event-vo-detail-template" : vo_detail,
                 "event-log-template" : log,
                 "event-label-template" : labels,
                 "files-template" : files,
diff --git a/gracedb/urls_rest.py b/gracedb/urls_rest.py
index 828bfec477bde347f8b5592539e343a79e6f9209..89e6faea18a50cf79069f7447d3cdd4aa48c1f84 100644
--- a/gracedb/urls_rest.py
+++ b/gracedb/urls_rest.py
@@ -3,7 +3,7 @@ from django.conf.urls.defaults import patterns, url
 
 # rest_framework
 from gracedb.api import GracedbRoot
-from gracedb.api import EventList, EventDetail
+from gracedb.api import EventList, EventDetail, EventVODetail
 from gracedb.api import EventLogList, EventLogDetail
 from gracedb.api import TagList
 # from gracedb.api import TagDetail
@@ -20,6 +20,8 @@ urlpatterns = patterns('gracedb.api',
     # events/[{graceid}[/{version}]]
     url (r'events/$',
         EventList.as_view(), name='event-list'),
+    url (r'events/voevent/(?P<graceid>[GEHT]\d+)$',
+        EventVODetail.as_view(), name='event-vo-detail'),
     url (r'events/(?P<graceid>[GEHT]\d+)$',
         EventDetail.as_view(), name='event-detail'),