diff --git a/reviewboard/static/rb/js/views/reviewBoxView.js b/reviewboard/static/rb/js/views/reviewBoxView.js
index 512112a34f7b85937cc0ef5d0e88ce485572888e..5867819d64c6c8b825c2098790b351bb4b707483 100644
--- a/reviewboard/static/rb/js/views/reviewBoxView.js
+++ b/reviewboard/static/rb/js/views/reviewBoxView.js
@@ -36,10 +36,6 @@ RB.ReviewBoxView = RB.CollapsableBoxView.extend({
         this._$banners = this.$('.banners');
         this._$shipIt = this.$('.shipit');
 
-        this._reviewReply.on('destroyed published', function() {
-            this._setupNewReply();
-        }, this);
-
         _.each(this.$('.review-comments .issue-indicator'), function(el) {
             var $issueState = $('.issue-state', el),
                 issueStatus,
@@ -171,10 +167,12 @@ RB.ReviewBoxView = RB.CollapsableBoxView.extend({
             reviewReply = this.model.createReply();
         }
 
-        reviewReply.on('destroyed published', this._setupNewReply, this);
+        this.listenTo(reviewReply, 'destroyed published', function() {
+            this._setupNewReply();
+        });
 
         if (hadReviewReply) {
-            this._reviewReply.off(null, null, this);
+            this.stopListening(this._reviewReply);
 
             /*
              * We had one displayed before. Now it's time to clean up and
diff --git a/reviewboard/static/rb/js/views/tests/reviewBoxViewTests.js b/reviewboard/static/rb/js/views/tests/reviewBoxViewTests.js
index 5b488065c7a047e5435ec325844bef86682ef25f..d183b35e7ec908652f28d55ecde8e0c35adf81ab 100644
--- a/reviewboard/static/rb/js/views/tests/reviewBoxViewTests.js
+++ b/reviewboard/static/rb/js/views/tests/reviewBoxViewTests.js
@@ -130,20 +130,20 @@ suite('rb/views/ReviewBoxView', function() {
             it('Signals connected', function() {
                 var reviewReply = new RB.ReviewReply();
 
-                spyOn(reviewReply, 'on');
+                spyOn(view, 'listenTo').andCallThrough();
 
                 view._setupNewReply(reviewReply);
 
-                expect(reviewReply.on.calls[0].args[0])
+                expect(view.listenTo.calls[0].args[1])
                     .toBe('destroyed published');
             });
 
             it('Signals disconnected from old reviewReply', function() {
-                spyOn(reviewReply, 'off');
+                spyOn(view, 'stopListening').andCallThrough();
 
                 view._setupNewReply();
 
-                expect(reviewReply.off).toHaveBeenCalledWith(null, null, view);
+                expect(view.stopListening).toHaveBeenCalledWith(reviewReply);
             });
 
             it('Draft banner hidden', function() {
