diff --git a/reviewboard/static/rb/css/pages/reviews.less b/reviewboard/static/rb/css/pages/reviews.less
index dab489c99a64a1a7c049cae94642959a5587c497..b54f088e09fd7b6c8f4a885fd9b513daf8851a50 100644
--- a/reviewboard/static/rb/css/pages/reviews.less
+++ b/reviewboard/static/rb/css/pages/reviews.less
@@ -1362,7 +1362,7 @@
 
 
 /****************************************************************************
- * Review Dialog
+ * Review Composer
  ****************************************************************************/
 #review-form {
   @review-dialog-padding: 20px;
@@ -1377,6 +1377,129 @@
     margin-top: 10px;
   }
 
+  .ship-it-checkbox {
+    display: none;
+
+    &:not(:checked) ~ .rb-icon-admin-disabled {
+      margin-right: 4px;
+      margin-left: 4px;
+      position: relative;
+      top: -6px
+    }
+
+    &:checked ~ .rb-icon-admin-enabled {
+      margin-right: 4px;
+      margin-left: 4px;
+      position: relative;
+      top: -6px
+    }
+
+    &:not(:checked) ~ .rb-icon-admin-enabled {
+      display: none;
+    }
+
+    &:checked ~ .rb-icon-admin-disabled {
+      display: none;
+    }
+  }
+
+    // .issue-opened {
+    //   // display: none;
+
+    //   .edit-field > .issue-opened:not(:checked) {
+    //     margin-right: 4px;
+    //     margin-left: 4px;
+    //     position: relative;
+    //     top: -6px;
+    //   }
+
+    //   .edit-field > .issue-opened:checked {
+    //     margin-right: 4px;
+    //     margin-left: 4px;
+    //     position: relative;
+    //     top: -6px;
+    //   }
+
+    //   .edit-field > .issue-opened:not(:checked) {
+    //     display: none;
+    //   }
+
+    //   .edit-field > .issue-opened:checked {
+    //     display: none;
+    //   }
+    // }
+
+
+
+    // .edit-fields {
+    //   // display: none;
+
+    //   .edit-field > .issue-opened:not(:checked) {
+    //     margin-right: 4px;
+    //     margin-left: 4px;
+    //     position: relative;
+    //     top: -6px;
+    //   }
+
+    //   .edit-field > .issue-opened:checked {
+    //     margin-right: 4px;
+    //     margin-left: 4px;
+    //     position: relative;
+    //     top: -6px;
+    //   }
+
+    //   .edit-field > .issue-opened:not(:checked) {
+    //     display: none;
+    //   }
+
+    //   .edit-field > .issue-opened:checked {
+    //     display: none;
+    //   }
+    // }
+
+    .edit-fields {
+      & .rb-icon-datagrid-comment-draft {
+        margin-right: 4px;
+        margin-left: 4px;
+        position: relative;
+        top: -6px;
+      }
+
+      & .rb-icon-issue-open {
+        margin-right: 4px;
+        margin-left: 4px;
+        position: relative;
+        top: -6px;
+      }
+
+
+      .edit-field:nth-child(-n + 2) {
+        &.issue-opened{
+          background: black;
+        }
+      }
+
+      // &:nth-child(1) .rb-icon-issue-open ~ &:nth-child(2) {
+      //   background: black;
+      // }
+
+
+      //.issue-opened {
+      //  display: none;
+      // }
+    }
+
+
+
+  .composer-comment-label {
+    content: " ";
+    display: block;
+    border-top: 1px solid  #000000;
+    border-bottom: 1px solid #000000;
+    padding-top: 1px;
+    padding-bottom: 1px;
+  }
+
   .add-link {
     font-size: 110%;
 
@@ -1387,15 +1510,15 @@
 
   .delete-comment {
     color: #000000;
+    float: right;
   }
 
   .comment-label {
-    color: #AB5603;
-    font-size: 1.1em;
+    color: #000000;
+    font-size: 1.2em;
     font-weight: bold;
     margin-bottom: 2em;
     text-decoration: none;
-
     .inline-editor-label();
   }
 
@@ -1403,6 +1526,10 @@
     margin-bottom: 1em;
   }
 
+  .editicon {
+    float: right;
+  }
+
   .rich-text {
     margin-bottom: 2em;
   }
diff --git a/reviewboard/static/rb/js/pages/views/reviewablePageView.es6.js b/reviewboard/static/rb/js/pages/views/reviewablePageView.es6.js
index e9fa554fd76977f491c8793ee21741f077e3f908..4dc995dcad7d4a412df8b4dd864908201a8e640a 100644
--- a/reviewboard/static/rb/js/pages/views/reviewablePageView.es6.js
+++ b/reviewboard/static/rb/js/pages/views/reviewablePageView.es6.js
@@ -341,7 +341,7 @@ RB.ReviewablePageView = RB.PageView.extend({
      *    false, always.
      */
     _onEditReviewClicked() {
-        RB.ReviewDialogView.create({
+        RB.ReviewComposerView.create({
             review: this.model.get('pendingReview'),
             reviewRequestEditor: this.model.reviewRequestEditor,
         });
diff --git a/reviewboard/static/rb/js/pages/views/tests/reviewablePageViewTests.es6.js b/reviewboard/static/rb/js/pages/views/tests/reviewablePageViewTests.es6.js
index 2ffc88f1b2753a8edb76b9462507c915aee0060b..cc314ee298ad13fe279defa016dd91dcdf2b7969 100644
--- a/reviewboard/static/rb/js/pages/views/tests/reviewablePageViewTests.es6.js
+++ b/reviewboard/static/rb/js/pages/views/tests/reviewablePageViewTests.es6.js
@@ -93,13 +93,13 @@ suite('rb/pages/views/ReviewablePageView', function() {
 
     describe('Actions', function() {
         it('Edit Review', function() {
-            spyOn(RB.ReviewDialogView, 'create');
+            spyOn(RB.ReviewComposerView, 'create');
 
             $editReview.click();
 
-            expect(RB.ReviewDialogView.create).toHaveBeenCalled();
+            expect(RB.ReviewComposerView.create).toHaveBeenCalled();
 
-            const options = RB.ReviewDialogView.create.calls.argsFor(0)[0];
+            const options = RB.ReviewComposerView.create.calls.argsFor(0)[0];
             expect(options.review).toBe(page.get('pendingReview'));
             expect(options.reviewRequestEditor).toBe(page.reviewRequestEditor);
         });
diff --git a/reviewboard/static/rb/js/ui/views/inlineEditorView.es6.js b/reviewboard/static/rb/js/ui/views/inlineEditorView.es6.js
index 2445d6680877b32d39f194da57d65d8e34f9f94a..b908eea5f944874153614261956cf26699fc2e86 100644
--- a/reviewboard/static/rb/js/ui/views/inlineEditorView.es6.js
+++ b/reviewboard/static/rb/js/ui/views/inlineEditorView.es6.js
@@ -739,8 +739,8 @@ RB.RichTextInlineEditorView = RB.InlineEditorView.extend({
      * Defaults for the view options.
      */
     defaultOptions: _.defaults({
-        matchHeight: false,
         multiline: true,
+        matchHeight: false,
         setFieldValue: (editor, value) =>
             editor.textEditor.setText(value || ''),
         getFieldValue: editor => editor.textEditor.getText(),
diff --git a/reviewboard/static/rb/js/ui/views/textEditorView.es6.js b/reviewboard/static/rb/js/ui/views/textEditorView.es6.js
index 49a0df9b1f773759909d99f00c69f6f0c2b62241..450bda9930e6fe395c77c0e0ffeaee0788f81b49 100644
--- a/reviewboard/static/rb/js/ui/views/textEditorView.es6.js
+++ b/reviewboard/static/rb/js/ui/views/textEditorView.es6.js
@@ -514,6 +514,33 @@ RB.TextEditorView = Backbone.View.extend({
                 () => $checkbox.prop('checked', this.richText));
     },
 
+    /**
+     * Bind an dropdown to this text editor which allows for the choosing of markdown
+     *
+     * The dropdown will initially be set to the value of the editor's
+     * richText property. Switching the option in the dropdown will then manipulate that
+     * property.
+     *
+     * Args:
+     *     $dropdown (jQuery):
+     *         The dropdown to bind.
+     */
+    bindRichTextDropdown($dropdown) {
+        let enableMarkdown;
+        if ($dropDown.val() === 'markdown') {
+            enableMarkdown = true;
+        }
+        else {
+            enableMarkdown = false;
+        }
+        $dropdown
+            .prop('checked', this.richText)
+            .on('change', () => this.setRichText($dropdown.prop('checked')));
+
+        this.on('change:richText',
+                () => $dropdown.prop('checked', this.richText));
+    },
+
     /**
      * Bind the visibility of an element to the richText property.
      *
@@ -813,6 +840,13 @@ RB.TextEditorView = Backbone.View.extend({
                         .attr('for', $checkbox[0].id)
                         .text(gettext('Enable Markdown')));
 
+                    const $dropdown = $('<select><option></option><option>Markdown</option></select>')
+                    .attr({
+                        id: _.uniqueId('markdown_check_dropdown')
+                    })
+                    .appendTo($span);
+                    textEditor.bindRichTextDropdown($dropdown);
+
                     $buttons.append($span);
 
                     const $markdownRef = $('<a/>')
diff --git a/reviewboard/static/rb/js/views/draftReviewBannerView.es6.js b/reviewboard/static/rb/js/views/draftReviewBannerView.es6.js
index 207a29d3b31c061338993b9ec05fca5ec4e49c19..80875a3cfaf1bb85fed18134c50e820b5a13a96f 100644
--- a/reviewboard/static/rb/js/views/draftReviewBannerView.es6.js
+++ b/reviewboard/static/rb/js/views/draftReviewBannerView.es6.js
@@ -175,14 +175,14 @@ RB.DraftReviewBannerView = Backbone.View.extend({
     /**
      * Handler for the Edit Review button.
      *
-     * Displays the review editor dialog.
+     * Displays the review editor composer.
      *
      * Returns:
      *     boolean:
      *     false, always.
      */
     _onEditReviewClicked() {
-        RB.ReviewDialogView.create({
+        RB.ReviewComposerView.create({
             review: this.model,
             reviewRequestEditor: this.options.reviewRequestEditor,
         });
diff --git a/reviewboard/static/rb/js/views/reviewDialogView.es6.js b/reviewboard/static/rb/js/views/reviewComposerView.es6.js
similarity index 93%
rename from reviewboard/static/rb/js/views/reviewDialogView.es6.js
rename to reviewboard/static/rb/js/views/reviewComposerView.es6.js
index f5fcce951c5652c2d123f4f828c360ef470dafe5..564f29499d205b85d01d5cc1b4e588d8759877f5 100644
--- a/reviewboard/static/rb/js/views/reviewDialogView.es6.js
+++ b/reviewboard/static/rb/js/views/reviewComposerView.es6.js
@@ -2,7 +2,7 @@
 
 
 /**
- * Base class for displaying a comment in the review dialog.
+ * Base class for displaying a comment in the review composer.
  */
 const BaseCommentView = Backbone.View.extend({
     tagName: 'li',
@@ -17,12 +17,18 @@ const BaseCommentView = Backbone.View.extend({
         <div class="edit-fields">
          <div class="edit-field">
           <div class="comment-text-field">
-           <label class="comment-label" for="<%= id %>">
+           <label class="comment-label composer-comment-label" for="<%- id %>">
+           <!--span title="<%- openAnIssueText %>" class="issue-opened-checkbox"> -->
+            <!-- <input class="issue-opened" id="<%- issueOpenedID %>"
+                  type="checkbox"> -->
+            <label class="toggleIssue rb-icon rb-icon-datagrid-comment-draft" for="<%- issueOpenedID %>"></label>
+            <label class="toggleIssue rb-icon rb-icon-issue-open" for="<%- issueOpenedID %>"></label>
+           <!-- </span> -->
             <%- commentText %>
             <a href="#" role="button" class="delete-comment"
                aria-label="<%- deleteCommentText %>"
                title="<%- deleteCommentText %>"
-               ><span class="fa fa-trash-o" aria-hidden="true"></span></a>
+               <span class="fa fa-trash-o" aria-hidden="true"></span></a>
            </label>
            <pre id="<%= id %>" class="reviewtext rich-text"
                 data-rich-text="true"><%- text %></pre>
@@ -37,6 +43,9 @@ const BaseCommentView = Backbone.View.extend({
                   type="checkbox">
            <label for="<%= verifyIssueID %>"><%- verifyIssueText %></label>
           <% } %>
+          <select style="float: right">
+          <option>Markdown</option>
+          </select>
          </div>
         </div>
     `),
@@ -700,7 +709,7 @@ const HeaderFooterCommentView = Backbone.View.extend({
      * Open the editor.
      *
      * This is used for the 'Add ...' link handler, as well as for the default
-     * state of the dialog when there are no comments.
+     * state of the composer when there are no comments.
      *
      * Args:
      *     ev (Event):
@@ -764,20 +773,25 @@ const HeaderFooterCommentView = Backbone.View.extend({
 
 
 /**
- * Creates a dialog for modifying a draft review.
+ * Creates a composer for modifying a draft review.
  *
  * This provides editing capabilities for creating or modifying a new
  * review. The list of comments are retrieved from the server, providing
  * context for the comments.
  */
-RB.ReviewDialogView = Backbone.View.extend({
+RB.ReviewComposerView = Backbone.View.extend({
     id: 'review-form-comments',
     className: 'review',
 
     template: _.template(dedent`
         <div class="edit-field">
-         <input id="id_shipit" type="checkbox" />
-         <label for="id_shipit"><%- shipItText %></label>
+            <label for="id_shipit" ><%- shipChange %></label>
+            <span title="<% shipItText %>">
+             <input id="id_shipit" class="ship-it-checkbox" type="checkbox"/>
+             <label class="rb-icon rb-icon-admin-disabled" for="id_shipit"></label>
+             <label class="rb-icon rb-icon-admin-enabled" for="id_shipit"></label>
+            </span>
+            <label for="id_shipit"><%- shipItText %></label>
         </div>
         <div class="review-dialog-hooks-container"></div>
         <div class="edit-field body-top"></div>
@@ -792,11 +806,11 @@ RB.ReviewDialogView = Backbone.View.extend({
     `),
 
     /**
-     * Initialize the review dialog.
+     * Initialize the review composer.
      *
      * Args:
      *     container (string, optional):
-     *         The selector for a container element for the review dialog.
+     *         The selector for a container element for the review composer.
      *
      *     options (object):
      *         Options for the view.
@@ -840,7 +854,7 @@ RB.ReviewDialogView = Backbone.View.extend({
             propertyName: 'bodyTop',
             richTextPropertyName: 'bodyTopRichText',
             linkText: gettext('Add header'),
-            commentText: gettext('Header'),
+            commentText: '',
         });
 
         this._bodyBottomView = new HeaderFooterCommentView({
@@ -848,7 +862,7 @@ RB.ReviewDialogView = Backbone.View.extend({
             propertyName: 'bodyBottom',
             richTextPropertyName: 'bodyBottomRichText',
             linkText: gettext('Add footer'),
-            commentText: gettext('Footer'),
+            commentText: '',
         });
 
         this.listenTo(this._diffCommentsCollection, 'add', comment => {
@@ -911,10 +925,10 @@ RB.ReviewDialogView = Backbone.View.extend({
     },
 
     /**
-     * Remove the dialog from the DOM.
+     * Remove the composer from the DOM.
      *
-     * This will remove all the extension hook views from the dialog,
-     * and then remove the dialog itself.
+     * This will remove all the extension hook views from the composer,
+     * and then remove the composer itself.
      */
     remove() {
         if (this._publishButton) {
@@ -929,9 +943,9 @@ RB.ReviewDialogView = Backbone.View.extend({
     },
 
     /**
-     * Close the review dialog.
+     * Close the review composer.
      *
-     * The dialog will be removed from the screen, and the "closed"
+     * The composer will be removed from the screen, and the "closed"
      * event will be triggered.
      */
     close() {
@@ -943,20 +957,21 @@ RB.ReviewDialogView = Backbone.View.extend({
     },
 
     /**
-     * Render the dialog.
+     * Render the review composer.
      *
-     * The dialog will be shown on the screen, and the comments from
+     * The review composer will be shown on the screen, and the comments from
      * the server will begin loading and rendering.
      *
      * Returns:
-     *     RB.ReviewDialogView:
+     *     RB.ReviewComposerView:
      *     This object, for chaining.
      */
     render() {
         this.$el.html(this.template({
             addHeaderText: gettext('Add header'),
             addFooterText: gettext('Add footer'),
-            shipItText: gettext('Ship It'),
+            shipChange: gettext('Happy with the change?'),
+            shipItText: gettext('Ship It!'),
             markdownDocsURL: MANUAL_URL + 'users/markdown/',
             markdownText: gettext('Markdown Reference'),
         }));
@@ -999,7 +1014,7 @@ RB.ReviewDialogView = Backbone.View.extend({
         this.model.ready({
             data: this._queryData,
             ready: () => {
-                this._renderDialog();
+                this._renderComposer();
                 this._bodyTopView.render();
                 this._bodyBottomView.render();
 
@@ -1030,7 +1045,7 @@ RB.ReviewDialogView = Backbone.View.extend({
      *
      * This will begin chaining together the loads of each set of
      * comment types. Each loaded comment will be rendered to the
-     * dialog once loaded.
+     * composer once loaded.
      */
     _loadComments() {
         const collections = [
@@ -1108,7 +1123,7 @@ RB.ReviewDialogView = Backbone.View.extend({
     },
 
     /**
-     * Render a comment to the dialog.
+     * Render a comment to the composer.
      *
      * Args:
      *     view (BaseCommentView):
@@ -1141,12 +1156,12 @@ RB.ReviewDialogView = Backbone.View.extend({
     },
 
     /**
-     * Render the dialog.
+     * Render the composer.
      *
-     * This will create and render a dialog to the screen, adding
+     * This will create and render a composer to the screen, adding
      * this view's element as the child.
      */
-    _renderDialog() {
+    _renderComposer() {
         const $leftButtons = $('<div class="review-dialog-buttons-left"/>');
         const $rightButtons = $('<div class="review-dialog-buttons-right"/>');
         const buttons = [$leftButtons, $rightButtons];
@@ -1196,7 +1211,7 @@ RB.ReviewDialogView = Backbone.View.extend({
             .attr('scrollTop', 0)
             .trigger('ready');
 
-        /* Must be done after the dialog is rendered. */
+        /* Must be done after the composer is rendered. */
 
         this._publishButton = new RB.SplitButtonView({
             el: $('#review-form-publish-split-btn-container'),
@@ -1240,7 +1255,7 @@ RB.ReviewDialogView = Backbone.View.extend({
      *
      * Returns:
      *     boolean:
-     *     This always returns false to indicate that the dialog should not
+     *     This always returns false to indicate that the composer should not
      *     close.
      */
     _onAddCommentClicked() {
@@ -1264,7 +1279,7 @@ RB.ReviewDialogView = Backbone.View.extend({
      *
      * Returns:
      *     boolean:
-     *     This always returns false to indicate that the dialog should not
+     *     This always returns false to indicate that the composer should not
      *     close.
      */
     _onDiscardClicked() {
@@ -1401,50 +1416,50 @@ RB.ReviewDialogView = Backbone.View.extend({
     },
 }, {
     /*
-     * Add some useful singletons to ReviewDialogView for managing the
-     * review dialog.
+     * Add some useful singletons to ReviewComposerView for managing the
+     * review composer.
      */
 
     _instance: null,
 
     /**
-     * Create a ReviewDialogView.
+     * Create a ReviewComposerView.
      *
      * Only one is allowed on the screen at any given time.
      *
      * Args:
      *     options (object):
-     *         Options for the dialog.
+     *         Options for the composer.
      *
      * Option Args:
      *     container (jQuery):
-     *         The DOM container to attach the dialog to.
+     *         The DOM container to attach the composer to.
      *
      *     review (RB.Review):
-     *         The review to show in this dialog.
+     *         The review to show in this composer.
      *
      *     reviewRequestEditor (RB.ReviewRequestEditor):
      *         The review request editor model.
      */
     create(options={}) {
-        console.assert(!RB.ReviewDialogView._instance,
-                       'A ReviewDialogView is already opened');
+        console.assert(!RB.ReviewComposerView._instance,
+                       'A ReviewComposerView is already opened');
         console.assert(options.review, 'A review must be specified');
 
-        const dialog = new RB.ReviewDialogView({
+        const composer = new RB.ReviewComposerView({
             container: options.container,
             model: options.review,
             reviewRequestEditor: options.reviewRequestEditor,
         });
-        RB.ReviewDialogView._instance = dialog;
+        RB.ReviewComposerView._instance = composer;
 
-        dialog.render();
+        composer.render();
 
-        dialog.on('closed', () => {
-            RB.ReviewDialogView._instance = null;
+        composer.on('closed', () => {
+            RB.ReviewComposerView._instance = null;
         });
 
-        return dialog;
+        return composer;
     },
 });
 
diff --git a/reviewboard/static/rb/js/views/tests/draftReviewBannerViewTests.js b/reviewboard/static/rb/js/views/tests/draftReviewBannerViewTests.js
index 08442f5a8484364402bd842546a351a5952bdd1d..f7028c97dd618592fb100af6d19528589d5992fa 100644
--- a/reviewboard/static/rb/js/views/tests/draftReviewBannerViewTests.js
+++ b/reviewboard/static/rb/js/views/tests/draftReviewBannerViewTests.js
@@ -71,12 +71,12 @@ suite('rb/views/DraftReviewBannerView', function() {
 
     describe('Button events', function() {
         it('Edit Review', function() {
-            spyOn(RB.ReviewDialogView, 'create');
+            spyOn(RB.ReviewComposerView, 'create');
 
             view.$('#review-banner-edit').click();
 
-            expect(RB.ReviewDialogView.create).toHaveBeenCalled();
-            expect(RB.ReviewDialogView.create.calls.argsFor(0)[0].review)
+            expect(RB.ReviewComposerView.create).toHaveBeenCalled();
+            expect(RB.ReviewComposerView.create.calls.argsFor(0)[0].review)
                 .toBe(model);
         });
 
diff --git a/reviewboard/static/rb/js/views/tests/reviewDialogViewTests.js b/reviewboard/static/rb/js/views/tests/reviewComposerViewTests.js
similarity index 91%
rename from reviewboard/static/rb/js/views/tests/reviewDialogViewTests.js
rename to reviewboard/static/rb/js/views/tests/reviewComposerViewTests.js
index 0304f9a103f26d289e117e6e33fada074200631f..486faaf8f5c1ccd60089171cdbc272c1333c5656 100644
--- a/reviewboard/static/rb/js/views/tests/reviewDialogViewTests.js
+++ b/reviewboard/static/rb/js/views/tests/reviewComposerViewTests.js
@@ -1,4 +1,4 @@
-suite('rb/views/ReviewDialogView', function() {
+suite('rb/views/ReviewComposerView', function() {
     var baseEmptyCommentListPayload = {
             stat: 'ok',
             total_results: 0,
@@ -68,8 +68,8 @@ suite('rb/views/ReviewDialogView', function() {
         review,
         dlg;
 
-    function createReviewDialog() {
-        return RB.ReviewDialogView.create({
+    function createReviewComposer() {
+        return RB.ReviewComposerView.create({
             review: review,
             container: $testsScratch,
             reviewRequestEditor: reviewRequestEditor
@@ -119,7 +119,7 @@ suite('rb/views/ReviewDialogView', function() {
 
     afterEach(function() {
         RB.DnDUploader.instance = null;
-        RB.ReviewDialogView._instance = null;
+        RB.ReviewComposerView._instance = null;
         RB.EnabledFeatures.generalComments = origGeneralCommentsEnabled;
     });
 
@@ -127,32 +127,32 @@ suite('rb/views/ReviewDialogView', function() {
         describe('create', function() {
             it('Without a review', function() {
                 expect(function() {
-                    RB.ReviewDialogView.create({
+                    RB.ReviewComposerView.create({
                         container: $testsScratch,
                         reviewRequestEditor: reviewRequestEditor
                     });
                 }).toThrow();
 
-                expect(RB.ReviewDialogView._instance).toBeFalsy();
+                expect(RB.ReviewComposerView._instance).toBeFalsy();
                 expect($testsScratch.children().length).toBe(0);
             });
 
             it('With a review', function() {
-                dlg = createReviewDialog();
+                dlg = createReviewComposer();
 
                 expect(dlg).toBeTruthy();
-                expect(RB.ReviewDialogView._instance).toBe(dlg);
+                expect(RB.ReviewComposerView._instance).toBe(dlg);
 
-                /* One for the dialog, one for the background box. */
+                /* One for the composer, one for the background box. */
                 expect($testsScratch.children().length).toBe(2);
             });
 
             it('With existing instance', function() {
-                dlg = createReviewDialog();
+                dlg = createReviewComposer();
 
-                expect(createReviewDialog).toThrow();
+                expect(createReviewComposer).toThrow();
 
-                expect(RB.ReviewDialogView._instance).toBe(dlg);
+                expect(RB.ReviewComposerView._instance).toBe(dlg);
                 expect($testsScratch.children().length).toBe(2);
             });
         });
@@ -161,12 +161,12 @@ suite('rb/views/ReviewDialogView', function() {
     describe('Instances', function() {
         describe('Methods', function() {
             it('close', function() {
-                dlg = createReviewDialog();
+                dlg = createReviewComposer();
                 expect($testsScratch.children().length).toBe(2);
 
                 dlg.close();
                 expect($testsScratch.children().length).toBe(0);
-                expect(RB.ReviewDialogView._instance).toBe(null);
+                expect(RB.ReviewComposerView._instance).toBe(null);
             });
         });
 
@@ -174,7 +174,7 @@ suite('rb/views/ReviewDialogView', function() {
             it('With new review', function() {
                 expect(review.isNew()).toBe(true);
 
-                dlg = RB.ReviewDialogView.create({
+                dlg = RB.ReviewComposerView.create({
                     review: review,
                     container: $testsScratch,
                     reviewRequestEditor: reviewRequestEditor
@@ -200,7 +200,7 @@ suite('rb/views/ReviewDialogView', function() {
                 });
 
                 it('Clearing body bottom hides footer', function() {
-                    dlg = RB.ReviewDialogView.create({
+                    dlg = RB.ReviewComposerView.create({
                         review: review,
                         container: $testsScratch,
                         reviewRequestEditor: reviewRequestEditor
@@ -277,7 +277,7 @@ suite('rb/views/ReviewDialogView', function() {
 
                 describe('Review properties', function() {
                     function testLoadReview() {
-                        dlg = RB.ReviewDialogView.create({
+                        dlg = RB.ReviewComposerView.create({
                             review: review,
                             container: $testsScratch,
                             reviewRequestEditor: reviewRequestEditor
@@ -325,7 +325,7 @@ suite('rb/views/ReviewDialogView', function() {
 
                         RB.EnabledFeatures.generalComments = false;
 
-                        dlg = RB.ReviewDialogView.create({
+                        dlg = RB.ReviewComposerView.create({
                             review: review,
                             container: $testsScratch,
                             reviewRequestEditor: reviewRequestEditor
@@ -351,7 +351,7 @@ suite('rb/views/ReviewDialogView', function() {
                                 generalCommentPayload
                             ];
 
-                            dlg = RB.ReviewDialogView.create({
+                            dlg = RB.ReviewComposerView.create({
                                 review: review,
                                 container: $testsScratch,
                                 reviewRequestEditor: reviewRequestEditor
@@ -448,7 +448,7 @@ suite('rb/views/ReviewDialogView', function() {
                         diffCommentsPayload.diff_comments =
                             [diffCommentPayload];
 
-                        dlg = RB.ReviewDialogView.create({
+                        dlg = RB.ReviewComposerView.create({
                             review: review,
                             container: $testsScratch,
                             reviewRequestEditor: reviewRequestEditor
@@ -536,7 +536,7 @@ suite('rb/views/ReviewDialogView', function() {
                         fileAttachmentCommentsPayload.file_attachment_comments =
                             [fileAttachmentCommentPayload];
 
-                        dlg = RB.ReviewDialogView.create({
+                        dlg = RB.ReviewComposerView.create({
                             review: review,
                             container: $testsScratch,
                             reviewRequestEditor: reviewRequestEditor
@@ -637,7 +637,7 @@ suite('rb/views/ReviewDialogView', function() {
                             screenshotCommentPayload
                         ];
 
-                        dlg = createReviewDialog();
+                        dlg = createReviewComposer();
 
                         expect($.ajax).toHaveBeenCalled();
                         expect($.ajax.calls.argsFor(1)[0].url).toBe(
@@ -746,7 +746,7 @@ suite('rb/views/ReviewDialogView', function() {
             function testSaveComment(richText) {
                 var newCommentText = 'New comment text';
 
-                dlg = createReviewDialog();
+                dlg = createReviewComposer();
 
                 expect(dlg._commentViews.length).toBe(1);
 
@@ -772,7 +772,7 @@ suite('rb/views/ReviewDialogView', function() {
 
                 delete window.rbTestFoundXSS;
 
-                dlg = createReviewDialog();
+                dlg = createReviewComposer();
 
                 expect(dlg._commentViews.length).toBe(1);
 
@@ -861,7 +861,7 @@ suite('rb/views/ReviewDialogView', function() {
                 }
 
                 beforeEach(function() {
-                    dlg = createReviewDialog();
+                    dlg = createReviewComposer();
                 });
 
                 describe('Body Top', function() {
@@ -995,6 +995,62 @@ suite('rb/views/ReviewDialogView', function() {
                 it('For plain text', function() {
                     testSaveComment(false);
                 });
+
+                it('Toggle issue with label. Check issue status.', function() {
+                    let initialValue = commentView.$issueOpened.prop('checked')
+                    let expectedValue;
+                    if (initialValue == true) {
+                        expectedValue = false;
+                    }
+                    else {
+                        expectedValue = true;
+                    }
+                    dlg.$('.toggleIssue').click();
+                    expect(commentView.$issueOpened.prop('checked'))
+                    .toBe(generalCommentPayload.issue_opened);
+                });
+
+                it('Toggle issue with label. Check checkbox status.', function() {
+                    let initialValue = commentView.$issueOpened.prop('checked')
+                    let expectedValue;
+                    if (initialValue == true) {
+                        expectedValue = false;
+                    }
+                    else {
+                        expectedValue = true;
+                    }
+                    dlg.$('.toggleIssue').click();
+                    expect(commentView.$issueOpened.prop('checked'))
+                    .toBe(expectedValue);
+                });
+
+                it('Close issue with label. Check issue status.', function() {
+                    let initialValue = commentView.$issueOpened.prop('checked')
+                    let expectedValue;
+                    if (initialValue == false) {
+                        expectedValue = true;
+                    }
+                    else {
+                        expectedValue = false;
+                    }
+                    dlg.$('.toggleIssue').click();
+                    expect(commentView.$issueOpened.prop('checked'))
+                    .toBe(generalCommentPayload.issue_opened);
+                });
+
+                it('Close issue with label. Check checkbox status.', function() {
+                    let initialValue = commentView.$issueOpened.prop('checked')
+                    let expectedValue;
+                    if (initialValue == false) {
+                        expectedValue = true;
+                    }
+                    else {
+                        expectedValue = false;
+                    }
+                    dlg.$('.toggleIssue').click();
+                    expect(commentView.$issueOpened.prop('checked'))
+                    .toBe(expectedValue);
+                });
             });
 
             describe('Screenshot comments', function() {
diff --git a/reviewboard/staticbundles.py b/reviewboard/staticbundles.py
index 575373674de2a4536e38fa0ef295d2d7b6486e44..1684fc1d6714aca21db289428077014f5bab48b5 100644
--- a/reviewboard/staticbundles.py
+++ b/reviewboard/staticbundles.py
@@ -128,7 +128,7 @@ PIPELINE_JAVASCRIPT = dict({
             'rb/js/views/tests/diffFragmentViewTests.es6.js',
             'rb/js/views/tests/draftReviewBannerViewTests.js',
             'rb/js/views/tests/fileAttachmentThumbnailViewTests.js',
-            'rb/js/views/tests/reviewDialogViewTests.js',
+            'rb/js/views/tests/reviewComposerViewTests.js',
             'rb/js/views/tests/reviewRequestEditorViewTests.js',
             'rb/js/views/tests/screenshotThumbnailViewTests.js',
         ),
@@ -277,7 +277,7 @@ PIPELINE_JAVASCRIPT = dict({
             'rb/js/views/fileAttachmentThumbnailView.es6.js',
             'rb/js/views/floatingBannerView.js',
             'rb/js/views/regionCommentBlockView.es6.js',
-            'rb/js/views/reviewDialogView.es6.js',
+            'rb/js/views/reviewComposerView.es6.js',
             'rb/js/views/reviewRequestFieldViews.es6.js',
             'rb/js/views/reviewRequestEditorView.es6.js',
             'rb/js/views/screenshotThumbnailView.js',
