diff --git a/reviewboard/admin/urls.py b/reviewboard/admin/urls.py
index 0e06e96d72a78ba324b51adcb22fa91f16ba14a6..e3ecfd4434af6f0848cb7f9fec9d1758713bd360 100644
--- a/reviewboard/admin/urls.py
+++ b/reviewboard/admin/urls.py
@@ -52,6 +52,9 @@ urlpatterns = [
             'url': NEWS_FEED,
         }),
 
+    url(r'^feed/security/$', views.security_feed,
+        name='admin-widget-security'),
+
     url(r'^feed/news/rss/$',
         RedirectView.as_view(url=NEWS_FEED, permanent=True)),
 
diff --git a/reviewboard/admin/views.py b/reviewboard/admin/views.py
index 9d07bd3e3059ca23d5467691f3a990d9734bebe3..0ee6e8ab5381ab919c9ff0d5802435ee61c91db2 100644
--- a/reviewboard/admin/views.py
+++ b/reviewboard/admin/views.py
@@ -130,6 +130,35 @@ def security(request, template_name="admin/security.html"):
     }))
 
 
+@staff_member_required
+def security_feed(request, template_name="admin/security_feed.html"):
+    """Run security checks and render the results with the given template.
+
+    Args:
+        request (django.http.HttpRequest):
+            The HTTP request from the client.
+
+        template_name (unicode):
+            The template to render the results of the security checks.
+
+    Returns:
+        django.http.HttpResponse:
+        The rendered response.
+    """
+    runner = SecurityCheckRunner()
+    err_msgs = [
+        item['error_msg']
+        for item in runner.run()
+        if not item['result']
+    ]
+
+    return render_to_response(template_name, RequestContext(request, {
+        'count': len(err_msgs),
+        'error_msgs': err_msgs,
+        'title': _("Security Checklist"),
+    }))
+
+
 @superuser_required
 def site_settings(request, form_class, template_name='admin/settings.html'):
     """Render the general site settings page."""
diff --git a/reviewboard/admin/widgets.py b/reviewboard/admin/widgets.py
index 65def95620cf6417704e4adffc284ba315e67cab..e4d898e15d25b768d39767a97beaed654f0906f9 100644
--- a/reviewboard/admin/widgets.py
+++ b/reviewboard/admin/widgets.py
@@ -507,6 +507,29 @@ class ActivityGraphWidget(Widget):
     has_data = False
 
 
+class SecurityCenterWidget(Widget):
+    """Security Center widget.
+
+    This widget displays a list of security alerts to the user.
+    """
+
+    widget_id = 'security-center-widget'
+    title = _('Security Center')
+    size = Widget.SMALL
+    cache_data = False
+    template = 'admin/widgets/w-security-center.html'
+
+    actions = [
+        {
+            'label': _('More'),
+            'url': '/admin/security',
+        },
+        {
+            'id': 'reload-security-widget',
+            'label': _('Reload'),
+        },
+    ]
+
 def init_widgets():
     """Initialize the widgets subsystem.
 
@@ -571,3 +594,4 @@ register_admin_widget(ReviewGroupsWidget)
 register_admin_widget(ServerCacheWidget)
 register_admin_widget(NewsWidget)
 register_admin_widget(DatabaseStatsWidget)
+register_admin_widget(SecurityCenterWidget)
diff --git a/reviewboard/static/rb/css/pages/admin-dashboard.less b/reviewboard/static/rb/css/pages/admin-dashboard.less
index 1bdbe9392e414df47b00fc043b7183ee41346356..6d5fd169327231c12c45d6e78789dbe8b8a5e869 100644
--- a/reviewboard/static/rb/css/pages/admin-dashboard.less
+++ b/reviewboard/static/rb/css/pages/admin-dashboard.less
@@ -352,6 +352,24 @@
   }
 }
 
+/* Review Board Security Center widget */
+#security-center-widget {
+  .summary {
+    border-bottom: 1px solid @widget-border-color;
+    color: green;
+    padding: @widget-padding;
+
+    &.has-errors {
+      color: #cb4b4b;
+    }
+  }
+
+  .entry {
+    border-bottom: 1px solid @widget-border-color;
+    padding: @widget-padding;
+  }
+}
+
 /* Recent Actions widget */
 #recent-actions-widget {
   li {
diff --git a/reviewboard/templates/admin/security_feed.html b/reviewboard/templates/admin/security_feed.html
new file mode 100644
index 0000000000000000000000000000000000000000..5c984964e774026457ef819c10fd9cc96a0f7b2c
--- /dev/null
+++ b/reviewboard/templates/admin/security_feed.html
@@ -0,0 +1,20 @@
+{% load i18n %}
+
+<div class="summary{% if count > 0 %} has-errors{% endif %}">
+{% if count == 0 %}
+  {% trans "No security issue was found."%}
+{% else %}
+  {% if count == 1 %}
+    {% trans "1 security issue was found:" %}
+
+  {% else %}
+    {% blocktrans with count=count %}
+      {{count}} security issues were found:
+    {% endblocktrans %}
+  {% endif %}
+</div>
+
+{% for security_incident in error_msgs %}
+<div class="entry">&#9656; {{security_incident}} </div>
+{% endfor %}
+{% endif %}
\ No newline at end of file
diff --git a/reviewboard/templates/admin/widgets/w-security-center.html b/reviewboard/templates/admin/widgets/w-security-center.html
new file mode 100644
index 0000000000000000000000000000000000000000..107f8190cd16365c5cf65ad8ab934a6b5fb5f13b
--- /dev/null
+++ b/reviewboard/templates/admin/widgets/w-security-center.html
@@ -0,0 +1,24 @@
+{% load i18n %}
+
+<div class="security-center-widget">
+ <span class="fa fa-spinner fa-pulse"></span>
+ {% trans "Loading..." %}
+</div>
+<script type="text/javascript">
+$(document).ready(function () {
+    {# Load security center error messages from custom security view. #}
+    $('#reload-security-widget').click(function(evt) {
+        evt.preventDefault();
+        evt.stopPropagation();
+        $('.security-center-widget').load('feed/security/?reload=1');
+    });
+
+    $('.security-center-widget').load('feed/security/', function() {
+        var $extras = $('#admin-extras');
+
+        if ($.data($extras[0], 'masonry')) {
+            $extras.masonry('reload');
+        }
+    });
+});
+</script>
