diff --git a/CHANGELOG b/CHANGELOG
index 90ade156caf2c75cf58183d12476fdf606e2c12d..8916b9f0403e9ed92790966216dedc35f9e24250 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,7 @@ Please view this file on the master branch, on stable branches it's out of date.
 
 v 8.3.0 (unreleased)
   - Fix: Assignee selector is empty when 'Unassigned' is selected (Jose Corcuera)
+  - Fix 500 error when update group member permission
 
 v 8.2.1
   - Forcefully update builds that didn't want to update with state machine
diff --git a/app/views/groups/group_members/_group_member.html.haml b/app/views/groups/group_members/_group_member.html.haml
index be94b1abc11fdf2de51de541309f1bd224b66b82..bae67552a10fe439af40782dad07ca794b0d0958 100644
--- a/app/views/groups/group_members/_group_member.html.haml
+++ b/app/views/groups/group_members/_group_member.html.haml
@@ -30,7 +30,7 @@
 
   - if should_user_see_group_roles?(current_user, @group)
     %span.pull-right
-      %strong= member.human_access
+      %strong.member-access-level= member.human_access
       - if show_controls
         - if can?(current_user, :update_group_member, member)
           = button_tag class: "btn-xs btn js-toggle-button",
diff --git a/app/views/groups/group_members/update.js.haml b/app/views/groups/group_members/update.js.haml
index 5bad48abafd0e908d7dcf6eca0de33c39fefdfc2..df726e2b2b9f355528af9b3ba3247c159815847c 100644
--- a/app/views/groups/group_members/update.js.haml
+++ b/app/views/groups/group_members/update.js.haml
@@ -1,2 +1,2 @@
 :plain
-  $("##{dom_id(@member)}").replaceWith('#{escape_javascript(render(@member, member: @member, show_controls: true))}');
+  $("##{dom_id(@group_member)}").replaceWith('#{escape_javascript(render(@group_member, member: @group_member, show_controls: true))}');
diff --git a/features/groups.feature b/features/groups.feature
index abf3769a84446c7355cf924a30abe0b2549892a2..938e658f2a96ec0e3ef6a2a5f1a5965a2319e6b5 100644
--- a/features/groups.feature
+++ b/features/groups.feature
@@ -74,6 +74,13 @@ Feature: Groups
     When I select "sjobs@apple.com" as "Reporter"
     Then I should see "sjobs@apple.com" in team list as invited "Reporter"
 
+  @javascript
+  Scenario: Edit group member permissions
+    Given "Mary Jane" is guest of group "Owned"
+    And I visit group "Owned" members page
+    When I change the "Mary Jane" role to "Developer"
+    Then I should see "Mary Jane" as "Developer"
+
   # Leave
 
   @javascript
diff --git a/features/steps/groups.rb b/features/steps/groups.rb
index 9c0313537b12db5573d86d1e956494dfc34e543c..7c991af4c2b65253bc4e7b2079557be2c7f279d2 100644
--- a/features/steps/groups.rb
+++ b/features/steps/groups.rb
@@ -26,7 +26,7 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'Group "Owned" has a public project "Public-project"' do
-    group = Group.find_by(name: "Owned")
+    group = owned_group
 
     @project = create :empty_project, :public,
                  group: group,
@@ -91,7 +91,7 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I should see group "Owned" projects list' do
-    Group.find_by(name: "Owned").projects.each do |project|
+    owned_group.projects.each do |project|
       expect(page).to have_link project.name
     end
   end
@@ -172,12 +172,12 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   step 'I change group "Owned" avatar' do
     attach_file(:group_avatar, File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif'))
     click_button "Save group"
-    Group.find_by(name: "Owned").reload
+    owned_group.reload
   end
 
   step 'I should see new group "Owned" avatar' do
-    expect(Group.find_by(name: "Owned").avatar).to be_instance_of AvatarUploader
-    expect(Group.find_by(name: "Owned").avatar.url).to eq "/uploads/group/avatar/#{ Group.find_by(name:"Owned").id }/banana_sample.gif"
+    expect(owned_group.avatar).to be_instance_of AvatarUploader
+    expect(owned_group.avatar.url).to eq "/uploads/group/avatar/#{ Group.find_by(name:"Owned").id }/banana_sample.gif"
   end
 
   step 'I should see the "Remove avatar" button' do
@@ -187,16 +187,16 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   step 'I have group "Owned" avatar' do
     attach_file(:group_avatar, File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif'))
     click_button "Save group"
-    Group.find_by(name: "Owned").reload
+    owned_group.reload
   end
 
   step 'I remove group "Owned" avatar' do
     click_link "Remove avatar"
-    Group.find_by(name: "Owned").reload
+    owned_group.reload
   end
 
   step 'I should not see group "Owned" avatar' do
-    expect(Group.find_by(name: "Owned").avatar?).to eq false
+    expect(owned_group.avatar?).to eq false
   end
 
   step 'I should not see the "Remove avatar" button' do
@@ -295,18 +295,49 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
     end
   end
 
+  step 'I change the "Mary Jane" role to "Developer"' do
+    member = mary_jane_member
+
+    page.within "#group_member_#{member.id}" do
+      find(".js-toggle-button").click
+      page.within "#edit_group_member_#{member.id}" do
+        select 'Developer', from: 'group_member_access_level'
+        click_on 'Save'
+      end
+    end
+  end
+
+  step 'I should see "Mary Jane" as "Developer"' do
+    member = mary_jane_member
+
+    page.within "#group_member_#{member.id}" do
+      page.within '.member-access-level' do
+        expect(page).to have_content "Developer"
+      end
+    end
+  end
+
   protected
 
+  def owned_group
+    @owned_group ||= Group.find_by(name: "Owned")
+  end
+
+  def mary_jane_member
+    user = User.find_by(name: "Mary Jane")
+    owned_group.members.find_by(user_id: user.id)
+  end
+
   def assigned_to_me(key)
     project.send(key).where(assignee_id: current_user.id)
   end
 
   def project
-    Group.find_by(name: "Owned").projects.first
+    owned_group.projects.first
   end
 
   def group_milestone
-    group = Group.find_by(name: "Owned")
+    group = owned_group
 
     @project1 = create :project,
                  group: group