diff --git a/AUTHORS b/AUTHORS
index 4a2c22cb5ad207170092bb7bf202b2c00997bb1a..01ba5d13fe409f072998be546dd0ec7bfb0a7413 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -92,4 +92,5 @@ Felipe Montoya <felipe.montoya@edunext.co>
 Julia Hansbrough <julia@edx.org>
 Pavel Yushchenko <pavelyushchenko@gmail.com>
 Nicolas Chevalier <nicolas.chevalier@epitech.eu>
+Gabe Mulley <gabe@edx.org>
 Iain Dunning <idunning@mit.edu>
diff --git a/common/djangoapps/track/middleware.py b/common/djangoapps/track/middleware.py
index c5bba2e10cb488c16764b6df9caf7d55c2fa4338..54934c5f36a65fb680bfa66d1716127dd3b8c1fb 100644
--- a/common/djangoapps/track/middleware.py
+++ b/common/djangoapps/track/middleware.py
@@ -1,5 +1,6 @@
 import json
 import re
+import logging
 
 from django.conf import settings
 
@@ -8,13 +9,20 @@ from track import contexts
 from eventtracking import tracker
 
 
-COURSE_CONTEXT_NAME = 'edx.course'
+log = logging.getLogger(__name__)
+
+CONTEXT_NAME = 'edx.request'
 
 
 class TrackMiddleware(object):
+    """
+    Tracks all requests made, as well as setting up context for other server
+    emitted events.
+    """
+
     def process_request(self, request):
         try:
-            self.enter_course_context(request)
+            self.enter_request_context(request)
 
             if not self.should_process_request(request):
                 return
@@ -66,20 +74,29 @@ class TrackMiddleware(object):
                 return False
         return True
 
-    def enter_course_context(self, request):
+    def enter_request_context(self, request):
         """
-        Extract course information from the request and add it to the
-        tracking context.
+        Extract information from the request and add it to the tracking
+        context.
         """
+        context = {}
+        context.update(contexts.course_context_from_url(request.build_absolute_uri()))
+        try:
+            context['user_id'] = request.user.pk
+        except AttributeError:
+            context['user_id'] = ''
+            if settings.DEBUG:
+                log.error('Cannot determine primary key of logged in user.')
+
         tracker.get_tracker().enter_context(
-            COURSE_CONTEXT_NAME,
-            contexts.course_context_from_url(request.build_absolute_uri())
+            CONTEXT_NAME,
+            context
         )
 
     def process_response(self, request, response):  # pylint: disable=unused-argument
-        """Exit the course context if it exists."""
+        """Exit the context if it exists."""
         try:
-            tracker.get_tracker().exit_context(COURSE_CONTEXT_NAME)
+            tracker.get_tracker().exit_context(CONTEXT_NAME)
         except:  # pylint: disable=bare-except
             pass
 
diff --git a/common/djangoapps/track/tests/test_middleware.py b/common/djangoapps/track/tests/test_middleware.py
index 68cc7585f61d8241e83caa7c6d33b3424eb35c0a..78d5d46b61f5886a43b72d15af7a8bf319178d0b 100644
--- a/common/djangoapps/track/tests/test_middleware.py
+++ b/common/djangoapps/track/tests/test_middleware.py
@@ -2,6 +2,7 @@ import re
 
 from mock import patch
 
+from django.contrib.auth.models import User
 from django.test import TestCase
 from django.test.client import RequestFactory
 from django.test.utils import override_settings
@@ -52,15 +53,32 @@ class TrackMiddlewareTestCase(TestCase):
     def test_request_in_course_context(self):
         request = self.request_factory.get('/courses/test_org/test_course/test_run/foo')
         self.track_middleware.process_request(request)
+        captured_context = tracker.get_tracker().resolve_context()
+        self.track_middleware.process_response(request, None)
+
         self.assertEquals(
-            tracker.get_tracker().resolve_context(),
+            captured_context,
             {
                 'course_id': 'test_org/test_course/test_run',
-                'org_id': 'test_org'
+                'org_id': 'test_org',
+                'user_id': ''
             }
         )
-        self.track_middleware.process_response(request, None)
         self.assertEquals(
             tracker.get_tracker().resolve_context(),
             {}
         )
+
+    def test_request_with_user(self):
+        request = self.request_factory.get('/courses/')
+        request.user = User(pk=1)
+        self.track_middleware.process_request(request)
+        self.addCleanup(self.track_middleware.process_response, request, None)
+        self.assertEquals(
+            tracker.get_tracker().resolve_context(),
+            {
+                'course_id': '',
+                'org_id': '',
+                'user_id': 1
+            }
+        )