diff --git a/reviewboard/static/rb/css/pages/reviews.less b/reviewboard/static/rb/css/pages/reviews.less
index 3911c43f9b522414fb39d90d4e0111070dd86935..f9925bbed0eff3135cc6329eecf864ecdddd94e5 100644
--- a/reviewboard/static/rb/css/pages/reviews.less
+++ b/reviewboard/static/rb/css/pages/reviews.less
@@ -7,6 +7,10 @@
 @img_base: '../../images';
 @djblets_img_base: '../../../djblets/images';
 
+@base-entry-bg: #ffffff;
+@collapsed-entry-bg: #ececee;
+@changedesc-bg: lighten(@review-request-bg, 5%);
+
 
 /****************************************************************************
  * Review-specific macros
@@ -18,8 +22,8 @@
 
   &:before, &:after {
     position: absolute;
-    left: -19px;
-    top: 17px;
+    left: -20px;
+    top: 12px;
     right: 100%;
     border: 1px transparent solid;
     content: " ";
@@ -195,33 +199,118 @@
 
 
 /****************************************************************************
- * Reviews
+ * Entries (status updates, reviews, change descriptions)
  ****************************************************************************/
 
-#reviews {
-  .box {
-    margin: 2em 0;
-    .left-arrow-callout(white);
+.review-request-page-entry {
+  margin: 2rem 0;
 
-    .on-mobile-medium-screen-720({
-      margin-top: 1em;
-    });
+  .on-mobile-medium-screen-720({
+    margin-top: 1rem;
+  });
 
-    &:last-child {
+  &:last-child {
+    margin-bottom: 0;
+  }
+
+  .collapse-button {
+    border: 1px #333333 solid;
+    cursor: pointer;
+    float: left;
+    margin-right: 0.5rem;
+    margin-top: -1px;
+    padding: 0;
+  }
+}
+
+.review-request-page-entry-contents {
+  background-color: @base-entry-bg;
+  border: 1px @box-border-color solid;
+  border-radius: @box-border-radius;
+  box-shadow: @box-shadow;
+
+  &.collapsed {
+    background-color: @collapsed-entry-bg !important;
+    background-image: none !important; // Override any gradients used.
+
+    .banner {
+      border-bottom: 0;
       margin-bottom: 0;
     }
+
+    .body {
+      display: none;
+    }
   }
 
-  .box-container {
-    margin: 0;
-    padding-left: 75px;
+  .has-avatar & {
+    margin-left: 75px;
     width: auto;
 
+    .left-arrow-callout(@base-entry-bg);
+
     .on-mobile-medium-screen-720({
-      padding-left: 0;
+      margin-left: 0;
     });
+
+    &.collapsed {
+      .left-arrow-callout-color(@collapsed-entry-bg);
+    }
   }
 
+  .header {
+    border-radius: @box-border-radius @box-border-radius 0 0;
+    padding: @entry-padding;
+
+    a {
+      color: black;
+      text-decoration: none;
+    }
+
+    .header-details {
+      line-height: 20px;
+      overflow: hidden;
+    }
+
+    .summary {
+      float: left;
+      font-size: 110%;
+      font-weight: bold;
+
+      .on-mobile-medium-screen-720({
+        float: none;
+      });
+    }
+
+    .timestamp {
+      color: #555;
+      text-align: right;
+
+      .on-mobile-medium-screen-720({
+        margin-top: 0.5rem;
+        text-align: left;
+      });
+    }
+  }
+}
+
+
+/****************************************************************************
+ * Reviews
+ ****************************************************************************/
+
+.review.has-draft {
+  // Reviews with draft replies have a green header.
+  .review-request-page-entry-contents {
+    .left-arrow-callout-color(@draft-bg-color);
+  }
+
+  .header {
+    background: @draft-bg-color;
+  }
+}
+
+#reviews {
   .box-statuses {
     float: left;
     text-align: center;
@@ -345,58 +434,7 @@
   }
 }
 
-#reviews .box {
-  border: 0;
-
-  .on-mobile-medium-screen-720({
-    &:after, &:before {
-      content: none
-    }
-  });
-
-  &.collapsed {
-    .left-arrow-callout-color(#ECECEE);
-
-    .body {
-      display: none;
-    }
-
-    .box-inner {
-      background: #ECECEE;
-    }
-
-    .banner {
-      border-bottom: 0;
-      margin-bottom: 0;
-    }
-  }
-
-  .box-inner {
-    background: none;
-    overflow: hidden;
-  }
-
-  .collapse-button {
-    border: 1px #333333 solid;
-    cursor: pointer;
-    float: left;
-    margin-right: 0.5em;
-    margin-top: -1px;
-    padding: 0;
-  }
-}
-
 #reviews .review {
-  &.has-draft {
-    .box {
-      .left-arrow-callout-color(@draft-bg-color);
-    }
-
-    .header {
-      background: @draft-bg-color;
-    }
-  }
-
   .banners {
     .banner {
       border-left: 0;
@@ -443,16 +481,6 @@
     }
   }
 
-  .box {
-    background: white;
-    border: 0;
-  }
-
-  .box-inner {
-    background: white;
-    border: 1px @review-box-border-color solid;
-  }
-
   .controls {
     list-style: none;
     margin: 0;
@@ -613,8 +641,7 @@
 
 #view_controls {
   list-style: none;
-  margin: 1em 0;
-  padding: 1em;
+  margin: 2em 0;
   text-align: center;
 
   a {
@@ -663,13 +690,12 @@
  * Change Descriptions
  ****************************************************************************/
 .changedesc {
-  &.box {
-    background-color: #fefadf;
-    #gradient > .vertical(lighten(@review-request-bg, 5%), @review-request-bg);
+  .review-request-page-entry-contents {
 
-    .box-inner {
-      border: 1px @review-request-border-color solid;
-    }
+    background-color: @changedesc-bg;
+    #gradient > .vertical(@changedesc-bg, @review-request-bg);
+
+    .left-arrow-callout-color(@changedesc-bg);
   }
 
   .body {
@@ -703,7 +729,7 @@
     h3 {
       color: @review-request-label-color;
       font-size: 110%;
-      margin: 1em 0 0.5em 0;
+      margin: 0;
       padding: 0;
 
       &.status {
@@ -972,7 +998,7 @@
       });
 
       h3 {
-        margin: 2px 1em 0 0;
+        margin: 0 1em 0 0;
         padding: 0;
         text-align: right;
 
@@ -1032,48 +1058,6 @@
   }
 }
 
-.box .header {
-  border-radius: @box-border-radius @box-border-radius 0 0;
-  padding: @entry-padding;
-
-  a {
-    color: black;
-    text-decoration: none;
-  }
-
-  .header-details {
-    line-height: 20px;
-    overflow: hidden;
-  }
-
-  .reviewer {
-    float: left;
-    font-size: 110%;
-    font-weight: bold;
-    padding-top: 1px;
-
-    .on-mobile-medium-screen-720({
-      float: none;
-    });
-
-    a {
-      position: relative;
-    }
-  }
-
-  .posted_time {
-    color: #555;
-    text-align: right;
-    padding-top: 2px;
-
-    .on-mobile-medium-screen-720({
-      margin-top: 0.5em;
-      text-align: left;
-    });
-  }
-
-}
-
 
 /****************************************************************************
  * Updates Bubble
diff --git a/reviewboard/static/rb/js/pages/views/tests/reviewRequestPageViewTests.es6.js b/reviewboard/static/rb/js/pages/views/tests/reviewRequestPageViewTests.es6.js
index e8138b60db93d9ffefe087dc18aa52109981235e..cad2ff76329855873e56aacd0c85fc93ad86c3d0 100644
--- a/reviewboard/static/rb/js/pages/views/tests/reviewRequestPageViewTests.es6.js
+++ b/reviewboard/static/rb/js/pages/views/tests/reviewRequestPageViewTests.es6.js
@@ -7,8 +7,8 @@ suite('rb/pages/views/ReviewRequestPageView', () => {
         '<a id="collapse-all"></a>',
         '<a id="expand-all"></a>',
         '<div>',
-        ' <div class="review" id="review123">',
-        '  <div class="box">',
+        ' <div class="review review-request-page-entry" id="review123">',
+        '  <div class="review-request-page-entry-contents">',
         '   <div class="body">',
         '    <pre class="body_top">Body Top</pre>',
         '    <div class="comment-section" data-context-type="body_top">',
@@ -21,8 +21,8 @@ suite('rb/pages/views/ReviewRequestPageView', () => {
         '    </div>',
         '   </div>',
         ' </div>',
-        ' <div class="review" id="review124">',
-        '  <div class="box">',
+        ' <div class="review review-request-page-entry" id="review124">',
+        '  <div class="review-request-page-entry-contents">',
         '   <div class="body">',
         '    <pre class="body_top">Body Top</pre>',
         '    <div class="comment-section" data-context-type="body_top">',
@@ -88,8 +88,8 @@ suite('rb/pages/views/ReviewRequestPageView', () => {
 
     describe('Actions', () => {
         it('Collapse all', () => {
-            const $el1 = box1.$el.find('.box');
-            const $el2 = box2.$el.find('.box');
+            const $el1 = box1.$el.find('.review-request-page-entry-contents');
+            const $el2 = box2.$el.find('.review-request-page-entry-contents');
 
             expect($el1.hasClass('collapsed')).toBe(false);
             expect($el2.hasClass('collapsed')).toBe(false);
@@ -101,8 +101,8 @@ suite('rb/pages/views/ReviewRequestPageView', () => {
         });
 
         it('Expand all', () => {
-            const $el1 = box1.$el.find('.box');
-            const $el2 = box2.$el.find('.box');
+            const $el1 = box1.$el.find('.review-request-page-entry-contents');
+            const $el2 = box2.$el.find('.review-request-page-entry-contents');
 
             $el1.addClass('collapsed');
             $el2.addClass('collapsed');
diff --git a/reviewboard/static/rb/js/views/collapsableBoxView.es6.js b/reviewboard/static/rb/js/views/collapsableBoxView.es6.js
index 1c447727cbb230bf3a83acdb55891a4d1b75a053..730638f47bf11e00716998003115db870eb0dc28 100644
--- a/reviewboard/static/rb/js/views/collapsableBoxView.es6.js
+++ b/reviewboard/static/rb/js/views/collapsableBoxView.es6.js
@@ -14,7 +14,7 @@ RB.CollapsableBoxView = Backbone.View.extend({
      *     This object, for chaining.
      */
     render() {
-        this._$box = this.$('.box');
+        this._$box = this.$('.review-request-page-entry-contents');
         this._$expandCollapseButton = this.$('.collapse-button .rb-icon');
 
         if (this._$box.hasClass('collapsed')) {
diff --git a/reviewboard/static/rb/js/views/reviewBoxView.es6.js b/reviewboard/static/rb/js/views/reviewBoxView.es6.js
index 0a169d205b69f980dcad6e77d86dc82025185676..fdcbef34a6c4a30439fef2eb1c7bc69df5c67612 100644
--- a/reviewboard/static/rb/js/views/reviewBoxView.es6.js
+++ b/reviewboard/static/rb/js/views/reviewBoxView.es6.js
@@ -173,7 +173,7 @@ RB.ReviewBoxView = RB.CollapsableBoxView.extend({
         if (!this._draftBannerShown) {
             this._bannerView = new RB.ReviewReplyDraftBannerView({
                 model: this._reviewReply,
-                $floatContainer: this.$('.box'),
+                $floatContainer: this._$box,
                 noFloatContainerClass: 'collapsed',
                 showSendEmail: this.options.showSendEmail,
             });
diff --git a/reviewboard/static/rb/js/views/tests/reviewBoxViewTests.js b/reviewboard/static/rb/js/views/tests/reviewBoxViewTests.js
index b58f2f32cb80f71e615edc89260c7a2fc5a5f96c..dca37ff5e610c33649f1879fb879d3b655eebed5 100644
--- a/reviewboard/static/rb/js/views/tests/reviewBoxViewTests.js
+++ b/reviewboard/static/rb/js/views/tests/reviewBoxViewTests.js
@@ -2,8 +2,8 @@ suite('rb/views/ReviewBoxView', function() {
     var view,
         reviewReply,
         template = _.template([
-            '<div>',
-            ' <div class="box">',
+            '<div class="review review-request-page-entry">',
+            ' <div class="review-request-page-entry-contents">',
             '  <div class="collapse-button"></div>',
             '  <div class="banners">',
             '   <input type="button" value="Publish" />',
@@ -64,7 +64,7 @@ suite('rb/views/ReviewBoxView', function() {
 
     describe('Actions', function() {
         it('Toggle collapse', function() {
-            var $box = view.$('.box'),
+            var $box = view.$('.review-request-page-entry-contents'),
                 $collapseButton = view.$('.collapse-button');
 
             $collapseButton.click();
@@ -186,7 +186,10 @@ suite('rb/views/ReviewBoxView', function() {
     describe('Methods', function() {
         it('collapse', function() {
             view.collapse();
-            expect(view.$('.box').hasClass('collapsed')).toBe(true);
+            expect(
+                view.$('.review-request-page-entry-contents')
+                    .hasClass('collapsed'))
+                .toBe(true);
         });
 
         it('expand', function() {
diff --git a/reviewboard/templates/reviews/boxes/change.html b/reviewboard/templates/reviews/boxes/change.html
index dfb354a44f7e463a028cfbfc413bc29df52967c1..e734dc7eb80ab924c22798ed96635ade11d90ddf 100644
--- a/reviewboard/templates/reviews/boxes/change.html
+++ b/reviewboard/templates/reviews/boxes/change.html
@@ -1,7 +1,7 @@
 {% load changedescs avatars djblets_deco djblets_utils i18n reviewtags tz %}
 
 {% with changedesc=entry.changedesc %}
-<div class="changedesc" id="changedesc{{changedesc.id}}">
+<div class="changedesc review-request-page-entry has-avatar" id="changedesc{{changedesc.id}}">
  <a name="changedesc{{changedesc.id}}"></a>
  <div class="box-statuses">
   <div class="box-status">
@@ -14,13 +14,13 @@
   </div>
  </div>
 
-{%  definevar "boxclass" %}changedesc {% if entry.collapsed %}collapsed{% endif %}{% enddefinevar %}
-{%  box boxclass %}
+ <div class="review-request-page-entry-contents
+             {{entry.collapsed|yesno:'collapsed,'}}">
   <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="header-details">
-    <div class="reviewer"><b>{% trans "Review request changed" %}</b></div>
-    <div class="posted_time">{% localtime on %}{% blocktrans with changedesc.timestamp as timestamp and changedesc.timestamp|date:"c" as timestamp_raw %}<time class="timesince" datetime="{{timestamp_raw}}">{{timestamp}}</time>{% endblocktrans %}{% endlocaltime %}</div>
+    <div class="summary"><b>{% trans "Review request changed" %}</b></div>
+    <div class="timestamp">{% localtime on %}{% blocktrans with changedesc.timestamp as timestamp and changedesc.timestamp|date:"c" as timestamp_raw %}<time class="timesince" datetime="{{timestamp_raw}}">{{timestamp}}</time>{% endblocktrans %}{% endlocaltime %}</div>
    </div>
   </div>
   <div class="body">
@@ -73,6 +73,6 @@
 {%   endfor %}
 
   </div>
-{%  endbox %}
+ </div>
 </div>
 {% endwith %}
diff --git a/reviewboard/templates/reviews/boxes/review.html b/reviewboard/templates/reviews/boxes/review.html
index 82cc01ca4bff66dc459d240367bc93c1035806f3..6e1fede228fbd13acf975765f24c74d7a000ab9c 100644
--- a/reviewboard/templates/reviews/boxes/review.html
+++ b/reviewboard/templates/reviews/boxes/review.html
@@ -3,7 +3,7 @@
 
 {% with review=entry.review %}
 <a name="review{{review.id}}"></a>
-<div id="review{{review.id}}" class="review">
+<div id="review{{review.id}}" class="review review-request-page-entry has-avatar">
 {%  if forloop.last %}
  <a name="last-review"></a>
 {%  endif %}
@@ -24,14 +24,15 @@
    </div>
   </div>
  </div>
-{%  definevar "boxclass" %}{% if entry.collapsed %}collapsed{% endif %}{% enddefinevar %}
-{%  box boxclass %}
+
+ <div class="review-request-page-entry-contents
+             {{entry.collapsed|yesno:'collapsed,'}}">
   <div class="header">
 {%   template_hook_point "review-summary-header-pre" %}
    <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="header-details">
-    <div class="reviewer"><a href="{% url 'user' review.user %}" class="user">{{review.user|user_displayname}}</a></div>
-    <div class="posted_time">{% localtime on %}{% blocktrans with review.timestamp as timestamp and review.timestamp|date:"c" as timestamp_raw %}<time class="timesince" datetime="{{timestamp_raw}}">{{timestamp}}</time>{% endblocktrans %}{% endlocaltime %}</div>
+    <div class="summary"><a href="{% url 'user' review.user %}" class="user">{{review.user|user_displayname}}</a></div>
+    <div class="timestamp">{% localtime on %}{% blocktrans with review.timestamp as timestamp and review.timestamp|date:"c" as timestamp_raw %}<time class="timesince" datetime="{{timestamp_raw}}">{{timestamp}}</time>{% endblocktrans %}{% endlocaltime %}</div>
    </div>
 {%   template_hook_point "review-summary-header-post" %}
   </div>
@@ -183,7 +184,7 @@
    </div>
 {%   endif %}
   </div>
-{%  endbox %}
+ </div>
 </div>
 
 {% endwith %}
