diff --git a/reviewboard/reviews/datagrids.py b/reviewboard/reviews/datagrids.py
index b61cf77fdb489e7947706aac316fb4bb693713fa..ac07fe233a211ac7d4b4fb6f65d98f63ad621d77 100644
--- a/reviewboard/reviews/datagrids.py
+++ b/reviewboard/reviews/datagrids.py
@@ -11,10 +11,11 @@ from djblets.datagrid.grids import Column, DateTimeColumn, DataGrid
 from djblets.util.templatetags.djblets_utils import ageid
 
 from reviewboard.accounts.models import Profile
-from reviewboard.reviews.models import Group, ReviewRequest
+from reviewboard.reviews.models import Group, ReviewRequest, Review, Scoreboard
 from reviewboard.reviews.templatetags.reviewtags import render_star
 from reviewboard.site.urlresolvers import local_site_reverse
 
+from datetime import datetime, timedelta
 
 class DateTimeSinceColumn(DateTimeColumn):
     """A column that displays how long it has been since a date/time.
@@ -800,3 +801,52 @@ def get_sidebar_counts(user, local_site):
         counts['starred_groups'][group.name] = group.incoming_request_count
 
     return counts
+
+class ScoreboardDataGrid(DataGrid):
+   """
+   A datagrid showing a list of review statistics.
+   """
+   user      = Column(_("Username"), link=True, sortable=True)
+   fullname      = Column(_("Full Name"), field_name="get_full_name",
+                          link=True)
+   timestamp = DateTimeSinceColumn(_("Last Reviewed"),
+       detailed_label=_("Last Reviewed (Relative)"), shrink=True, link=True,
+       css_class=lambda r: ageid(r.timestamp))
+   month_count     = Column(_("Past Month"), link=True, sortable=True)
+   weeks_count     = Column(_("Past 2 Weeks"), link=True, sortable=True)
+
+   def __init__(self, request,
+                queryset=User.objects.filter(review_groups__name__iexact="engineering").exclude(last_name = None),
+                title=_("Scoreboard")):
+       for user in queryset:
+           delta = timedelta(days=-62)
+           two_months = Review.objects.filter(base_reply_to=None).filter(user=user).filter(timestamp__gt = datetime.now() + delta).count()
+
+           if two_months == 0:
+               try:
+                   inactive = Scoreboard.objects.get(user=user)
+                   inactive.delete()
+               except:
+                   continue
+
+           try:
+               s = Scoreboard.objects.get(user=user)
+           except:
+               s = Scoreboard()
+               s.user = user
+
+           s.timestamp = Review.objects.filter(base_reply_to=None).filter(user=user).filter(timestamp__gt = datetime.now() + timedelta(days=-62)).latest('timestamp').timestamp
+           s.month_count = Review.objects.filter(base_reply_to=None).filter(user=user).filter(timestamp__gt = datetime.now() + timedelta(days=-30)).count()
+           s.weeks_count = Review.objects.filter(base_reply_to=None).filter(user=user).filter(timestamp__gt = datetime.now() + timedelta(days=-14)).count()
+           s.save()
+
+       scoresquery = Scoreboard.objects.all()
+       DataGrid.__init__(self, request, scoresquery, title)
+       self.default_sort = ["-month_count", "-weeks_count"]
+       self.default_columns = [
+           "fullname", "month_count", "weeks_count", "timestamp",
+       ]
+
+#   @staticmethod
+   def link_to_object(self, obj, value):
+       return local_site_reverse("user", args=[obj.username])
diff --git a/reviewboard/reviews/models.py b/reviewboard/reviews/models.py
index 952a6cd497c2428c912107f146e23f932f535214..db6a3b77dbd76fba9ce4ee34b9ee8d93d2bf941b 100644
--- a/reviewboard/reviews/models.py
+++ b/reviewboard/reviews/models.py
@@ -1726,3 +1726,27 @@ class Review(models.Model):
     class Meta:
         ordering = ['timestamp']
         get_latest_by = 'timestamp'
+
+class Scoreboard(models.Model):
+    """
+    A scoreboard entry.
+    """
+    user = models.ForeignKey(User, verbose_name=_("user"),
+                             related_name="scoreboards")
+    timestamp = models.DateTimeField(_('timestamp'))
+    month_count = models.IntegerField(_('month_count'))
+    weeks_count = models.IntegerField(_('week_count'))
+
+    # Set this up with a ReviewManager to help prevent race conditions and
+    # to fix duplicate reviews.
+    objects = ReviewManager()
+
+    def __unicode__(self):
+        return u"Scoreboard entry of '%s'. Latest Review: '%s'." % (self.user, self.timestamp)
+
+    def get_full_name(self):
+        return self.user.get_full_name()
+
+    class Meta:
+        ordering = ['timestamp']
+        get_latest_by = 'timestamp'
diff --git a/reviewboard/reviews/views.py b/reviewboard/reviews/views.py
index b2f239a76aa2860c46ec55a16b654d498b6e8d12..b910e24b182a37c1b99da2bb44981e76fc5e0411 100644
--- a/reviewboard/reviews/views.py
+++ b/reviewboard/reviews/views.py
@@ -42,6 +42,7 @@ from reviewboard.extensions.hooks import DashboardHook, \
 from reviewboard.reviews.datagrids import DashboardDataGrid, \
                                           GroupDataGrid, \
                                           ReviewRequestDataGrid, \
+                                          ScoreboardDataGrid, \
                                           SubmitterDataGrid, \
                                           WatchedGroupDataGrid
 from reviewboard.reviews.errors import OwnershipError
@@ -1477,3 +1478,9 @@ def user_infobox(request, username,
     set_etag(response, etag)
 
     return response
+
+@check_login_required
+def scoreboard(request, template_name='reviews/datagrid.html'):
+    grid = ScoreboardDataGrid(request)
+
+    return grid.render_to_response(template_name)
diff --git a/reviewboard/templates/base.html b/reviewboard/templates/base.html
index ba348b96574f4e20c3042a115591e12c5d394733..b8d716d495ff57fd83bd458363b1254a6a964c91 100644
--- a/reviewboard/templates/base.html
+++ b/reviewboard/templates/base.html
@@ -71,6 +71,7 @@
      <li>Welcome, <b>{{username}}</b></li>
 {% endblocktrans %}
      <li>- <a href="{% url user-preferences %}">{% trans "My account" %}</a></li>
+     <li>- <a href="{% url scoreboard %}">{% trans "Scoreboard" %}</a></li>
 {%  if user.is_staff %}
      <li>- <a href="{% url reviewboard.admin.views.dashboard %}">{% trans "Admin" %}</a></li>
 {%  endif %}
diff --git a/reviewboard/urls.py b/reviewboard/urls.py
index 1af463a3438810f92917f6466a27d98a17c990ae..ec024b52b452283b21d451c5da2b0bfad1d114d2 100644
--- a/reviewboard/urls.py
+++ b/reviewboard/urls.py
@@ -73,6 +73,7 @@ localsite_urlpatterns = patterns('',
     # Dashboard
     url(r'^dashboard/$',
         'reviewboard.reviews.views.dashboard', name="dashboard"),
+    url(r'^scoreboard/$', 'reviewboard.reviews.views.scoreboard', name="scoreboard"),
 
     # Users
     url(r'^users/$',
