diff --git a/reviewboard/templates/reviews/boxes/change.html b/reviewboard/templates/reviews/boxes/change.html
new file mode 100644
index 0000000000000000000000000000000000000000..7c2afdcc7f5e2050cfc4833e790c8a4bdaf9c382
--- /dev/null
+++ b/reviewboard/templates/reviews/boxes/change.html
@@ -0,0 +1,54 @@
+{% load djblets_deco djblets_utils i18n reviewtags tz %}
+
+<div class="changedesc">
+ <a name="changedesc{{entry.changedesc.id}}"></a>
+{% definevar "boxclass" %}changedesc {{entry.class}}{% enddefinevar %}
+{% box boxclass %}
+ <div class="main">
+  <div class="header">
+   <div class="collapse-button btn"><div class="rb-icon {% if entry.collapsed %}rb-icon-expand-review{% else %}rb-icon-collapse-review{% endif %}"></div></div>
+   <div class="reviewer"><b>{% trans "Review request changed" %}</b></div>
+   <div class="posted_time">{% localtime on %}{% blocktrans with entry.changedesc.timestamp as timestamp and entry.changedesc.timestamp|date:"c" as timestamp_raw %}Updated <time class="timesince" datetime="{{timestamp_raw}}">{{timestamp}}</time> ({{timestamp}}){% endblocktrans %}{% endlocaltime %}</div>
+  </div>
+  <div class="body">
+   <ul>
+{%  for fieldinfo in entry.changeinfo %}
+    <li><label>{{fieldinfo.title}}</label>
+{%   if fieldinfo.rendered_html %}
+     {{fieldinfo.rendered_html}}
+{%   elif fieldinfo.name == "status" %}
+{%    blocktrans with fieldinfo.old_status as old_status and fieldinfo.new_status as new_status %}
+     changed from <i>{{old_status}}</i> to <i>{{new_status}}</i>
+{%    endblocktrans %}
+{%   elif fieldinfo.name == "diff" %}
+{%    definevar "added_values" %}
+      <a href="{{fieldinfo.diff_url}}">{{fieldinfo.diff_label}}</a>
+{%     if fieldinfo.past_revision != 0 %}
+      - <a href="{% url 'view-interdiff' review_request.display_id fieldinfo.past_revision fieldinfo.current_revision %}">{% trans "Show changes" %}</a>
+{%     endif %}
+{%    enddefinevar %}
+     <ul>
+      <li>{% blocktrans %}added {{added_values}}{% endblocktrans %}</li>
+     </ul>
+{%   elif fieldinfo.name == "screenshot_captions" or fieldinfo.name == "file_captions" %}
+     <ul>
+{%    for caption in fieldinfo.captions %}
+      <li>
+{%     blocktrans with caption.old as old_caption and caption.new as new_caption %}
+       changed from <i>{{old_caption}}</i> to <i>{{new_caption}}</i>
+{%     endblocktrans %}
+      </li>
+{%    endfor %}
+     </ul>
+{%   endif %}
+    </li>
+{%  endfor %}
+   </ul>
+{%  if entry.changedesc.text %}
+   <label>{% trans "Description:" %}</label>
+   <pre class="changedesc-text" data-rich-text="true">{{entry.changedesc.text|markdown_escape:entry.changedesc.rich_text}}</pre>
+{%  endif %}
+  </div>
+ </div>
+{% endbox %}
+</div>
diff --git a/reviewboard/templates/reviews/boxes/review.html b/reviewboard/templates/reviews/boxes/review.html
new file mode 100644
index 0000000000000000000000000000000000000000..c55aa408ffac97943a1c368ba2649b245e583d0a
--- /dev/null
+++ b/reviewboard/templates/reviews/boxes/review.html
@@ -0,0 +1,146 @@
+{% load djblets_deco djblets_extensions djblets_utils i18n rb_extensions %}
+{% load reviewtags tz %}
+
+<a name="review{{entry.review.id}}"></a>
+<div id="review{{entry.review.id}}" class="review" data-review-id="{{entry.review.id}}" data-ship-it="{{entry.review.ship_it|yesno:'true,false'}}">
+{% if forloop.last %}
+ <a name="last-review"></a>
+{% endif %}
+{% box entry.class %}
+ <div class="main">
+
+  <div class="header">
+{%  template_hook_point "review-summary-header-pre" %}
+{%  if entry.review.ship_it %}
+{%   if entry.issue_open_count > 0 %}
+   <div class="shipit with-issues">{% trans "Fix it, then Ship it!" %}</div>
+{%   else %}
+   <div class="shipit">{% trans "Ship it!" %}</div>
+{%   endif %}
+{%  endif %}
+   <div class="collapse-button btn"><div class="rb-icon {% if entry.collapsed %}rb-icon-expand-review{% else %}rb-icon-collapse-review{% endif %}"></div></div>
+   <div class="reviewer"><a href="{% url 'user' entry.review.user %}" class="user">{{entry.review.user|user_displayname}}</a></div>
+   <div class="posted_time">{% localtime on %}{% blocktrans with entry.review.timestamp as timestamp and entry.review.timestamp|date:"c" as timestamp_raw %}Posted <time class="timesince" datetime="{{timestamp_raw}}">{{timestamp}}</time> ({{timestamp}}){% endblocktrans %}{% endlocaltime %}</div>
+{%  template_hook_point "review-summary-header-post" %}
+  </div>
+
+  <div class="banners"></div>
+
+  <div class="body">
+   <pre class="body_top reviewtext" data-rich-text="true">{{entry.review.body_top|markdown_escape:entry.review.rich_text}}</pre>
+{%  reply_section entry "" "body_top" "rcbt" %}
+
+{%  if entry.comments.diff_comments or entry.comments.screenshot_comments or entry.comments.file_attachment_comments %}
+   <dl class="review-comments">
+
+{%   for comment in entry.comments.screenshot_comments %}
+    <dt>
+     <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 %}
+{% if draft and comment.screenshot.draft_caption %}
+{{comment.screenshot.draft_caption}}
+{% else %}
+{{comment.screenshot.caption|default_if_none:comment.screenshot.image.name|basename}}
+{% endif %}
+{% endspaceless %}</a>
+      </span>
+      {{comment.image|safe}}
+     </div>
+    </dt>
+    <dd>
+{%    comment_detail_display_hook comment "review" %}
+     <pre class="reviewtext comment-text" data-rich-text="true" id="{{comment.anchor_prefix}}{{comment.id}}">{{comment.text|markdown_escape:comment.rich_text}}</pre>
+{%    if comment.issue_opened %}
+     <div class="issue-indicator">
+       {% comment_issue review_request_details comment "screenshot_comments" %}
+     </div>
+{%    endif %}
+{%    reply_section entry comment "screenshot_comments" "rc" %}
+    </dd>
+{%   endfor %}
+
+{%   for comment in entry.comments.file_attachment_comments %}
+    <dt>
+     <a class="comment-anchor" name="{{comment.anchor_prefix}}{{comment.id}}"></a>
+     <div class="file-attachment">
+      <div class="file-attachment-comment-header">
+       <a href="{{comment.get_absolute_url}}">
+        <img src="{{comment.file_attachment.icon_url}}" />
+        <span class="filename">{{comment.get_link_text}}</span>
+       </a>
+{%    if draft and comment.file_attachment.draft_caption %}
+       <p class="caption">{{comment.file_attachment.draft_caption}}</p>
+{%    elif comment.file_attachment.caption %}
+       <p class="caption">{{comment.file_attachment.caption}}</p>
+{%    endif %}
+      </div>
+{%    with comment.thumbnail as thumbnail %}
+{%     if thumbnail %}
+      <div class="thumbnail">{{thumbnail|default:''|safe}}</div>
+{%     endif %}
+{%    endwith %}
+     </div>
+    </dt>
+    <dd>
+{%    comment_detail_display_hook comment "review" %}
+     <pre class="reviewtext comment-text" data-rich-text="true" id="{{comment.anchor_prefix}}{{comment.id}}">{{comment.text|markdown_escape:comment.rich_text}}</pre>
+{%    if comment.issue_opened %}
+     <div class="issue-indicator">
+{%     comment_issue review_request_details comment "file_attachment_comments" %}
+     </div>
+{%    endif %}
+{%    reply_section entry comment "file_attachment_comments" "rc" %}
+    </dd>
+{%   endfor %}
+
+{%   for comment in entry.comments.diff_comments %}
+    <dt>
+     <a class="comment-anchor" name="{{comment.anchor_prefix}}{{comment.id}}"></a>
+     <div id="comment_container_{{comment.id}}">
+      <table class="sidebyside loading">
+       <thead>
+        <tr class="filename-row">
+         <th class="filename">
+          <a name="{{comment.get_absolute_url}}">{{comment.filediff.dest_file_display}}</a>
+          <span class="diffrevision">
+{%    if comment.interfilediff %}
+           (Diff revisions {{comment.filediff.diffset.revision}} - {{comment.interfilediff.diffset.revision}})
+{%    else %}
+           (Diff revision {{comment.filediff.diffset.revision}})
+{%    endif %}
+          </span>
+         </th>
+        </tr>
+       </thead>
+       <tbody>
+        <tr><td><pre>&nbsp;</pre></td></tr>{# header entry #}
+{%    for i in comment.num_lines|default_if_none:1|range %}
+        <tr><td><pre>&nbsp;</pre></td></tr>
+{%    endfor %}
+       </tbody>
+      </table>
+     </div>
+    </dt>
+    <dd>
+{%    comment_detail_display_hook comment "review" %}
+     <pre class="reviewtext comment-text" data-rich-text="true" id="{{comment.anchor_prefix}}{{comment.id}}">{{comment.text|markdown_escape:comment.rich_text}}</pre>
+{%    if comment.issue_opened %}
+     <div class="issue-indicator">
+{%     comment_issue review_request_details comment "diff_comments" %}
+     </div>
+{%    endif %}
+{%    reply_section entry comment "diff_comments" "rc" %}
+    </dd>
+{%   endfor %}
+   </dl>
+{%  endif %}
+{%  if entry.review.body_bottom %}
+   <pre class="body_bottom reviewtext" data-rich-text="true">{{entry.review.body_bottom|markdown_escape:entry.review.rich_text}}</pre>
+{%   reply_section entry "" "body_bottom" "rcbb" %}
+{%  endif %}
+  </div>
+ </div>
+{% endbox %}
+</div>
diff --git a/reviewboard/templates/reviews/review_detail.html b/reviewboard/templates/reviews/review_detail.html
index 67c7658c62ad9716cadf4ddb17c8382c9f495fd2..c92a0b9b0c02c922175a03e3646c398be6c706af 100644
--- a/reviewboard/templates/reviews/review_detail.html
+++ b/reviewboard/templates/reviews/review_detail.html
@@ -1,18 +1,17 @@
 {% extends "reviews/reviewable_base.html" %}
-{% load i18n djblets_deco djblets_extensions djblets_js djblets_utils %}
-{% load rb_extensions reviewtags staticfiles tz %}
+{% load i18n djblets_deco djblets_js rb_extensions reviewtags staticfiles tz %}
 
 {% block title %}{{review_request_details.summary}} | {% trans "Review Request" %}{% endblock %}
 
 {% block css %}
 {{block.super}}
 
-{% if siteconfig.settings.diffviewer_show_trailing_whitespace|default_if_none:1 %}
+{%  if siteconfig.settings.diffviewer_show_trailing_whitespace|default_if_none:1 %}
 <style type="text/css">
   .ew { background: #ee3434; }
 </style>
-{% endif %}
-{% endblock %}
+{%  endif %}
+{% endblock css %}
 
 {% block content %}
 <div id="review_request">
@@ -21,26 +20,26 @@
 
 {%  box "review-request" %}
  <div class="actions-container">
- {% star review_request %}
+{%   star review_request %}
   <ul class="actions">
-{% review_request_action_hooks %}
-{% review_request_dropdown_action_hooks %}
-{% include "reviews/review_request_actions_secondary.html" %}
-{% if has_diffs %}
+{%   review_request_action_hooks %}
+{%   review_request_dropdown_action_hooks %}
+{%   include "reviews/review_request_actions_secondary.html" %}
+{%   if has_diffs %}
    <li class="primary"><a href="diff/raw/">{% trans "Download Diff" %}</a></li>
-{% endif %}
-{% include "reviews/review_request_actions_primary.html" %}
-{% if has_diffs %}
+{%   endif %}
+{%   include "reviews/review_request_actions_primary.html" %}
+{%   if has_diffs %}
    <li class="primary"><a href="diff/#index_header">{% trans "View Diff" %}</a></li>
-{% endif %}
+{%   endif %}
   </ul>
  </div>
 
  <div class="main">
-{% include "reviews/review_request_box.html" %}
+{%   include "reviews/review_request_box.html" %}
 
   <ul class="controls">
-{% if entries %}
+{%   if entries %}
    <li>
     <a href="#" id="expand-all">
      <div class="rb-icon rb-icon-expand"></div>
@@ -53,211 +52,20 @@
      <span>{% trans "Collapse All" %}</span>
     </a>
    </li>
-{% endif %}
+{%   endif %}
   </ul>
  </div>
-{% endbox %}
+{%  endbox "review-request" %}
 </div>
 
-{% for entry in entries %}
-{%  if entry.review %}
-<a name="review{{entry.review.id}}"></a>
-<div id="review{{entry.review.id}}" class="review" data-review-id="{{entry.review.id}}" data-ship-it="{{entry.review.ship_it|yesno:'true,false'}}">
-{%   if forloop.last %}
-<a name="last-review"></a>
-{%   endif %}
-{% box entry.class %}
-<div class="main">
- <div class="header">
-{%  template_hook_point "review-summary-header-pre" %}
-{%  if entry.review.ship_it %}
-{%   if entry.issue_open_count > 0 %}
-  <div class="shipit with-issues">{% trans "Fix it, then Ship it!" %}</div>
-{%   else %}
-  <div class="shipit">{% trans "Ship it!" %}</div>
+{%  for entry in entries %}
+{%   if entry.review %}
+{%    include "reviews/boxes/review.html" %}
+{%   elif entry.changedesc %}
+{%    include "reviews/boxes/change.html" %}
 {%   endif %}
-{%  endif %}
-  <div class="collapse-button btn"><div class="rb-icon {% if entry.collapsed %}rb-icon-expand-review{% else %}rb-icon-collapse-review{% endif %}"></div></div>
-  <div class="reviewer"><a href="{% url 'user' entry.review.user %}" class="user">{{entry.review.user|user_displayname}}</a></div>
-  <div class="posted_time">{% localtime on %}{% blocktrans with entry.review.timestamp as timestamp and entry.review.timestamp|date:"c" as timestamp_raw %}Posted <time class="timesince" datetime="{{timestamp_raw}}">{{timestamp}}</time> ({{timestamp}}){% endblocktrans %}{% endlocaltime %}</div>
-  {% template_hook_point "review-summary-header-post" %}
- </div>
- <div class="banners"></div>
- <div class="body">
-   <pre class="body_top reviewtext" data-rich-text="true">{{entry.review.body_top|markdown_escape:entry.review.rich_text}}</pre>
-   {% reply_section entry "" "body_top" "rcbt" %}
-{% if entry.comments.diff_comments or entry.comments.screenshot_comments or entry.comments.file_attachment_comments %}
-   <dl class="review-comments">
-
-{% for comment in entry.comments.screenshot_comments %}
-    <dt>
-     <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 %}
-{% if draft and comment.screenshot.draft_caption %}
-{{comment.screenshot.draft_caption}}
-{% else %}
-{{comment.screenshot.caption|default_if_none:comment.screenshot.image.name|basename}}
-{% endif %}
-{% endspaceless %}</a>
-      </span>
-      {{comment.image|safe}}
-     </div>
-    </dt>
-    <dd>
-{% comment_detail_display_hook comment "review" %}
-     <pre class="reviewtext comment-text" data-rich-text="true" id="{{comment.anchor_prefix}}{{comment.id}}">{{comment.text|markdown_escape:comment.rich_text}}</pre>
-{% if comment.issue_opened %}
-     <div class="issue-indicator">
-       {% comment_issue review_request_details comment "screenshot_comments" %}
-     </div>
-{% endif %}
-     {% reply_section entry comment "screenshot_comments" "rc" %}
-    </dd>
-{% endfor %}
-
-{% for comment in entry.comments.file_attachment_comments %}
-    <dt>
-     <a class="comment-anchor" name="{{comment.anchor_prefix}}{{comment.id}}"></a>
-     <div class="file-attachment">
-      <div class="file-attachment-comment-header">
-       <a href="{{comment.get_absolute_url}}">{% spaceless %}
-        <img src="{{comment.file_attachment.icon_url}}" />
-        <span class="filename">{{comment.get_link_text}}</span>
-       </a>
-{% if draft and comment.file_attachment.draft_caption %}
-       <p class="caption">{{comment.file_attachment.draft_caption}}</p>
-{% elif comment.file_attachment.caption %}
-       <p class="caption">{{comment.file_attachment.caption}}</p>
-{% endif %}
-{% endspaceless %}</a>
-      </div>
-{% with comment.thumbnail as thumbnail %}
-{%  if thumbnail %}
-      <div class="thumbnail">{{thumbnail|default:''|safe}}</div>
-{%  endif %}
-{% endwith %}
-     </div>
-    </dt>
-    <dd>
-{% comment_detail_display_hook comment "review" %}
-     <pre class="reviewtext comment-text" data-rich-text="true" id="{{comment.anchor_prefix}}{{comment.id}}">{{comment.text|markdown_escape:comment.rich_text}}</pre>
-{% if comment.issue_opened %}
-     <div class="issue-indicator">
-       {% comment_issue review_request_details comment "file_attachment_comments" %}
-     </div>
-{% endif %}
-     {% reply_section entry comment "file_attachment_comments" "rc" %}
-    </dd>
-{% endfor %}
-
-{% for comment in entry.comments.diff_comments %}
-    <dt>
-     <a class="comment-anchor" name="{{comment.anchor_prefix}}{{comment.id}}"></a>
-     <div id="comment_container_{{comment.id}}">
-      <table class="sidebyside loading">
-       <thead>
-        <tr class="filename-row">
-         <th class="filename">
-          <a name="{{comment.get_absolute_url}}">{{comment.filediff.dest_file_display}}</a>
-          <span class="diffrevision">
-{% if comment.interfilediff %}
-           (Diff revisions {{comment.filediff.diffset.revision}} - {{comment.interfilediff.diffset.revision}})
-{% else %}
-           (Diff revision {{comment.filediff.diffset.revision}})
-{% endif %}
-          </span>
-         </th>
-        </tr>
-       </thead>
-       <tbody>
-        <tr><td><pre>&nbsp;</pre></td></tr>{# header entry #}
-{% for i in comment.num_lines|default_if_none:1|range %}
-        <tr><td><pre>&nbsp;</pre></td></tr>
-{% endfor %}
-       </tbody>
-      </table>
-     </div>
-    </dt>
-    <dd>
-{% comment_detail_display_hook comment "review" %}
-     <pre class="reviewtext comment-text" data-rich-text="true" id="{{comment.anchor_prefix}}{{comment.id}}">{{comment.text|markdown_escape:comment.rich_text}}</pre>
-{% if comment.issue_opened %}
-     <div class="issue-indicator">
-       {% comment_issue review_request_details comment "diff_comments" %}
-     </div>
-{% endif %}
-     {% reply_section entry comment "diff_comments" "rc" %}
-    </dd>
-{% endfor %}
-   </dl>
-{% endif %}
-  {% if entry.review.body_bottom %}
-   <pre class="body_bottom reviewtext" data-rich-text="true">{{entry.review.body_bottom|markdown_escape:entry.review.rich_text}}</pre>
-   {% reply_section entry "" "body_bottom" "rcbb" %}
-  {% endif %}
- </div><!-- body -->
-</div><!-- main -->
-{%   endbox %}
-</div><!-- review{{entry.review.id}} -->
-{%  endif %}
-{%  if entry.changedesc %}
-<div class="changedesc">
- <a name="changedesc{{entry.changedesc.id}}"></a>
-{% definevar "boxclass" %}changedesc {{entry.class}}{% enddefinevar %}
-{% box boxclass %}
- <div class="main">
-  <div class="header">
-   <div class="collapse-button btn"><div class="rb-icon {% if entry.collapsed %}rb-icon-expand-review{% else %}rb-icon-collapse-review{% endif %}"></div></div>
-   <div class="reviewer"><b>{% trans "Review request changed" %}</b></div>
-   <div class="posted_time">{% localtime on %}{% blocktrans with entry.changedesc.timestamp as timestamp and entry.changedesc.timestamp|date:"c" as timestamp_raw %}Updated <time class="timesince" datetime="{{timestamp_raw}}">{{timestamp}}</time> ({{timestamp}}){% endblocktrans %}{% endlocaltime %}</div>
-  </div>
-  <div class="body">
-   <ul>
-{% for fieldinfo in entry.changeinfo %}
-    <li><label>{{fieldinfo.title}}</label>
-{%  if fieldinfo.rendered_html %}
-     {{fieldinfo.rendered_html}}
-{%  elif fieldinfo.name == "status" %}
-{%   blocktrans with fieldinfo.old_status as old_status and fieldinfo.new_status as new_status %}
-     changed from <i>{{old_status}}</i> to <i>{{new_status}}</i>
-{%   endblocktrans %}
-{%  elif fieldinfo.name == "diff" %}
-{%   definevar "added_values" %}
-      <a href="{{fieldinfo.diff_url}}">{{fieldinfo.diff_label}}</a>
-{%    if fieldinfo.past_revision != 0 %}
-      - <a href="{% url 'view-interdiff' review_request.display_id fieldinfo.past_revision fieldinfo.current_revision %}">{% trans "Show changes" %}</a>
-{%    endif %}
-{%   enddefinevar %}
-     <ul>
-      <li>{% blocktrans %}added {{added_values}}{% endblocktrans %}</li>
-     </ul>
-{%  elif fieldinfo.name == "screenshot_captions" or fieldinfo.name == "file_captions" %}
-     <ul>
-{%   for caption in fieldinfo.captions %}
-      <li>
-{%    blocktrans with caption.old as old_caption and caption.new as new_caption %}
-       changed from <i>{{old_caption}}</i> to <i>{{new_caption}}</i>
-{%    endblocktrans %}
-      </li>
-{%   endfor %}
-     </ul>
-{%  endif %}
-    </li>
-{% endfor %}
-   </ul>
-{% if entry.changedesc.text %}
-   <label>{% trans "Description:" %}</label>
-   <pre class="changedesc-text" data-rich-text="true">{{entry.changedesc.text|markdown_escape:entry.changedesc.rich_text}}</pre>
-{% endif %}
-  </div>
- </div>
-</div>
-{%   endbox %}
-{%  endif %}
-{% endfor %}
-{% endblock %}
+{%  endfor %}
+{% endblock content %}
 
 {% block scripts-post %}
 {{block.super}}
@@ -294,4 +102,4 @@
     });
 {%  endif %}
 </script>
-{% endblock %}
+{% endblock scripts-post %}
