diff --git a/reviewboard/static/rb/css/pages/text-review-ui.less b/reviewboard/static/rb/css/pages/text-review-ui.less
index 73bd6c3bac417c140e045b2c2475d41433b83c90..c55bc89e3644e0d0471d071e781f581968234649 100644
--- a/reviewboard/static/rb/css/pages/text-review-ui.less
+++ b/reviewboard/static/rb/css/pages/text-review-ui.less
@@ -4,39 +4,53 @@
 /****************************************************************************
  * General text-based review styles
  ****************************************************************************/
-.text-review-ui {
+.review-ui-box .text-review-ui {
   @header-padding: 8px;
 
+  .border-radius(@box-border-radius);
+
   .review-ui-header {
-    .text-review-ui-views {
-      list-style: none;
-      margin: 1em 0 0 5em;
-      padding: 0;
+    /*
+     * We set this instead of turning off the border to keep the gradient from
+     * stopping too soon on Chrome and Firefox.
+     */
+    border-bottom-color: transparent;
 
-      li {
-        background: lighten(@diff-file-color, 2%);
-        cursor: pointer;
-        display: inline-block;
-        margin: 0;
-        border: 1px @diff-file-border-color solid;
-        border-bottom: 0;
-        vertical-align: bottom;
-        .border-radius(@box-border-radius @box-border-radius 0 0);
+    .text-review-ui-views {
+      border-bottom: 1px @diff-file-border-color solid;
 
-        &.active {
-          background: lighten(@diff-file-color, 5%);
+      ul {
+        list-style: none;
+        margin: 1em 0 0 5em;
+        padding: 0;
+
+        li {
+          background: lighten(@diff-file-color, 2%);
+          cursor: pointer;
+          display: inline-block;
+          margin: 0;
+          border: 1px @diff-file-border-color solid;
+          border-bottom: 0;
+          font-size: 110%;
+          font-weight: normal;
+          vertical-align: bottom;
+          .border-radius(@box-border-radius @box-border-radius 0 0);
+
+          &.active {
+            background: lighten(@diff-file-color, 5%);
+
+            a {
+              padding: 6px 12px;
+            }
+          }
 
           a {
-            padding: 6px 12px;
+            color: black;
+            display: block;
+            padding: 4px 12px;
+            text-decoration: none;
           }
         }
-
-        a {
-          color: black;
-          display: block;
-          padding: 4px 12px;
-          text-decoration: none;
-        }
       }
     }
   }
@@ -45,12 +59,16 @@
   .text-review-ui-rendered-table {
     .border-radius(0 0 @box-inner-border-radius @box-inner-border-radius);
 
+    .revision-row th {
+      font-weight: bold;
+    }
+
     tr:last-child {
-      td {
+      td:last-child {
         .border-radius(0 0 @box-inner-border-radius 0);
       }
 
-      th {
+      th:first-child {
         .border-radius(0 0 0 @box-inner-border-radius);
       }
     }
@@ -64,6 +82,11 @@
     text-align: center;
     padding: 2em;
   }
+
+  .sidebyside {
+    .border-radius(0 0 @box-border-radius @box-border-radius);
+    margin-bottom: 0;
+  }
 }
 
 .text-review-ui-comment-thumbnail {
diff --git a/reviewboard/static/rb/js/views/textBasedReviewableView.js b/reviewboard/static/rb/js/views/textBasedReviewableView.js
index d4c8b0ce4a30d8f5ccd30c37af94f5a56f30ac39..507263ca6f95f3a3c728cc8f816178026c858b0c 100644
--- a/reviewboard/static/rb/js/views/textBasedReviewableView.js
+++ b/reviewboard/static/rb/js/views/textBasedReviewableView.js
@@ -102,32 +102,16 @@ RB.TextBasedReviewableView = RB.FileAttachmentReviewableView.extend({
         $fileHeader = this.$('.review-ui-header');
 
         if (this.model.get('numRevisions') > 1) {
-            $tr = $('<tr />')
-                .prependTo($fileHeader);
-            $td = $('<td />')
-                .attr('colspan', hasDiff ? 4 : 2)
-                .appendTo($tr);
-
-            $revisionSelector = $('<div id="attachment_revision_selector" />')
-                .appendTo($td);
             this._revisionSelectorView = new RB.FileAttachmentRevisionSelectorView({
-                el: $revisionSelector,
+                el: $fileHeader.find('#attachment_revision_selector'),
                 model: this.model
             });
             this._revisionSelectorView.render();
             this.listenTo(this._revisionSelectorView, 'revisionSelected',
                           this._onRevisionSelected);
 
-            $tr = $('<tr />')
-                .prependTo($fileHeader);
-            $td = $('<td />')
-                .attr('colspan', hasDiff ? 4 : 2)
-                .appendTo($tr);
-
-            $revisionLabel = $('<div id="revision_label" />')
-                .prependTo($td);
             this._revisionLabelView = new RB.FileAttachmentRevisionLabelView({
-                el: $revisionLabel,
+                el: $fileHeader.find('#revision_label'),
                 model: this.model
             });
             this._revisionLabelView.render();
@@ -140,14 +124,13 @@ RB.TextBasedReviewableView = RB.FileAttachmentReviewableView.extend({
         });
     },
 
-        /*
+    /*
      * Callback for when a new file revision is selected.
      *
      * This supports single revisions and diffs. If `base is 0, a
      * single revision is selected, If not, the diff between `base` and
      * `tip` will be shown.
      */
-
     _onRevisionSelected: function(revisions) {
         var revisionIDs = this.model.get('attachmentRevisionIDs'),
             base = revisions[0],
diff --git a/reviewboard/templates/reviews/ui/_text_rendered_table.html b/reviewboard/templates/reviews/ui/_text_rendered_table.html
new file mode 100644
index 0000000000000000000000000000000000000000..1eb4de48d6472e7713888b178d39be70e3de694d
--- /dev/null
+++ b/reviewboard/templates/reviews/ui/_text_rendered_table.html
@@ -0,0 +1,29 @@
+{% extends "reviews/ui/_text_table.html" %}
+
+{% load i18n %}
+
+{% block table_class %}text-review-ui-rendered-table{% endblock %}
+
+{% block table_content %}
+{%  if diff_type_mismatch %}
+    <thead>
+     <tr>
+{%   if is_diff %}
+      <td colspan="4">
+{%   else %}
+      <td colspan="2">
+{%   endif %}
+       <div class="review-ui-error">
+        <div class="rb-icon rb-icon-warning"></div>
+{%   blocktrans %}
+        These revisions cannot be compared because they are different
+        file types.
+{%   endblocktrans %}
+       </div>
+      </td>
+     </tr>
+    </thead>
+{%  else %}
+{{block.super}}
+{%  endif %}
+{% endblock table_content %}
diff --git a/reviewboard/templates/reviews/ui/_text_table.html b/reviewboard/templates/reviews/ui/_text_table.html
new file mode 100644
index 0000000000000000000000000000000000000000..09964e4bf2c9fd66c46bcae23448cc0486ac615a
--- /dev/null
+++ b/reviewboard/templates/reviews/ui/_text_table.html
@@ -0,0 +1,58 @@
+{% load i18n %}
+
+<table class="sidebyside {% block table_class %}text-review-ui-text-table{% endblock %}"{% if hide %} style="display: none;"{% endif %}>
+ <colgroup>
+{% if is_diff %}
+  <col class="line" />
+  <col class="left" />
+{% endif %}
+  <col class="line" />
+  <col class="right" />
+ </colgroup>
+
+ <thead>
+  <tr class="revision-row">
+{% if is_diff %}
+   <th></th>
+   <th>
+     {{diff_caption|default:diff_filename}}
+{%  blocktrans %}
+     (revision {{diff_revision}})
+{%  endblocktrans %}
+   </th>
+{% endif %}
+
+   <th></th>
+   <th>
+     {{caption|default:filename}}
+{% if num_revisions > 1 %}
+{%  blocktrans %}
+     (revision {{revision}})
+{%  endblocktrans %}
+{% endif %}
+   </th>
+  </tr>
+ </thead>
+
+{% block table_content %}
+ <tbody>
+{%  if is_diff %}
+{%   for line1, line2 in lines %}
+  <tr line="{{forloop.counter}}">
+   <th>{{forloop.counter}}</th>
+   <td class="l">{{line1}}</td>
+   <th>{{forloop.counter}}</th>
+   <td class="r">{{line2}}</td>
+  </tr>
+{%   endfor %}
+{%  else %}
+{%   for line in lines %}
+  <tr line="{{forloop.counter}}">
+   <th>{{forloop.counter}}</th>
+   <td class="l">{{line}}</td>
+  </tr>
+{%   endfor %}
+{%  endif %}
+ </tbody>
+{% endblock %}
+</table>
diff --git a/reviewboard/templates/reviews/ui/text.html b/reviewboard/templates/reviews/ui/text.html
index 0d1299bcf8b3c296c69b2b19e95b9bea54c6215a..c3a9ba78fea9447103d8b9b7e1a5c00fc4eb3029 100644
--- a/reviewboard/templates/reviews/ui/text.html
+++ b/reviewboard/templates/reviews/ui/text.html
@@ -7,113 +7,27 @@
 {% block review_ui_box_content_inner %}
  <div id="diffs">
   <div class="diff-container text-review-ui {{review_ui.extra_css_classes|join:' '}}">
-
-   <table class="sidebyside">
-    <colgroup>
-{%  if is_diff %}
-     <col class="line" />
-     <col class="left" />
-{%  endif %}
-     <col class="line" />
-     <col class="right" />
-    </colgroup>
-
-    <thead class="review-ui-header">
-     <tr>
-{%  if is_diff %}
-      <th colspan="2">
-       <h1 class="caption">
-        {{diff_caption|default:diff_filename}}
-{%   blocktrans %}
-        (revision {{diff_revision}})
-{%   endblocktrans %}
-       </h1>
-      </th>
-{%  endif %}
-
-      <th colspan="2">
-       <h1 class="caption">
-    {{caption|default:filename}}
+   <div class="review-ui-header">
 {%  if num_revisions > 1 %}
-{%   blocktrans %}
-        (revision {{revision}})
-{%   endblocktrans %}
+    <div id="revision_label"></div>
+    <div id="attachment_revision_selector"></div>
 {%  endif %}
-       </h1>
-      </th>
-     </tr>
 
 {%  if review_ui.can_render_text and not diff_type_mismatch %}
-     <tr>
-      <td colspan="{% if is_diff %}4{% else %}2{% endif %}">
-       <ul class="text-review-ui-views">
-        <li class="active" data-view-mode="rendered"><a href="#rendered">{% trans "Rendered" %}</a></li>
-        <li data-view-mode="source"><a href="#source">{% trans "Source" %}</a></li>
-       </ul>
-      </td>
-     </tr>
+    <div class="text-review-ui-views">
+     <ul>
+      <li class="active" data-view-mode="rendered"><a href="#rendered">{% trans "Rendered" %}</a></li>
+      <li data-view-mode="source"><a href="#source">{% trans "Source" %}</a></li>
+     </ul>
+    </div>
 {%  endif %}
-    </thead>
-
-{%  if diff_type_mismatch %}
-    <tbody class="text-review-ui-rendered-table">
-     <tr>
-{%   if is_diff %}
-      <td colspan="4">
-{%   else %}
-      <td colspan="2">
-{%   endif %}
-       <div class="review-ui-error">
-        <div class="rb-icon rb-icon-warning"></div>
-	{% trans "These revisions cannot be compared because they are different file types." %}
-       </div>
-      </td>
-     </tr>
-    </tbody>
-{%  else %}
-{%   if review_ui.can_render_text %}
-    <tbody class="text-review-ui-rendered-table">
-{%    if is_diff %}
-{%     for line1, line2 in rendered_lines %}
-     <tr line="{{forloop.counter}}">
-      <th>{{forloop.counter}}</th>
-      <td class="l">{{line1}}</td>
-      <th>{{forloop.counter}}</th>
-      <td class="2">{{line2}}</td>
-     </tr>
-{%     endfor %}
-{%    else %}
-{%    for line in rendered_lines %}
-     <tr line="{{forloop.counter}}">
-      <th>{{forloop.counter}}</th>
-      <td class="l">{{line}}</td>
-     </tr>
-{%     endfor %}
-{%    endif %}
-    </tbody>
-{%   endif %}
+   </div>
 
-    <tbody class="text-review-ui-text-table"{% if review_ui.can_render_text %} style="display:none;"{%endif%}>
-{%   if is_diff %}
-{%    for line1, line2 in text_lines %}
-     <tr line="{{forloop.counter}}">
-      <th>{{forloop.counter}}</th>
-      <td class="l">{{line1}}</td>
-      <th>{{forloop.counter}}</th>
-      <td class="2">{{line2}}</td>
-     </tr>
-{%    endfor %}
-{%   else %}
-{%    for line in text_lines %}
-     <tr line="{{forloop.counter}}">
-      <th>{{forloop.counter}}</th>
-      <td class="l">{{line}}</td>
-     </tr>
-{%    endfor %}
-{%   endif %}
-    </tbody>
+{%  if review_ui.can_render_text %}
+{%   include "reviews/ui/_text_rendered_table.html" with lines=rendered_lines %}
 {%  endif %}
-   </table>
+
+{%  include "reviews/ui/_text_table.html" with hide=review_ui.can_render_text lines=text_lines %}
 
   </div>
  </div>
