diff --git a/gracedb/superevents/api/serializers.py b/gracedb/superevents/api/serializers.py
index 680b38d2f4809b4243b7dcae8ea208a666ccc4ed..1e47d7c01a56e68b1f10a2ed7ebc908321c87343 100644
--- a/gracedb/superevents/api/serializers.py
+++ b/gracedb/superevents/api/serializers.py
@@ -2,7 +2,7 @@ from rest_framework import serializers, validators
 from django.contrib.auth import get_user_model
 from django.utils.translation import ugettext_lazy as _
 from django.conf import settings
-from ..models import Superevent, Labelling, Log, VOEvent
+from ..models import Superevent, Labelling, Log, VOEvent, EMObservation
 from ..forms import LogCreateForm
 from ..utils import create_superevent, update_superevent, add_tag_to_log, \
     create_log, add_event_to_superevent, add_label_to_superevent
@@ -10,7 +10,7 @@ from ..utils import create_superevent, update_superevent, add_tag_to_log, \
 from .fields import ParentObjectDefault
 from .settings import SUPEREVENT_LOOKUP_FIELD
 
-from events.models import Event, Label, Tag
+from events.models import Event, Label, Tag, EMGroup
 from events.view_utils import reverse as gracedb_reverse
 from events.api.fields import EventGraceidField
 
@@ -380,38 +380,47 @@ class SupereventVOEventSerializer(serializers.ModelSerializer):
         }
         return link_dict
 
-    #def get_text(self, obj):
-    #    text = None
-    #    if obj.filename:
-    #        filepath = os.path.join(obj.superevent.datadir, obj.filename)
-    #        text = open(filepath, 'r').read()
+    # TODO:
+    # VOEvent creation!!
 
-    #    return text
 
+class SupereventEMObservationSerializer(serializers.ModelSerializer):
+    # Read only fields
+    submitter = serializers.SlugRelatedField(slug_field='username',
+        read_only=True)
+    created = serializers.DateTimeField(format=settings.GRACE_STRFTIME_FORMAT,
+        read_only=True)
+    footprint_count = serializers.SerializerMethodField(read_only=True)
+    footprints = serializers.SerializerMethodField(read_only=True)
 
-    #def __init__(self, *args, **kwargs):
-    #    super(SupereventLogSerializer, self).__init__(*args, **kwargs)
-    #    self.fields['filename'].read_only = True
-    #    self.fields['file_version'].read_only = True
-
-    #def get_self(self, obj):
-    #    superevent_id = self.context['view'].kwargs.get(
-    #        SUPEREVENT_LOOKUP_FIELD)
-    #    return gracedb_reverse('superevent-log-detail', args=[
-    #        superevent_id, obj.N], request=self.context['request'])
-
-    #def create(self, validated_data):
-    #    # Check user permissions here, or somewhere else? Maybe just on viewset
-    #    # create resource
-
-    #    # Convert to be used with Django form for Logs
-    #    validated_data['issuer'] = validated_data.pop('submitter').id
-    #    validated_data['superevent'] = validated_data['superevent'].id
-    #    if validated_data.has_key('data_file'):
-    #        validated_data['filename'] = validated_data['data_file'].name
+    # Both
+    group = serializers.SlugRelatedField(slug_field='name',
+        queryset=EMGroup.objects.all())
 
-    #    form = LogCreateForm(validated_data, validated_data)
-    #    if form.is_valid():
-    #        obj = form.save()
+    # Write only fields
+    user = serializers.HiddenField(write_only=True,
+        default=serializers.CurrentUserDefault())
 
-    #    return obj
+    class Meta:
+        model = EMObservation
+        fields = ('created', 'N', 'submitter', 'group', 'ra', 'raWidth', 'dec',
+            'decWidth', 'footprint_count', 'footprints', 'user')
+
+    def get_footprint_count(self, obj):
+        return obj.emfootprint_set.count()
+
+    def get_footprints(self, obj):
+        return [{
+            'exposure_time': fp.exposure_time,
+            'start_time': fp.start_time.strftime(
+                settings.GRACE_STRFTIME_FORMAT),
+            'N': fp.N,
+            'raWidth': fp.raWidth,
+            'decWidth': fp.decWidth,
+            'ra': fp.ra,
+            'dec': fp.dec,
+        } for fp in obj.emfootprint_set.all().order_by('-N')]
+        return 'test'
+
+    # TODO:
+    # EMObservation creation!!
diff --git a/gracedb/superevents/api/urls.py b/gracedb/superevents/api/urls.py
index a02bee915297947590ea922bf51f483e1b531f4a..8b02abf6c4e997c66b510d19b1cc822160ae282f 100644
--- a/gracedb/superevents/api/urls.py
+++ b/gracedb/superevents/api/urls.py
@@ -61,6 +61,15 @@ suburlpatterns = [
         SupereventVOEventViewSet.lookup_field),
         SupereventVOEventViewSet.as_view({'get': 'retrieve'}),
         name='superevent-voevent-detail'),
+
+    # EMObservations
+    url(r'^emobservations/$', SupereventEMObservationViewSet.as_view(
+        {'get': 'list', 'post': 'create'}),
+        name='superevent-emobservation-list'),
+    url(r'^emobservations/(?P<{lookup_field}>\d+)/$'.format(lookup_field=
+        SupereventEMObservationViewSet.lookup_field),
+        SupereventEMObservationViewSet.as_view({'get': 'retrieve'}),
+        name='superevent-emobservation-detail'),
 ]
 
 urlpatterns = router.urls + [
diff --git a/gracedb/superevents/api/view_templates.py b/gracedb/superevents/api/view_templates.py
index 27e6d621aed6567d1036cd3667364a201877caaa..f80784f32eb5395066d28417b6a4ad953904a4c7 100644
--- a/gracedb/superevents/api/view_templates.py
+++ b/gracedb/superevents/api/view_templates.py
@@ -1,7 +1,8 @@
 from events.view_utils import reverse
 from .views import SupereventViewSet, SupereventEventViewSet, \
     SupereventLabelViewSet, SupereventLogViewSet, SupereventLogTagViewSet, \
-    SupereventFileViewSet, SupereventVOEventViewSet
+    SupereventFileViewSet, SupereventVOEventViewSet, \
+    SupereventEMObservationViewSet
 
 
 # Placeholder parameters for getting URLs with reverse
@@ -13,6 +14,7 @@ PH = {
     SupereventLogTagViewSet.lookup_field: 'TAG_NAME', # tag name
     SupereventFileViewSet.lookup_field: 'FILE_NAME', # file name
     SupereventVOEventViewSet.lookup_field: '4444', # VOEvent number (N)
+    SupereventEMObservationViewSet.lookup_field: '5555', # EMObservation number (N)
 }
 
 
@@ -38,6 +40,9 @@ def construct_api_url_templates(request=None):
         'superevent-voevent-list': [],
         'superevent-voevent-detail': [
             PH[SupereventVOEventViewSet.lookup_field]],
+        'superevent-emobservation-list': [],
+        'superevent-emobservation-detail': [
+            PH[SupereventEMObservationViewSet.lookup_field]],
     }
 
     # Dict of URL templates:
diff --git a/gracedb/superevents/api/views.py b/gracedb/superevents/api/views.py
index 8465abcffa34eea40e8ea793126407216f71c5cf..e2fc68bca2166327ff121ed4b72d34446812d0d9 100644
--- a/gracedb/superevents/api/views.py
+++ b/gracedb/superevents/api/views.py
@@ -28,7 +28,7 @@ from .paginators import BasePaginationFactory, CustomLabelPagination, \
 from .serializers import SupereventSerializer, SupereventUpdateSerializer, \
     SupereventEventSerializer, SupereventLabelSerializer, \
     SupereventLogSerializer, SupereventLogTagSerializer, \
-    SupereventVOEventSerializer
+    SupereventVOEventSerializer, SupereventEMObservationSerializer
 
 from .settings import SUPEREVENT_LOOKUP_FIELD, SUPEREVENT_LOOKUP_REGEX
 
@@ -283,3 +283,29 @@ class SupereventVOEventViewSet(mixins.ListModelMixin,
         obj = get_object_or_404(queryset, **filter_kwargs)
         return obj
 
+
+class SupereventEMObservationViewSet(mixins.ListModelMixin,
+                                     mixins.RetrieveModelMixin,
+                                     mixins.CreateModelMixin,
+                                     GetParentSupereventMixin,
+                                     viewsets.GenericViewSet):
+    """
+    View for EMObservations attached to a superevent.
+    """
+    serializer_class = SupereventEMObservationSerializer
+    pagination_class = BasePaginationFactory(results_name='observations')
+    lookup_field = 'N'
+
+    def get_queryset(self):
+        superevent = self.get_parent()
+        queryset = superevent.emobservation_set.all()
+        # filter for those tagged with external access tagname if is_external(request.user)
+        return queryset
+
+    # TODO: generalize this method, can be used for superevent, superevent-event, etc.
+    def get_object(self):
+        queryset = self.filter_queryset(self.get_queryset())
+        N = self.kwargs.get(self.lookup_field, None)
+        filter_kwargs = {'N': N}
+        obj = get_object_or_404(queryset, **filter_kwargs)
+        return obj