diff --git a/app/assets/javascripts/admin/components/group-member.js.es6 b/app/assets/javascripts/admin/components/group-member.js.es6
new file mode 100644
index 00000000000..abf0f2984a4
--- /dev/null
+++ b/app/assets/javascripts/admin/components/group-member.js.es6
@@ -0,0 +1,9 @@
+export default Ember.Component.extend({
+  classNames: ["item"],
+
+  actions: {
+    remove() {
+      this.sendAction('removeAction', this.get('member'));
+    }
+  }
+});
diff --git a/app/assets/javascripts/admin/controllers/admin-group.js.es6 b/app/assets/javascripts/admin/controllers/admin-group.js.es6
index 21ef6139971..93213e2c661 100644
--- a/app/assets/javascripts/admin/controllers/admin-group.js.es6
+++ b/app/assets/javascripts/admin/controllers/admin-group.js.es6
@@ -6,14 +6,14 @@ export default Em.ObjectController.extend({
   disableSave: false,
 
   currentPage: function() {
-    if (this.get("user_count") === 0) { return 0; }
-    return Math.floor(this.get("offset") / this.get("limit")) + 1;
-  }.property("limit", "offset", "user_count"),
+    if (this.get("model.user_count") === 0) { return 0; }
+    return Math.floor(this.get("model.offset") / this.get("model.limit")) + 1;
+  }.property("model.limit", "model.offset", "model.user_count"),
 
   totalPages: function() {
-    if (this.get("user_count") === 0) { return 0; }
-    return Math.floor(this.get("user_count") / this.get("limit")) + 1;
-  }.property("limit", "user_count"),
+    if (this.get("model.user_count") === 0) { return 0; }
+    return Math.floor(this.get("model.user_count") / this.get("model.limit")) + 1;
+  }.property("model.limit", "model.user_count"),
 
   showingFirst: Em.computed.lte("currentPage", 1),
   showingLast: propertyEqual("currentPage", "totalPages"),
@@ -32,7 +32,7 @@ export default Em.ObjectController.extend({
       if (this.get("showingLast")) { return; }
 
       const group = this.get("model"),
-            offset = Math.min(group.get("offset") + group.get("limit"), group.get("user_count"));
+            offset = Math.min(group.get("offset") + group.get("model.limit"), group.get("user_count"));
 
       group.set("offset", offset);
 
@@ -43,7 +43,7 @@ export default Em.ObjectController.extend({
       if (this.get("showingFirst")) { return; }
 
       const group = this.get("model"),
-            offset = Math.max(group.get("offset") - group.get("limit"), 0);
+            offset = Math.max(group.get("offset") - group.get("model.limit"), 0);
 
       group.set("offset", offset);
 
@@ -52,7 +52,7 @@ export default Em.ObjectController.extend({
 
     removeMember(member) {
       const self = this,
-            message = I18n.t("admin.groups.delete_member_confirm", { username: member.get("username"), group: this.get("name") });
+            message = I18n.t("admin.groups.delete_member_confirm", { username: member.get("username"), group: this.get("model.name") });
       return bootbox.confirm(message, I18n.t("no_value"), I18n.t("yes_value"), function(confirm) {
         if (confirm) {
           self.get("model").removeMember(member);
@@ -61,10 +61,9 @@ export default Em.ObjectController.extend({
     },
 
     addMembers() {
-      if (Em.isEmpty(this.get("usernames"))) { return; }
-      this.get("model").addMembers(this.get("usernames"));
-      // clear the user selector
-      this.set("usernames", null);
+      if (Em.isEmpty(this.get("model.usernames"))) { return; }
+      this.get("model").addMembers(this.get("model.usernames")).catch(popupAjaxError);
+      this.set("model.usernames", null);
     },
 
     save() {
diff --git a/app/assets/javascripts/admin/routes/admin-group.js.es6 b/app/assets/javascripts/admin/routes/admin-group.js.es6
index f397297767f..fd56aeca52d 100644
--- a/app/assets/javascripts/admin/routes/admin-group.js.es6
+++ b/app/assets/javascripts/admin/routes/admin-group.js.es6
@@ -11,9 +11,7 @@ export default Discourse.Route.extend({
 
   setupController: function(controller, model) {
     controller.set("model", model);
-    // clear the user selector
-    controller.set("usernames", null);
-    // load the members of the group
+    controller.set("model.usernames", null);
     model.findMembers();
   }
 
diff --git a/app/assets/javascripts/admin/templates/components/group-member.hbs b/app/assets/javascripts/admin/templates/components/group-member.hbs
new file mode 100644
index 00000000000..d476fdf033a
--- /dev/null
+++ b/app/assets/javascripts/admin/templates/components/group-member.hbs
@@ -0,0 +1 @@
+<a href={{member.adminPath}}>{{avatar member imageSize="small"}}</a> {{member.username}} {{#unless automatic}}<a class='remove' {{action "remove"}}>{{fa-icon "times"}}</a>{{/unless}}
diff --git a/app/assets/javascripts/admin/templates/group.hbs b/app/assets/javascripts/admin/templates/group.hbs
index d17167a66f5..6260d12aab3 100644
--- a/app/assets/javascripts/admin/templates/group.hbs
+++ b/app/assets/javascripts/admin/templates/group.hbs
@@ -1,31 +1,33 @@
 <form class="form-horizontal">
 
   <div>
-    {{#if automatic}}
-      <h3>{{name}}</h3>
+    {{#if model.automatic}}
+      <h3>{{model.name}}</h3>
     {{else}}
       <label for="name">{{i18n 'admin.groups.name'}}</label>
-      {{text-field name="name" value=name placeholderKey="admin.groups.name_placeholder"}}
+      {{text-field name="name" value=model.name placeholderKey="admin.groups.name_placeholder"}}
     {{/if}}
   </div>
 
-  {{#if id}}
+  {{#if model.id}}
     <div>
-      <label>{{i18n 'admin.groups.group_members'}} ({{user_count}})</label>
+      <label>{{i18n 'admin.groups.group_members'}} ({{model.user_count}})</label>
       <div>
         <a {{bind-attr class=":previous showingFirst:disabled"}} {{action "previous"}}>{{fa-icon "fast-backward"}}</a>
         {{currentPage}}/{{totalPages}}
         <a {{bind-attr class=":next showingLast:disabled"}} {{action "next"}}>{{fa-icon "fast-forward"}}</a>
       </div>
       <div class="ac-wrap clearfix">
-        {{each member in members itemView="group-member"}}
+        {{#each model.members as |member|}}
+          {{group-member member=member automatic=model.automatic removeAction="removeMember"}}
+        {{/each}}
       </div>
     </div>
 
-    {{#unless automatic}}
+    {{#unless model.automatic}}
       <div>
         <label for="user-selector">{{i18n 'admin.groups.add_members'}}</label>
-        {{user-selector usernames=usernames placeholderKey="admin.groups.selector_placeholder" id="user-selector"}}
+        {{user-selector usernames=model.usernames placeholderKey="admin.groups.selector_placeholder" id="user-selector"}}
         <button {{action "addMembers"}} class='btn add'>{{fa-icon "plus"}} {{i18n 'admin.groups.add'}}</button>
       </div>
     {{/unless}}
@@ -33,15 +35,15 @@
 
   <div>
     <label>
-      {{input type="checkbox" checked=visible}}
+      {{input type="checkbox" checked=model.visible}}
       {{i18n 'groups.visible'}}
     </label>
   </div>
 
-  {{#unless automatic}}
+  {{#unless model.automatic}}
   <div>
     <label for="primary_group">
-      {{input type="checkbox" checked=primary_group}}
+      {{input type="checkbox" checked=model.primary_group}}
       {{i18n 'admin.groups.primary_group'}}
     </label>
   </div>
@@ -49,15 +51,15 @@
 
   <div>
     <label for="alias">{{i18n 'groups.alias_levels.title'}}</label>
-    {{combo-box name="alias" valueAttribute="value" value=alias_level content=aliasLevelOptions}}
+    {{combo-box name="alias" valueAttribute="value" value=model.alias_level content=aliasLevelOptions}}
   </div>
 
-  {{#unless automatic}}
+  {{#unless model.automatic}}
     <div>
       <label for="automatic_membership">{{i18n 'admin.groups.automatic_membership_email_domains'}}</label>
-      {{list-setting name="automatic_membership" settingValue=emailDomains}}
+      {{list-setting name="automatic_membership" settingValue=model.emailDomains}}
       <label>
-        {{input type="checkbox" checked=automatic_membership_retroactive}}
+        {{input type="checkbox" checked=model.automatic_membership_retroactive}}
         {{i18n 'admin.groups.automatic_membership_retroactive'}}
       </label>
     </div>
@@ -66,13 +68,13 @@
       <label for="title">
         {{i18n 'admin.groups.default_title'}}
       </label>
-        {{input value=title}}
+        {{input value=model.title}}
     </div>
   {{/unless}}
 
   <div class='buttons'>
     <button {{action "save"}} {{bind-attr disabled="disableSave"}} class='btn btn-primary'>{{i18n 'admin.customize.save'}}</button>
-    {{#unless automatic}}
+    {{#unless model.automatic}}
       <button {{action "destroy"}} class='btn btn-danger'>{{fa-icon "trash-o"}}{{i18n 'admin.customize.delete'}}</button>
     {{/unless}}
   </div>
diff --git a/app/assets/javascripts/admin/templates/group_member.hbs b/app/assets/javascripts/admin/templates/group_member.hbs
deleted file mode 100644
index 1c344ba7390..00000000000
--- a/app/assets/javascripts/admin/templates/group_member.hbs
+++ /dev/null
@@ -1 +0,0 @@
-<a href='{{unbound member.adminPath}}'>{{avatar member imageSize="small"}}</a> {{member.username}} {{#unless automatic}}<a class='remove' {{action "removeMember" member}}>{{fa-icon "times"}}</a>{{/unless}}
diff --git a/app/assets/javascripts/admin/views/group-member.js.es6 b/app/assets/javascripts/admin/views/group-member.js.es6
deleted file mode 100644
index 7889fd59cf7..00000000000
--- a/app/assets/javascripts/admin/views/group-member.js.es6
+++ /dev/null
@@ -1,4 +0,0 @@
-export default Discourse.View.extend({
-  classNames: ["item"],
-  templateName: "admin/templates/group_member"
-});
diff --git a/app/assets/javascripts/discourse/models/group.js.es6 b/app/assets/javascripts/discourse/models/group.js.es6
index 984941e89f0..b79db164f48 100644
--- a/app/assets/javascripts/discourse/models/group.js.es6
+++ b/app/assets/javascripts/discourse/models/group.js.es6
@@ -50,14 +50,7 @@ const Group = Discourse.Model.extend({
       type: "PUT",
       data: { usernames: usernames }
     }).then(function() {
-      // reload member list
       self.findMembers();
-    }).catch(function(error) {
-      if (error && error.responseText) {
-        bootbox.alert($.parseJSON(error.responseText).errors[0]);
-      } else {
-        bootbox.alert(I18n.t('generic_error'));
-      }
     });
   },