diff --git a/reviewboard/__init__.py b/reviewboard/__init__.py
index ede67a4a3ec11da15fdbf953cef89c691c97f5c7..6487774fe6d217035a422bef677f8fc364899241 100644
--- a/reviewboard/__init__.py
+++ b/reviewboard/__init__.py
@@ -13,7 +13,7 @@ from __future__ import unicode_literals
 #:
 #: (Major, Minor, Micro, Patch, alpha/beta/rc/final, Release Number, Released)
 #:
-VERSION = (5, 0, 0, 0, 'alpha', 0, False)
+VERSION = (4, 0, 0, 0, 'beta', 3, False)
 
 
 def get_version_string():
diff --git a/reviewboard/dependencies.py b/reviewboard/dependencies.py
index e121673c35cead31d48306695134c625a438e0a1..17a81ba2ac8a0d91e7a69380e8cf830ca6dbbe3f 100644
--- a/reviewboard/dependencies.py
+++ b/reviewboard/dependencies.py
@@ -48,7 +48,7 @@ djblets_doc_major_version = '2.x'
 django_version = '>=1.11.29,<1.11.999'
 
 #: The version range required for Djblets.
-djblets_version = '>=3.0a0.dev,<=3.999'
+djblets_version = '>=2.1.1,<=2.999'
 
 #: All dependencies required to install Review Board.
 package_dependencies = {
@@ -64,8 +64,8 @@ package_dependencies = {
     ],
     'Django': django_version,
     'django-cors-headers': '>=1.1.0,<1.1.999',
-    'django_evolution': '>=2.1,<2.999',
-    'django-haystack': '>=2.8.1,<2.999',
+    'django_evolution': '>=2.0.dev',
+    'django-haystack': '>=2.7,<2.999',
     'django-multiselectfield': '',
     'django-oauth-toolkit': '>=0.9.0,<0.9.999',
     'Djblets': djblets_version,
diff --git a/reviewboard/static/rb/js/reviewRequestPage/views/baseStatusUpdatesEntryView.es6.js b/reviewboard/static/rb/js/reviewRequestPage/views/baseStatusUpdatesEntryView.es6.js
index c36e765aa774ec43d003a9dad139571887d920ff..94d6c945309048e6495d016c8ddc64f5617082e7 100644
--- a/reviewboard/static/rb/js/reviewRequestPage/views/baseStatusUpdatesEntryView.es6.js
+++ b/reviewboard/static/rb/js/reviewRequestPage/views/baseStatusUpdatesEntryView.es6.js
@@ -66,6 +66,23 @@ RB.ReviewRequestPage.BaseStatusUpdatesEntryView = ParentView.extend({
     render() {
         ParentView.prototype.render.call(this);
 
+        let collapsed = ParentView.prototype.isCollapsed.call(this);
+        if (!collapsed) {
+            this.renderContents();
+        }
+
+        if (this.model.get('pendingStatusUpdates')) {
+            this.model.watchUpdates(this.CHECK_UPDATES_MS);
+        }
+
+        return this;
+    },
+
+    /**
+     * Render the entry contents.
+     * This will be called only when the entry box is not collapsed.
+     */
+    renderContents() {
         this._reviewViews = this.model.get('reviews').map(review => {
             const $reviewEl = this.$(`#review${review.id}`);
 
@@ -83,12 +100,6 @@ RB.ReviewRequestPage.BaseStatusUpdatesEntryView = ParentView.extend({
 
             return view;
         });
-
-        if (this.model.get('pendingStatusUpdates')) {
-            this.model.watchUpdates(this.CHECK_UPDATES_MS);
-        }
-
-        return this;
     },
 
     /**
diff --git a/reviewboard/templates/reviews/entries/base.html b/reviewboard/templates/reviews/entries/base.html
index 9c38ec17cc280383b40868b842c6d2a3249c5aa7..6cfa912e90460ffdcf14d0e7e10728a663b5e56f 100644
--- a/reviewboard/templates/reviews/entries/base.html
+++ b/reviewboard/templates/reviews/entries/base.html
@@ -43,7 +43,9 @@
   </div>
   <div class="banners"></div>
   <div class="body">
-{% block entry_content %}{% endblock %}
+{% if not entry.collapsed %}
+  {% block entry_content %}{% endblock %}
+{% endif %}
   </div>
  </div>
 </div>
