diff --git a/app/assets/javascripts/discourse/controllers/edit-category.js.es6 b/app/assets/javascripts/discourse/controllers/edit-category.js.es6
index 52e0e45bc..ad1e1f235 100644
--- a/app/assets/javascripts/discourse/controllers/edit-category.js.es6
+++ b/app/assets/javascripts/discourse/controllers/edit-category.js.es6
@@ -100,16 +100,12 @@ export default ObjectController.extend(ModalFunctionality, {
     return name.trim().length > 0 ? name : I18n.t("preview");
   }.property('name'),
 
-  buttonTitle: function() {
-    if (this.get('saving')) return I18n.t("saving");
-    if (this.get('model.isUncategorizedCategory')) return I18n.t("save");
-    return (this.get('model.id') ? I18n.t("category.save") : I18n.t("category.create"));
+  saveLabel: function() {
+    if (this.get('saving')) return "saving";
+    if (this.get('model.isUncategorizedCategory')) return "save";
+    return this.get('model.id') ? "category.save" : "category.create";
   }.property('saving', 'model.id'),
 
-  deleteButtonTitle: function() {
-    return I18n.t('category.delete');
-  }.property(),
-
   showDescription: function() {
     return !this.get('model.isUncategorizedCategory') && this.get('model.id');
   }.property('model.isUncategorizedCategory', 'model.id'),
@@ -149,7 +145,6 @@ export default ObjectController.extend(ModalFunctionality, {
         self.send('closeModal');
         model.setProperties({slug: result.category.slug, id: result.category.id });
         Discourse.URL.redirectTo("/c/" + Discourse.Category.slugFor(model));
-
       }).catch(function(error) {
         if (error && error.responseText) {
           self.flash($.parseJSON(error.responseText).errors[0], 'error');
diff --git a/app/assets/javascripts/discourse/templates/modal/edit-category-general.hbs b/app/assets/javascripts/discourse/templates/modal/edit-category-general.hbs
index e04fd2a76..21c724abe 100644
--- a/app/assets/javascripts/discourse/templates/modal/edit-category-general.hbs
+++ b/app/assets/javascripts/discourse/templates/modal/edit-category-general.hbs
@@ -53,7 +53,7 @@
       <div class='input-prepend input-append'>
         <span class='color-title'>{{i18n 'category.foreground_color'}}:</span>
         <span class='add-on'>#</span>{{text-field value=model.text_color placeholderKey="category.color_placeholder" maxlength="6"}}
-        {{color-picker colors=foregroundColors value=model.text_color}}
+        {{color-picker colors=foregroundColors value=model.text_color id='edit-text-color'}}
       </div>
     </div>
   </section>
diff --git a/app/assets/javascripts/discourse/templates/modal/edit-category.hbs b/app/assets/javascripts/discourse/templates/modal/edit-category.hbs
index bfd64468a..ac5ff0585 100644
--- a/app/assets/javascripts/discourse/templates/modal/edit-category.hbs
+++ b/app/assets/javascripts/discourse/templates/modal/edit-category.hbs
@@ -9,15 +9,20 @@
   </ul>
 
   <div class="modal-body">
-    {{#each tab in view.panels}}
+    {{#each view.panels as |tab|}}
       {{view 'edit-category-panel' tab=tab}}
     {{/each}}
   </div>
 
   <div class="modal-footer">
-    <button class='btn btn-primary' {{bind-attr disabled="disabled"}} {{action "saveCategory"}}>{{buttonTitle}}</button>
+    {{d-button id="save-category" class="btn-primary" disabled=disabled action="saveCategory" label=saveLabel}}
+
     {{#if model.can_delete}}
-      <button class='btn btn-danger pull-right' {{bind-attr disabled="deleteDisabled"}} {{action "deleteCategory"}}><i class="fa fa-trash-o"></i>{{deleteButtonTitle}}</button>
+      {{d-button class="btn-danger pull-right"
+                 disabled=deleteDisabled
+                 action="deleteCategory"
+                 icon="trash-o"
+                 label="category.delete"}}
     {{else}}
       <div class="cannot_delete_reason">
         {{{model.cannot_delete_reason}}}
diff --git a/test/javascripts/acceptance/category-edit-test.js.es6 b/test/javascripts/acceptance/category-edit-test.js.es6
index e1dbc2b49..e0975d5c2 100644
--- a/test/javascripts/acceptance/category-edit-test.js.es6
+++ b/test/javascripts/acceptance/category-edit-test.js.es6
@@ -2,7 +2,7 @@ import { acceptance } from "helpers/qunit-helpers";
 
 acceptance("Category Edit", { loggedIn: true });
 
-test("Can edit a category", (assert) => {
+test("Can open the category modal", (assert) => {
   visit("/c/bug");
 
   click('.edit-category');
@@ -15,3 +15,15 @@ test("Can edit a category", (assert) => {
     assert.ok(!visible('#discourse-modal'), 'it closes the modal');
   });
 });
+
+test("Change the category color", (assert) => {
+  visit("/c/bug");
+
+  click('.edit-category');
+  fillIn('#edit-text-color', '#ff0000');
+  click('#save-category');
+  andThen(() => {
+    assert.ok(!visible('#discourse-modal'), 'it closes the modal');
+    assert.equal(Discourse.URL.redirectedTo, '/c/bug', 'it does one of the rare full page redirects');
+  });
+});
diff --git a/test/javascripts/helpers/create-pretender.js.es6 b/test/javascripts/helpers/create-pretender.js.es6
index cad384f5e..60994d163 100644
--- a/test/javascripts/helpers/create-pretender.js.es6
+++ b/test/javascripts/helpers/create-pretender.js.es6
@@ -119,6 +119,11 @@ export default function() {
 
     this.get('/users/:username/staff-info.json', () => response({}));
 
+    this.put('/categories/:category_id', function(request) {
+      const category = parsePostData(request.requestBody);
+      return response({category});
+    });
+
     this.get('/draft.json', function() {
       return response({});
     });
diff --git a/test/javascripts/test_helper.js b/test/javascripts/test_helper.js
index 537575842..e29c25cd2 100644
--- a/test/javascripts/test_helper.js
+++ b/test/javascripts/test_helper.js
@@ -90,6 +90,12 @@ QUnit.testStart(function(ctx) {
   Discourse.BaseUrl = "localhost";
   Discourse.User.resetCurrent();
   Discourse.Site.resetCurrent(Discourse.Site.create(fixtures['site.json'].site));
+
+  Discourse.URL.redirectedTo = null;
+  Discourse.URL.redirectTo = function(url) {
+    Discourse.URL.redirectedTo = url;
+  };
+
   PreloadStore.reset();
 
   window.sandbox = sinon.sandbox.create();