diff --git a/reviewboard/reviews/models.py b/reviewboard/reviews/models.py
index d74943680c9fffc4930aeb909c69d4d0b9c129be..a73cdfbe582617d69743a57b43914d5247d5c4fc 100644
--- a/reviewboard/reviews/models.py
+++ b/reviewboard/reviews/models.py
@@ -1341,7 +1341,8 @@ class Comment(BaseComment):
     A comment can belong to a single filediff or to an interdiff between
     two filediffs. It can also have multiple replies.
     """
-
+    anchor_prefix = "comment"
+    comment_type = "diff"
     filediff = models.ForeignKey(FileDiff, verbose_name=_('file diff'),
                                  related_name="comments")
     interfilediff = models.ForeignKey(FileDiff,
@@ -1388,8 +1389,8 @@ class Comment(BaseComment):
               self.first_line)
 
     def get_review_url(self):
-        return "%s#comment%d" % \
-            (self.review.get().review_request.get_absolute_url(), self.id)
+        return "%s#%s%d" % \
+            (self.review.get().review_request.get_absolute_url(), self.anchor_prefix, self.id)
 
     def __unicode__(self):
         return self.text
@@ -1399,6 +1400,8 @@ class ScreenshotComment(BaseComment):
     """
     A comment on a screenshot.
     """
+    anchor_prefix = "scomment"
+    comment_type = "screenshot"
     screenshot = models.ForeignKey(Screenshot, verbose_name=_('screenshot'),
                                    related_name="comments")
     reply_to = models.ForeignKey('self', blank=True, null=True,
@@ -1443,8 +1446,8 @@ class ScreenshotComment(BaseComment):
             (self.get_image_url(), self.w, self.h, escape(self.text))
 
     def get_review_url(self):
-        return "%s#scomment%d" % \
-            (self.review.get().review_request.get_absolute_url(), self.id)
+        return "%s#%s%d" % \
+            (self.review.get().review_request.get_absolute_url(), self.anchor_prefix, self.id)
 
     def __unicode__(self):
         return self.text
@@ -1452,6 +1455,8 @@ class ScreenshotComment(BaseComment):
 
 class FileAttachmentComment(BaseComment):
     """A comment on a file attachment."""
+    anchor_prefix = "fcomment"
+    comment_type = "file"
     file_attachment = models.ForeignKey(FileAttachment,
                                         verbose_name=_('file_attachment'),
                                         related_name="comments")
@@ -1484,8 +1489,8 @@ class FileAttachmentComment(BaseComment):
                                              escape(self.text))
 
     def get_review_url(self):
-        return "%s#fcomment%d" % \
-            (self.review.get().review_request.get_absolute_url(), self.id)
+        return "%s#%s%d" % \
+            (self.review.get().review_request.get_absolute_url(), self.anchor_prefix, self.id)
 
     def __unicode__(self):
         return self.text
diff --git a/reviewboard/static/rb/css/reviews.less b/reviewboard/static/rb/css/reviews.less
index 3a97c2236e3f9e2fcd81ea958171564c2f438d5e..0a0d895f5f7161522b5c4f850e4275cd62851203 100644
--- a/reviewboard/static/rb/css/reviews.less
+++ b/reviewboard/static/rb/css/reviews.less
@@ -79,6 +79,10 @@
     }
   }
 
+  .content-divider {
+    border-top: 1px #C2C1B0 solid;
+  }
+
   #required-field-legend {
     color: darkRed;
     font-weight: bold;
@@ -335,6 +339,12 @@
       .pre-wrap;
     }
 
+    .comment-text:target {
+      background-color: #E7EDF3;
+      border: 1px solid @dark-blue;
+      padding: 1em;
+    }
+
     .body_top, .body_bottom {
       margin: 0;
     }
@@ -1005,6 +1015,12 @@
     background: url('../images/tick.png') #FAFAFA no-repeat 5px 50%;
   }
 
+  .back-to-issue-summary {
+    float: right;
+    padding: 7px 0;
+    text-decoration: none;
+  }
+
   .issue-button {
     margin-left: 5px;
   }
@@ -1116,95 +1132,110 @@
  * Issue Summary
  ****************************************************************************/
 
-.issue-summary {
-  display: inline;
-  float: left;
-  font-size: 13px;
-  font-weight: bold;
+.issue-table-wrapper {
+  margin: 8px 9px 14px 9px;
 }
 
-.issue {
-  .status {
-    border-right-width: 1px;
-  }
-
-  .summary-table-description {
-    border-left-width: 1px;
-  }
+#issue-summary-table {
+  border-spacing: 0;
+  width: 100%;
 
-  &.open {
+  tr {
     td {
-      background-color: @light-yellow;
-      border-color: @dark-yellow;
+      border-width: 1px 0;
+      border-style: solid;
+      padding: 2px 5px;
     }
-  }
 
-  &.dropped {
-    td {
-      background-color: @light-grey;
-      border-color: @grey;
+    &.hidden {
+      display: none;
     }
   }
 
-  &.resolved {
-    td {
-      background-color: transparent;
-      border-color: #EEE;
+  thead {
+    th {
+      background: url("../../../static/djblets/images/datagrid/header_bg.png") repeat-x bottom left;
+      border-color: #999;
+      border-style: solid;
+      border-width: 1px 0;
+      cursor: pointer;
+      height: 21px;
+      padding: 2px 5px;
+      text-align: left;
+      white-space: nowrap;
+
+      &:hover {
+        background: url("../../../static/djblets/images/datagrid/header_bg_primary.png") repeat-x bottom left;
+      }
+    }
+
+    .comment-id-header {
+      border-left-width: 1px;
+    }
+
+    .status-header {
+      border-right-width: 1px;
     }
   }
-}
 
-.issue-table-wrapper {
-  margin: 5px;
-}
+  .issue {
+    .status {
+      border-right-width: 1px;
+    }
 
-.issue-table {
-  font-size: 12px;
-  border-spacing: 0;
-  width: 100%;
+    .comment-id {
+      border-left-width: 1px;
+    }
 
-  tr {
-    margin: 5px 0;
+    &.open {
+      td {
+        background-color: #FDF4A4;
+        border-color: @dark-yellow;
+      }
+    }
 
-    th {
-      padding: 0 5px;
-      font-size: 13px;
+    &.dropped {
+      td {
+        background-color: @light-grey;
+        border-color: #AAA;
+      }
     }
 
-    td {
-      border-width: 1px 0px;
-      border-style: solid;
-      padding: 1px 5px;
+    &.resolved {
+      td {
+        background-color: #FFF;
+        border-color: #BBB;
+      }
     }
 
     &:hover td {
-      background-color: @light-blue;
+      background-color: #D4E0F3;
       border-color: @dark-blue;
     }
-  }
 
-  .summary-anchor {
-    color: #000;
-    display: block;
-    height: 14px;
-    overflow: hidden;
-    text-decoration: none;
-  }
-
-  .status, .reviewer {
-    text-align: center;
+    .summary-anchor {
+      color: #000;
+      display: block;
+      height: 12px;
+      overflow: hidden;
+      text-decoration: none;
+    }
   }
 
   .status {
     text-transform: capitalize;
   }
+
+  .comment-id, .last-updated, .reviewer, .status {
+    white-space: nowrap;
+  }
 }
 
 .counters {
   display: inline;
   font-size: 12px;
   text-align: right;
-  float: right;
+  float: left;
 
   div {
     margin-right: 3px;
@@ -1216,4 +1247,12 @@
   }
 }
 
+.filters {
+  margin: 3px 0 0 0;
+
+  .filter {
+    margin: 0 4px;
+  }
+}
+
 // vim: set et ts=2 sw=2:
diff --git a/reviewboard/static/rb/js/reviews.js b/reviewboard/static/rb/js/reviews.js
index 90e842ae9385fcf3e683fc0cb90f3ef88c491114..24e4d71178bb2a7a1a4e2d6d52efc9d01a000870 100644
--- a/reviewboard/static/rb/js/reviews.js
+++ b/reviewboard/static/rb/js/reviews.js
@@ -118,12 +118,15 @@ var gCommentIssueManager = new function() {
     // Helper function to set the state of a comment
     function requestState(comment, state) {
         comment.ready(function() {
-	    var old_issue_status = comment.issue_status;
+            var old_issue_status = comment.issue_status;
             comment.issue_status = state;
             comment.save({
                 success: function(rsp) {
+                    var rspComment = (rsp.diff_comment ||
+                                      rsp.file_attachment_comment ||
+                                      rsp.screenshot_comment);
                     notifyCallbacks(comment.id, comment.issue_status,
-				    old_issue_status);
+                                    old_issue_status, rspComment.timestamp);
 
                     /*
                      * We don't want the current user to receive the
@@ -143,15 +146,123 @@ var gCommentIssueManager = new function() {
      * Helper function that notifies all callbacks registered for
      * a particular comment
      */
-    function notifyCallbacks(comment_id, issue_status, old_issue_status) {
+    function notifyCallbacks(comment_id, issue_status, old_issue_status,
+                             last_updated) {
         for (var i = 0; i < callbacks[comment_id].length; i++) {
-            callbacks[comment_id][i](issue_status, old_issue_status);
+            callbacks[comment_id][i](issue_status, old_issue_status,
+                                     last_updated);
         }
     }
 }();
 
 
 /*
+ * issueSummaryTableManager handles all interactions with
+ * the issue summary table.
+ */
+var issueSummaryTableManager = new function() {
+    // Default state is "open"
+    var statusFilterState = "open";
+
+    // Maps a status filter state to its corresponding selector
+    var stateToSelectorMap = {
+        "open": ".issue.open",
+        "dropped": ".issue.dropped",
+        "resolved": ".issue.resolved",
+        "all": ".issue.open, .issue.dropped, .issue.resolved"
+    }
+
+    this.init = function() {
+        // Event Listeners
+        $(".summary-anchor").live("click", function(event) {
+            event.stopPropagation();
+            /*
+            * Extract the issue-id attribute and attach '#comment-' and
+            * '-issue' to find the comment's location. Then find the
+            * closest box class and uncollapse it.
+            */
+            var issueId = '#comment-' + $(this).attr("issue-id") + '-issue';
+            $(issueId).closest(".box").removeClass("collapsed");
+        });
+
+        $("#issue-summary-filter").change(function() {
+            $(stateToSelectorMap[statusFilterState]).toggleClass("hidden");
+            statusFilterState = $("#issue-summary-filter").val().toLowerCase();;
+            $(stateToSelectorMap[statusFilterState]).toggleClass("hidden");
+        });
+
+        $('#issue-summary-table thead th').click(function() {
+            var col = $(this).parent().children().index($(this)) + 1;
+
+            $('#issue-summary-table tbody').html($('.issue').sort(function(a, b) {
+                var firstElement = $(a).find('td:nth-child(' + col + ')'),
+                    secondElement = $(b).find('td:nth-child(' + col + ')'),
+                    firstElementText = firstElement.text().toLowerCase(),
+                    secondElementText = secondElement.text().toLowerCase();
+
+                if (firstElement.attr('timestamp')) {
+                    return parseInt(firstElement.attr('timestamp'), 10) -
+                           parseInt(secondElement.attr('timestamp'), 10);
+                } else if (firstElement.hasClass('comment-id')) {
+                     var firstText = firstElementText.split(" "),
+                         secondText = secondElementText.split(" ");
+
+                     if (firstText[0] > secondText[0]) {
+                         return 1;
+                     } else if (firstText[0] < secondText[0]) {
+                         return -1;
+                     } else {
+                         return parseInt(firstText[1], 10) -
+                                parseInt(secondText[1], 10)
+                     }
+                } else if (firstElementText > secondElementText) {
+                    return 1;
+                } else if (firstElementText === secondElementText) {
+                    return 0;
+                } else {
+                    return -1;
+                }
+            }));
+
+            return false;
+        });
+    }
+
+    // Show or hide entry according to issue summary filter state.
+    this.setVisibility = function(entry, status) {
+        if (statusFilterState !== status && statusFilterState !== 'all') {
+            entry.addClass('hidden');
+        } else {
+            entry.removeClass('hidden');
+        }
+    }
+
+    // Decrement old status counter and increment new status counter.
+    this.updateCounters = function(old_status, new_status) {
+        var old_counter = $('#' + old_status + '-counter');
+        old_counter.text(parseInt(old_counter.text(), 10) - 1);
+
+        var new_counter = $('#' + new_status + '-counter');
+        new_counter.text(parseInt(new_counter.text(), 10) + 1);
+    }
+
+    // Replace old status class with new status class and update text.
+    this.updateStatus = function(entry, old_status, new_status) {
+        entry.removeClass(old_status)
+            .addClass(new_status)
+            .find('.status').text(new_status);
+    }
+
+    // Replace old timestamp attirbute with new timestamp and update text.
+    this.updateTimeStamp = function(entry, timestamp) {
+        entry.find(".last-updated")
+            .attr("timestamp", new Date(timestamp).getTime())
+            .text(timestamp);
+    }
+}
+
+
+/*
  * Converts an array of items to a list of hyperlinks.
  *
  * By default, this will use the item as the URL and as the hyperlink text.
@@ -669,20 +780,14 @@ $.fn.commentIssue = function(review_id, comment_id, comment_type,
         }
     }
 
-    self.update_issue_summary_table = function(new_status, old_status) {
-	var comment_id = self.comment_id;
-	var entry = $('#summary-table-entry-' + comment_id);
+    self.update_issue_summary_table = function(new_status, old_status, timestamp) {
+        var comment_id = self.comment_id;
+        var entry = $('#summary-table-entry-' + comment_id);
 
-	// Remove old status class and decrement counter.
-	entry.removeClass(old_status);
-	var old_counter = $('#' + old_status + '-counter');
-	old_counter.text(parseInt(old_counter.text(), 10) - 1);
-
-	// Add new status class, update text, and increment counter.
-	entry.addClass(new_status);
-	entry.find('.status').text(new_status);
-	var new_counter = $('#' + new_status + '-counter');
-	new_counter.text(parseInt(new_counter.text(), 10) + 1);
+        issueSummaryTableManager.updateStatus(entry, old_status, new_status);
+        issueSummaryTableManager.updateCounters(old_status, new_status);
+        issueSummaryTableManager.setVisibility(entry, new_status);
+        issueSummaryTableManager.updateTimeStamp(entry, timestamp);
     }
 
     var open_state = {
@@ -2591,18 +2696,7 @@ $(document).ready(function() {
 
     loadDiffFragments("diff_fragments", "comment_container");
 
-    $(".summary-table-description").click(function() {
-        /*
-         * Extract the href attribute and remove the leading
-         * '#', then attach '#comment-' and '-issue' to
-         * find the comment's location. Then find the
-         * closest box class and uncollapse it.
-         */
-        var issueId = '#comment-' +
-                      $(this).find("a.summary-anchor").attr("href").slice(1) +
-                      '-issue';
-        $(issueId).closest(".box").removeClass("collapsed");
-    });
+    issueSummaryTableManager.init();
 });
 
 // vim: set et:sw=4:
diff --git a/reviewboard/templates/reviews/comment_issue.html b/reviewboard/templates/reviews/comment_issue.html
index 6b8a920f97892ce862ffd90ec26b1115a8614180..de7d7b4615d1f9855ae6d0ab950f248e0113a0a1 100644
--- a/reviewboard/templates/reviews/comment_issue.html
+++ b/reviewboard/templates/reviews/comment_issue.html
@@ -1,8 +1,11 @@
+{% load i18n %}
+
 <div class="issue-state">
   <span class="issue-message"></span>
   <input type="button" value="Fixed" class="issue-button resolve" style="display:none;"/>
   <input type="button" value="Drop" class="issue-button drop" style="display:none;"/>
   <input type="button" value="Re-open" class="issue-button reopen" style="display:none;"/>
+  <a class="back-to-issue-summary" href="#issue-summary">{% trans "Back to issue summary" %}</a>
 </div>
 <script language="javascript">
   $(document).ready(function() {
diff --git a/reviewboard/templates/reviews/review_detail.html b/reviewboard/templates/reviews/review_detail.html
index 4cfe14f445f0673cc12f0901c4ebb1282f417202..7b0ab226e32780aa95ed0179195564315cc97a34 100644
--- a/reviewboard/templates/reviews/review_detail.html
+++ b/reviewboard/templates/reviews/review_detail.html
@@ -67,54 +67,6 @@
 </div>
 {% endbox %}
 
-{% if issues.total > 0 %}
-{% box "collapsed" %}
-<div class="main">
- <div class="header">
-  <div class="collapse-button"></div>
-  <div class="issue-summary">{% trans "Issue Summary" %}:</div>
-  <div class="counters">
-   <strong>
-    <div class="counter">{% trans "Total" %}:</div>
-    <div id="total-counter">{{issues.total}}</div>
-   </strong>
-   <div class="counter">{% trans "Open" %}:</div>
-   <div id="open-counter">{{issues.open}}</div>
-   <div class="counter">{% trans "Resolved" %}:</div>
-   <div id="resolved-counter">{{issues.resolved}}</div>
-   <div class="counter">{% trans "Dropped" %}:</div>
-   <div id="dropped-counter">{{issues.dropped}}</div>
-  </div>
-  <div class="clearfix"></div>
- </div>
- <div class="body">
-  <div class="issue-table-wrapper">
-   <table class="issue-table">
-    <tr>
-     <th>{% trans "Description" %}</th>
-     <th>{% trans "From" %}</th>
-     <th>{% trans "Status" %}</th>
-    </tr>
-{% for entry in entries %}
-{%  if entry.review %}
-{%   for comment in entry.review.get_all_comments %}
-{%    if comment.issue_opened %}
-    <tr id="summary-table-entry-{{comment.id}}" class="issue {{comment.issue_status|pretty_print_issue_status}}">
-     <td class="summary-table-description"><a class="summary-anchor" href="#{{comment.id}}">{{comment}}</a></td>
-     <td class="reviewer"><a href="{% url user entry.review.user %}" class="user">{{entry.review.user|user_displayname}}</a></td>
-     <td class="status">{{comment.issue_status|pretty_print_issue_status|capfirst}}</td>
-    </tr>
-{%    endif %}
-{%   endfor %}
-{%  endif %}
-{% endfor %}
-   </table>
-  </div>
- </div>
-</div>
-{% endbox %}
-{% endif %}
-
 {% for entry in entries %}
 {%  if entry.review %}
 <a name="review{{entry.review.id}}"></a>
@@ -142,7 +94,7 @@
 
 {% for comment in entry.review.screenshot_comments.all %}
     <dt>
-     <a name="scomment{{comment.id}}"></a>
+     <a class="comment-anchor" name="{{comment.anchor_prefix}}{{comment.id}}"></a>
      <div class="screenshot">
       <span class="filename">
        <a href="{{comment.screenshot.get_absolute_url}}">{% spaceless %}
@@ -157,10 +109,7 @@
      </div>
     </dt>
     <dd>
-{% if comment.issue_opened %}
-     <a name="{{comment.id}}"></a>
-{% endif %}
-     <pre>{{comment.text|escape}}</pre>
+     <pre class="comment-text" id="{{comment.anchor_prefix}}{{comment.id}}">{{comment.text|escape}}</pre>
 {% if comment.issue_opened %}
      <div id="comment-{{comment.id}}-issue" class="issue-indicator">
        {% comment_issue review_request_details comment "screenshot_comment" %}
@@ -172,7 +121,7 @@
 
 {% for comment in entry.review.file_attachment_comments.all %}
     <dt>
-     <a name="fcomment{{comment.id}}"></a>
+     <a class="comment-anchor" name="{{comment.anchor_prefix}}{{comment.id}}"></a>
      <div class="file-attachment">
       <a href="{{comment.file_attachment.get_absolute_url}}">{% spaceless %}
        <img src="{{comment.file_attachment.icon_url}}" />
@@ -190,10 +139,7 @@
      </div>
     </dt>
     <dd>
-{% if comment.issue_opened %}
-     <a name="{{comment.id}}"></a>
-{% endif %}
-     <pre>{{comment.text|escape}}</pre>
+     <pre class="comment-text" id="{{comment.anchor_prefix}}{{comment.id}}">{{comment.text|escape}}</pre>
 {% if comment.issue_opened %}
      <div id="comment-{{comment.id}}-issue" class="issue-indicator">
        {% comment_issue review_request_details comment "file_attachment_comment" %}
@@ -205,7 +151,7 @@
 
 {% for comment in entry.review.ordered_comments %}
     <dt>
-     <a name="comment{{comment.id}}"></a>
+     <a class="comment-anchor" name="{{comment.anchor_prefix}}{{comment.id}}"></a>
      <div id="comment_container_{{comment.id}}">
       <table class="sidebyside loading">
        <thead>
@@ -232,10 +178,7 @@
      </div>
     </dt>
     <dd>
-{% if comment.issue_opened %}
-     <a name="{{comment.id}}"></a>
-{% endif %}
-     <pre class="reviewtext">{{comment.text|escape}}</pre>
+     <pre class="reviewtext comment-text" id="{{comment.anchor_prefix}}{{comment.id}}">{{comment.text|escape}}</pre>
 {% if comment.issue_opened %}
      <div id="comment-{{comment.id}}-issue" class="issue-indicator">
        {% comment_issue review_request_details comment "comment" %}
diff --git a/reviewboard/templates/reviews/review_request_box.html b/reviewboard/templates/reviews/review_request_box.html
index c617acccfa99561173ec05a91af0e7ccf8995967..301a1b5d12042974ac345af29d944bf9031add25 100644
--- a/reviewboard/templates/reviews/review_request_box.html
+++ b/reviewboard/templates/reviews/review_request_box.html
@@ -149,6 +149,70 @@
  </div>
 </div>
 
+{% if issues.total > 0 %}
+<div class="content-divider"></div>
+<div class="content">
+ <a name="issue-summary"></a>
+ <label>{% trans "Issue Summary" %}:</label>
+ <div class="header">
+  <div class="counters">
+   <strong>
+    <div class="counter">{% trans "Total" %}:</div>
+    <div id="total-counter">{{issues.total}}</div>
+   </strong>
+   <div class="counter">{% trans "Open" %}:</div>
+   <div id="open-counter">{{issues.open}}</div>
+   <div class="counter">{% trans "Resolved" %}:</div>
+   <div id="resolved-counter">{{issues.resolved}}</div>
+   <div class="counter">{% trans "Dropped" %}:</div>
+   <div id="dropped-counter">{{issues.dropped}}</div>
+  </div>
+  <div class="clearfix"></div>
+  <div class="filters">
+   <div class="filter">
+    <span><strong>{% trans "Show status:" %}</strong></span>
+    <select id="issue-summary-filter">
+     <option>{% trans "Open" %}</option>
+     <option>{% trans "Dropped" %}</option>
+     <option>{% trans "Resolved" %}</option>
+     <option>{% trans "All" %}</option>
+    </select>
+   </div>
+  </div>
+ </div>
+ <div class="issue-table-wrapper">
+  <table id="issue-summary-table">
+   <thead>
+    <tr>
+     <th class="comment-id-header">{% trans "Issue ID" %}</th>
+     <th class="description-header">{% trans "Description" %}</th>
+     <th class="from-header">{% trans "From" %}</th>
+     <th class="last-updated-header">{% trans "Last Updated" %}</th>
+     <th class="status-header">{% trans "Status" %}</th>
+    </tr>
+   </thead>
+   <tbody>
+{% for entry in entries %}
+{%  if entry.review %}
+{%   for comment in entry.review.get_all_comments %}
+{%    if comment.issue_opened %}
+    <tr id="summary-table-entry-{{comment.id}}" class="issue {{comment.issue_status|pretty_print_issue_status}}{% if comment.issue_status != 'O' %} hidden{% endif %}">
+     <td class="comment-id">{{comment.comment_type|capfirst}} {{comment.id}}</td>
+     <td class="summary-table-description"><a class="summary-anchor" issue-id="{{comment.id}}" href="#{{comment.anchor_prefix}}{{comment.id}}">{{comment}}</a></td>
+     <td class="reviewer"><a href="{% url user entry.review.user %}" class="user">{{entry.review.user|user_displayname}}</a></td>
+     <td class="last-updated" timestamp={{comment.timestamp|date:"U"}}>{{comment.timestamp}}</td>
+     <td class="status">{{comment.issue_status|pretty_print_issue_status|capfirst}}</td>
+    </tr>
+{%    endif %}
+{%   endfor %}
+{%  endif %}
+{% endfor %}
+   </tbody>
+  </table>
+ </div>
+</div>
+{% endif %}
+
 <script type="text/javascript">
   $(document).ready(function() {
     RB.setFileAttachmentComments({
diff --git a/reviewboard/webapi/resources.py b/reviewboard/webapi/resources.py
index 1b9a92249a0a7927324305aab17685384f767a76..876995c7d06a2ae158d7e4255b85a52c02bd8f1d 100644
--- a/reviewboard/webapi/resources.py
+++ b/reviewboard/webapi/resources.py
@@ -14,6 +14,7 @@ from django.http import HttpResponseRedirect, HttpResponse, \
                         HttpResponseNotModified
 from django.template.defaultfilters import timesince
 from django.utils.encoding import force_unicode
+from django.utils.formats import localize
 from django.utils.translation import ugettext as _
 from djblets.extensions.base import RegisteredExtension
 from djblets.extensions.resources import ExtensionResource
@@ -245,6 +246,7 @@ class BaseCommentResource(WebAPIResource):
         comment.save()
 
         last_activity_time, updated_object = review_request.get_last_activity()
+        comment.timestamp = localize(comment.timestamp)
 
         return 200, {
             comment_resource.item_result_key: comment,
