diff --git a/reviewboard/htdocs/media/rb/css/reviews.css b/reviewboard/htdocs/media/rb/css/reviews.css
index 7f762552916cff53735c0b3b636e2f048df9b66a..c40c05071e0d4e3938c7c7abe34f9e1fa1190e57 100644
--- a/reviewboard/htdocs/media/rb/css/reviews.css
+++ b/reviewboard/htdocs/media/rb/css/reviews.css
@@ -1152,3 +1152,62 @@
 * html .clearfix {height: 1%;}
 .clearfix {display: block;}
 /* End hide from IE-mac */
+
+/****************************************************************************
+ * Issue Summary
+ ****************************************************************************/
+
+.issue-summary {
+  font-size: 13px;
+  font-weight: bold;
+  display: inline;
+  float: left;
+}
+
+.issue-table td {
+  border-width: 1px 0px;
+  border-style: solid;
+  padding: 1px 5px;
+}
+
+.issue-open td {
+  background-color: #FFF47C;
+  border-color: #A89C00;
+}
+
+.issue-dropped td {
+  background-color: #EAEAEA;
+  border-color: #D0D0D0;
+}
+
+.issue-resolved td {
+  background-color: transparent;
+  border-color: transparent;
+}
+
+.issue-table {
+  clear: left;
+  margin: 5px 10px;
+  padding: 5px 5px;
+  font-size: 12px;
+  border-spacing: 0px 2px;
+}
+
+.issue-table tr {
+  margin: 5px 0px;
+}
+
+.issue-table th {
+  padding: 0px 5px;
+  font-size: 13px;
+}
+
+.issue-table .description a {
+  text-decoration: None;
+  color: #000;
+}
+
+.counters {
+  text-align: right;
+  font-size: 12px;
+}
\ No newline at end of file
diff --git a/reviewboard/reviews/models.py b/reviewboard/reviews/models.py
index cf447a2d1594c30259b4b5f092ae8aaf5000e42a..519ae3c0361c3fbdebff41d5d940f802ed3808ba 100644
--- a/reviewboard/reviews/models.py
+++ b/reviewboard/reviews/models.py
@@ -17,15 +17,15 @@ from djblets.util.templatetags.djblets_images import crop_image, thumbnail
 from reviewboard.changedescs.models import ChangeDescription
 from reviewboard.diffviewer.models import DiffSet, DiffSetHistory, FileDiff
 from reviewboard.attachments.models import FileAttachment
-from reviewboard.reviews.signals import review_request_published, \
-                                        review_request_reopened, \
-                                        review_request_closed, \
-                                        reply_published, review_published
 from reviewboard.reviews.errors import PermissionError
 from reviewboard.reviews.managers import DefaultReviewerManager, \
                                          ReviewGroupManager, \
                                          ReviewRequestManager, \
                                          ReviewManager
+from reviewboard.reviews.signals import review_request_published, \
+                                        review_request_reopened, \
+                                        review_request_closed, \
+                                        reply_published, review_published
 from reviewboard.scmtools.errors import EmptyChangeSetError, \
                                         InvalidChangeNumberError
 from reviewboard.scmtools.models import Repository
@@ -63,14 +63,14 @@ def update_obj_with_changenum(obj, repository, changenum):
 
 
 def truncate(string, num):
-   if len(string) > num:
-      string = string[0:num]
-      i = string.rfind('.')
+    if len(string) > num:
+        string = string[0:num]
+        i = string.rfind('.')
 
-      if i != -1:
-         string = string[0:i + 1]
+        if i != -1:
+            string = string[0:i + 1]
 
-   return string
+    return string
 
 
 class Group(models.Model):
@@ -1659,6 +1659,12 @@ class Review(models.Model):
     def get_absolute_url(self):
         return "%s#review%s" % (self.review_request.get_absolute_url(), self.id)
 
+    def get_all_comments(self):
+	"""Return a list of all contained comments of all types."""
+        return (list(self.comments.all()) +
+		list(self.screenshot_comments.all()) +
+		list(self.file_attachment_comments.all()))
+
     class Meta:
         ordering = ['timestamp']
         get_latest_by = 'timestamp'
diff --git a/reviewboard/reviews/templatetags/reviewtags.py b/reviewboard/reviews/templatetags/reviewtags.py
index ca6800c19ebd3137f494c2840a498d98f943d671..c24e256aa2627d5fb029e029b03f9b378ccd50e7 100644
--- a/reviewboard/reviews/templatetags/reviewtags.py
+++ b/reviewboard/reviews/templatetags/reviewtags.py
@@ -2,6 +2,7 @@ from django import template
 from django.conf import settings
 from django.db.models import Q
 from django.template import NodeList, TemplateSyntaxError
+from django.template.defaultfilters import stringfilter
 from django.template.loader import render_to_string
 from django.utils import simplejson
 from django.utils.translation import ugettext_lazy as _
@@ -619,3 +620,18 @@ def comment_issue(context, review_request, comment, comment_type):
         'review': comment.review.get(),
         'interactive': interactive,
     }
+
+@register.filter
+@stringfilter
+def pretty_print_issue_status(status):
+    """Turns an issue status code into a human-readable status string."""
+    return BaseComment.issue_status_to_string(status)
+
+@register.filter
+@stringfilter
+def char_limit(description):
+    """Limit the length of an issue description if it exceeds 120 chars."""
+    limit = 120
+    if len(description) > limit:
+	description = description[0:limit-3]+"..."
+    return description
\ No newline at end of file
diff --git a/reviewboard/reviews/views.py b/reviewboard/reviews/views.py
index 4d13622ba2e00156360f6b28fc77559ef5375a09..8d8008e3a4a25f120c93ed41e4e2d59dc6ce7f11 100644
--- a/reviewboard/reviews/views.py
+++ b/reviewboard/reviews/views.py
@@ -47,7 +47,8 @@ from reviewboard.reviews.errors import OwnershipError
 from reviewboard.reviews.forms import NewReviewRequestForm, \
                                       UploadDiffForm, \
                                       UploadScreenshotForm
-from reviewboard.reviews.models import Comment, ReviewRequest, \
+from reviewboard.reviews.models import BaseComment, Comment, \
+				       ReviewRequest, \
                                        Review, Group, Screenshot, \
                                        ScreenshotComment
 from reviewboard.scmtools.core import PRE_CREATION
@@ -449,6 +450,21 @@ def review_detail(request,
         if status in (ReviewRequest.DISCARDED, ReviewRequest.SUBMITTED):
             close_description = latest_changedesc.text
 
+    issues = {
+        'total': 0,
+        'open': 0,
+        'resolved': 0,
+        'dropped': 0
+    }
+
+    for entry in entries:
+	if entry['review']:
+	    for comment in entry['review'].get_all_comments():
+		if comment.issue_opened:
+		    issues['total'] += 1
+		    issues[BaseComment.issue_status_to_string(
+			    comment.issue_status)] += 1
+
     response = render_to_response(
         template_name,
         RequestContext(request, _make_review_request_context(review_request, {
@@ -462,6 +478,7 @@ def review_detail(request,
             'latest_changedesc': latest_changedesc,
             'close_description': close_description,
             'PRE_CREATION': PRE_CREATION,
+	    'issues': issues,
         })))
     set_etag(response, etag)
 
@@ -1170,4 +1187,4 @@ def user_infobox(request, username,
     }))
     set_etag(response, etag)
 
-    return response
+    return response
\ No newline at end of file
diff --git a/reviewboard/templates/reviews/review_detail.html b/reviewboard/templates/reviews/review_detail.html
index 241e6016cfa6fb412769c1834c92ff186ff473a4..86f25576c7008f3038d966b7e3954b05d0beb790 100644
--- a/reviewboard/templates/reviews/review_detail.html
+++ b/reviewboard/templates/reviews/review_detail.html
@@ -63,7 +63,42 @@
 </div>
 {% endbox %}
 
-
+{% box %}
+<div class="main">
+ <div class="header">
+  <div class="collapse-button"></div>
+  <div class="issue-summary">Issue Summary:</div>
+  <div class="counters">
+   <b>Total: {{issues.total}}&nbsp;</b>
+   Open: {{issues.open}}&nbsp;
+   Resolved: {{issues.resolved}}&nbsp;
+   Dropped: {{issues.dropped}}&nbsp;
+  </div>
+ </div>
+ <div class="body">
+  <table class="issue-table">
+   <tr>
+    <th>Description</th>
+    <th>From</th>
+    <th>Status</th>
+   </tr>
+  {% for entry in entries %}
+  {% if entry.review %}
+  {% for comment in entry.review.get_all_comments %}
+  {% if comment.issue_opened %}
+   <tr class="issue-{{comment.issue_status|pretty_print_issue_status}}">
+    <td class="description"><a href="#{{comment.id}}">{{comment|char_limit}}</a></td>
+    <td><div class="reviewer"><a href="{% url user entry.review.user %}" class="user">{{entry.review.user|user_displayname}}</a></div></td>
+    <td>{{comment.issue_status|pretty_print_issue_status|capfirst}}</td>
+   </tr>
+  {% endif %}
+  {% endfor %}
+  {% endif %}
+  {% endfor %}
+  </table>
+ </div>
+</div>
+{% endbox %}
 
 {% for entry in entries %}
 {%  if entry.review %}
@@ -107,6 +142,9 @@
      </div>
     </dt>
     <dd>
+{% if comment.issue_opened %}
+     <a name="{{comment.id}}">
+{% endif %}
      <pre>{{comment.text|escape}}</pre>
 {% if comment.issue_opened %}
      <div id="comment-{{comment.id}}-issue" class="issue-indicator">
@@ -137,6 +175,9 @@
      </div>
     </dt>
     <dd>
+{% if comment.issue_opened %}
+     <a name="{{comment.id}}">
+{% endif %}
      <pre>{{comment.text|escape}}</pre>
 {% if comment.issue_opened %}
      <div id="comment-{{comment.id}}-issue" class="issue-indicator">
@@ -176,6 +217,9 @@
      </div>
     </dt>
     <dd>
+{% if comment.issue_opened %}
+     <a name="{{comment.id}}">
+{% endif %}
      <pre class="reviewtext">{{comment.text|escape}}</pre>
 {% if comment.issue_opened %}
      <div id="comment-{{comment.id}}-issue" class="issue-indicator">
