diff --git a/app/assets/javascripts/admin/components/resumable_upload_component.js b/app/assets/javascripts/admin/components/resumable_upload_component.js
index 3e3c1ad6f..a5ef4af92 100644
--- a/app/assets/javascripts/admin/components/resumable_upload_component.js
+++ b/app/assets/javascripts/admin/components/resumable_upload_component.js
@@ -9,13 +9,8 @@
         error="errorAction"
         uploadText="UPLOAD"
     }}
-
-  @class ResumableUploadComponent
-  @extends Ember.Component
-  @namespace Discourse
-  @module Discourse
 **/
-Discourse.ResumableUploadComponent = Ember.Component.extend({
+Discourse.ResumableUploadComponent = Ember.Component.extend(Discourse.StringBuffer, {
   tagName: "button",
   classNames: ["btn", "ru"],
   classNameBindings: ["isUploading"],
@@ -25,7 +20,7 @@ Discourse.ResumableUploadComponent = Ember.Component.extend({
   isUploading: false,
   progress: 0,
 
-  shouldRerender: Discourse.View.renderIfChanged("isUploading", "progress"),
+  rerenderTriggers: ['isUploading', 'progress'],
 
   text: function() {
     if (this.get("isUploading")) {
@@ -35,7 +30,7 @@ Discourse.ResumableUploadComponent = Ember.Component.extend({
     }
   }.property("isUploading", "progress"),
 
-  render: function(buffer) {
+  renderString: function(buffer) {
     var icon = this.get("isUploading") ? "times" : "upload";
     buffer.push("<i class='fa fa-" + icon + "'></i>");
     buffer.push("<span class='ru-label'>" + this.get("text") + "</span>");
diff --git a/app/assets/javascripts/discourse/mixins/string-buffer.js.es6 b/app/assets/javascripts/discourse/mixins/string-buffer.js.es6
new file mode 100644
index 000000000..070dfd127
--- /dev/null
+++ b/app/assets/javascripts/discourse/mixins/string-buffer.js.es6
@@ -0,0 +1,27 @@
+export default Ember.Mixin.create({
+
+  _watchProps: function() {
+    var args = this.get('rerenderTriggers');
+    if (!Ember.isNone(args)) {
+      var self = this;
+      args.forEach(function(k) {
+        self.addObserver(k, self.rerenderString);
+      });
+    }
+  }.on('init'),
+
+  render: function(buffer) {
+    this.renderString(buffer);
+  },
+
+  _rerenderString: function() {
+    var buffer = [];
+    this.renderString(buffer);
+    this.$().html(buffer.join(''));
+  },
+
+  rerenderString: function() {
+    Ember.run.once(this, '_rerenderString');
+  }
+
+});