diff --git a/features/steps/admin/applications.rb b/features/steps/admin/applications.rb
index d59088fa3c32c815dc0f9aa0482bd2abd9762876..7c12cb969211bac8776bc3bae7c88e936cd0b356 100644
--- a/features/steps/admin/applications.rb
+++ b/features/steps/admin/applications.rb
@@ -8,7 +8,7 @@ class Spinach::Features::AdminApplications < Spinach::FeatureSteps
   end
 
   step 'I should see application form' do
-    page.should have_content "New application"
+    expect(page).to have_content "New application"
   end
 
   step 'I fill application form out and submit' do
@@ -18,9 +18,9 @@ class Spinach::Features::AdminApplications < Spinach::FeatureSteps
   end
 
   step 'I see application' do
-    page.should have_content "Application: test"
-    page.should have_content "Application Id"
-    page.should have_content "Secret"
+    expect(page).to have_content "Application: test"
+    expect(page).to have_content "Application Id"
+    expect(page).to have_content "Secret"
   end
 
   step 'I click edit' do
@@ -28,28 +28,28 @@ class Spinach::Features::AdminApplications < Spinach::FeatureSteps
   end
 
   step 'I see edit application form' do
-    page.should have_content "Edit application"
+    expect(page).to have_content "Edit application"
   end
 
   step 'I change name of application and submit' do
-    page.should have_content "Edit application"
+    expect(page).to have_content "Edit application"
     fill_in :doorkeeper_application_name, with: 'test_changed'
     click_on "Submit"
   end
 
   step 'I see that application was changed' do
-    page.should have_content "test_changed"
-    page.should have_content "Application Id"
-    page.should have_content "Secret"
+    expect(page).to have_content "test_changed"
+    expect(page).to have_content "Application Id"
+    expect(page).to have_content "Secret"
   end
 
   step 'I click to remove application' do
-    within '.oauth-applications' do
+    page.within '.oauth-applications' do
       click_on "Destroy"
     end
   end
 
   step "I see that application is removed" do
-    page.find(".oauth-applications").should_not have_content "test_changed"
+    expect(page.find(".oauth-applications")).not_to have_content "test_changed"
   end
 end
diff --git a/features/steps/admin/broadcast_messages.rb b/features/steps/admin/broadcast_messages.rb
index a35fa34a3a295e6d93fb14e3350ba41e95568af7..2ecb6f0191a7bb20dd75852ffd10f1e24ff3fc4c 100644
--- a/features/steps/admin/broadcast_messages.rb
+++ b/features/steps/admin/broadcast_messages.rb
@@ -8,7 +8,7 @@ class Spinach::Features::AdminBroadcastMessages < Spinach::FeatureSteps
   end
 
   step 'I should be all broadcast messages' do
-    page.should have_content "Migration to new server"
+    expect(page).to have_content "Migration to new server"
   end
 
   step 'submit form with new broadcast message' do
@@ -18,11 +18,11 @@ class Spinach::Features::AdminBroadcastMessages < Spinach::FeatureSteps
   end
 
   step 'I should be redirected to admin messages page' do
-    current_path.should == admin_broadcast_messages_path
+    expect(current_path).to eq admin_broadcast_messages_path
   end
 
   step 'I should see newly created broadcast message' do
-    page.should have_content 'Application update from 4:00 CST to 5:00 CST'
+    expect(page).to have_content 'Application update from 4:00 CST to 5:00 CST'
   end
 
   step 'submit form with new customized broadcast message' do
@@ -35,7 +35,7 @@ class Spinach::Features::AdminBroadcastMessages < Spinach::FeatureSteps
   end
 
   step 'I should see a customized broadcast message' do
-    page.should have_content 'Application update from 4:00 CST to 5:00 CST'
-    page.should have_selector %(div[style="background-color:#f2dede;color:#b94a48"])
+    expect(page).to have_content 'Application update from 4:00 CST to 5:00 CST'
+    expect(page).to have_selector %(div[style="background-color:#f2dede;color:#b94a48"])
   end
 end
diff --git a/features/steps/admin/deploy_keys.rb b/features/steps/admin/deploy_keys.rb
index 844837d177d228523948ee8b30433904f37aec77..56787eeb6b3b92d7172003859930665fd90a81f0 100644
--- a/features/steps/admin/deploy_keys.rb
+++ b/features/steps/admin/deploy_keys.rb
@@ -10,7 +10,7 @@ class Spinach::Features::AdminDeployKeys < Spinach::FeatureSteps
 
   step 'I should see all public deploy keys' do
     DeployKey.are_public.each do |p|
-      page.should have_content p.title
+      expect(page).to have_content p.title
     end
   end
 
@@ -33,11 +33,11 @@ class Spinach::Features::AdminDeployKeys < Spinach::FeatureSteps
   end
 
   step 'I should be on admin deploy keys page' do
-    current_path.should == admin_deploy_keys_path
+    expect(current_path).to eq admin_deploy_keys_path
   end
 
   step 'I should see newly created deploy key' do
-    page.should have_content(deploy_key.title)
+    expect(page).to have_content(deploy_key.title)
   end
 
   def deploy_key
diff --git a/features/steps/admin/groups.rb b/features/steps/admin/groups.rb
index 721460b93710f11b4df29fc7a5c213aaeadb6b3f..9cc74a97c3abcd548787d5ab1f99b7e0c64e48ea 100644
--- a/features/steps/admin/groups.rb
+++ b/features/steps/admin/groups.rb
@@ -28,32 +28,32 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps
   end
 
   step 'I should see newly created group' do
-    page.should have_content "Group: gitlab"
-    page.should have_content "Group description"
+    expect(page).to have_content "Group: gitlab"
+    expect(page).to have_content "Group description"
   end
 
   step 'I should be redirected to group page' do
-    current_path.should == admin_group_path(Group.find_by(path: 'gitlab'))
+    expect(current_path).to eq admin_group_path(Group.find_by(path: 'gitlab'))
   end
 
   When 'I select user "John Doe" from user list as "Reporter"' do
     select2(user_john.id, from: "#user_ids", multiple: true)
-    within "#new_project_member" do
+    page.within "#new_project_member" do
       select "Reporter", from: "access_level"
     end
     click_button "Add users to group"
   end
 
   step 'I should see "John Doe" in team list in every project as "Reporter"' do
-    within ".group-users-list" do
-      page.should have_content "John Doe"
-      page.should have_content "Reporter"
+    page.within ".group-users-list" do
+      expect(page).to have_content "John Doe"
+      expect(page).to have_content "Reporter"
     end
   end
 
   step 'I should be all groups' do
     Group.all.each do |group|
-      page.should have_content group.name
+      expect(page).to have_content group.name
     end
   end
 
@@ -62,14 +62,14 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps
   end
 
   step 'I remove user "John Doe" from group' do
-    within "#user_#{user_john.id}" do
+    page.within "#user_#{user_john.id}" do
       click_link 'Remove user from group'
     end
   end
 
   step 'I should not see "John Doe" in team list' do
-    within ".group-users-list" do
-      page.should_not have_content "John Doe"
+    page.within ".group-users-list" do
+      expect(page).not_to have_content "John Doe"
     end
   end
 
diff --git a/features/steps/admin/logs.rb b/features/steps/admin/logs.rb
index 904e54686558337f876016f1c4ff1f8f73776e5a..f9e49588c7541c9ffddba14b2171ce70201d3a27 100644
--- a/features/steps/admin/logs.rb
+++ b/features/steps/admin/logs.rb
@@ -4,8 +4,8 @@ class Spinach::Features::AdminLogs < Spinach::FeatureSteps
   include SharedAdmin
 
   step 'I should see tabs with available logs' do
-    page.should have_content 'production.log'
-    page.should have_content 'githost.log'
-    page.should have_content 'application.log'
+    expect(page).to have_content 'production.log'
+    expect(page).to have_content 'githost.log'
+    expect(page).to have_content 'application.log'
   end
 end
diff --git a/features/steps/admin/projects.rb b/features/steps/admin/projects.rb
index 9be4d39d2d5775bb5c75f33ebd49865fcc085394..655f18952799f9f6b91a4fc333cbe778fc5282ce 100644
--- a/features/steps/admin/projects.rb
+++ b/features/steps/admin/projects.rb
@@ -5,7 +5,7 @@ class Spinach::Features::AdminProjects < Spinach::FeatureSteps
 
   step 'I should see all projects' do
     Project.all.each do |p|
-      page.should have_content p.name_with_namespace
+      expect(page).to have_content p.name_with_namespace
     end
   end
 
@@ -15,9 +15,9 @@ class Spinach::Features::AdminProjects < Spinach::FeatureSteps
 
   step 'I should see project details' do
     project = Project.first
-    current_path.should == admin_namespace_project_path(project.namespace, project)
-    page.should have_content(project.name_with_namespace)
-    page.should have_content(project.creator.name)
+    expect(current_path).to eq admin_namespace_project_path(project.namespace, project)
+    expect(page).to have_content(project.name_with_namespace)
+    expect(page).to have_content(project.creator.name)
   end
 
   step 'I visit admin project page' do
@@ -34,8 +34,8 @@ class Spinach::Features::AdminProjects < Spinach::FeatureSteps
   end
 
   step 'I should see project transfered' do
-    page.should have_content 'Web / ' + project.name
-    page.should have_content 'Namespace: Web'
+    expect(page).to have_content 'Web / ' + project.name
+    expect(page).to have_content 'Namespace: Web'
   end
 
   def project
diff --git a/features/steps/admin/settings.rb b/features/steps/admin/settings.rb
index 15ca0d80f1acaaab4ba21c27792a6a6fb0bf1de1..1c0b7a4b712ea42db7f7ee8861b204eef1148365 100644
--- a/features/steps/admin/settings.rb
+++ b/features/steps/admin/settings.rb
@@ -11,9 +11,9 @@ class Spinach::Features::AdminSettings < Spinach::FeatureSteps
   end
 
   step 'I should see application settings saved' do
-    current_application_settings.gravatar_enabled.should be_false
-    current_application_settings.home_page_url.should == 'https://about.gitlab.com/'
-    page.should have_content 'Application settings saved successfully'
+    expect(current_application_settings.gravatar_enabled).to be_false
+    expect(current_application_settings.home_page_url).to eq 'https://about.gitlab.com/'
+    expect(page).to have_content 'Application settings saved successfully'
   end
 
   step 'I click on "Service Templates"' do
@@ -41,18 +41,18 @@ class Spinach::Features::AdminSettings < Spinach::FeatureSteps
   end
 
   step 'I should see service template settings saved' do
-    page.should have_content 'Application settings saved successfully'
+    expect(page).to have_content 'Application settings saved successfully'
   end
 
   step 'I should see all checkboxes checked' do
-    all('input[type=checkbox]').each do |checkbox|
-      checkbox.should be_checked
+    page.all('input[type=checkbox]').each do |checkbox|
+      expect(checkbox).to be_checked
     end
   end
 
   step 'I should see Slack settings saved' do
-    find_field('Webhook').value.should eq 'http://localhost'
-    find_field('Username').value.should eq 'test_user'
-    find_field('Channel').value.should eq '#test_channel'
+    expect(find_field('Webhook').value).to eq 'http://localhost'
+    expect(find_field('Username').value).to eq 'test_user'
+    expect(find_field('Channel').value).to eq '#test_channel'
   end
 end
diff --git a/features/steps/admin/users.rb b/features/steps/admin/users.rb
index e13830972487e0e4c99e1b94a806ca9d29900793..34a3ed9f615ae3635f1fc17f0077f21df0ddfaad 100644
--- a/features/steps/admin/users.rb
+++ b/features/steps/admin/users.rb
@@ -5,7 +5,7 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps
 
   step 'I should see all users' do
     User.all.each do |user|
-      page.should have_content user.name
+      expect(page).to have_content user.name
     end
   end
 
@@ -23,13 +23,13 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps
   end
 
   step 'See username error message' do
-    within "#error_explanation" do
-      page.should have_content "Username"
+    page.within "#error_explanation" do
+      expect(page).to have_content "Username"
     end
   end
 
   step 'Not changed form action url' do
-    page.should have_selector %(form[action="/admin/users/#{@user.username}"])
+    expect(page).to have_selector %(form[action="/admin/users/#{@user.username}"])
   end
 
   step 'I submit modified user' do
@@ -38,7 +38,7 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps
   end
 
   step 'I see user attributes changed' do
-    page.should have_content 'Can create groups: Yes'
+    expect(page).to have_content 'Can create groups: Yes'
   end
 
   step 'click edit on my user' do
@@ -53,7 +53,7 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps
   end
 
   step 'I see the secondary email' do
-    page.should have_content "Secondary email: #{@user_with_secondary_email.emails.last.email}"
+    expect(page).to have_content "Secondary email: #{@user_with_secondary_email.emails.last.email}"
   end
 
   step 'I click remove secondary email' do
@@ -61,7 +61,7 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps
   end
 
   step 'I should not see secondary email anymore' do
-    page.should_not have_content "Secondary email:"
+    expect(page).not_to have_content "Secondary email:"
   end
 
   step 'user "Mike" with groups and projects' do
@@ -79,8 +79,8 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps
   end
 
   step 'I should see user "Mike" details' do
-    page.should have_content 'Account'
-    page.should have_content 'Personal projects limit'
+    expect(page).to have_content 'Account'
+    expect(page).to have_content 'Personal projects limit'
   end
 
   step 'user "Pete" with ssh keys' do
@@ -94,8 +94,8 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps
   end
 
   step 'I should see key list' do
-    page.should have_content 'ssh-rsa Key2'
-    page.should have_content 'ssh-rsa Key1'
+    expect(page).to have_content 'ssh-rsa Key2'
+    expect(page).to have_content 'ssh-rsa Key1'
   end
 
   step 'I click on the key title' do
@@ -103,8 +103,8 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps
   end
 
   step 'I should see key details' do
-    page.should have_content 'ssh-rsa Key2'
-    page.should have_content 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQSTWXhJAX/He+nG78MiRRRn7m0Pb0XbcgTxE0etArgoFoh9WtvDf36HG6tOSg/0UUNcp0dICsNAmhBKdncp6cIyPaXJTURPRAGvhI0/VDk4bi27bRnccGbJ/hDaUxZMLhhrzY0r22mjVf8PF6dvv5QUIQVm1/LeaWYsHHvLgiIjwrXirUZPnFrZw6VLREoBKG8uWvfSXw1L5eapmstqfsME8099oi+vWLR8MgEysZQmD28M73fgW4zek6LDQzKQyJx9nB+hJkKUDvcuziZjGmRFlNgSA2mguERwL1OXonD8WYUrBDGKroIvBT39zS5d9tQDnidEJZ9Y8gv5ViYP7x Key2'
+    expect(page).to have_content 'ssh-rsa Key2'
+    expect(page).to have_content 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQSTWXhJAX/He+nG78MiRRRn7m0Pb0XbcgTxE0etArgoFoh9WtvDf36HG6tOSg/0UUNcp0dICsNAmhBKdncp6cIyPaXJTURPRAGvhI0/VDk4bi27bRnccGbJ/hDaUxZMLhhrzY0r22mjVf8PF6dvv5QUIQVm1/LeaWYsHHvLgiIjwrXirUZPnFrZw6VLREoBKG8uWvfSXw1L5eapmstqfsME8099oi+vWLR8MgEysZQmD28M73fgW4zek6LDQzKQyJx9nB+hJkKUDvcuziZjGmRFlNgSA2mguERwL1OXonD8WYUrBDGKroIvBT39zS5d9tQDnidEJZ9Y8gv5ViYP7x Key2'
   end
 
   step 'I click on remove key' do
@@ -112,6 +112,6 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps
   end
 
   step 'I should see the key removed' do
-    page.should_not have_content 'ssh-rsa Key2'
+    expect(page).not_to have_content 'ssh-rsa Key2'
   end
 end
diff --git a/features/steps/dashboard/archived_projects.rb b/features/steps/dashboard/archived_projects.rb
index 969baf92287c620cfdd74bfdd1f157e6d9046518..36e092f50c6014eede84f52957cc83157161602d 100644
--- a/features/steps/dashboard/archived_projects.rb
+++ b/features/steps/dashboard/archived_projects.rb
@@ -9,14 +9,14 @@ class Spinach::Features::DashboardArchivedProjects < Spinach::FeatureSteps
   end
 
   step 'I should see "Shop" project link' do
-    page.should have_link "Shop"
+    expect(page).to have_link "Shop"
   end
 
   step 'I should not see "Forum" project link' do
-    page.should_not have_link "Forum"
+    expect(page).not_to have_link "Forum"
   end
 
   step 'I should see "Forum" project link' do
-    page.should have_link "Forum"
+    expect(page).to have_link "Forum"
   end
 end
diff --git a/features/steps/dashboard/dashboard.rb b/features/steps/dashboard/dashboard.rb
index bb1f2f444f9b6acb395bafeb7ae4b3a58dd71227..945bf35ff27aeed7fbc4534dec8d9140e8215073 100644
--- a/features/steps/dashboard/dashboard.rb
+++ b/features/steps/dashboard/dashboard.rb
@@ -4,16 +4,16 @@ class Spinach::Features::Dashboard < Spinach::FeatureSteps
   include SharedProject
 
   step 'I should see "New Project" link' do
-    page.should have_link "New project"
+    expect(page).to have_link "New project"
   end
 
   step 'I should see "Shop" project link' do
-    page.should have_link "Shop"
+    expect(page).to have_link "Shop"
   end
 
   step 'I should see last push widget' do
-    page.should have_content "You pushed to fix"
-    page.should have_link "Create Merge Request"
+    expect(page).to have_content "You pushed to fix"
+    expect(page).to have_link "Create Merge Request"
   end
 
   step 'I click "Create Merge Request" link' do
@@ -21,10 +21,10 @@ class Spinach::Features::Dashboard < Spinach::FeatureSteps
   end
 
   step 'I see prefilled new Merge Request page' do
-    current_path.should == new_namespace_project_merge_request_path(@project.namespace, @project)
-    find("#merge_request_target_project_id").value.should == @project.id.to_s
-    find("input#merge_request_source_branch").value.should == "fix"
-    find("input#merge_request_target_branch").value.should == "master"
+    expect(current_path).to eq new_namespace_project_merge_request_path(@project.namespace, @project)
+    expect(find("#merge_request_target_project_id").value).to eq @project.id.to_s
+    expect(find("input#merge_request_source_branch").value).to eq "fix"
+    expect(find("input#merge_request_target_branch").value).to eq "master"
   end
 
   step 'user with name "John Doe" joined project "Shop"' do
@@ -38,7 +38,7 @@ class Spinach::Features::Dashboard < Spinach::FeatureSteps
   end
 
   step 'I should see "John Doe joined project Shop" event' do
-    page.should have_content "John Doe joined project #{project.name_with_namespace}"
+    expect(page).to have_content "John Doe joined project #{project.name_with_namespace}"
   end
 
   step 'user with name "John Doe" left project "Shop"' do
@@ -51,7 +51,7 @@ class Spinach::Features::Dashboard < Spinach::FeatureSteps
   end
 
   step 'I should see "John Doe left project Shop" event' do
-    page.should have_content "John Doe left project #{project.name_with_namespace}"
+    expect(page).to have_content "John Doe left project #{project.name_with_namespace}"
   end
 
   step 'I have group with projects' do
@@ -64,13 +64,13 @@ class Spinach::Features::Dashboard < Spinach::FeatureSteps
 
   step 'I should see projects list' do
     @user.authorized_projects.all.each do |project|
-      page.should have_link project.name_with_namespace
+      expect(page).to have_link project.name_with_namespace
     end
   end
 
   step 'I should see groups list' do
     Group.all.each do |group|
-      page.should have_link group.name
+      expect(page).to have_link group.name
     end
   end
 
@@ -80,6 +80,6 @@ class Spinach::Features::Dashboard < Spinach::FeatureSteps
   end
 
   step 'I should see 1 project at group list' do
-    find('span.last_activity/span').should have_content('1')
+    expect(find('span.last_activity/span')).to have_content('1')
   end
 end
diff --git a/features/steps/dashboard/event_filters.rb b/features/steps/dashboard/event_filters.rb
index 3da3d62d0c0468efd690c33513ef0fb9829034ac..834afa439a0c0e0f49302207232d8b987ab07884 100644
--- a/features/steps/dashboard/event_filters.rb
+++ b/features/steps/dashboard/event_filters.rb
@@ -4,27 +4,27 @@ class Spinach::Features::EventFilters < Spinach::FeatureSteps
   include SharedProject
 
   step 'I should see push event' do
-    page.should have_selector('span.pushed')
+    expect(page).to have_selector('span.pushed')
   end
 
   step 'I should not see push event' do
-    page.should_not have_selector('span.pushed')
+    expect(page).not_to have_selector('span.pushed')
   end
 
   step 'I should see new member event' do
-    page.should have_selector('span.joined')
+    expect(page).to have_selector('span.joined')
   end
 
   step 'I should not see new member event' do
-    page.should_not have_selector('span.joined')
+    expect(page).not_to have_selector('span.joined')
   end
 
   step 'I should see merge request event' do
-    page.should have_selector('span.accepted')
+    expect(page).to have_selector('span.accepted')
   end
 
   step 'I should not see merge request event' do
-    page.should_not have_selector('span.accepted')
+    expect(page).not_to have_selector('span.accepted')
   end
 
   step 'this project has push event' do
diff --git a/features/steps/dashboard/group.rb b/features/steps/dashboard/group.rb
index aeea49320ffcc7c5c8187569a5c9637eaa24dc1c..0c6a0ae37251c03f5cd5d838576eddf7b55ddcc6 100644
--- a/features/steps/dashboard/group.rb
+++ b/features/steps/dashboard/group.rb
@@ -17,29 +17,29 @@ class Spinach::Features::DashboardGroup < Spinach::FeatureSteps
   end
 
   step 'I should not see the "Leave" button for group "Owned"' do
-    find(:css, 'li', text: "Owner").should_not have_selector(:css, 'i.fa.fa-sign-out')
+    expect(find(:css, 'li', text: "Owner")).not_to have_selector(:css, 'i.fa.fa-sign-out')
     # poltergeist always confirms popups.
   end
 
   step 'I should not see the "Leave" button for groupr "Guest"' do
-    find(:css, 'li', text: "Guest").should_not have_selector(:css,  'i.fa.fa-sign-out')
+    expect(find(:css, 'li', text: "Guest")).not_to have_selector(:css,  'i.fa.fa-sign-out')
     # poltergeist always confirms popups.
   end
 
   step 'I should see group "Owned" in group list' do
-    page.should have_content("Owned")
+    expect(page).to have_content("Owned")
   end
 
   step 'I should not see group "Owned" in group list' do
-    page.should_not have_content("Owned")
+    expect(page).not_to have_content("Owned")
   end
 
   step 'I should see group "Guest" in group list' do
-    page.should have_content("Guest")
+    expect(page).to have_content("Guest")
   end
 
   step 'I should not see group "Guest" in group list' do
-    page.should_not have_content("Guest")
+    expect(page).not_to have_content("Guest")
   end
 
   step 'I click new group link' do
@@ -53,15 +53,15 @@ class Spinach::Features::DashboardGroup < Spinach::FeatureSteps
   end
 
   step 'I should be redirected to group "Samurai" page' do
-    current_path.should == group_path(Group.find_by(name: 'Samurai'))
+    expect(current_path).to eq group_path(Group.find_by(name: 'Samurai'))
   end
 
   step 'I should see newly created group "Samurai"' do
-    page.should have_content "Samurai"
-    page.should have_content "Tokugawa Shogunate"
+    expect(page).to have_content "Samurai"
+    expect(page).to have_content "Tokugawa Shogunate"
   end
 
   step 'I should see the "Can not leave message"' do
-    page.should have_content "You can not leave Owned group because you're the last owner"
+    expect(page).to have_content "You can not leave Owned group because you're the last owner"
   end
 end
diff --git a/features/steps/dashboard/help.rb b/features/steps/dashboard/help.rb
index ef433c57c6eebfc4dfafd134e8053484eba03e9c..86ab31a58aba4eb45aa51cffdc2b328c3e3a2ecf 100644
--- a/features/steps/dashboard/help.rb
+++ b/features/steps/dashboard/help.rb
@@ -12,7 +12,7 @@ class Spinach::Features::DashboardHelp < Spinach::FeatureSteps
   end
 
   step 'I should see "Rake Tasks" page markdown rendered' do
-    page.should have_content "Gather information about GitLab and the system it runs on"
+    expect(page).to have_content "Gather information about GitLab and the system it runs on"
   end
 
   step 'Header "Rebuild project satellites" should have correct ids and links' do
diff --git a/features/steps/dashboard/issues.rb b/features/steps/dashboard/issues.rb
index 60da36e86de10928faac3d51788440c6b258ba0a..cbe54e2dc792aa2d5aff88cbb47443a612ba3cae 100644
--- a/features/steps/dashboard/issues.rb
+++ b/features/steps/dashboard/issues.rb
@@ -46,11 +46,11 @@ class Spinach::Features::DashboardIssues < Spinach::FeatureSteps
   end
 
   def should_see(issue)
-    page.should have_content(issue.title[0..10])
+    expect(page).to have_content(issue.title[0..10])
   end
 
   def should_not_see(issue)
-    page.should_not have_content(issue.title[0..10])
+    expect(page).not_to have_content(issue.title[0..10])
   end
 
   def assigned_issue
diff --git a/features/steps/dashboard/merge_requests.rb b/features/steps/dashboard/merge_requests.rb
index 9d92082bb83d5aa32b654558e1dc2e57ccda17bc..cec8d06adee62b66a48bc7eb7803e8a0799c25e9 100644
--- a/features/steps/dashboard/merge_requests.rb
+++ b/features/steps/dashboard/merge_requests.rb
@@ -50,11 +50,11 @@ class Spinach::Features::DashboardMergeRequests < Spinach::FeatureSteps
   end
 
   def should_see(merge_request)
-    page.should have_content(merge_request.title[0..10])
+    expect(page).to have_content(merge_request.title[0..10])
   end
 
   def should_not_see(merge_request)
-    page.should_not have_content(merge_request.title[0..10])
+    expect(page).not_to have_content(merge_request.title[0..10])
   end
 
   def assigned_merge_request
diff --git a/features/steps/dashboard/new_project.rb b/features/steps/dashboard/new_project.rb
index 93456a81ecf7838006a3db256463713555c3fa6d..b4ade65ee534d0008a1f3e0dbe57894a244d9425 100644
--- a/features/steps/dashboard/new_project.rb
+++ b/features/steps/dashboard/new_project.rb
@@ -4,13 +4,13 @@ class Spinach::Features::NewProject < Spinach::FeatureSteps
   include SharedProject
 
   step 'I click "New project" link' do
-    within('.content') do
+    page.within('.content') do
       click_link "New project"
     end
   end
 
   step 'I see "New project" page' do
-    page.should have_content("Project path")
+    expect(page).to have_content("Project path")
   end
 
   step 'I click on "Import project from GitHub"' do
@@ -19,11 +19,11 @@ class Spinach::Features::NewProject < Spinach::FeatureSteps
 
   step 'I see instructions on how to import from GitHub' do
     github_modal = first('.modal-body')
-    github_modal.should be_visible
-    github_modal.should have_content "To enable importing projects from GitHub"
+    expect(github_modal).to be_visible
+    expect(github_modal).to have_content "To enable importing projects from GitHub"
 
-    all('.modal-body').each do |element|
-      element.should_not be_visible unless element == github_modal
+    page.all('.modal-body').each do |element|
+      expect(element).not_to be_visible unless element == github_modal
     end
   end
 end
diff --git a/features/steps/dashboard/starred_projects.rb b/features/steps/dashboard/starred_projects.rb
index b9ad2f13e293248e55a4307aeb2619a723093da1..59c73fe63f249a0f63f811b67c1052b80eed0486 100644
--- a/features/steps/dashboard/starred_projects.rb
+++ b/features/steps/dashboard/starred_projects.rb
@@ -8,8 +8,8 @@ class Spinach::Features::DashboardStarredProjects < Spinach::FeatureSteps
   end
 
   step 'I should not see project "Shop"' do
-    within 'aside' do
-      page.should_not have_content('Shop')
+    page.within 'aside' do
+      expect(page).not_to have_content('Shop')
     end
   end
 end
diff --git a/features/steps/explore/groups.rb b/features/steps/explore/groups.rb
index 0c2127d4c4b3ba7133c1fdb68bf9d2fec1713dd8..89b82293ef273e2cab1243967c34323ff95d3b82 100644
--- a/features/steps/explore/groups.rb
+++ b/features/steps/explore/groups.rb
@@ -39,19 +39,19 @@ class Spinach::Features::ExploreGroups < Spinach::FeatureSteps
   end
 
   step 'I should not see project "Enterprise" items' do
-    page.should_not have_content "Enterprise"
+    expect(page).not_to have_content "Enterprise"
   end
 
   step 'I should see project "Internal" items' do
-    page.should have_content "Internal"
+    expect(page).to have_content "Internal"
   end
 
   step 'I should not see project "Internal" items' do
-    page.should_not have_content "Internal"
+    expect(page).not_to have_content "Internal"
   end
 
   step 'I should see project "Community" items' do
-    page.should have_content "Community"
+    expect(page).to have_content "Community"
   end
 
   step 'I change filter to Everyone\'s' do
@@ -59,11 +59,11 @@ class Spinach::Features::ExploreGroups < Spinach::FeatureSteps
   end
 
   step 'I should see group member "John Doe"' do
-    page.should have_content "John Doe"
+    expect(page).to have_content "John Doe"
   end
 
   step 'I should not see member roles' do
-    body.should_not match(%r{owner|developer|reporter|guest}i)
+    expect(body).not_to match(%r{owner|developer|reporter|guest}i)
   end
 
   protected
diff --git a/features/steps/explore/projects.rb b/features/steps/explore/projects.rb
index 26b71406bd8a9a52756a0f6fff4af0214a7f0412..49c2f6a1253a7b21867bd07135645feb5fb34156 100644
--- a/features/steps/explore/projects.rb
+++ b/features/steps/explore/projects.rb
@@ -4,56 +4,56 @@ class Spinach::Features::ExploreProjects < Spinach::FeatureSteps
   include SharedProject
 
   step 'I should see project "Empty Public Project"' do
-    page.should have_content "Empty Public Project"
+    expect(page).to have_content "Empty Public Project"
   end
 
   step 'I should see public project details' do
-    page.should have_content '32 branches'
-    page.should have_content '16 tags'
+    expect(page).to have_content '32 branches'
+    expect(page).to have_content '16 tags'
   end
 
   step 'I should see project readme' do
-    page.should have_content 'README.md'
+    expect(page).to have_content 'README.md'
   end
 
   step 'I should see empty public project details' do
-    page.should have_content 'Git global setup'
+    expect(page).to have_content 'Git global setup'
   end
 
   step 'I should see empty public project details with http clone info' do
     project = Project.find_by(name: 'Empty Public Project')
-    all(:css, '.git-empty .clone').each do |element|
-      element.text.should include(project.http_url_to_repo)
+    page.all(:css, '.git-empty .clone').each do |element|
+      expect(element.text).to include(project.http_url_to_repo)
     end
   end
 
   step 'I should see empty public project details with ssh clone info' do
     project = Project.find_by(name: 'Empty Public Project')
-    all(:css, '.git-empty .clone').each do |element|
-      element.text.should include(project.url_to_repo)
+    page.all(:css, '.git-empty .clone').each do |element|
+      expect(element.text).to include(project.url_to_repo)
     end
   end
 
   step 'I should see project "Community" home page' do
-    within '.navbar-gitlab .title' do
-      page.should have_content 'Community'
+    page.within '.navbar-gitlab .title' do
+      expect(page).to have_content 'Community'
     end
   end
 
   step 'I should see project "Internal" home page' do
-    within '.navbar-gitlab .title' do
-      page.should have_content 'Internal'
+    page.within '.navbar-gitlab .title' do
+      expect(page).to have_content 'Internal'
     end
   end
 
   step 'I should see an http link to the repository' do
     project = Project.find_by(name: 'Community')
-    page.should have_field('project_clone', with: project.http_url_to_repo)
+    expect(page).to have_field('project_clone', with: project.http_url_to_repo)
   end
 
   step 'I should see an ssh link to the repository' do
     project = Project.find_by(name: 'Community')
-    page.should have_field('project_clone', with: project.url_to_repo)
+    expect(page).to have_field('project_clone', with: project.url_to_repo)
   end
 
   step 'I visit "Community" issues page' do
@@ -70,9 +70,9 @@ class Spinach::Features::ExploreProjects < Spinach::FeatureSteps
 
 
   step 'I should see list of issues for "Community" project' do
-    page.should have_content "Bug"
-    page.should have_content public_project.name
-    page.should have_content "New feature"
+    expect(page).to have_content "Bug"
+    expect(page).to have_content public_project.name
+    expect(page).to have_content "New feature"
   end
 
   step 'I visit "Internal" issues page' do
@@ -89,9 +89,9 @@ class Spinach::Features::ExploreProjects < Spinach::FeatureSteps
 
 
   step 'I should see list of issues for "Internal" project' do
-    page.should have_content "Internal Bug"
-    page.should have_content internal_project.name
-    page.should have_content "New internal feature"
+    expect(page).to have_content "Internal Bug"
+    expect(page).to have_content internal_project.name
+    expect(page).to have_content "New internal feature"
   end
 
   step 'I visit "Community" merge requests page' do
@@ -107,8 +107,8 @@ class Spinach::Features::ExploreProjects < Spinach::FeatureSteps
   end
 
   step 'I should see list of merge requests for "Community" project' do
-    page.should have_content public_project.name
-    page.should have_content public_merge_request.source_project.name
+    expect(page).to have_content public_project.name
+    expect(page).to have_content public_merge_request.source_project.name
   end
 
   step 'I visit "Internal" merge requests page' do
@@ -124,8 +124,8 @@ class Spinach::Features::ExploreProjects < Spinach::FeatureSteps
   end
 
   step 'I should see list of merge requests for "Internal" project' do
-    page.should have_content internal_project.name
-    page.should have_content internal_merge_request.source_project.name
+    expect(page).to have_content internal_project.name
+    expect(page).to have_content internal_merge_request.source_project.name
   end
 
   def internal_project
diff --git a/features/steps/groups.rb b/features/steps/groups.rb
index 84348d1709a8451221e7b147ca3339e430d81820..c6c855a7c2215608b6c949d6ee2ee294fb305227 100644
--- a/features/steps/groups.rb
+++ b/features/steps/groups.rb
@@ -16,7 +16,7 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   step 'I select "Mike" as "Reporter"' do
     user = User.find_by(name: "Mike")
 
-    within ".users-group-form" do
+    page.within ".users-group-form" do
       select2(user.id, from: "#user_ids", multiple: true)
       select "Reporter", from: "access_level"
     end
@@ -25,14 +25,14 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I should see "Mike" in team list as "Reporter"' do
-    within '.well-list' do
-      page.should have_content('Mike')
-      page.should have_content('Reporter')
+    page.within '.well-list' do
+      expect(page).to have_content('Mike')
+      expect(page).to have_content('Reporter')
     end
   end
 
   step 'I select "sjobs@apple.com" as "Reporter"' do
-    within ".users-group-form" do
+    page.within ".users-group-form" do
       select2("sjobs@apple.com", from: "#user_ids", multiple: true)
       select "Reporter", from: "access_level"
     end
@@ -41,39 +41,39 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I should see "sjobs@apple.com" in team list as invited "Reporter"' do
-    within '.well-list' do
-      page.should have_content('sjobs@apple.com')
-      page.should have_content('invited')
-      page.should have_content('Reporter')
+    page.within '.well-list' do
+      expect(page).to have_content('sjobs@apple.com')
+      expect(page).to have_content('invited')
+      expect(page).to have_content('Reporter')
     end
   end
 
   step 'I should see group "Owned" projects list' do
     Group.find_by(name: "Owned").projects.each do |project|
-      page.should have_link project.name
+      expect(page).to have_link project.name
     end
   end
 
   step 'I should see projects activity feed' do
-    page.should have_content 'closed issue'
+    expect(page).to have_content 'closed issue'
   end
 
   step 'I should see issues from group "Owned" assigned to me' do
     assigned_to_me(:issues).each do |issue|
-      page.should have_content issue.title
+      expect(page).to have_content issue.title
     end
   end
 
   step 'I should see merge requests from group "Owned" assigned to me' do
     assigned_to_me(:merge_requests).each do |issue|
-      page.should have_content issue.title[0..80]
+      expect(page).to have_content issue.title[0..80]
     end
   end
 
   step 'I select user "Mary Jane" from list with role "Reporter"' do
     user = User.find_by(name: "Mary Jane") || create(:user, name: "Mary Jane")
     click_button 'Add members'
-    within ".users-group-form" do
+    page.within ".users-group-form" do
       select2(user.id, from: "#user_ids", multiple: true)
       select "Reporter", from: "access_level"
     end
@@ -82,22 +82,22 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
 
   step 'I should see user "John Doe" in team list' do
     projects_with_access = find(".panel .well-list")
-    projects_with_access.should have_content("John Doe")
+    expect(projects_with_access).to have_content("John Doe")
   end
 
   step 'I should not see user "John Doe" in team list' do
     projects_with_access = find(".panel .well-list")
-    projects_with_access.should_not have_content("John Doe")
+    expect(projects_with_access).not_to have_content("John Doe")
   end
 
   step 'I should see user "Mary Jane" in team list' do
     projects_with_access = find(".panel .well-list")
-    projects_with_access.should have_content("Mary Jane")
+    expect(projects_with_access).to have_content("Mary Jane")
   end
 
   step 'I should not see user "Mary Jane" in team list' do
     projects_with_access = find(".panel .well-list")
-    projects_with_access.should_not have_content("Mary Jane")
+    expect(projects_with_access).not_to have_content("Mary Jane")
   end
 
   step 'project from group "Owned" has issues assigned to me' do
@@ -122,8 +122,8 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I should see new group "Owned" name' do
-    within ".navbar-gitlab" do
-      page.should have_content "new-name"
+    page.within ".navbar-gitlab" do
+      expect(page).to have_content "new-name"
     end
   end
 
@@ -134,12 +134,12 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I should see new group "Owned" avatar' do
-    Group.find_by(name: "Owned").avatar.should be_instance_of AvatarUploader
-    Group.find_by(name: "Owned").avatar.url.should == "/uploads/group/avatar/#{ Group.find_by(name:"Owned").id }/gitlab_logo.png"
+    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 }/gitlab_logo.png"
   end
 
   step 'I should see the "Remove avatar" button' do
-    page.should have_link("Remove avatar")
+    expect(page).to have_link("Remove avatar")
   end
 
   step 'I have group "Owned" avatar' do
@@ -154,11 +154,11 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I should not see group "Owned" avatar' do
-    Group.find_by(name: "Owned").avatar?.should be_false
+    expect(Group.find_by(name: "Owned").avatar?).to be_false
   end
 
   step 'I should not see the "Remove avatar" button' do
-    page.should_not have_link("Remove avatar")
+    expect(page).not_to have_link("Remove avatar")
   end
 
   step 'I click on the "Remove User From Group" button for "John Doe"' do
@@ -172,17 +172,17 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I should not see the "Remove User From Group" button for "John Doe"' do
-    find(:css, 'li', text: "John Doe").should_not have_selector(:css, 'a.btn-remove')
+    expect(find(:css, 'li', text: "John Doe")).not_to have_selector(:css, 'a.btn-remove')
     # poltergeist always confirms popups.
   end
 
   step 'I should not see the "Remove User From Group" button for "Mary Jane"' do
-    find(:css, 'li', text: "Mary Jane").should_not have_selector(:css, 'a.btn-remove')
+    expect(find(:css, 'li', text: "Mary Jane")).not_to have_selector(:css, 'a.btn-remove')
     # poltergeist always confirms popups.
   end
 
   step 'I search for \'Mary\' member' do
-    within '.member-search-form' do
+    page.within '.member-search-form' do
       fill_in 'search', with: 'Mary'
       click_button 'Search'
     end
@@ -193,7 +193,7 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I should see group milestones index page has no milestones' do
-    page.should have_content('No milestones to show')
+    expect(page).to have_content('No milestones to show')
   end
 
   step 'Group has projects with milestones' do
@@ -201,10 +201,10 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I should see group milestones index page with milestones' do
-    page.should have_content('Version 7.2')
-    page.should have_content('GL-113')
-    page.should have_link('2 Issues', href: issues_group_path("owned", milestone_title: "Version 7.2"))
-    page.should have_link('3 Merge Requests', href: merge_requests_group_path("owned", milestone_title: "GL-113"))
+    expect(page).to have_content('Version 7.2')
+    expect(page).to have_content('GL-113')
+    expect(page).to have_link('2 Issues', href: issues_group_path("owned", milestone_title: "Version 7.2"))
+    expect(page).to have_link('3 Merge Requests', href: merge_requests_group_path("owned", milestone_title: "GL-113"))
   end
 
   step 'I click on one group milestone' do
@@ -212,14 +212,14 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I should see group milestone with descriptions and expiry date' do
-    page.should have_content('expires at Aug 20, 2114')
+    expect(page).to have_content('expires at Aug 20, 2114')
   end
 
   step 'I should see group milestone with all issues and MRs assigned to that milestone' do
-    page.should have_content('Milestone GL-113')
-    page.should have_content('Progress: 0 closed – 4 open')
-    page.should have_link(@issue1.title, href: namespace_project_issue_path(@project1.namespace, @project1, @issue1))
-    page.should have_link(@mr3.title, href: namespace_project_merge_request_path(@project3.namespace, @project3, @mr3))
+    expect(page).to have_content('Milestone GL-113')
+    expect(page).to have_content('Progress: 0 closed – 4 open')
+    expect(page).to have_link(@issue1.title, href: namespace_project_issue_path(@project1.namespace, @project1, @issue1))
+    expect(page).to have_link(@mr3.title, href: namespace_project_merge_request_path(@project3.namespace, @project3, @mr3))
   end
 
   protected
diff --git a/features/steps/profile/emails.rb b/features/steps/profile/emails.rb
index 2b6ac37d8668162267358567e8416999b2489be4..10ebe7053653ac291ca9928d371c7bbda31994e4 100644
--- a/features/steps/profile/emails.rb
+++ b/features/steps/profile/emails.rb
@@ -6,9 +6,9 @@ class Spinach::Features::ProfileEmails < Spinach::FeatureSteps
   end
 
   step 'I should see my emails' do
-    page.should have_content(@user.email)
+    expect(page).to have_content(@user.email)
     @user.emails.each do |email|
-      page.should have_content(email.email)
+      expect(page).to have_content(email.email)
     end
   end
 
@@ -19,14 +19,14 @@ class Spinach::Features::ProfileEmails < Spinach::FeatureSteps
 
   step 'I should see new email "my@email.com"' do
     email = @user.emails.find_by(email: "my@email.com")
-    email.should_not be_nil
-    page.should have_content("my@email.com")
+    expect(email).not_to be_nil
+    expect(page).to have_content("my@email.com")
   end
 
   step 'I should not see email "my@email.com"' do
     email = @user.emails.find_by(email: "my@email.com")
-    email.should be_nil
-    page.should_not have_content("my@email.com")
+    expect(email).to be_nil
+    expect(page).not_to have_content("my@email.com")
   end
   
   step 'I click link "Remove" for "my@email.com"' do
@@ -43,6 +43,6 @@ class Spinach::Features::ProfileEmails < Spinach::FeatureSteps
 
   step 'I should not have @user.email added' do
     email = @user.emails.find_by(email: @user.email)
-    email.should be_nil
+    expect(email).to be_nil
   end
 end
diff --git a/features/steps/profile/notifications.rb b/features/steps/profile/notifications.rb
index b6e03b549af314ba43c8dc6203e50902c5958ced..447ea6d9d10fd5917772b81bee7f5d1bc6b5e986 100644
--- a/features/steps/profile/notifications.rb
+++ b/features/steps/profile/notifications.rb
@@ -7,6 +7,6 @@ class Spinach::Features::ProfileNotifications < Spinach::FeatureSteps
   end
 
   step 'I should see global notifications settings' do
-    page.should have_content "Notifications"
+    expect(page).to have_content "Notifications"
   end
 end
diff --git a/features/steps/profile/profile.rb b/features/steps/profile/profile.rb
index d16e6bbea57c53a10c8dd43f9098e1c22cea7830..32e6859eff792812904a456e8a03bd51a3e529f8 100644
--- a/features/steps/profile/profile.rb
+++ b/features/steps/profile/profile.rb
@@ -3,7 +3,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   include SharedPaths
 
   step 'I should see my profile info' do
-    page.should have_content "This information will appear on your profile"
+    expect(page).to have_content "This information will appear on your profile"
   end
 
   step 'I change my profile info' do
@@ -23,7 +23,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
     expect(@user.twitter).to eq 'testtwitter'
     expect(@user.website_url).to eq 'testurl'
     expect(@user.bio).to eq 'I <3 GitLab'
-    find('#user_location').value.should == 'Ukraine'
+    expect(find('#user_location').value).to eq 'Ukraine'
   end
 
   step 'I change my avatar' do
@@ -33,12 +33,12 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I should see new avatar' do
-    @user.avatar.should be_instance_of AvatarUploader
-    @user.avatar.url.should == "/uploads/user/avatar/#{ @user.id }/gitlab_logo.png"
+    expect(@user.avatar).to be_instance_of AvatarUploader
+    expect(@user.avatar.url).to eq "/uploads/user/avatar/#{ @user.id }/gitlab_logo.png"
   end
 
   step 'I should see the "Remove avatar" button' do
-    page.should have_link("Remove avatar")
+    expect(page).to have_link("Remove avatar")
   end
 
   step 'I have an avatar' do
@@ -53,15 +53,15 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I should see my gravatar' do
-    @user.avatar?.should be_false
+    expect(@user.avatar?).to be_false
   end
 
   step 'I should not see the "Remove avatar" button' do
-    page.should_not have_link("Remove avatar")
+    expect(page).not_to have_link("Remove avatar")
   end
 
   step 'I try change my password w/o old one' do
-    within '.update-password' do
+    page.within '.update-password' do
       fill_in "user_password", with: "22233344"
       fill_in "user_password_confirmation", with: "22233344"
       click_button "Save"
@@ -69,7 +69,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I change my password' do
-    within '.update-password' do
+    page.within '.update-password' do
       fill_in "user_current_password", with: "12345678"
       fill_in "user_password", with: "22233344"
       fill_in "user_password_confirmation", with: "22233344"
@@ -78,7 +78,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I unsuccessfully change my password' do
-    within '.update-password' do
+    page.within '.update-password' do
       fill_in "user_current_password", with: "12345678"
       fill_in "user_password", with: "password"
       fill_in "user_password_confirmation", with: "confirmation"
@@ -87,23 +87,23 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step "I should see a missing password error message" do
-    page.should have_content "You must provide a valid current password"
+    expect(page).to have_content "You must provide a valid current password"
   end
 
   step "I should see a password error message" do
-    page.should have_content "Password confirmation doesn't match"
+    expect(page).to have_content "Password confirmation doesn't match"
   end
 
   step 'I reset my token' do
-    within '.update-token' do
+    page.within '.update-token' do
       @old_token = @user.private_token
       click_button "Reset"
     end
   end
 
   step 'I should see new token' do
-    find("#token").value.should_not == @old_token
-    find("#token").value.should == @user.reload.private_token
+    expect(find("#token").value).not_to eq @old_token
+    expect(find("#token").value).to eq @user.reload.private_token
   end
 
   step 'I have activity' do
@@ -111,28 +111,28 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I should see my activity' do
-    page.should have_content "#{current_user.name} closed issue"
+    expect(page).to have_content "#{current_user.name} closed issue"
   end
 
   step "I change my application theme" do
-    within '.application-theme' do
+    page.within '.application-theme' do
       choose "Violet"
     end
   end
 
   step "I change my code preview theme" do
-    within '.code-preview-theme' do
+    page.within '.code-preview-theme' do
       choose "Solarized dark"
     end
   end
 
   step "I should see the theme change immediately" do
-    page.should have_selector('body.ui_color')
-    page.should_not have_selector('body.ui_basic')
+    expect(page).to have_selector('body.ui_color')
+    expect(page).not_to have_selector('body.ui_basic')
   end
 
   step "I should receive feedback that the changes were saved" do
-    page.should have_content("saved")
+    expect(page).to have_content("saved")
   end
 
   step 'my password is expired' do
@@ -141,11 +141,11 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
 
   step "I am not an ldap user" do
     current_user.identities.delete
-    current_user.ldap_user?.should be_false
+    expect(current_user.ldap_user?).to be_false
   end
 
   step 'I redirected to expired password page' do
-    current_path.should == new_profile_password_path
+    expect(current_path).to eq new_profile_password_path
   end
 
   step 'I submit new password' do
@@ -156,15 +156,15 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I redirected to sign in page' do
-    current_path.should == new_user_session_path
+    expect(current_path).to eq new_user_session_path
   end
 
   step 'I should be redirected to password page' do
-    current_path.should == edit_profile_password_path
+    expect(current_path).to eq edit_profile_password_path
   end
 
   step 'I should be redirected to account page' do
-    current_path.should == profile_account_path
+    expect(current_path).to eq profile_account_path
   end
 
   step 'I click on my profile picture' do
@@ -172,10 +172,10 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I should see my user page' do
-    page.should have_content "User Activity"
+    expect(page).to have_content "User Activity"
 
-    within '.navbar-gitlab' do
-      page.should have_content current_user.name
+    page.within '.navbar-gitlab' do
+      expect(page).to have_content current_user.name
     end
   end
 
@@ -189,7 +189,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I should see groups I belong to' do
-    page.should have_css('.profile-groups-avatars', visible: true)
+    expect(page).to have_css('.profile-groups-avatars', visible: true)
   end
 
   step 'I click on new application button' do
@@ -197,7 +197,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I should see application form' do
-    page.should have_content "New application"
+    expect(page).to have_content "New application"
   end
 
   step 'I fill application form out and submit' do
@@ -207,9 +207,9 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I see application' do
-    page.should have_content "Application: test"
-    page.should have_content "Application Id"
-    page.should have_content "Secret"
+    expect(page).to have_content "Application: test"
+    expect(page).to have_content "Application Id"
+    expect(page).to have_content "Secret"
   end
 
   step 'I click edit' do
@@ -217,28 +217,28 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I see edit application form' do
-    page.should have_content "Edit application"
+    expect(page).to have_content "Edit application"
   end
 
   step 'I change name of application and submit' do
-    page.should have_content "Edit application"
+    expect(page).to have_content "Edit application"
     fill_in :doorkeeper_application_name, with: 'test_changed'
     click_on "Submit"
   end
 
   step 'I see that application was changed' do
-    page.should have_content "test_changed"
-    page.should have_content "Application Id"
-    page.should have_content "Secret"
+    expect(page).to have_content "test_changed"
+    expect(page).to have_content "Application Id"
+    expect(page).to have_content "Secret"
   end
 
   step 'I click to remove application' do
-    within '.oauth-applications' do
+    page.within '.oauth-applications' do
       click_on "Destroy"
     end
   end
 
   step "I see that application is removed" do
-    page.find(".oauth-applications").should_not have_content "test_changed"
+    expect(page.find(".oauth-applications")).not_to have_content "test_changed"
   end
 end
diff --git a/features/steps/profile/ssh_keys.rb b/features/steps/profile/ssh_keys.rb
index ea912e5b4da0c10f271db8ba8ca9593354d2da2f..c7f879d247d697e49668ee01c2f5556af47f2e23 100644
--- a/features/steps/profile/ssh_keys.rb
+++ b/features/steps/profile/ssh_keys.rb
@@ -3,7 +3,7 @@ class Spinach::Features::ProfileSshKeys < Spinach::FeatureSteps
 
   step 'I should see my ssh keys' do
     @user.keys.each do |key|
-      page.should have_content(key.title)
+      expect(page).to have_content(key.title)
     end
   end
 
@@ -19,9 +19,9 @@ class Spinach::Features::ProfileSshKeys < Spinach::FeatureSteps
 
   step 'I should see new ssh key "Laptop"' do
     key = Key.find_by(title: "Laptop")
-    page.should have_content(key.title)
-    page.should have_content(key.key)
-    current_path.should == profile_key_path(key)
+    expect(page).to have_content(key.title)
+    expect(page).to have_content(key.key)
+    expect(current_path).to eq profile_key_path(key)
   end
 
   step 'I click link "Work"' do
@@ -37,7 +37,7 @@ class Spinach::Features::ProfileSshKeys < Spinach::FeatureSteps
   end
 
   step 'I should not see "Work" ssh key' do
-    page.should_not have_content "Work"
+    expect(page).not_to have_content "Work"
   end
 
   step 'I have ssh key "ssh-rsa Work"' do
diff --git a/features/steps/project/active_tab.rb b/features/steps/project/active_tab.rb
index dd3215adb1a2a4ee84f67c7d7d322109f69214a9..fabbc1d3d815bfa6444901bf49d98f097bb5585b 100644
--- a/features/steps/project/active_tab.rb
+++ b/features/steps/project/active_tab.rb
@@ -20,7 +20,7 @@ class Spinach::Features::ProjectActiveTab < Spinach::FeatureSteps
   end
 
   step 'I click the "Edit" tab' do
-    within '.project-settings-nav' do
+    page.within '.project-settings-nav' do
       click_link('Project')
     end
   end
diff --git a/features/steps/project/archived.rb b/features/steps/project/archived.rb
index 37ad0c776555da2384d9d501d2109f96daf5a8c6..db1387763d59615058a522d1d15ff9baa4d01cb5 100644
--- a/features/steps/project/archived.rb
+++ b/features/steps/project/archived.rb
@@ -19,11 +19,11 @@ class Spinach::Features::ProjectArchived < Spinach::FeatureSteps
   end
 
   step 'I should not see "Archived"' do
-    page.should_not have_content "Archived"
+    expect(page).not_to have_content "Archived"
   end
 
   step 'I should see "Archived"' do
-    page.should have_content "Archived"
+    expect(page).to have_content "Archived"
   end
 
   When 'I set project archived' do
diff --git a/features/steps/project/commits/branches.rb b/features/steps/project/commits/branches.rb
index 07f7e5796a3a04ad42e05b8da816e8b5bea0e594..338f5e8d3ee66ce7c2ed50bf4f3695b2e7a6e614 100644
--- a/features/steps/project/commits/branches.rb
+++ b/features/steps/project/commits/branches.rb
@@ -8,8 +8,8 @@ class Spinach::Features::ProjectCommitsBranches < Spinach::FeatureSteps
   end
 
   step 'I should see "Shop" all branches list' do
-    page.should have_content "Branches"
-    page.should have_content "master"
+    expect(page).to have_content "Branches"
+    expect(page).to have_content "master"
   end
 
   step 'I click link "Protected"' do
@@ -17,9 +17,9 @@ class Spinach::Features::ProjectCommitsBranches < Spinach::FeatureSteps
   end
 
   step 'I should see "Shop" protected branches list' do
-    within ".protected-branches-list" do
-      page.should have_content "stable"
-      page.should_not have_content "master"
+    page.within ".protected-branches-list" do
+      expect(page).to have_content "stable"
+      expect(page).not_to have_content "master"
     end
   end
 
@@ -57,29 +57,29 @@ class Spinach::Features::ProjectCommitsBranches < Spinach::FeatureSteps
   end
 
   step 'I should see new branch created' do
-    page.should have_content 'deploy_keys'
+    expect(page).to have_content 'deploy_keys'
   end
 
   step 'I should see new an error that branch is invalid' do
-    page.should have_content 'Branch name invalid'
+    expect(page).to have_content 'Branch name invalid'
   end
 
   step 'I should see new an error that ref is invalid' do
-    page.should have_content 'Invalid reference name'
+    expect(page).to have_content 'Invalid reference name'
   end
 
   step 'I should see new an error that branch already exists' do
-    page.should have_content 'Branch already exists'
+    expect(page).to have_content 'Branch already exists'
   end
 
   step "I click branch 'improve/awesome' delete link" do
-    within '.js-branch-improve\/awesome' do
+    page.within '.js-branch-improve\/awesome' do
       find('.btn-remove').click
       sleep 0.05
     end
   end
 
   step "I should not see branch 'improve/awesome'" do
-    all(visible: true).should_not have_content 'improve/awesome'
+    expect(page.all(visible: true)).not_to have_content 'improve/awesome'
   end
 end
diff --git a/features/steps/project/commits/commits.rb b/features/steps/project/commits/commits.rb
index 30d53333b787c7e81434d35dbcc4ae8f389d1e94..4b19e3beed4428de0671345e0152316044281589 100644
--- a/features/steps/project/commits/commits.rb
+++ b/features/steps/project/commits/commits.rb
@@ -6,9 +6,9 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps
 
   step 'I see project commits' do
     commit = @project.repository.commit
-    page.should have_content(@project.name)
-    page.should have_content(commit.message[0..20])
-    page.should have_content(commit.short_id)
+    expect(page).to have_content(@project.name)
+    expect(page).to have_content(commit.message[0..20])
+    expect(page).to have_content(commit.short_id)
   end
 
   step 'I click atom feed link' do
@@ -17,10 +17,10 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps
 
   step 'I see commits atom feed' do
     commit = @project.repository.commit
-    response_headers['Content-Type'].should have_content("application/atom+xml")
-    body.should have_selector("title", text: "#{@project.name}:master commits")
-    body.should have_selector("author email", text: commit.author_email)
-    body.should have_selector("entry summary", text: commit.description[0..10])
+    expect(response_headers['Content-Type']).to have_content("application/atom+xml")
+    expect(body).to have_selector("title", text: "#{@project.name}:master commits")
+    expect(body).to have_selector("author email", text: commit.author_email)
+    expect(body).to have_selector("entry summary", text: commit.description[0..10])
   end
 
   step 'I click on commit link' do
@@ -28,8 +28,8 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps
   end
 
   step 'I see commit info' do
-    page.should have_content sample_commit.message
-    page.should have_content "Showing #{sample_commit.files_changed_count} changed files"
+    expect(page).to have_content sample_commit.message
+    expect(page).to have_content "Showing #{sample_commit.files_changed_count} changed files"
   end
 
   step 'I fill compare fields with refs' do
@@ -45,27 +45,27 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps
   end
 
   step 'I should see additional file lines' do
-    within @diff.parent do
-      first('.new_line').text.should_not have_content "..."
+    page.within @diff.parent do
+      expect(first('.new_line').text).not_to have_content "..."
     end
   end
 
   step 'I see compared refs' do
-    page.should have_content "Compare View"
-    page.should have_content "Commits (1)"
-    page.should have_content "Showing 2 changed files"
+    expect(page).to have_content "Compare View"
+    expect(page).to have_content "Commits (1)"
+    expect(page).to have_content "Showing 2 changed files"
   end
 
   step 'I see breadcrumb links' do
-    page.should have_selector('ul.breadcrumb')
-    page.should have_selector('ul.breadcrumb a', count: 4)
+    expect(page).to have_selector('ul.breadcrumb')
+    expect(page).to have_selector('ul.breadcrumb a', count: 4)
   end
 
   step 'I see commits stats' do
-    page.should have_content 'Top 50 Committers'
-    page.should have_content 'Committers'
-    page.should have_content 'Total commits'
-    page.should have_content 'Authors'
+    expect(page).to have_content 'Top 50 Committers'
+    expect(page).to have_content 'Committers'
+    expect(page).to have_content 'Total commits'
+    expect(page).to have_content 'Authors'
   end
 
   step 'I visit big commit page' do
@@ -74,8 +74,8 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps
   end
 
   step 'I see big commit warning' do
-    page.should have_content sample_big_commit.message
-    page.should have_content "Too many changes"
+    expect(page).to have_content sample_big_commit.message
+    expect(page).to have_content "Too many changes"
   end
 
   step 'I visit a commit with an image that changed' do
@@ -83,9 +83,9 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps
   end
 
   step 'The diff links to both the previous and current image' do
-    links = all('.two-up span div a')
-    links[0]['href'].should =~ %r{blob/#{sample_image_commit.old_blob_id}}
-    links[1]['href'].should =~ %r{blob/#{sample_image_commit.new_blob_id}}
+    links = page.all('.two-up span div a')
+    expect(links[0]['href']).to match %r{blob/#{sample_image_commit.old_blob_id}}
+    expect(links[1]['href']).to match %r{blob/#{sample_image_commit.new_blob_id}}
   end
 
   step 'I click side-by-side diff button' do
@@ -93,10 +93,10 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps
   end
 
   step 'I see side-by-side diff button' do
-    page.should have_content "Side-by-side"
+    expect(page).to have_content "Side-by-side"
   end
 
   step 'I see inline diff button' do
-    page.should have_content "Inline"
+    expect(page).to have_content "Inline"
   end
 end
diff --git a/features/steps/project/commits/tags.rb b/features/steps/project/commits/tags.rb
index 3465fcbfd072dfc8c37afc7b3711a11bcf6eeff9..e6f8faf50fdec75a764adaca1e26317ba9e8cec4 100644
--- a/features/steps/project/commits/tags.rb
+++ b/features/steps/project/commits/tags.rb
@@ -4,8 +4,8 @@ class Spinach::Features::ProjectCommitsTags < Spinach::FeatureSteps
   include SharedPaths
 
   step 'I should see "Shop" all tags list' do
-    page.should have_content "Tags"
-    page.should have_content "v1.0.0"
+    expect(page).to have_content "Tags"
+    expect(page).to have_content "v1.0.0"
   end
 
   step 'I click new tag link' do
@@ -37,37 +37,37 @@ class Spinach::Features::ProjectCommitsTags < Spinach::FeatureSteps
   end
 
   step 'I should see new tag created' do
-    page.should have_content 'v7.0'
+    expect(page).to have_content 'v7.0'
   end
 
   step 'I should see new an error that tag is invalid' do
-    page.should have_content 'Tag name invalid'
+    expect(page).to have_content 'Tag name invalid'
   end
 
   step 'I should see new an error that tag ref is invalid' do
-    page.should have_content 'Invalid reference name'
+    expect(page).to have_content 'Invalid reference name'
   end
 
   step 'I should see new an error that tag already exists' do
-    page.should have_content 'Tag already exists'
+    expect(page).to have_content 'Tag already exists'
   end
 
   step "I delete tag 'v1.1.0'" do
-    within '.tags' do
+    page.within '.tags' do
       first('.btn-remove').click
       sleep 0.05
     end
   end
 
   step "I should not see tag 'v1.1.0'" do
-    within '.tags' do
-      all(visible: true).should_not have_content 'v1.1.0'
+    page.within '.tags' do
+      expect(page.all(visible: true)).not_to have_content 'v1.1.0'
     end
   end
 
   step 'I delete all tags' do
-    within '.tags' do
-      all('.btn-remove').each do |remove|
+    page.within '.tags' do
+      page.all('.btn-remove').each do |remove|
         remove.click
         sleep 0.05
       end
@@ -75,8 +75,8 @@ class Spinach::Features::ProjectCommitsTags < Spinach::FeatureSteps
   end
 
   step 'I should see tags info message' do
-    within '.tags' do
-      page.should have_content 'Repository has no tags yet.'
+    page.within '.tags' do
+      expect(page).to have_content 'Repository has no tags yet.'
     end
   end
 end
diff --git a/features/steps/project/commits/user_lookup.rb b/features/steps/project/commits/user_lookup.rb
index 63ff84c82ef0645a0d08fbc53bc8b506f54106c5..40cada6da45017b10fcacafaa5d3b77ce3a1558b 100644
--- a/features/steps/project/commits/user_lookup.rb
+++ b/features/steps/project/commits/user_lookup.rb
@@ -29,9 +29,9 @@ class Spinach::Features::ProjectCommitsUserLookup < Spinach::FeatureSteps
 
   def check_author_link(email, user)
     author_link = find('.commit-author-link')
-    author_link['href'].should == user_path(user)
-    author_link['data-original-title'].should == email
-    find('.commit-author-name').text.should == user.name
+    expect(author_link['href']).to eq user_path(user)
+    expect(author_link['data-original-title']).to eq email
+    expect(find('.commit-author-name').text).to eq user.name
   end
 
   def user_primary
diff --git a/features/steps/project/create.rb b/features/steps/project/create.rb
index 6b85cf74f5f239b718ff0085cf7ea252ad71c32f..0d39e1997b57552b50b2b564b96d5bc6e918d925 100644
--- a/features/steps/project/create.rb
+++ b/features/steps/project/create.rb
@@ -8,20 +8,20 @@ class Spinach::Features::ProjectCreate < Spinach::FeatureSteps
   end
 
   step 'I should see project page' do
-    page.should have_content "Empty"
-    current_path.should == namespace_project_path(Project.last.namespace, Project.last)
+    expect(page).to have_content "Empty"
+    expect(current_path).to eq namespace_project_path(Project.last.namespace, Project.last)
   end
 
   step 'I should see empty project instuctions' do
-    page.should have_content "git init"
-    page.should have_content "git remote"
-    page.should have_content Project.last.url_to_repo
+    expect(page).to have_content "git init"
+    expect(page).to have_content "git remote"
+    expect(page).to have_content Project.last.url_to_repo
   end
 
   step 'I see empty project instuctions' do
-    page.should have_content "git init"
-    page.should have_content "git remote"
-    page.should have_content Project.last.url_to_repo
+    expect(page).to have_content "git init"
+    expect(page).to have_content "git remote"
+    expect(page).to have_content Project.last.url_to_repo
   end
 
   step 'I click on HTTP' do
@@ -29,7 +29,7 @@ class Spinach::Features::ProjectCreate < Spinach::FeatureSteps
   end
 
   step 'Remote url should update to http link' do
-    page.should have_content "git remote add origin #{Project.last.http_url_to_repo}"
+    expect(page).to have_content "git remote add origin #{Project.last.http_url_to_repo}"
   end
 
   step 'If I click on SSH' do
@@ -37,6 +37,6 @@ class Spinach::Features::ProjectCreate < Spinach::FeatureSteps
   end
 
   step 'Remote url should update to ssh link' do
-    page.should have_content "git remote add origin #{Project.last.url_to_repo}"
+    expect(page).to have_content "git remote add origin #{Project.last.url_to_repo}"
   end
 end
diff --git a/features/steps/project/deploy_keys.rb b/features/steps/project/deploy_keys.rb
index 81d1182cd1baf101d883402b7e6c5b7a7256acaa..a4d6c9a1b8e625dcebb5d93d60e49a20d99075ba 100644
--- a/features/steps/project/deploy_keys.rb
+++ b/features/steps/project/deploy_keys.rb
@@ -8,20 +8,20 @@ class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps
   end
 
   step 'I should see project deploy key' do
-    within '.enabled-keys' do
-      page.should have_content deploy_key.title
+    page.within '.enabled-keys' do
+      expect(page).to have_content deploy_key.title
     end
   end
 
   step 'I should see other project deploy key' do
-    within '.available-keys' do
-      page.should have_content other_deploy_key.title
+    page.within '.available-keys' do
+      expect(page).to have_content other_deploy_key.title
     end
   end
 
   step 'I should see public deploy key' do
-    within '.available-keys' do
-      page.should have_content public_deploy_key.title
+    page.within '.available-keys' do
+      expect(page).to have_content public_deploy_key.title
     end
   end
 
@@ -36,12 +36,12 @@ class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps
   end
 
   step 'I should be on deploy keys page' do
-    current_path.should == namespace_project_deploy_keys_path(@project.namespace, @project)
+    expect(current_path).to eq namespace_project_deploy_keys_path(@project.namespace, @project)
   end
 
   step 'I should see newly created deploy key' do
-    within '.enabled-keys' do
-      page.should have_content(deploy_key.title)
+    page.within '.enabled-keys' do
+      expect(page).to have_content(deploy_key.title)
     end
   end
 
@@ -56,8 +56,8 @@ class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps
   end
 
   step 'I should only see the same deploy key once' do
-    within '.available-keys' do
-      page.should have_selector('ul li', count: 1)
+    page.within '.available-keys' do
+      expect(page).to have_selector('ul li', count: 1)
     end
   end
 
@@ -66,7 +66,7 @@ class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps
   end
 
   step 'I click attach deploy key' do
-    within '.available-keys' do
+    page.within '.available-keys' do
       click_link 'Enable'
     end
   end
diff --git a/features/steps/project/fork.rb b/features/steps/project/fork.rb
index 8e58597db205f47ea0b4ad4076903cfc1817c005..0e433781d7a41dd88a9238d10a6735f1709e8633 100644
--- a/features/steps/project/fork.rb
+++ b/features/steps/project/fork.rb
@@ -4,8 +4,8 @@ class Spinach::Features::ProjectFork < Spinach::FeatureSteps
   include SharedProject
 
   step 'I click link "Fork"' do
-    page.should have_content "Shop"
-    page.should have_content "Fork"
+    expect(page).to have_content "Shop"
+    expect(page).to have_content "Fork"
     click_link "Fork"
   end
 
@@ -15,7 +15,7 @@ class Spinach::Features::ProjectFork < Spinach::FeatureSteps
   end
 
   step 'I should see the forked project page' do
-    page.should have_content "Project was successfully forked."
+    expect(page).to have_content "Project was successfully forked."
   end
 
   step 'I already have a project named "Shop" in my namespace' do
@@ -23,11 +23,11 @@ class Spinach::Features::ProjectFork < Spinach::FeatureSteps
   end
 
   step 'I should see a "Name has already been taken" warning' do
-    page.should have_content "Name has already been taken"
+    expect(page).to have_content "Name has already been taken"
   end
 
   step 'I fork to my namespace' do
-    within '.fork-namespaces' do
+    page.within '.fork-namespaces' do
       click_link current_user.name
     end
   end
diff --git a/features/steps/project/forked_merge_requests.rb b/features/steps/project/forked_merge_requests.rb
index ebfa102cee5b824ab53c57739ebeab6aff5a0e73..78812c520260bad287f37649c1348139856e17ff 100644
--- a/features/steps/project/forked_merge_requests.rb
+++ b/features/steps/project/forked_merge_requests.rb
@@ -21,17 +21,17 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I should see merge request "Merge Request On Forked Project"' do
-    @project.merge_requests.size.should >= 1
+    expect(@project.merge_requests.size).to be >= 1
     @merge_request = @project.merge_requests.last
-    current_path.should == namespace_project_merge_request_path(@project.namespace, @project, @merge_request)
-    @merge_request.title.should == "Merge Request On Forked Project"
-    @merge_request.source_project.should == @forked_project
-    @merge_request.source_branch.should == "fix"
-    @merge_request.target_branch.should == "master"
-    page.should have_content @forked_project.path_with_namespace
-    page.should have_content @project.path_with_namespace
-    page.should have_content @merge_request.source_branch
-    page.should have_content @merge_request.target_branch
+    expect(current_path).to eq namespace_project_merge_request_path(@project.namespace, @project, @merge_request)
+    expect(@merge_request.title).to eq "Merge Request On Forked Project"
+    expect(@merge_request.source_project).to eq @forked_project
+    expect(@merge_request.source_branch).to eq "fix"
+    expect(@merge_request.target_branch).to eq "master"
+    expect(page).to have_content @forked_project.path_with_namespace
+    expect(page).to have_content @project.path_with_namespace
+    expect(page).to have_content @merge_request.source_branch
+    expect(page).to have_content @merge_request.target_branch
   end
 
   step 'I fill out a "Merge Request On Forked Project" merge request' do
@@ -56,7 +56,7 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps
 
   step 'I should see the commit under the forked from project' do
     commit = @project.repository.commit
-    page.should have_content(commit.message)
+    expect(page).to have_content(commit.message)
   end
 
   step 'I click "Create Merge Request on fork" link' do
@@ -64,12 +64,12 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I see prefilled new Merge Request page for the forked project' do
-    current_path.should == new_namespace_project_merge_request_path(@forked_project.namespace, @forked_project)
-    find("#merge_request_source_project_id").value.should == @forked_project.id.to_s
-    find("#merge_request_target_project_id").value.should == @project.id.to_s
-    find("#merge_request_source_branch").value.should have_content "new_design"
-    find("#merge_request_target_branch").value.should have_content "master"
-    find("#merge_request_title").value.should == "New Design"
+    expect(current_path).to eq new_namespace_project_merge_request_path(@forked_project.namespace, @forked_project)
+    expect(find("#merge_request_source_project_id").value).to eq @forked_project.id.to_s
+    expect(find("#merge_request_target_project_id").value).to eq @project.id.to_s
+    expect(find("#merge_request_source_branch").value).to have_content "new_design"
+    expect(find("#merge_request_target_branch").value).to have_content "master"
+    expect(find("#merge_request_title").value).to eq "New Design"
     verify_commit_link(".mr_target_commit", @project)
     verify_commit_link(".mr_source_commit", @forked_project)
   end
@@ -83,22 +83,22 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I should see the edited merge request' do
-    page.should have_content "An Edited Forked Merge Request"
-    @project.merge_requests.size.should >= 1
+    expect(page).to have_content "An Edited Forked Merge Request"
+    expect(@project.merge_requests.size).to be >= 1
     @merge_request = @project.merge_requests.last
-    current_path.should == namespace_project_merge_request_path(@project.namespace, @project, @merge_request)
-    @merge_request.source_project.should == @forked_project
-    @merge_request.source_branch.should == "fix"
-    @merge_request.target_branch.should == "master"
-    page.should have_content @forked_project.path_with_namespace
-    page.should have_content @project.path_with_namespace
-    page.should have_content @merge_request.source_branch
-    page.should have_content @merge_request.target_branch
+    expect(current_path).to eq namespace_project_merge_request_path(@project.namespace, @project, @merge_request)
+    expect(@merge_request.source_project).to eq @forked_project
+    expect(@merge_request.source_branch).to eq "fix"
+    expect(@merge_request.target_branch).to eq "master"
+    expect(page).to have_content @forked_project.path_with_namespace
+    expect(page).to have_content @project.path_with_namespace
+    expect(page).to have_content @merge_request.source_branch
+    expect(page).to have_content @merge_request.target_branch
   end
 
   step 'I should see last push widget' do
-    page.should have_content "You pushed to new_design"
-    page.should have_link "Create Merge Request"
+    expect(page).to have_content "You pushed to new_design"
+    expect(page).to have_link "Create Merge Request"
   end
 
   step 'I click link edit "Merge Request On Forked Project"' do
@@ -106,26 +106,26 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I see the edit page prefilled for "Merge Request On Forked Project"' do
-    current_path.should == edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)
-    page.should have_content "Edit merge request ##{@merge_request.id}"
-    find("#merge_request_title").value.should == "Merge Request On Forked Project"
+    expect(current_path).to eq edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)
+    expect(page).to have_content "Edit merge request ##{@merge_request.id}"
+    expect(find("#merge_request_title").value).to eq "Merge Request On Forked Project"
   end
 
   step 'I fill out an invalid "Merge Request On Forked Project" merge request' do
     select "Select branch", from: "merge_request_target_branch"
-    find(:select, "merge_request_source_project_id", {}).value.should == @forked_project.id.to_s
-    find(:select, "merge_request_target_project_id", {}).value.should == @project.id.to_s
-    find(:select, "merge_request_source_branch", {}).value.should == ""
-    find(:select, "merge_request_target_branch", {}).value.should == ""
+    expect(find(:select, "merge_request_source_project_id", {}).value).to eq @forked_project.id.to_s
+    expect(find(:select, "merge_request_target_project_id", {}).value).to eq @project.id.to_s
+    expect(find(:select, "merge_request_source_branch", {}).value).to eq ""
+    expect(find(:select, "merge_request_target_branch", {}).value).to eq ""
     click_button "Compare branches"
   end
 
   step 'I should see validation errors' do
-    page.should have_content "You must select source and target branch"
+    expect(page).to have_content "You must select source and target branch"
   end
 
   step 'the target repository should be the original repository' do
-    page.should have_select("merge_request_target_project_id", selected: @project.path_with_namespace)
+    expect(page).to have_select("merge_request_target_project_id", selected: @project.path_with_namespace)
   end
 
   step 'I click "Assign to" dropdown"' do
@@ -139,13 +139,13 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps
   step 'I should see the users from the target project ID' do
     expect(page).to have_selector('.user-result', visible: true, count: 2)
     users = page.all('.user-name')
-    users[0].text.should == 'Unassigned'
-    users[1].text.should == @project.users.first.name
+    expect(users[0].text).to eq 'Unassigned'
+    expect(users[1].text).to eq @project.users.first.name
   end
 
   # Verify a link is generated against the correct project
   def verify_commit_link(container_div, container_project)
     # This should force a wait for the javascript to execute
-    find(:div,container_div).find(".commit_short_id")['href'].should have_content "#{container_project.path_with_namespace}/commit"
+    expect(find(:div,container_div).find(".commit_short_id")['href']).to have_content "#{container_project.path_with_namespace}/commit"
   end
 end
diff --git a/features/steps/project/graph.rb b/features/steps/project/graph.rb
index a2807c340f6824156c17315bf270f9b377cd26d2..5e7e573a6abb03086e2a022141d5feb88ebfa7a7 100644
--- a/features/steps/project/graph.rb
+++ b/features/steps/project/graph.rb
@@ -3,7 +3,7 @@ class Spinach::Features::ProjectGraph < Spinach::FeatureSteps
   include SharedProject
 
   step 'page should have graphs' do
-    page.should have_selector ".stat-graph"
+    expect(page).to have_selector ".stat-graph"
   end
 
   When 'I visit project "Shop" graph page' do
@@ -17,7 +17,7 @@ class Spinach::Features::ProjectGraph < Spinach::FeatureSteps
   end
 
   step 'page should have commits graphs' do
-    page.should have_content "Commit statistics for master"
-    page.should have_content "Commits per day of month"
+    expect(page).to have_content "Commit statistics for master"
+    expect(page).to have_content "Commits per day of month"
   end
 end
diff --git a/features/steps/project/hooks.rb b/features/steps/project/hooks.rb
index d06905285fe33bfd4cfa236bbb9fccbfac20df6b..04e3bf78ede53b0080c55dac3653cb49a4a28e37 100644
--- a/features/steps/project/hooks.rb
+++ b/features/steps/project/hooks.rb
@@ -19,7 +19,7 @@ class Spinach::Features::ProjectHooks < Spinach::FeatureSteps
   end
 
   step 'I should see project hook' do
-    page.should have_content @hook.url
+    expect(page).to have_content @hook.url
   end
 
   step 'I submit new hook' do
@@ -29,8 +29,8 @@ class Spinach::Features::ProjectHooks < Spinach::FeatureSteps
   end
 
   step 'I should see newly created hook' do
-    current_path.should == namespace_project_hooks_path(current_project.namespace, current_project)
-    page.should have_content(@url)
+    expect(current_path).to eq namespace_project_hooks_path(current_project.namespace, current_project)
+    expect(page).to have_content(@url)
   end
 
   step 'I click test hook button' do
@@ -44,19 +44,19 @@ class Spinach::Features::ProjectHooks < Spinach::FeatureSteps
   end
 
   step 'hook should be triggered' do
-    current_path.should == namespace_project_hooks_path(current_project.namespace, current_project)
-    page.should have_selector '.flash-notice',
+    expect(current_path).to eq namespace_project_hooks_path(current_project.namespace, current_project)
+    expect(page).to have_selector '.flash-notice',
                               text: 'Hook successfully executed.'
   end
 
   step 'I should see hook error message' do
-    page.should have_selector '.flash-alert',
+    expect(page).to have_selector '.flash-alert',
                               text: 'Hook execution failed. '\
                               'Ensure the project has commits.'
   end
 
   step 'I should see hook service down error message' do
-    page.should have_selector '.flash-alert',
+    expect(page).to have_selector '.flash-alert',
                               text: 'Hook execution failed. '\
                                     'Ensure hook URL is correct and '\
                                     'service is up.'
diff --git a/features/steps/project/issues/filter_labels.rb b/features/steps/project/issues/filter_labels.rb
index 5740bd12837ba6aa0e1a5f172270c9beecc42d07..50bb32429b965345a1ddf62f010fd77c086e884b 100644
--- a/features/steps/project/issues/filter_labels.rb
+++ b/features/steps/project/issues/filter_labels.rb
@@ -5,26 +5,26 @@ class Spinach::Features::ProjectIssuesFilterLabels < Spinach::FeatureSteps
   include Select2Helper
 
   step 'I should see "Bugfix1" in issues list' do
-    within ".issues-list" do
-      page.should have_content "Bugfix1"
+    page.within ".issues-list" do
+      expect(page).to have_content "Bugfix1"
     end
   end
 
   step 'I should see "Bugfix2" in issues list' do
-    within ".issues-list" do
-      page.should have_content "Bugfix2"
+    page.within ".issues-list" do
+      expect(page).to have_content "Bugfix2"
     end
   end
 
   step 'I should not see "Bugfix2" in issues list' do
-    within ".issues-list" do
-      page.should_not have_content "Bugfix2"
+    page.within ".issues-list" do
+      expect(page).not_to have_content "Bugfix2"
     end
   end
 
   step 'I should not see "Feature1" in issues list' do
-    within ".issues-list" do
-      page.should_not have_content "Feature1"
+    page.within ".issues-list" do
+      expect(page).not_to have_content "Feature1"
     end
   end
 
@@ -33,7 +33,7 @@ class Spinach::Features::ProjectIssuesFilterLabels < Spinach::FeatureSteps
   end
 
   step 'I click link "feature"' do
-    within ".labels-filter" do
+    page.within ".labels-filter" do
       click_link "feature"
     end
   end
diff --git a/features/steps/project/issues/issues.rb b/features/steps/project/issues/issues.rb
index 504f0cff724bca5c7b57ca4e8c3ad9309a08387c..6873c043e190345e8fe679dc488f7533b3ee7bb8 100644
--- a/features/steps/project/issues/issues.rb
+++ b/features/steps/project/issues/issues.rb
@@ -7,24 +7,24 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
   include SharedMarkdown
 
   step 'I should see "Release 0.4" in issues' do
-    page.should have_content "Release 0.4"
+    expect(page).to have_content "Release 0.4"
   end
 
   step 'I should not see "Release 0.3" in issues' do
-    page.should_not have_content "Release 0.3"
+    expect(page).not_to have_content "Release 0.3"
   end
 
   step 'I should not see "Tweet control" in issues' do
-    page.should_not have_content "Tweet control"
+    expect(page).not_to have_content "Tweet control"
   end
 
   step 'I should see that I am subscribed' do
-    find(".subscribe-button span").text.should == "Unsubscribe"
+    expect(find(".subscribe-button span").text).to eq "Unsubscribe"
   end
 
   step 'I should see that I am unsubscribed' do
     sleep 0.2
-    find(".subscribe-button span").text.should == "Subscribe"
+    expect(find(".subscribe-button span").text).to eq "Subscribe"
   end
 
   step 'I click link "Closed"' do
@@ -36,11 +36,11 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
   end
 
   step 'I should see "Release 0.3" in issues' do
-    page.should have_content "Release 0.3"
+    expect(page).to have_content "Release 0.3"
   end
 
   step 'I should not see "Release 0.4" in issues' do
-    page.should_not have_content "Release 0.4"
+    expect(page).not_to have_content "Release 0.4"
   end
 
   step 'I click link "All"' do
@@ -52,7 +52,7 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
   end
 
   step 'I should see issue "Release 0.4"' do
-    page.should have_content "Release 0.4"
+    expect(page).to have_content "Release 0.4"
   end
 
   step 'I click link "New Issue"' do
@@ -66,9 +66,9 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
   step 'I see current user as the first user' do
     expect(page).to have_selector('.user-result', visible: true, count: 4)
     users = page.all('.user-name')
-    users[0].text.should == 'Any'
-    users[1].text.should == 'Unassigned'
-    users[2].text.should == current_user.name
+    expect(users[0].text).to eq 'Any'
+    expect(users[1].text).to eq 'Unassigned'
+    expect(users[2].text).to eq current_user.name
   end
 
   step 'I submit new issue "500 error on profile"' do
@@ -87,16 +87,16 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
   end
 
   step 'I should see label \'bug\' with issue' do
-    within '.issue-show-labels' do
-      page.should have_content 'bug'
+    page.within '.issue-show-labels' do
+      expect(page).to have_content 'bug'
     end
   end
 
   step 'I should see issue "500 error on profile"' do
     issue = Issue.find_by(title: "500 error on profile")
-    page.should have_content issue.title
-    page.should have_content issue.author_name
-    page.should have_content issue.project.name
+    expect(page).to have_content issue.title
+    expect(page).to have_content issue.author_name
+    expect(page).to have_content issue.project.name
   end
 
   step 'I fill in issue search with "Re"' do
@@ -139,7 +139,7 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
 
   step 'I should see selected milestone with title "v3.0"' do
     issues_milestone_selector = "#issue_milestone_id_chzn > a"
-    find(issues_milestone_selector).should have_content("v3.0")
+    expect(find(issues_milestone_selector)).to have_content("v3.0")
   end
 
   When 'I select first assignee from "Shop" project' do
@@ -152,7 +152,7 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
     issues_assignee_selector = "#issue_assignee_id_chzn > a"
 
     assignee_name = project.users.first.name
-    find(issues_assignee_selector).should have_content(assignee_name)
+    expect(find(issues_assignee_selector)).to have_content(assignee_name)
   end
 
   step 'project "Shop" have "Release 0.4" open issue' do
@@ -190,8 +190,8 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
 
   step 'I see empty project details with ssh clone info' do
     project = Project.find_by(name: 'Empty Project')
-    all(:css, '.git-empty .clone').each do |element|
-      element.text.should include(project.url_to_repo)
+    page.all(:css, '.git-empty .clone').each do |element|
+      expect(element.text).to include(project.url_to_repo)
     end
   end
 
@@ -201,7 +201,7 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
   end
 
   step 'I leave a comment with code block' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       fill_in "note[note]", with: "```\nCommand [1]: /usr/local/bin/git , see [text](doc/text)\n```"
       click_button "Add Comment"
       sleep 0.05
@@ -209,13 +209,13 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
   end
 
   step 'I should see an error alert section within the comment form' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       find(".error-alert")
     end
   end
 
   step 'The code block should be unchanged' do
-    page.should have_content("```\nCommand [1]: /usr/local/bin/git , see [text](doc/text)\n```")
+    expect(page).to have_content("```\nCommand [1]: /usr/local/bin/git , see [text](doc/text)\n```")
   end
 
   step 'project \'Shop\' has issue \'Bugfix1\' with description: \'Description for issue1\'' do
@@ -239,15 +239,15 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
   end
 
   step 'I should see \'Bugfix1\' in issues' do
-    page.should have_content 'Bugfix1'
+    expect(page).to have_content 'Bugfix1'
   end
 
   step 'I should see \'Feature1\' in issues' do
-    page.should have_content 'Feature1'
+    expect(page).to have_content 'Feature1'
   end
 
   step 'I should not see \'Bugfix1\' in issues' do
-    page.should_not have_content 'Bugfix1'
+    expect(page).not_to have_content 'Bugfix1'
   end
 
   step 'issue \'Release 0.4\' has label \'bug\'' do
@@ -257,7 +257,7 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
   end
 
   step 'I click label \'bug\'' do
-    within ".issues-list" do
+    page.within ".issues-list" do
       click_link 'bug'
     end
   end
diff --git a/features/steps/project/issues/labels.rb b/features/steps/project/issues/labels.rb
index 6ce34c500c6f5d1ffc494a711f0dc9fb2d929976..d656acf4220c1f8d20b0bde8c90f2d28e37f0349 100644
--- a/features/steps/project/issues/labels.rb
+++ b/features/steps/project/issues/labels.rb
@@ -8,14 +8,14 @@ class Spinach::Features::ProjectIssuesLabels < Spinach::FeatureSteps
   end
 
   step 'I remove label \'bug\'' do
-    within "#label_#{bug_label.id}" do
+    page.within "#label_#{bug_label.id}" do
       click_link 'Remove'
     end
   end
 
   step 'I delete all labels' do
-    within '.labels' do
-      all('.btn-remove').each do |remove|
+    page.within '.labels' do
+      page.all('.btn-remove').each do |remove|
         remove.click
         sleep 0.05
       end
@@ -23,8 +23,8 @@ class Spinach::Features::ProjectIssuesLabels < Spinach::FeatureSteps
   end
 
   step 'I should see labels help message' do
-    within '.labels' do
-      page.should have_content 'Create first label or generate default set of '\
+    page.within '.labels' do
+      expect(page).to have_content 'Create first label or generate default set of '\
                                'labels'
     end
   end
@@ -48,38 +48,38 @@ class Spinach::Features::ProjectIssuesLabels < Spinach::FeatureSteps
   end
 
   step 'I should see label label exist error message' do
-    within '.label-form' do
-      page.should have_content 'Title has already been taken'
+    page.within '.label-form' do
+      expect(page).to have_content 'Title has already been taken'
     end
   end
 
   step 'I should see label color error message' do
-    within '.label-form' do
-      page.should have_content 'Color is invalid'
+    page.within '.label-form' do
+      expect(page).to have_content 'Color is invalid'
     end
   end
 
   step 'I should see label \'feature\'' do
-    within '.manage-labels-list' do
-      page.should have_content 'feature'
+    page.within '.manage-labels-list' do
+      expect(page).to have_content 'feature'
     end
   end
 
   step 'I should see label \'bug\'' do
-    within '.manage-labels-list' do
-      page.should have_content 'bug'
+    page.within '.manage-labels-list' do
+      expect(page).to have_content 'bug'
     end
   end
 
   step 'I should not see label \'bug\'' do
-    within '.manage-labels-list' do
-      page.should_not have_content 'bug'
+    page.within '.manage-labels-list' do
+      expect(page).not_to have_content 'bug'
     end
   end
 
   step 'I should see label \'support\'' do
-    within '.manage-labels-list' do
-      page.should have_content 'support'
+    page.within '.manage-labels-list' do
+      expect(page).to have_content 'support'
     end
   end
 
@@ -90,8 +90,8 @@ class Spinach::Features::ProjectIssuesLabels < Spinach::FeatureSteps
   end
 
   step 'I should see label \'fix\'' do
-    within '.manage-labels-list' do
-      page.should have_content 'fix'
+    page.within '.manage-labels-list' do
+      expect(page).to have_content 'fix'
     end
   end
 
diff --git a/features/steps/project/issues/milestones.rb b/features/steps/project/issues/milestones.rb
index cce87a6d9817a192da022c3f36f6afd0d1ac5129..708c5243947fc271590275208eb489148f4c1b1a 100644
--- a/features/steps/project/issues/milestones.rb
+++ b/features/steps/project/issues/milestones.rb
@@ -6,9 +6,9 @@ class Spinach::Features::ProjectIssuesMilestones < Spinach::FeatureSteps
 
   step 'I should see milestone "v2.2"' do
     milestone = @project.milestones.find_by(title: "v2.2")
-    page.should have_content(milestone.title[0..10])
-    page.should have_content(milestone.expires_at)
-    page.should have_content("Issues")
+    expect(page).to have_content(milestone.title[0..10])
+    expect(page).to have_content(milestone.expires_at)
+    expect(page).to have_content("Issues")
   end
 
   step 'I click link "v2.2"' do
@@ -26,9 +26,9 @@ class Spinach::Features::ProjectIssuesMilestones < Spinach::FeatureSteps
 
   step 'I should see milestone "v2.3"' do
     milestone = @project.milestones.find_by(title: "v2.3")
-    page.should have_content(milestone.title[0..10])
-    page.should have_content(milestone.expires_at)
-    page.should have_content("Issues")
+    expect(page).to have_content(milestone.title[0..10])
+    expect(page).to have_content(milestone.expires_at)
+    expect(page).to have_content("Issues")
   end
 
   step 'project "Shop" has milestone "v2.2"' do
@@ -54,6 +54,6 @@ class Spinach::Features::ProjectIssuesMilestones < Spinach::FeatureSteps
   end
 
   step 'I should see 3 issues' do
-    page.should have_selector('#tab-issues li.issue-row', count: 4)
+    expect(page).to have_selector('#tab-issues li.issue-row', count: 4)
   end
 end
diff --git a/features/steps/project/merge_requests.rb b/features/steps/project/merge_requests.rb
index f6cfa7ef9ed38b56c51bfd94a5ea6d1c65e27520..62c64e60f6d0cfe1e5742df89b81f017c84f7551 100644
--- a/features/steps/project/merge_requests.rb
+++ b/features/steps/project/merge_requests.rb
@@ -24,44 +24,44 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I should see merge request "Wiki Feature"' do
-    within '.merge-request' do
-      page.should have_content "Wiki Feature"
+    page.within '.merge-request' do
+      expect(page).to have_content "Wiki Feature"
     end
   end
 
   step 'I should see closed merge request "Bug NS-04"' do
     merge_request = MergeRequest.find_by!(title: "Bug NS-04")
-    merge_request.closed?.should be_true
-    page.should have_content "Rejected by"
+    expect(merge_request.closed?).to be_true
+    expect(page).to have_content "Rejected by"
   end
 
   step 'I should see merge request "Bug NS-04"' do
-    page.should have_content "Bug NS-04"
+    expect(page).to have_content "Bug NS-04"
   end
 
   step 'I should see "Bug NS-04" in merge requests' do
-    page.should have_content "Bug NS-04"
+    expect(page).to have_content "Bug NS-04"
   end
 
   step 'I should see "Feature NS-03" in merge requests' do
-    page.should have_content "Feature NS-03"
+    expect(page).to have_content "Feature NS-03"
   end
 
   step 'I should not see "Feature NS-03" in merge requests' do
-    page.should_not have_content "Feature NS-03"
+    expect(page).not_to have_content "Feature NS-03"
   end
 
 
   step 'I should not see "Bug NS-04" in merge requests' do
-    page.should_not have_content "Bug NS-04"
+    expect(page).not_to have_content "Bug NS-04"
   end
 
   step 'I should see that I am subscribed' do
-    find(".subscribe-button span").text.should == "Unsubscribe"
+    expect(find(".subscribe-button span").text).to eq "Unsubscribe"
   end
 
   step 'I should see that I am unsubscribed' do
-    find(".subscribe-button span").should have_content("Subscribe")
+    expect(find(".subscribe-button span")).to have_content("Subscribe")
   end
 
   step 'I click button "Unsubscribe"' do
@@ -113,7 +113,7 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I click on the Changes tab via Javascript' do
-    within '.merge-request-tabs' do
+    page.within '.merge-request-tabs' do
       click_link 'Changes'
     end
 
@@ -121,11 +121,11 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I should see the proper Inline and Side-by-side links' do
-    buttons = all('#commit-diff-viewtype')
+    buttons = page.all('#commit-diff-viewtype')
     expect(buttons.count).to eq(2)
 
     buttons.each do |b|
-      expect(b['href']).should_not have_content('json')
+      expect(expect(b['href'])).not_to have_content('json')
     end
   end
 
@@ -134,11 +134,11 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I click on the commit in the merge request' do
-    within '.merge-request-tabs' do
+    page.within '.merge-request-tabs' do
       click_link 'Commits'
     end
 
-    within '.commits' do
+    page.within '.commits' do
       click_link Commit.truncate_sha(sample_commit.id)
     end
   end
@@ -164,24 +164,24 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I should see a discussion has started on diff' do
-    page.should have_content "#{current_user.name} started a discussion"
-    page.should have_content sample_commit.line_code_path
-    page.should have_content "Line is wrong"
+    expect(page).to have_content "#{current_user.name} started a discussion"
+    expect(page).to have_content sample_commit.line_code_path
+    expect(page).to have_content "Line is wrong"
   end
 
   step 'I should see a discussion has started on commit diff' do
-    page.should have_content "#{current_user.name} started a discussion on commit"
-    page.should have_content sample_commit.line_code_path
-    page.should have_content "Line is wrong"
+    expect(page).to have_content "#{current_user.name} started a discussion on commit"
+    expect(page).to have_content sample_commit.line_code_path
+    expect(page).to have_content "Line is wrong"
   end
 
   step 'I should see a discussion has started on commit' do
-    page.should have_content "#{current_user.name} started a discussion on commit"
-    page.should have_content "One comment to rule them all"
+    expect(page).to have_content "#{current_user.name} started a discussion on commit"
+    expect(page).to have_content "One comment to rule them all"
   end
 
   step 'merge request is mergeable' do
-    page.should have_button 'Accept Merge Request'
+    expect(page).to have_button 'Accept Merge Request'
   end
 
   step 'I modify merge commit message' do
@@ -199,14 +199,14 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
       merge!: true,
     )
 
-    within '.mr-state-widget' do
+    page.within '.mr-state-widget' do
       click_button "Accept Merge Request"
     end
   end
 
   step 'I should see merged request' do
-    within '.issue-box' do
-      page.should have_content "Accepted"
+    page.within '.issue-box' do
+      expect(page).to have_content "Accepted"
     end
   end
 
@@ -215,72 +215,72 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I should see reopened merge request "Bug NS-04"' do
-    within '.issue-box' do
-      page.should have_content "Open"
+    page.within '.issue-box' do
+      expect(page).to have_content "Open"
     end
   end
 
   step 'I click link "Hide inline discussion" of the second file' do
-    within '.files [id^=diff]:nth-child(2)' do
+    page.within '.files [id^=diff]:nth-child(2)' do
       find('.js-toggle-diff-comments').click
     end
   end
 
   step 'I click link "Show inline discussion" of the second file' do
-    within '.files [id^=diff]:nth-child(2)' do
+    page.within '.files [id^=diff]:nth-child(2)' do
       find('.js-toggle-diff-comments').click
     end
   end
 
   step 'I should not see a comment like "Line is wrong" in the second file' do
-    within '.files [id^=diff]:nth-child(2)' do
-      page.should_not have_visible_content "Line is wrong"
+    page.within '.files [id^=diff]:nth-child(2)' do
+      expect(page).not_to have_visible_content "Line is wrong"
     end
   end
 
   step 'I should see a comment like "Line is wrong" in the second file' do
-    within '.files [id^=diff]:nth-child(2) .note-body > .note-text' do
-      page.should have_visible_content "Line is wrong"
+    page.within '.files [id^=diff]:nth-child(2) .note-body > .note-text' do
+      expect(page).to have_visible_content "Line is wrong"
     end
   end
 
   step 'I should not see a comment like "Line is wrong here" in the second file' do
-    within '.files [id^=diff]:nth-child(2)' do
-      page.should_not have_visible_content "Line is wrong here"
+    page.within '.files [id^=diff]:nth-child(2)' do
+      expect(page).not_to have_visible_content "Line is wrong here"
     end
   end
 
   step 'I should see a comment like "Line is wrong here" in the second file' do
-    within '.files [id^=diff]:nth-child(2) .note-body > .note-text' do
-      page.should have_visible_content "Line is wrong here"
+    page.within '.files [id^=diff]:nth-child(2) .note-body > .note-text' do
+      expect(page).to have_visible_content "Line is wrong here"
     end
   end
 
   step 'I leave a comment like "Line is correct" on line 12 of the first file' do
     init_diff_note_first_file
 
-    within(".js-discussion-note-form") do
+    page.within(".js-discussion-note-form") do
       fill_in "note_note", with: "Line is correct"
       click_button "Add Comment"
     end
 
-    within ".files [id^=diff]:nth-child(1) .note-body > .note-text" do
-      page.should have_content "Line is correct"
+    page.within ".files [id^=diff]:nth-child(1) .note-body > .note-text" do
+      expect(page).to have_content "Line is correct"
     end
   end
 
   step 'I leave a comment like "Line is wrong" on line 39 of the second file' do
     init_diff_note_second_file
 
-    within(".js-discussion-note-form") do
+    page.within(".js-discussion-note-form") do
       fill_in "note_note", with: "Line is wrong on here"
       click_button "Add Comment"
     end
   end
 
   step 'I should still see a comment like "Line is correct" in the first file' do
-    within '.files [id^=diff]:nth-child(1) .note-body > .note-text' do
-      page.should have_visible_content "Line is correct"
+    page.within '.files [id^=diff]:nth-child(1) .note-body > .note-text' do
+      expect(page).to have_visible_content "Line is correct"
     end
   end
 
@@ -297,8 +297,8 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I should see comments on the side-by-side diff page' do
-    within '.files [id^=diff]:nth-child(1) .parallel .note-body > .note-text' do
-      page.should have_visible_content "Line is correct"
+    page.within '.files [id^=diff]:nth-child(1) .parallel .note-body > .note-text' do
+      expect(page).to have_visible_content "Line is correct"
     end
   end
 
@@ -316,8 +316,8 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I should see new target branch changes' do
-    page.should have_content 'From fix into feature'
-    page.should have_content 'Target branch changed from master to feature'
+    expect(page).to have_content 'From fix into feature'
+    expect(page).to have_content 'Target branch changed from master to feature'
   end
 
   def merge_request
@@ -329,12 +329,12 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
   end
 
   def leave_comment(message)
-    within(".js-discussion-note-form") do
+    page.within(".js-discussion-note-form") do
       fill_in "note_note", with: message
       click_button "Add Comment"
     end
 
-    page.should have_content message
+    expect(page).to have_content message
   end
 
   def init_diff_note_first_file
diff --git a/features/steps/project/network_graph.rb b/features/steps/project/network_graph.rb
index a15688ace6aef3f4ab15ccc3e3ab51553fb4b142..992cf2734fdc8e993b4c6dbb7a8d9c545f22694c 100644
--- a/features/steps/project/network_graph.rb
+++ b/features/steps/project/network_graph.rb
@@ -4,7 +4,7 @@ class Spinach::Features::ProjectNetworkGraph < Spinach::FeatureSteps
   include SharedProject
 
   step 'page should have network graph' do
-    page.should have_selector ".network-graph"
+    expect(page).to have_selector ".network-graph"
   end
 
   When 'I visit project "Shop" network page' do
@@ -16,16 +16,16 @@ class Spinach::Features::ProjectNetworkGraph < Spinach::FeatureSteps
   end
 
   step 'page should select "master" in select box' do
-    page.should have_selector '.select2-chosen', text: "master"
+    expect(page).to have_selector '.select2-chosen', text: "master"
   end
 
   step 'page should select "v1.0.0" in select box' do
-    page.should have_selector '.select2-chosen', text: "v1.0.0"
+    expect(page).to have_selector '.select2-chosen', text: "v1.0.0"
   end
 
   step 'page should have "master" on graph' do
-    within '.network-graph' do
-      page.should have_content 'master'
+    page.within '.network-graph' do
+      expect(page).to have_content 'master'
     end
   end
 
@@ -45,33 +45,33 @@ class Spinach::Features::ProjectNetworkGraph < Spinach::FeatureSteps
   end
 
   step 'page should have content not containing "v1.0.0"' do
-    within '.network-graph' do
-      page.should have_content 'Change some files'
+    page.within '.network-graph' do
+      expect(page).to have_content 'Change some files'
     end
   end
 
   step 'page should not have content not containing "v1.0.0"' do
-    within '.network-graph' do
-      page.should_not have_content 'Change some files'
+    page.within '.network-graph' do
+      expect(page).not_to have_content 'Change some files'
     end
   end
 
   step 'page should select "feature" in select box' do
-    page.should have_selector '.select2-chosen', text: "feature"
+    expect(page).to have_selector '.select2-chosen', text: "feature"
   end
 
   step 'page should select "v1.0.0" in select box' do
-    page.should have_selector '.select2-chosen', text: "v1.0.0"
+    expect(page).to have_selector '.select2-chosen', text: "v1.0.0"
   end
 
   step 'page should have "feature" on graph' do
-    within '.network-graph' do
-      page.should have_content 'feature'
+    page.within '.network-graph' do
+      expect(page).to have_content 'feature'
     end
   end
 
   When 'I looking for a commit by SHA of "v1.0.0"' do
-    within ".network-form" do
+    page.within ".network-form" do
       fill_in 'extended_sha1', with: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9'
       find('button').click
     end
@@ -79,13 +79,13 @@ class Spinach::Features::ProjectNetworkGraph < Spinach::FeatureSteps
   end
 
   step 'page should have "v1.0.0" on graph' do
-    within '.network-graph' do
-      page.should have_content 'v1.0.0'
+    page.within '.network-graph' do
+      expect(page).to have_content 'v1.0.0'
     end
   end
 
   When 'I look for a commit by ";"' do
-    within ".network-form" do
+    page.within ".network-form" do
       fill_in 'extended_sha1', with: ';'
       find('button').click
     end
diff --git a/features/steps/project/project.rb b/features/steps/project/project.rb
index fcc15aacc214a0989af99d4fffbe119da2152613..ee4c7cd0f06083e67e2aabb6fa39b59d0a210523 100644
--- a/features/steps/project/project.rb
+++ b/features/steps/project/project.rb
@@ -13,7 +13,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps
   end
 
   step 'I should see project with new settings' do
-    find_field('project_name').value.should == 'NewName'
+    expect(find_field('project_name').value).to eq 'NewName'
   end
 
   step 'change project path settings' do
@@ -22,7 +22,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps
   end
 
   step 'I should see project with new path settings' do
-    project.path.should == 'new-path'
+    expect(project.path).to eq 'new-path'
   end
 
   step 'I change the project avatar' do
@@ -35,13 +35,13 @@ class Spinach::Features::Project < Spinach::FeatureSteps
   end
 
   step 'I should see new project avatar' do
-    @project.avatar.should be_instance_of AvatarUploader
+    expect(@project.avatar).to be_instance_of AvatarUploader
     url = @project.avatar.url
-    url.should == "/uploads/project/avatar/#{ @project.id }/gitlab_logo.png"
+    expect(url).to eq "/uploads/project/avatar/#{ @project.id }/gitlab_logo.png"
   end
 
   step 'I should see the "Remove avatar" button' do
-    page.should have_link('Remove avatar')
+    expect(page).to have_link('Remove avatar')
   end
 
   step 'I have an project avatar' do
@@ -59,16 +59,16 @@ class Spinach::Features::Project < Spinach::FeatureSteps
   end
 
   step 'I should see the default project avatar' do
-    @project.avatar?.should be_false
+    expect(@project.avatar?).to be_false
   end
 
   step 'I should not see the "Remove avatar" button' do
-    page.should_not have_link('Remove avatar')
+    expect(page).not_to have_link('Remove avatar')
   end
 
   step 'I should see project "Shop" version' do
-    within '.project-side' do
-      page.should have_content '6.7.0.pre'
+    page.within '.project-side' do
+      expect(page).to have_content '6.7.0.pre'
     end
   end
 
@@ -78,7 +78,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps
   end
 
   step 'I should see project default branch changed' do
-    find(:css, 'select#project_default_branch').value.should == 'fix'
+    expect(find(:css, 'select#project_default_branch').value).to eq 'fix'
   end
 
   step 'I select project "Forum" README tab' do
@@ -86,13 +86,13 @@ class Spinach::Features::Project < Spinach::FeatureSteps
   end
 
   step 'I should see project "Forum" README' do
-    page.should have_link 'README.md'
-    page.should have_content 'Sample repo for testing gitlab features'
+    expect(page).to have_link 'README.md'
+    expect(page).to have_content 'Sample repo for testing gitlab features'
   end
 
   step 'I should see project "Shop" README' do
-    page.should have_link 'README.md'
-    page.should have_content 'testme'
+    expect(page).to have_link 'README.md'
+    expect(page).to have_content 'testme'
   end
 
   step 'I add project tags' do
@@ -104,14 +104,14 @@ class Spinach::Features::Project < Spinach::FeatureSteps
   end
 
   step 'I should not see "New Issue" button' do
-    page.should_not have_link 'New Issue'
+    expect(page).not_to have_link 'New Issue'
   end
 
   step 'I should not see "New Merge Request" button' do
-    page.should_not have_link 'New Merge Request'
+    expect(page).not_to have_link 'New Merge Request'
   end
 
   step 'I should not see "Snippets" button' do
-    page.should_not have_link 'Snippets'
+    expect(page).not_to have_link 'Snippets'
   end
 end
diff --git a/features/steps/project/redirects.rb b/features/steps/project/redirects.rb
index 57c6e39c80198e49ba25da6cd889f65b4a4936e3..0e724138a8ab2a55eaa024154984ce240f640a38 100644
--- a/features/steps/project/redirects.rb
+++ b/features/steps/project/redirects.rb
@@ -18,8 +18,8 @@ class Spinach::Features::ProjectRedirects < Spinach::FeatureSteps
 
   step 'I should see project "Community" home page' do
     Gitlab.config.gitlab.should_receive(:host).and_return("www.example.com")
-    within '.navbar-gitlab .title' do
-      page.should have_content 'Community'
+    page.within '.navbar-gitlab .title' do
+      expect(page).to have_content 'Community'
     end
   end
 
@@ -48,8 +48,8 @@ class Spinach::Features::ProjectRedirects < Spinach::FeatureSteps
 
   step 'I should be redirected to "Community" page' do
     project = Project.find_by(name: 'Community')
-    current_path.should == "/#{project.path_with_namespace}"
-    status_code.should == 200
+    expect(current_path).to eq "/#{project.path_with_namespace}"
+    expect(status_code).to eq 200
   end
 
   step 'I get redirected to signin page where I sign in' do
@@ -63,7 +63,7 @@ class Spinach::Features::ProjectRedirects < Spinach::FeatureSteps
 
   step 'I should be redirected to "Enterprise" page' do
     project = Project.find_by(name: 'Enterprise')
-    current_path.should == "/#{project.path_with_namespace}"
-    status_code.should == 200
+    expect(current_path).to eq "/#{project.path_with_namespace}"
+    expect(status_code).to eq 200
   end
 end
diff --git a/features/steps/project/services.rb b/features/steps/project/services.rb
index 4b3d79324ab62facffa21048e6f2165a3c4b09c5..0327fd61981d3656dcc6e28b20183c120513615e 100644
--- a/features/steps/project/services.rb
+++ b/features/steps/project/services.rb
@@ -8,16 +8,16 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see list of available services' do
-    page.should have_content 'Project services'
-    page.should have_content 'Campfire'
-    page.should have_content 'HipChat'
-    page.should have_content 'GitLab CI'
-    page.should have_content 'Assembla'
-    page.should have_content 'Pushover'
-    page.should have_content 'Atlassian Bamboo'
-    page.should have_content 'JetBrains TeamCity'
-    page.should have_content 'Asana'
-    page.should have_content 'Irker (IRC gateway)'
+    expect(page).to have_content 'Project services'
+    expect(page).to have_content 'Campfire'
+    expect(page).to have_content 'HipChat'
+    expect(page).to have_content 'GitLab CI'
+    expect(page).to have_content 'Assembla'
+    expect(page).to have_content 'Pushover'
+    expect(page).to have_content 'Atlassian Bamboo'
+    expect(page).to have_content 'JetBrains TeamCity'
+    expect(page).to have_content 'Asana'
+    expect(page).to have_content 'Irker (IRC gateway)'
   end
 
   step 'I click gitlab-ci service link' do
@@ -32,7 +32,7 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see service settings saved' do
-    find_field('Project url').value.should == 'http://ci.gitlab.org/projects/3'
+    expect(find_field('Project url').value).to eq 'http://ci.gitlab.org/projects/3'
   end
 
   step 'I click hipchat service link' do
@@ -47,7 +47,7 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see hipchat service settings saved' do
-    find_field('Room').value.should == 'gitlab'
+    expect(find_field('Room').value).to eq 'gitlab'
   end
 
   step 'I fill hipchat settings with custom server' do
@@ -59,7 +59,7 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see hipchat service settings with custom server saved' do
-    find_field('Server').value.should == 'https://chat.example.com'
+    expect(find_field('Server').value).to eq 'https://chat.example.com'
   end
 
   step 'I click pivotaltracker service link' do
@@ -73,7 +73,7 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see pivotaltracker service settings saved' do
-    find_field('Token').value.should == 'verySecret'
+    expect(find_field('Token').value).to eq 'verySecret'
   end
 
   step 'I click Flowdock service link' do
@@ -87,7 +87,7 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see Flowdock service settings saved' do
-    find_field('Token').value.should == 'verySecret'
+    expect(find_field('Token').value).to eq 'verySecret'
   end
 
   step 'I click Assembla service link' do
@@ -101,7 +101,7 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see Assembla service settings saved' do
-    find_field('Token').value.should == 'verySecret'
+    expect(find_field('Token').value).to eq 'verySecret'
   end
 
   step 'I click Asana service link' do
@@ -116,8 +116,8 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see Asana service settings saved' do
-    find_field('Api key').value.should == 'verySecret'
-    find_field('Restrict to branch').value.should == 'master'
+    expect(find_field('Api key').value).to eq 'verySecret'
+    expect(find_field('Restrict to branch').value).to eq 'master'
   end
 
   step 'I click email on push service link' do
@@ -130,7 +130,7 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see email on push service settings saved' do
-    find_field('Recipients').value.should == 'qa@company.name'
+    expect(find_field('Recipients').value).to eq 'qa@company.name'
   end
 
   step 'I click Irker service link' do
@@ -145,8 +145,8 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see Irker service settings saved' do
-    find_field('Recipients').value.should == 'irc://chat.freenode.net/#commits'
-    find_field('Colorize messages').value.should == '1'
+    expect(find_field('Recipients').value).to eq 'irc://chat.freenode.net/#commits'
+    expect(find_field('Colorize messages').value).to eq '1'
   end
 
   step 'I click Slack service link' do
@@ -160,7 +160,7 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see Slack service settings saved' do
-    find_field('Webhook').value.should == 'https://hooks.slack.com/services/SVRWFV0VVAR97N/B02R25XN3/ZBqu7xMupaEEICInN685'
+    expect(find_field('Webhook').value).to eq 'https://hooks.slack.com/services/SVRWFV0VVAR97N/B02R25XN3/ZBqu7xMupaEEICInN685'
   end
 
   step 'I click Pushover service link' do
@@ -178,11 +178,11 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see Pushover service settings saved' do
-    find_field('Api key').value.should == 'verySecret'
-    find_field('User key').value.should == 'verySecret'
-    find_field('Device').value.should == 'myDevice'
-    find_field('Priority').find('option[selected]').value.should == '1'
-    find_field('Sound').find('option[selected]').value.should == 'bike'
+    expect(find_field('Api key').value).to eq 'verySecret'
+    expect(find_field('User key').value).to eq 'verySecret'
+    expect(find_field('Device').value).to eq 'myDevice'
+    expect(find_field('Priority').find('option[selected]').value).to eq '1'
+    expect(find_field('Sound').find('option[selected]').value).to eq 'bike'
   end
 
   step 'I click Atlassian Bamboo CI service link' do
@@ -199,9 +199,9 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see Atlassian Bamboo CI service settings saved' do
-    find_field('Bamboo url').value.should == 'http://bamboo.example.com'
-    find_field('Build key').value.should == 'KEY'
-    find_field('Username').value.should == 'user'
+    expect(find_field('Bamboo url').value).to eq 'http://bamboo.example.com'
+    expect(find_field('Build key').value).to eq 'KEY'
+    expect(find_field('Username').value).to eq 'user'
   end
 
   step 'I click JetBrains TeamCity CI service link' do
@@ -218,8 +218,8 @@ class Spinach::Features::ProjectServices < Spinach::FeatureSteps
   end
 
   step 'I should see JetBrains TeamCity CI service settings saved' do
-    find_field('Teamcity url').value.should == 'http://teamcity.example.com'
-    find_field('Build type').value.should == 'GitlabTest_Build'
-    find_field('Username').value.should == 'user'
+    expect(find_field('Teamcity url').value).to eq 'http://teamcity.example.com'
+    expect(find_field('Build type').value).to eq 'GitlabTest_Build'
+    expect(find_field('Username').value).to eq 'user'
   end
 end
diff --git a/features/steps/project/snippets.rb b/features/steps/project/snippets.rb
index 343aeb53b11e4d274dd63876a535c83916e4e95b..eedb4e1b74a5c613486f99947a8ce1a1158c070c 100644
--- a/features/steps/project/snippets.rb
+++ b/features/steps/project/snippets.rb
@@ -30,19 +30,19 @@ class Spinach::Features::ProjectSnippets < Spinach::FeatureSteps
   end
 
   step 'I should see "Snippet one" in snippets' do
-    page.should have_content "Snippet one"
+    expect(page).to have_content "Snippet one"
   end
 
   step 'I should not see "Snippet two" in snippets' do
-    page.should_not have_content "Snippet two"
+    expect(page).not_to have_content "Snippet two"
   end
 
   step 'I should not see "Snippet one" in snippets' do
-    page.should_not have_content "Snippet one"
+    expect(page).not_to have_content "Snippet one"
   end
 
   step 'I click link "Edit"' do
-    within ".file-title" do
+    page.within ".file-title" do
       click_link "Edit"
     end
   end
@@ -54,15 +54,15 @@ class Spinach::Features::ProjectSnippets < Spinach::FeatureSteps
   step 'I submit new snippet "Snippet three"' do
     fill_in "project_snippet_title", :with => "Snippet three"
     fill_in "project_snippet_file_name", :with => "my_snippet.rb"
-    within('.file-editor') do
+    page.within('.file-editor') do
       find(:xpath, "//input[@id='project_snippet_content']").set 'Content of snippet three'
     end
     click_button "Create snippet"
   end
 
   step 'I should see snippet "Snippet three"' do
-    page.should have_content "Snippet three"
-    page.should have_content "Content of snippet three"
+    expect(page).to have_content "Snippet three"
+    expect(page).to have_content "Content of snippet three"
   end
 
   step 'I submit new title "Snippet new title"' do
@@ -71,18 +71,18 @@ class Spinach::Features::ProjectSnippets < Spinach::FeatureSteps
   end
 
   step 'I should see "Snippet new title"' do
-    page.should have_content "Snippet new title"
+    expect(page).to have_content "Snippet new title"
   end
 
   step 'I leave a comment like "Good snippet!"' do
-    within('.js-main-target-form') do
+    page.within('.js-main-target-form') do
       fill_in "note_note", with: "Good snippet!"
       click_button "Add Comment"
     end
   end
 
   step 'I should see comment "Good snippet!"' do
-    page.should have_content "Good snippet!"
+    expect(page).to have_content "Good snippet!"
   end
 
   step 'I visit snippet page "Snippet one"' do
diff --git a/features/steps/project/source/browse_files.rb b/features/steps/project/source/browse_files.rb
index caf6c73ee066536790c090002118654fe016e839..398c9bf57563d0f92ce72c212d3f0e1fe08169f9 100644
--- a/features/steps/project/source/browse_files.rb
+++ b/features/steps/project/source/browse_files.rb
@@ -5,23 +5,23 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
   include RepoHelpers
 
   step 'I should see files from repository' do
-    page.should have_content "VERSION"
-    page.should have_content ".gitignore"
-    page.should have_content "LICENSE"
+    expect(page).to have_content "VERSION"
+    expect(page).to have_content ".gitignore"
+    expect(page).to have_content "LICENSE"
   end
 
   step 'I should see files from repository for "6d39438"' do
-    current_path.should == namespace_project_tree_path(@project.namespace, @project, "6d39438")
-    page.should have_content ".gitignore"
-    page.should have_content "LICENSE"
+    expect(current_path).to eq namespace_project_tree_path(@project.namespace, @project, "6d39438")
+    expect(page).to have_content ".gitignore"
+    expect(page).to have_content "LICENSE"
   end
 
   step 'I see the ".gitignore"' do
-    page.should have_content '.gitignore'
+    expect(page).to have_content '.gitignore'
   end
 
   step 'I don\'t see the ".gitignore"' do
-    page.should_not have_content '.gitignore'
+    expect(page).not_to have_content '.gitignore'
   end
 
   step 'I click on ".gitignore" file in repo' do
@@ -29,11 +29,11 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
   end
 
   step 'I should see its content' do
-    page.should have_content old_gitignore_content
+    expect(page).to have_content old_gitignore_content
   end
 
   step 'I should see its new content' do
-    page.should have_content new_gitignore_content
+    expect(page).to have_content new_gitignore_content
   end
 
   step 'I click link "Raw"' do
@@ -41,7 +41,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
   end
 
   step 'I should see raw file content' do
-    source.should == sample_blob.data
+    expect(source).to eq sample_blob.data
   end
 
   step 'I click button "Edit"' do
@@ -49,16 +49,16 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
   end
 
   step 'I cannot see the edit button' do
-    page.should_not have_link 'edit'
+    expect(page).not_to have_link 'edit'
   end
 
   step 'The edit button is disabled' do
-    page.should have_css '.disabled', text: 'Edit'
+    expect(page).to have_css '.disabled', text: 'Edit'
   end
 
   step 'I can edit code' do
     set_new_content
-    evaluate_script('blob.editor.getValue()').should == new_gitignore_content
+    expect(evaluate_script('blob.editor.getValue()')).to eq new_gitignore_content
   end
 
   step 'I edit code' do
@@ -98,7 +98,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
   end
 
   step 'I see diff' do
-    page.should have_css '.line_holder.new'
+    expect(page).to have_css '.line_holder.new'
   end
 
   step 'I click on "new file" link in repo' do
@@ -106,8 +106,8 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
   end
 
   step 'I can see new file page' do
-    page.should have_content "New file"
-    page.should have_content "Commit message"
+    expect(page).to have_content "New file"
+    expect(page).to have_content "Commit message"
   end
 
   step 'I click on files directory' do
@@ -119,25 +119,25 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
   end
 
   step 'I see Browse dir link' do
-    page.should have_link 'Browse Dir »'
-    page.should_not have_link 'Browse Code »'
+    expect(page).to have_link 'Browse Dir »'
+    expect(page).not_to have_link 'Browse Code »'
   end
 
   step 'I click on readme file' do
-    within '.tree-table' do
+    page.within '.tree-table' do
       click_link 'README.md'
     end
   end
 
   step 'I see Browse file link' do
-    page.should have_link 'Browse File »'
-    page.should_not have_link 'Browse Code »'
+    expect(page).to have_link 'Browse File »'
+    expect(page).not_to have_link 'Browse Code »'
   end
 
   step 'I see Browse code link' do
-    page.should have_link 'Browse Code »'
-    page.should_not have_link 'Browse File »'
-    page.should_not have_link 'Browse Dir »'
+    expect(page).to have_link 'Browse Code »'
+    expect(page).not_to have_link 'Browse File »'
+    expect(page).not_to have_link 'Browse Dir »'
   end
 
   step 'I click on Permalink' do
@@ -145,7 +145,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
   end
 
   step 'I am redirected to the files URL' do
-    current_path.should == namespace_project_tree_path(@project.namespace, @project, 'master')
+    expect(current_path).to eq namespace_project_tree_path(@project.namespace, @project, 'master')
   end
 
   step 'I am redirected to the ".gitignore"' do
diff --git a/features/steps/project/source/git_blame.rb b/features/steps/project/source/git_blame.rb
index e29a816c51b79075ac30f1f40b75c3cf9784395c..d0a27f47e2a4739cae9ed33c5f157d2246e779bc 100644
--- a/features/steps/project/source/git_blame.rb
+++ b/features/steps/project/source/git_blame.rb
@@ -12,8 +12,8 @@ class Spinach::Features::ProjectSourceGitBlame < Spinach::FeatureSteps
   end
 
   step 'I should see git file blame' do
-    page.should have_content "*.rb"
-    page.should have_content "Dmitriy Zaporozhets"
-    page.should have_content "Initial commit"
+    expect(page).to have_content "*.rb"
+    expect(page).to have_content "Dmitriy Zaporozhets"
+    expect(page).to have_content "Initial commit"
   end
 end
diff --git a/features/steps/project/source/markdown_render.rb b/features/steps/project/source/markdown_render.rb
index 7961fdedad8a906ca70e66c0f186ff2520936804..c78e86fa1a731904d81f70512773c7f50cf8e4a5 100644
--- a/features/steps/project/source/markdown_render.rb
+++ b/features/steps/project/source/markdown_render.rb
@@ -13,19 +13,19 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'I should see files from repository in markdown' do
-    current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown")
-    page.should have_content "README.md"
-    page.should have_content "CHANGELOG"
+    expect(current_path).to eq namespace_project_tree_path(@project.namespace, @project, "markdown")
+    expect(page).to have_content "README.md"
+    expect(page).to have_content "CHANGELOG"
   end
 
   step 'I should see rendered README which contains correct links' do
-    page.should have_content "Welcome to GitLab GitLab is a free project and repository management application"
-    page.should have_link "GitLab API doc"
-    page.should have_link "GitLab API website"
-    page.should have_link "Rake tasks"
-    page.should have_link "backup and restore procedure"
-    page.should have_link "GitLab API doc directory"
-    page.should have_link "Maintenance"
+    expect(page).to have_content "Welcome to GitLab GitLab is a free project and repository management application"
+    expect(page).to have_link "GitLab API doc"
+    expect(page).to have_link "GitLab API website"
+    expect(page).to have_link "Rake tasks"
+    expect(page).to have_link "backup and restore procedure"
+    expect(page).to have_link "GitLab API doc directory"
+    expect(page).to have_link "Maintenance"
   end
 
   step 'I click on Gitlab API in README' do
@@ -33,8 +33,8 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'I should see correct document rendered' do
-    current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md")
-    page.should have_content "All API requests require authentication"
+    expect(current_path).to eq namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md")
+    expect(page).to have_content "All API requests require authentication"
   end
 
   step 'I click on Rake tasks in README' do
@@ -42,9 +42,9 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'I should see correct directory rendered' do
-    current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown/doc/raketasks")
-    page.should have_content "backup_restore.md"
-    page.should have_content "maintenance.md"
+    expect(current_path).to eq namespace_project_tree_path(@project.namespace, @project, "markdown/doc/raketasks")
+    expect(page).to have_content "backup_restore.md"
+    expect(page).to have_content "maintenance.md"
   end
 
   step 'I click on GitLab API doc directory in README' do
@@ -52,9 +52,9 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'I should see correct doc/api directory rendered' do
-    current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown/doc/api")
-    page.should have_content "README.md"
-    page.should have_content "users.md"
+    expect(current_path).to eq namespace_project_tree_path(@project.namespace, @project, "markdown/doc/api")
+    expect(page).to have_content "README.md"
+    expect(page).to have_content "users.md"
   end
 
   step 'I click on Maintenance in README' do
@@ -62,41 +62,41 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'I should see correct maintenance file rendered' do
-    current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/raketasks/maintenance.md")
-    page.should have_content "bundle exec rake gitlab:env:info RAILS_ENV=production"
+    expect(current_path).to eq namespace_project_blob_path(@project.namespace, @project, "markdown/doc/raketasks/maintenance.md")
+    expect(page).to have_content "bundle exec rake gitlab:env:info RAILS_ENV=production"
   end
 
   step 'I click on link "empty" in the README' do
-    within('.readme-holder') do
+    page.within('.readme-holder') do
       click_link "empty"
     end
   end
 
   step 'I click on link "id" in the README' do
-    within('.readme-holder') do
+    page.within('.readme-holder') do
       click_link "#id"
     end
   end
 
   step 'I navigate to the doc/api/README' do
-    within '.tree-table' do
+    page.within '.tree-table' do
       click_link "doc"
     end
 
-    within '.tree-table' do
+    page.within '.tree-table' do
       click_link "api"
     end
 
-    within '.tree-table' do
+    page.within '.tree-table' do
       click_link "README.md"
     end
   end
 
   step 'I see correct file rendered' do
-    current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md")
-    page.should have_content "Contents"
-    page.should have_link "Users"
-    page.should have_link "Rake tasks"
+    expect(current_path).to eq namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md")
+    expect(page).to have_content "Contents"
+    expect(page).to have_link "Users"
+    expect(page).to have_link "Rake tasks"
   end
 
   step 'I click on users in doc/api/README' do
@@ -104,8 +104,8 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'I should see the correct document file' do
-    current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/users.md")
-    page.should have_content "Get a list of users."
+    expect(current_path).to eq namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/users.md")
+    expect(page).to have_content "Get a list of users."
   end
 
   step 'I click on raketasks in doc/api/README' do
@@ -131,32 +131,32 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'I should see files from repository in markdown branch' do
-    current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown")
-    page.should have_content "README.md"
-    page.should have_content "CHANGELOG"
+    expect(current_path).to eq namespace_project_tree_path(@project.namespace, @project, "markdown")
+    expect(page).to have_content "README.md"
+    expect(page).to have_content "CHANGELOG"
   end
 
   step 'I see correct file rendered in markdown branch' do
-    current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md")
-    page.should have_content "Contents"
-    page.should have_link "Users"
-    page.should have_link "Rake tasks"
+    expect(current_path).to eq namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md")
+    expect(page).to have_content "Contents"
+    expect(page).to have_link "Users"
+    expect(page).to have_link "Rake tasks"
   end
 
   step 'I should see correct document rendered for markdown branch' do
-    current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md")
-    page.should have_content "All API requests require authentication"
+    expect(current_path).to eq namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md")
+    expect(page).to have_content "All API requests require authentication"
   end
 
   step 'I should see correct directory rendered for markdown branch' do
-    current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown/doc/raketasks")
-    page.should have_content "backup_restore.md"
-    page.should have_content "maintenance.md"
+    expect(current_path).to eq namespace_project_tree_path(@project.namespace, @project, "markdown/doc/raketasks")
+    expect(page).to have_content "backup_restore.md"
+    expect(page).to have_content "maintenance.md"
   end
 
   step 'I should see the users document file in markdown branch' do
-    current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/users.md")
-    page.should have_content "Get a list of users."
+    expect(current_path).to eq namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/users.md")
+    expect(page).to have_content "Get a list of users."
   end
 
   # Expected link contents
@@ -208,7 +208,7 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
 
   step 'I go to wiki page' do
     click_link "Wiki"
-    current_path.should == namespace_project_wiki_path(@project.namespace, @project, "home")
+    expect(current_path).to eq namespace_project_wiki_path(@project.namespace, @project, "home")
   end
 
   step 'I add various links to the wiki page' do
@@ -218,8 +218,8 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'Wiki page should have added links' do
-    current_path.should == namespace_project_wiki_path(@project.namespace, @project, "home")
-    page.should have_content "test GitLab API doc Rake tasks"
+    expect(current_path).to eq namespace_project_wiki_path(@project.namespace, @project, "home")
+    expect(page).to have_content "test GitLab API doc Rake tasks"
   end
 
   step 'I add a header to the wiki page' do
@@ -237,13 +237,13 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'I see new wiki page named test' do
-    current_path.should ==  namespace_project_wiki_path(@project.namespace, @project, "test")
-    page.should have_content "Editing"
+    expect(current_path).to eq  namespace_project_wiki_path(@project.namespace, @project, "test")
+    expect(page).to have_content "Editing"
   end
 
   When 'I go back to wiki page home' do
     visit namespace_project_wiki_path(@project.namespace, @project, "home")
-    current_path.should == namespace_project_wiki_path(@project.namespace, @project, "home")
+    expect(current_path).to eq namespace_project_wiki_path(@project.namespace, @project, "home")
   end
 
   step 'I click on GitLab API doc link' do
@@ -251,8 +251,8 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'I see Gitlab API document' do
-    current_path.should == namespace_project_wiki_path(@project.namespace, @project, "api")
-    page.should have_content "Editing"
+    expect(current_path).to eq namespace_project_wiki_path(@project.namespace, @project, "api")
+    expect(page).to have_content "Editing"
   end
 
   step 'I click on Rake tasks link' do
@@ -260,13 +260,13 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'I see Rake tasks directory' do
-    current_path.should == namespace_project_wiki_path(@project.namespace, @project, "raketasks")
-    page.should have_content "Editing"
+    expect(current_path).to eq namespace_project_wiki_path(@project.namespace, @project, "raketasks")
+    expect(page).to have_content "Editing"
   end
 
   step 'I go directory which contains README file' do
     visit namespace_project_tree_path(@project.namespace, @project, "markdown/doc/api")
-    current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown/doc/api")
+    expect(current_path).to eq namespace_project_tree_path(@project.namespace, @project, "markdown/doc/api")
   end
 
   step 'I click on a relative link in README' do
@@ -274,8 +274,8 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps
   end
 
   step 'I should see the correct markdown' do
-    current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/users.md")
-    page.should have_content "List users"
+    expect(current_path).to eq namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/users.md")
+    expect(page).to have_content "List users"
   end
 
   step 'Header "Application details" should have correct id and link' do
diff --git a/features/steps/project/source/multiselect_blob.rb b/features/steps/project/source/multiselect_blob.rb
index b749ba493719cbb7610e4ef0122ccb9b1caaa428..8e14623b8927be60bfa3685c28b07fdc0e7f2885 100644
--- a/features/steps/project/source/multiselect_blob.rb
+++ b/features/steps/project/source/multiselect_blob.rb
@@ -23,19 +23,19 @@ class Spinach::Features::ProjectSourceMultiselectBlob < Spinach::FeatureSteps
         pluralization = range.kind_of?(Array) ? "s" : ""
 
         step "I should see \"#{fragment}\" as URI fragment" do
-          URI.parse(current_url).fragment.should == fragment
+          expect(URI.parse(current_url).fragment).to eq fragment
         end
 
         step "I should see line#{pluralization} #{fragment[1..-1]} highlighted" do
           ids = Array(range).map { |n| "LC#{n}" }
           extra = false
 
-          highlighted = all("#tree-content-holder .highlight .line.hll")
+          highlighted = page.all("#tree-content-holder .highlight .line.hll")
           highlighted.each do |element|
             extra ||= ids.delete(element[:id]).nil?
           end
 
-          extra.should be_false and ids.should be_empty
+          expect(extra).to be_false and ids.should be_empty
         end
       end
     end
diff --git a/features/steps/project/source/search_code.rb b/features/steps/project/source/search_code.rb
index b66c5a4123a558e6eefe22fdeb6c54e370d9178b..feee756d7ec8074f8a5c64dde7bdfbb4b522d5d4 100644
--- a/features/steps/project/source/search_code.rb
+++ b/features/steps/project/source/search_code.rb
@@ -9,11 +9,11 @@ class Spinach::Features::ProjectSourceSearchCode < Spinach::FeatureSteps
   end
 
   step 'I should see files from repository containing "coffee"' do
-    page.should have_content 'coffee'
-    page.should have_content 'CONTRIBUTING.md'
+    expect(page).to have_content 'coffee'
+    expect(page).to have_content 'CONTRIBUTING.md'
   end
 
   step 'I should see empty result' do
-    page.should have_content "We couldn't find any"
+    expect(page).to have_content "We couldn't find any"
   end
 end
diff --git a/features/steps/project/star.rb b/features/steps/project/star.rb
index 50cdfd73c347501a0fcd69386f97fd8f3b376cd2..8b50bfcef04b40976342badc0aaee1b41f3fb2f6 100644
--- a/features/steps/project/star.rb
+++ b/features/steps/project/star.rb
@@ -5,7 +5,7 @@ class Spinach::Features::ProjectStar < Spinach::FeatureSteps
   include SharedUser
 
   step "The project has no stars" do
-    page.should_not have_content '.star-buttons'
+    expect(page).not_to have_content '.star-buttons'
   end
 
   step "The project has 0 stars" do
@@ -26,7 +26,7 @@ class Spinach::Features::ProjectStar < Spinach::FeatureSteps
   end
 
   step 'I redirected to sign in page' do
-    current_path.should == new_user_session_path
+    expect(current_path).to eq new_user_session_path
   end
 
   protected
diff --git a/features/steps/project/team_management.rb b/features/steps/project/team_management.rb
index 09e5af3ef484d5b645dc89e15710b24f8fa0e5a5..97d63016458b41b0317108d13bb5423a29017311 100644
--- a/features/steps/project/team_management.rb
+++ b/features/steps/project/team_management.rb
@@ -5,14 +5,14 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps
   include Select2Helper
 
   step 'I should be able to see myself in team' do
-    page.should have_content(@user.name)
-    page.should have_content(@user.username)
+    expect(page).to have_content(@user.name)
+    expect(page).to have_content(@user.username)
   end
 
   step 'I should see "Dmitriy" in team list' do
     user = User.find_by(name: "Dmitriy")
-    page.should have_content(user.name)
-    page.should have_content(user.username)
+    expect(page).to have_content(user.name)
+    expect(page).to have_content(user.username)
   end
 
   step 'I click link "Add members"' do
@@ -22,7 +22,7 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps
   step 'I select "Mike" as "Reporter"' do
     user = User.find_by(name: "Mike")
 
-    within ".users-project-form" do
+    page.within ".users-project-form" do
       select2(user.id, from: "#user_ids", multiple: true)
       select "Reporter", from: "access_level"
     end
@@ -30,13 +30,13 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps
   end
 
   step 'I should see "Mike" in team list as "Reporter"' do
-    within ".access-reporter" do
-      page.should have_content('Mike')
+    page.within ".access-reporter" do
+      expect(page).to have_content('Mike')
     end
   end
 
   step 'I select "sjobs@apple.com" as "Reporter"' do
-    within ".users-project-form" do
+    page.within ".users-project-form" do
       select2("sjobs@apple.com", from: "#user_ids", multiple: true)
       select "Reporter", from: "access_level"
     end
@@ -44,16 +44,16 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps
   end
 
   step 'I should see "sjobs@apple.com" in team list as invited "Reporter"' do
-    within ".access-reporter" do
-      page.should have_content('sjobs@apple.com')
-      page.should have_content('invited')
-      page.should have_content('Reporter')
+    page.within ".access-reporter" do
+      expect(page).to have_content('sjobs@apple.com')
+      expect(page).to have_content('invited')
+      expect(page).to have_content('Reporter')
     end
   end
 
   step 'I should see "Dmitriy" in team list as "Developer"' do
-    within ".access-developer" do
-      page.should have_content('Dmitriy')
+    page.within ".access-developer" do
+      expect(page).to have_content('Dmitriy')
     end
   end
 
@@ -61,7 +61,7 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps
     project = Project.find_by(name: "Shop")
     user = User.find_by(name: 'Dmitriy')
     project_member = project.project_members.find_by(user_id: user.id)
-    within "#project_member_#{project_member.id}" do
+    page.within "#project_member_#{project_member.id}" do
       click_button "Edit access level"
       select "Reporter", from: "project_member_access_level"
       click_button "Save"
@@ -69,8 +69,8 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps
   end
 
   step 'I should see "Dmitriy" in team list as "Reporter"' do
-    within ".access-reporter" do
-      page.should have_content('Dmitriy')
+    page.within ".access-reporter" do
+      expect(page).to have_content('Dmitriy')
     end
   end
 
@@ -80,8 +80,8 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps
 
   step 'I should not see "Dmitriy" in team list' do
     user = User.find_by(name: "Dmitriy")
-    page.should_not have_content(user.name)
-    page.should_not have_content(user.username)
+    expect(page).not_to have_content(user.name)
+    expect(page).not_to have_content(user.username)
   end
 
   step 'gitlab user "Mike"' do
@@ -123,7 +123,7 @@ class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps
     project = Project.find_by(name: "Shop")
     user = User.find_by(name: 'Dmitriy')
     project_member = project.project_members.find_by(user_id: user.id)
-    within "#project_member_#{project_member.id}" do
+    page.within "#project_member_#{project_member.id}" do
       click_link('Remove user from team')
     end
   end
diff --git a/features/steps/project/wiki.rb b/features/steps/project/wiki.rb
index 58cb0ceb3f196776a1b8b70475cb5d72c7e6168f..eebfaee1edeef24d406d497ac70268dd9d116df1 100644
--- a/features/steps/project/wiki.rb
+++ b/features/steps/project/wiki.rb
@@ -6,13 +6,13 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
   include WikiHelper
 
   step 'I click on the Cancel button' do
-    within(:css, ".form-actions") do
+    page.within(:css, ".form-actions") do
       click_on "Cancel"
     end
   end
 
   step 'I should be redirected back to the Edit Home Wiki page' do
-    current_path.should == namespace_project_wiki_path(project.namespace, project, :home)
+    expect(current_path).to eq namespace_project_wiki_path(project.namespace, project, :home)
   end
 
   step 'I create the Wiki Home page' do
@@ -21,11 +21,11 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
   end
 
   step 'I should see the newly created wiki page' do
-    page.should have_content "Home"
-    page.should have_content "link test"
+    expect(page).to have_content "Home"
+    expect(page).to have_content "link test"
 
     click_link "link test"
-    page.should have_content "Editing"
+    expect(page).to have_content "Editing"
   end
 
   step 'I have an existing Wiki page' do
@@ -47,11 +47,11 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
   end
 
   step 'I should see the updated content' do
-    page.should have_content "Updated Wiki Content"
+    expect(page).to have_content "Updated Wiki Content"
   end
 
   step 'I should be redirected back to that Wiki page' do
-    current_path.should == namespace_project_wiki_path(project.namespace, project, @page)
+    expect(current_path).to eq namespace_project_wiki_path(project.namespace, project, @page)
   end
 
   step 'That page has two revisions' do
@@ -63,9 +63,9 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
   end
 
   step 'I should see both revisions' do
-    page.should have_content current_user.name
-    page.should have_content "first commit"
-    page.should have_content "second commit"
+    expect(page).to have_content current_user.name
+    expect(page).to have_content "first commit"
+    expect(page).to have_content "second commit"
   end
 
   step 'I click on the "Delete this page" button' do
@@ -73,7 +73,7 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
   end
 
   step 'The page should be deleted' do
-    page.should have_content "Page was successfully deleted"
+    expect(page).to have_content "Page was successfully deleted"
   end
 
   step 'I click on the "Pages" button' do
@@ -81,8 +81,8 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
   end
 
   step 'I should see the existing page in the pages list' do
-    page.should have_content current_user.name
-    page.should have_content @page.title
+    expect(page).to have_content current_user.name
+    expect(page).to have_content @page.title
   end
 
   step 'I have an existing Wiki page with images linked on page' do
@@ -98,30 +98,30 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
     file = Gollum::File.new(wiki.wiki)
     Gollum::Wiki.any_instance.stub(:file).with("image.jpg", "master", true).and_return(file)
     Gollum::File.any_instance.stub(:mime_type).and_return("image/jpeg")
-    page.should have_link('image', href: "image.jpg")
+    expect(page).to have_link('image', href: "image.jpg")
     click_on "image"
   end
 
   step 'I should see the image from wiki repo' do
-    current_path.should match('wikis/image.jpg')
-    page.should_not have_xpath('/html') # Page should render the image which means there is no html involved
+    expect(current_path).to match('wikis/image.jpg')
+    expect(page).not_to have_xpath('/html') # Page should render the image which means there is no html involved
     Gollum::Wiki.any_instance.unstub(:file)
     Gollum::File.any_instance.unstub(:mime_type)
   end
 
   step 'Image should be shown on the page' do
-    page.should have_xpath("//img[@src=\"image.jpg\"]")
+    expect(page).to have_xpath("//img[@src=\"image.jpg\"]")
   end
 
   step 'I click on image link' do
-    page.should have_link('image', href: "image.jpg")
+    expect(page).to have_link('image', href: "image.jpg")
     click_on "image"
   end
 
   step 'I should see the new wiki page form' do
-    current_path.should match('wikis/image.jpg')
-    page.should have_content('New Wiki Page')
-    page.should have_content('Editing - image.jpg')
+    expect(current_path).to match('wikis/image.jpg')
+    expect(page).to have_content('New Wiki Page')
+    expect(page).to have_content('Editing - image.jpg')
   end
 
   step 'I create a New page with paths' do
@@ -130,7 +130,7 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
     click_on 'Build'
     fill_in "wiki_content", with: 'wiki content'
     click_on "Create page"
-    current_path.should include 'one/two/three'
+    expect(current_path).to include 'one/two/three'
   end
 
   step 'I create a New page with an invalid name' do
@@ -144,7 +144,7 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
   end
 
   step 'I should see non-escaped link in the pages list' do
-    page.should have_xpath("//a[@href='/#{project.path_with_namespace}/wikis/one/two/three']")
+    expect(page).to have_xpath("//a[@href='/#{project.path_with_namespace}/wikis/one/two/three']")
   end
 
   step 'I edit the Wiki page with a path' do
@@ -153,11 +153,11 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
   end
 
   step 'I should see a non-escaped path' do
-    current_path.should include 'one/two/three'
+    expect(current_path).to include 'one/two/three'
   end
 
   step 'I should see the Editing page' do
-    page.should have_content('Editing')
+    expect(page).to have_content('Editing')
   end
 
   step 'I view the page history of a Wiki page that has a path' do
@@ -166,7 +166,7 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
   end
 
   step 'I should see the page history' do
-    page.should have_content('History for')
+    expect(page).to have_content('History for')
   end
 
   step 'I search for Wiki content' do
diff --git a/features/steps/search.rb b/features/steps/search.rb
index 8197cd410aa3b2fc81e3501d88ba1a353fc2f801..fec5d9f0e4e986c507923f63d1c792405e2eab27 100644
--- a/features/steps/search.rb
+++ b/features/steps/search.rb
@@ -24,35 +24,35 @@ class Spinach::Features::Search < Spinach::FeatureSteps
   end
 
   step 'I click "Issues" link' do
-    within '.search-filter' do
+    page.within '.search-filter' do
       click_link 'Issues'
     end
   end
 
   step 'I click project "Shop" link' do
-    within '.project-filter' do
+    page.within '.project-filter' do
       click_link project.name_with_namespace
     end
   end
 
   step 'I click "Merge requests" link' do
-    within '.search-filter' do
+    page.within '.search-filter' do
       click_link 'Merge requests'
     end
   end
 
   step 'I click "Wiki" link' do
-    within '.search-filter' do
+    page.within '.search-filter' do
       click_link 'Wiki'
     end
   end
 
   step 'I should see "Shop" project link' do
-    page.should have_link "Shop"
+    expect(page).to have_link "Shop"
   end
 
   step 'I should see code results for project "Shop"' do
-    page.should have_content 'Update capybara, rspec-rails, poltergeist to recent versions'
+    expect(page).to have_content 'Update capybara, rspec-rails, poltergeist to recent versions'
   end
 
   step 'I search for "Contibuting"' do
@@ -71,15 +71,15 @@ class Spinach::Features::Search < Spinach::FeatureSteps
   end
 
   step 'I should see "Foo" link in the search results' do
-    find(:css, '.search-results').should have_link 'Foo'
+    expect(find(:css, '.search-results')).to have_link 'Foo'
   end
 
   step 'I should not see "Bar" link in the search results' do
-    find(:css, '.search-results').should_not have_link 'Bar'
+    expect(find(:css, '.search-results')).not_to have_link 'Bar'
   end
 
   step 'I should see "test_wiki" link in the search results' do
-    find(:css, '.search-results').should have_link 'test_wiki.md'
+    expect(find(:css, '.search-results')).to have_link 'test_wiki.md'
   end
 
   step 'project has Wiki content' do
diff --git a/features/steps/shared/active_tab.rb b/features/steps/shared/active_tab.rb
index 9beb688bd16c163c40063b1aefa0a196d61d7a8b..72d873caa5734a0eeb24795d792ac0436adeb0dd 100644
--- a/features/steps/shared/active_tab.rb
+++ b/features/steps/shared/active_tab.rb
@@ -2,27 +2,27 @@ module SharedActiveTab
   include Spinach::DSL
 
   def ensure_active_main_tab(content)
-    find('.nav-sidebar > li.active').should have_content(content)
+    expect(find('.nav-sidebar > li.active')).to have_content(content)
   end
 
   def ensure_active_sub_tab(content)
-    find('div.content ul.nav-tabs li.active').should have_content(content)
+    expect(find('div.content ul.nav-tabs li.active')).to have_content(content)
   end
 
   def ensure_active_sub_nav(content)
-    find('.sidebar-subnav > li.active').should have_content(content)
+    expect(find('.sidebar-subnav > li.active')).to have_content(content)
   end
 
   step 'no other main tabs should be active' do
-    page.should have_selector('.nav-sidebar > li.active', count: 1)
+    expect(page).to have_selector('.nav-sidebar > li.active', count: 1)
   end
 
   step 'no other sub tabs should be active' do
-    page.should have_selector('div.content ul.nav-tabs li.active', count: 1)
+    expect(page).to have_selector('div.content ul.nav-tabs li.active', count: 1)
   end
 
   step 'no other sub navs should be active' do
-    page.should have_selector('.sidebar-subnav > li.active', count: 1)
+    expect(page).to have_selector('.sidebar-subnav > li.active', count: 1)
   end
 
   step 'the active main tab should be Home' do
diff --git a/features/steps/shared/authentication.rb b/features/steps/shared/authentication.rb
index ac8a3df6bb9fae52edda9318a7621b8a69952d6b..3c0f2a9406a834aa68759e9c70d7c6a2ee60b03f 100644
--- a/features/steps/shared/authentication.rb
+++ b/features/steps/shared/authentication.rb
@@ -21,7 +21,7 @@ module SharedAuthentication
   end
 
   step 'I should be redirected to sign in page' do
-    current_path.should == new_user_session_path
+    expect(current_path).to eq new_user_session_path
   end
 
   step "I logout" do
diff --git a/features/steps/shared/diff_note.rb b/features/steps/shared/diff_note.rb
index 510e0f0f93892e94d581172a4c9d4a2fde2c1455..a716ca5837c56abb36849328d335d02db8486d12 100644
--- a/features/steps/shared/diff_note.rb
+++ b/features/steps/shared/diff_note.rb
@@ -3,7 +3,7 @@ module SharedDiffNote
   include RepoHelpers
 
   step 'I cancel the diff comment' do
-    within(diff_file_selector) do
+    page.within(diff_file_selector) do
       find(".js-close-discussion-note-form").click
     end
   end
@@ -14,14 +14,14 @@ module SharedDiffNote
   end
 
   step 'I haven\'t written any diff comment text' do
-    within(diff_file_selector) do
+    page.within(diff_file_selector) do
       fill_in "note[note]", with: ""
     end
   end
 
   step 'I leave a diff comment like "Typo, please fix"' do
     click_diff_line(sample_commit.line_code)
-    within("#{diff_file_selector} form[rel$='#{sample_commit.line_code}']") do
+    page.within("#{diff_file_selector} form[rel$='#{sample_commit.line_code}']") do
       fill_in "note[note]", with: "Typo, please fix"
       find(".js-comment-button").trigger("click")
       sleep 0.05
@@ -30,7 +30,7 @@ module SharedDiffNote
 
   step 'I preview a diff comment text like "Should fix it :smile:"' do
     click_diff_line(sample_commit.line_code)
-    within("#{diff_file_selector} form[rel$='#{sample_commit.line_code}']") do
+    page.within("#{diff_file_selector} form[rel$='#{sample_commit.line_code}']") do
       fill_in "note[note]", with: "Should fix it :smile:"
       find('.js-md-preview-button').click
     end
@@ -39,7 +39,7 @@ module SharedDiffNote
   step 'I preview another diff comment text like "DRY this up"' do
     click_diff_line(sample_commit.del_line_code)
 
-    within("#{diff_file_selector} form[rel$='#{sample_commit.del_line_code}']") do
+    page.within("#{diff_file_selector} form[rel$='#{sample_commit.del_line_code}']") do
       fill_in "note[note]", with: "DRY this up"
       find('.js-md-preview-button').click
     end
@@ -54,103 +54,103 @@ module SharedDiffNote
   end
 
   step 'I write a diff comment like ":-1: I don\'t like this"' do
-    within(diff_file_selector) do
+    page.within(diff_file_selector) do
       fill_in "note[note]", with: ":-1: I don\'t like this"
     end
   end
 
   step 'I submit the diff comment' do
-    within(diff_file_selector) do
+    page.within(diff_file_selector) do
       click_button("Add Comment")
     end
   end
 
   step 'I should not see the diff comment form' do
-    within(diff_file_selector) do
-      page.should_not have_css("form.new_note")
+    page.within(diff_file_selector) do
+      expect(page).not_to have_css("form.new_note")
     end
   end
 
   step 'The diff comment preview tab should say there is nothing to do' do
-    within(diff_file_selector) do
+    page.within(diff_file_selector) do
       find('.js-md-preview-button').click
       expect(find('.js-md-preview')).to have_content('Nothing to preview.')
     end
   end
 
   step 'I should not see the diff comment text field' do
-    within(diff_file_selector) do
+    page.within(diff_file_selector) do
       expect(find('.js-note-text')).not_to be_visible
     end
   end
 
   step 'I should only see one diff form' do
-    within(diff_file_selector) do
-      page.should have_css("form.new_note", count: 1)
+    page.within(diff_file_selector) do
+      expect(page).to have_css("form.new_note", count: 1)
     end
   end
 
   step 'I should see a diff comment form with ":-1: I don\'t like this"' do
-    within(diff_file_selector) do
-      page.should have_field("note[note]", with: ":-1: I don\'t like this")
+    page.within(diff_file_selector) do
+      expect(page).to have_field("note[note]", with: ":-1: I don\'t like this")
     end
   end
 
   step 'I should see a diff comment saying "Typo, please fix"' do
-    within("#{diff_file_selector} .note") do
-      page.should have_content("Typo, please fix")
+    page.within("#{diff_file_selector} .note") do
+      expect(page).to have_content("Typo, please fix")
     end
   end
 
   step 'I should see a discussion reply button' do
-    within(diff_file_selector) do
-      page.should have_button('Reply')
+    page.within(diff_file_selector) do
+      expect(page).to have_button('Reply')
     end
   end
 
   step 'I should see a temporary diff comment form' do
-    within(diff_file_selector) do
-      page.should have_css(".js-temp-notes-holder form.new_note")
+    page.within(diff_file_selector) do
+      expect(page).to have_css(".js-temp-notes-holder form.new_note")
     end
   end
 
   step 'I should see add a diff comment button' do
-    page.should have_css('.js-add-diff-note-button', visible: true)
+    expect(page).to have_css('.js-add-diff-note-button', visible: true)
   end
 
   step 'I should see an empty diff comment form' do
-    within(diff_file_selector) do
-      page.should have_field("note[note]", with: "")
+    page.within(diff_file_selector) do
+      expect(page).to have_field("note[note]", with: "")
     end
   end
 
   step 'I should see the cancel comment button' do
-    within("#{diff_file_selector} form") do
-      page.should have_css(".js-close-discussion-note-form", text: "Cancel")
+    page.within("#{diff_file_selector} form") do
+      expect(page).to have_css(".js-close-discussion-note-form", text: "Cancel")
     end
   end
 
   step 'I should see the diff comment preview' do
-    within("#{diff_file_selector} form") do
+    page.within("#{diff_file_selector} form") do
       expect(page).to have_css('.js-md-preview', visible: true)
     end
   end
 
   step 'I should see the diff comment write tab' do
-    within(diff_file_selector) do
+    page.within(diff_file_selector) do
       expect(page).to have_css('.js-md-write-button', visible: true)
     end
   end
 
   step 'The diff comment preview tab should display rendered Markdown' do
-    within(diff_file_selector) do
+    page.within(diff_file_selector) do
       find('.js-md-preview-button').click
       expect(find('.js-md-preview')).to have_css('img.emoji', visible: true)
     end
   end
 
   step 'I should see two separate previews' do
-    within(diff_file_selector) do
+    page.within(diff_file_selector) do
       expect(page).to have_css('.js-md-preview', visible: true, count: 2)
       expect(page).to have_content('Should fix it')
       expect(page).to have_content('DRY this up')
diff --git a/features/steps/shared/group.rb b/features/steps/shared/group.rb
index 1b225dd61a6f111a024c5447d379a35a03c53e63..2d17fb34ccbf6dcf25e79e90a82ad5561fdd2f88 100644
--- a/features/steps/shared/group.rb
+++ b/features/steps/shared/group.rb
@@ -22,11 +22,11 @@ module SharedGroup
   end
 
   step 'I should see group "TestGroup"' do
-    page.should have_content "TestGroup"
+    expect(page).to have_content "TestGroup"
   end
 
   step 'I should not see group "TestGroup"' do
-    page.should_not have_content "TestGroup"
+    expect(page).not_to have_content "TestGroup"
   end
 
   protected
diff --git a/features/steps/shared/markdown.rb b/features/steps/shared/markdown.rb
index 943640007a9c0c2024fbf78b718c1bbce31f56a6..56b36f7c46c4773242ef54bb7448b1ad3d2f0762 100644
--- a/features/steps/shared/markdown.rb
+++ b/features/steps/shared/markdown.rb
@@ -3,11 +3,11 @@ module SharedMarkdown
 
   def header_should_have_correct_id_and_link(level, text, id, parent = ".wiki")
     node = find("#{parent} h#{level} a##{id}")
-    node[:href].should == "##{id}"
+    expect(node[:href]).to eq "##{id}"
 
     # Work around a weird Capybara behavior where calling `parent` on a node
     # returns the whole document, not the node's actual parent element
-    find(:xpath, "#{node.path}/..").text.should == text
+    expect(find(:xpath, "#{node.path}/..").text).to eq text
   end
 
   step 'Header "Description header" should have correct id and link' do
@@ -19,7 +19,7 @@ module SharedMarkdown
   end
 
   step 'The Markdown preview tab should say there is nothing to do' do
-    within('.gfm-form') do
+    page.within('.gfm-form') do
       find('.js-md-preview-button').click
       expect(find('.js-md-preview')).to have_content('Nothing to preview.')
     end
@@ -38,7 +38,7 @@ module SharedMarkdown
   end
 
   step 'The Markdown preview tab should display rendered Markdown' do
-    within('.gfm-form') do
+    page.within('.gfm-form') do
       find('.js-md-preview-button').click
       expect(find('.js-md-preview')).to have_css('img.emoji', visible: true)
     end
@@ -49,7 +49,7 @@ module SharedMarkdown
   end
 
   step 'I preview a description text like "Bug fixed :smile:"' do
-    within('.gfm-form') do
+    page.within('.gfm-form') do
       fill_in 'Description', with: 'Bug fixed :smile:'
       find('.js-md-preview-button').click
     end
diff --git a/features/steps/shared/note.rb b/features/steps/shared/note.rb
index 2f66e61b2140253a3bd1916a73b593e45e02488f..b2675546a14f70bbd5414c0365da81fa30ab9832 100644
--- a/features/steps/shared/note.rb
+++ b/features/steps/shared/note.rb
@@ -7,13 +7,13 @@ module SharedNote
   end
 
   step 'I haven\'t written any comment text' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       fill_in "note[note]", with: ""
     end
   end
 
   step 'I leave a comment like "XML attached"' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       fill_in "note[note]", with: "XML attached"
       click_button "Add Comment"
       sleep 0.05
@@ -21,94 +21,94 @@ module SharedNote
   end
 
   step 'I preview a comment text like "Bug fixed :smile:"' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       fill_in "note[note]", with: "Bug fixed :smile:"
       find('.js-md-preview-button').click
     end
   end
 
   step 'I submit the comment' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       click_button "Add Comment"
     end
   end
 
   step 'I write a comment like ":+1: Nice"' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       fill_in 'note[note]', with: ':+1: Nice'
     end
   end
 
   step 'I should not see a comment saying "XML attached"' do
-    page.should_not have_css(".note")
+    expect(page).not_to have_css(".note")
   end
 
   step 'I should not see the cancel comment button' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       should_not have_link("Cancel")
     end
   end
 
   step 'I should not see the comment preview' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       expect(find('.js-md-preview')).not_to be_visible
     end
   end
 
   step 'The comment preview tab should say there is nothing to do' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       find('.js-md-preview-button').click
       expect(find('.js-md-preview')).to have_content('Nothing to preview.')
     end
   end
 
   step 'I should not see the comment text field' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       expect(find('.js-note-text')).not_to be_visible
     end
   end
 
   step 'I should see a comment saying "XML attached"' do
-    within(".note") do
-      page.should have_content("XML attached")
+    page.within(".note") do
+      expect(page).to have_content("XML attached")
     end
   end
 
   step 'I should see an empty comment text field' do
-    within(".js-main-target-form") do
-      page.should have_field("note[note]", with: "")
+    page.within(".js-main-target-form") do
+      expect(page).to have_field("note[note]", with: "")
     end
   end
 
   step 'I should see the comment write tab' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       expect(page).to have_css('.js-md-write-button', visible: true)
     end
   end
 
   step 'The comment preview tab should be display rendered Markdown' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       find('.js-md-preview-button').click
       expect(find('.js-md-preview')).to have_css('img.emoji', visible: true)
     end
   end
 
   step 'I should see the comment preview' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       expect(page).to have_css('.js-md-preview', visible: true)
     end
   end
 
   step 'I should see comment "XML attached"' do
-    within(".note") do
-      page.should have_content("XML attached")
+    page.within(".note") do
+      expect(page).to have_content("XML attached")
     end
   end
 
   # Markdown
 
   step 'I leave a comment with a header containing "Comment with a header"' do
-    within(".js-main-target-form") do
+    page.within(".js-main-target-form") do
       fill_in "note[note]", with: "# Comment with a header"
       click_button "Add Comment"
       sleep 0.05
@@ -116,9 +116,9 @@ module SharedNote
   end
 
   step 'The comment with the header should not have an ID' do
-    within(".note-body > .note-text") do
-      page.should     have_content("Comment with a header")
-      page.should_not have_css("#comment-with-a-header")
+    page.within(".note-body > .note-text") do
+      expect(page).to     have_content("Comment with a header")
+      expect(page).not_to have_css("#comment-with-a-header")
     end
   end
 
@@ -126,7 +126,7 @@ module SharedNote
     find(".note").hover
     find('.js-note-edit').click
 
-    within(".current-note-edit-form") do
+    page.within(".current-note-edit-form") do
       fill_in 'note[note]', with: '+1 Awesome!'
       click_button 'Save Comment'
       sleep 0.05
@@ -134,8 +134,8 @@ module SharedNote
   end
 
   step 'I should see +1 in the description' do
-    within(".note") do
-      page.should have_content("+1 Awesome!")
+    page.within(".note") do
+      expect(page).to have_content("+1 Awesome!")
     end
   end
 end
diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb
index 464938768050d382bf0c1fd0f6f695e8ebf34c66..09ae7e3a3055cb2d6477a149736424aa774ec8b7 100644
--- a/features/steps/shared/paths.rb
+++ b/features/steps/shared/paths.rb
@@ -92,7 +92,7 @@ module SharedPaths
   end
 
   step 'I should be redirected to the dashboard groups page' do
-    current_path.should == dashboard_groups_path
+    expect(current_path).to eq dashboard_groups_path
   end
 
   step 'I visit dashboard starred projects page' do
@@ -292,11 +292,11 @@ module SharedPaths
   end
 
   step 'I am on the new file page' do
-    current_path.should eq(namespace_project_create_blob_path(@project.namespace, @project, root_ref))
+    expect(current_path).to eq(namespace_project_create_blob_path(@project.namespace, @project, root_ref))
   end
 
   step 'I am on the ".gitignore" edit file page' do
-    current_path.should eq(namespace_project_edit_blob_path(
+    expect(current_path).to eq(namespace_project_edit_blob_path(
       @project.namespace, @project, File.join(root_ref, '.gitignore')))
   end
 
@@ -459,6 +459,6 @@ module SharedPaths
   # ----------------------------------------
 
   step 'page status code should be 404' do
-    status_code.should == 404
+    expect(status_code).to eq 404
   end
 end
diff --git a/features/steps/shared/project.rb b/features/steps/shared/project.rb
index 3059c4ee0417aab09ec53ce4d5933e084a7d68da..9ee2e5dfbed6c23f7b6f3c11975755157d887b7b 100644
--- a/features/steps/shared/project.rb
+++ b/features/steps/shared/project.rb
@@ -79,13 +79,13 @@ module SharedProject
 
   step 'I should see project "Shop" activity feed' do
     project = Project.find_by(name: "Shop")
-    page.should have_content "#{@user.name} pushed new branch fix at #{project.name_with_namespace}"
+    expect(page).to have_content "#{@user.name} pushed new branch fix at #{project.name_with_namespace}"
   end
 
   step 'I should see project settings' do
-    current_path.should == edit_namespace_project_path(@project.namespace, @project)
-    page.should have_content("Project name")
-    page.should have_content("Features:")
+    expect(current_path).to eq edit_namespace_project_path(@project.namespace, @project)
+    expect(page).to have_content("Project name")
+    expect(page).to have_content("Features:")
   end
 
   def current_project
@@ -101,11 +101,11 @@ module SharedProject
   end
 
   step 'I should see project "Enterprise"' do
-    page.should have_content "Enterprise"
+    expect(page).to have_content "Enterprise"
   end
 
   step 'I should not see project "Enterprise"' do
-    page.should_not have_content "Enterprise"
+    expect(page).not_to have_content "Enterprise"
   end
 
   step 'internal project "Internal"' do
@@ -113,11 +113,11 @@ module SharedProject
   end
 
   step 'I should see project "Internal"' do
-    page.should have_content "Internal"
+    expect(page).to have_content "Internal"
   end
 
   step 'I should not see project "Internal"' do
-    page.should_not have_content "Internal"
+    expect(page).not_to have_content "Internal"
   end
 
   step 'public project "Community"' do
@@ -125,11 +125,11 @@ module SharedProject
   end
 
   step 'I should see project "Community"' do
-    page.should have_content "Community"
+    expect(page).to have_content "Community"
   end
 
   step 'I should not see project "Community"' do
-    page.should_not have_content "Community"
+    expect(page).not_to have_content "Community"
   end
 
   step '"John Doe" owns private project "Enterprise"' do
diff --git a/features/steps/shared/project_tab.rb b/features/steps/shared/project_tab.rb
index 71fe89f634f7e06cce4fc90bc4d6ce31f7331976..3b94b7d862103eb59e7cf79598e388fe17e5155c 100644
--- a/features/steps/shared/project_tab.rb
+++ b/features/steps/shared/project_tab.rb
@@ -45,8 +45,8 @@ module SharedProjectTab
   end
 
   step 'the active main tab should be Settings' do
-    within '.nav-sidebar' do
-      page.should have_content('Back to project')
+    page.within '.nav-sidebar' do
+      expect(page).to have_content('Back to project')
     end
   end
 end
diff --git a/features/steps/snippet_search.rb b/features/steps/snippet_search.rb
index 669c7186c1b868901c2c4c5a69f9c6e7236f9dbc..cf999879579a1f9429829601387b530080ec47d5 100644
--- a/features/steps/snippet_search.rb
+++ b/features/steps/snippet_search.rb
@@ -18,39 +18,39 @@ class Spinach::Features::SnippetSearch < Spinach::FeatureSteps
   end
 
   step 'I should see "line seven" in results' do
-    page.should have_content 'line seven'
+    expect(page).to have_content 'line seven'
   end
 
   step 'I should see "line four" in results' do
-    page.should have_content 'line four'
+    expect(page).to have_content 'line four'
   end
 
   step 'I should see "line ten" in results' do
-    page.should have_content 'line ten'
+    expect(page).to have_content 'line ten'
   end
 
   step 'I should not see "line eleven" in results' do
-    page.should_not have_content 'line eleven'
+    expect(page).not_to have_content 'line eleven'
   end
 
   step 'I should not see "line three" in results' do
-    page.should_not have_content 'line three'
+    expect(page).not_to have_content 'line three'
   end
 
   step 'I should see "Personal snippet one" in results' do
-    page.should have_content 'Personal snippet one'
+    expect(page).to have_content 'Personal snippet one'
   end
 
   step 'I should see "Personal snippet private" in results' do
-    page.should have_content 'Personal snippet private'
+    expect(page).to have_content 'Personal snippet private'
   end
 
   step 'I should not see "Personal snippet one" in results' do
-    page.should_not have_content 'Personal snippet one'
+    expect(page).not_to have_content 'Personal snippet one'
   end
 
   step 'I should not see "Personal snippet private" in results' do
-    page.should_not have_content 'Personal snippet private'
+    expect(page).not_to have_content 'Personal snippet private'
   end
 
 end
diff --git a/features/steps/snippets/discover.rb b/features/steps/snippets/discover.rb
index 2667c1e3d44644067d602a9acda632df17648463..76379d09d02456a7028e4475b09a1a087425183b 100644
--- a/features/steps/snippets/discover.rb
+++ b/features/steps/snippets/discover.rb
@@ -4,15 +4,15 @@ class Spinach::Features::SnippetsDiscover < Spinach::FeatureSteps
   include SharedSnippet
 
   step 'I should see "Personal snippet one" in snippets' do
-    page.should have_content "Personal snippet one"
+    expect(page).to have_content "Personal snippet one"
   end
 
   step 'I should see "Personal snippet internal" in snippets' do
-    page.should have_content "Personal snippet internal"
+    expect(page).to have_content "Personal snippet internal"
   end
 
   step 'I should not see "Personal snippet private" in snippets' do
-    page.should_not have_content "Personal snippet private"
+    expect(page).not_to have_content "Personal snippet private"
   end
 
   def snippet
diff --git a/features/steps/snippets/public_snippets.rb b/features/steps/snippets/public_snippets.rb
index 67669dc0a69f78a3ecfeec5035e366fa33562b1e..2ebdca5ed3084e2d4a25e74cf90ff66bc5860f62 100644
--- a/features/steps/snippets/public_snippets.rb
+++ b/features/steps/snippets/public_snippets.rb
@@ -4,11 +4,11 @@ class Spinach::Features::PublicSnippets < Spinach::FeatureSteps
   include SharedSnippet
 
   step 'I should see snippet "Personal snippet one"' do
-    page.should have_no_xpath("//i[@class='public-snippet']")
+    expect(page).to have_no_xpath("//i[@class='public-snippet']")
   end
 
   step 'I should see raw snippet "Personal snippet one"' do
-    page.should have_text(snippet.content)
+    expect(page).to have_text(snippet.content)
   end
 
   step 'I visit snippet page "Personal snippet one"' do
diff --git a/features/steps/snippets/snippets.rb b/features/steps/snippets/snippets.rb
index de936db85ee3141fd9a15827667cc6de07b97509..09fdd1b5a133820896b18c2b09272087b166ece6 100644
--- a/features/steps/snippets/snippets.rb
+++ b/features/steps/snippets/snippets.rb
@@ -9,11 +9,11 @@ class Spinach::Features::Snippets < Spinach::FeatureSteps
   end
 
   step 'I should not see "Personal snippet one" in snippets' do
-    page.should_not have_content "Personal snippet one"
+    expect(page).not_to have_content "Personal snippet one"
   end
 
   step 'I click link "Edit"' do
-    within ".file-title" do
+    page.within ".file-title" do
       click_link "Edit"
     end
   end
@@ -25,15 +25,15 @@ class Spinach::Features::Snippets < Spinach::FeatureSteps
   step 'I submit new snippet "Personal snippet three"' do
     fill_in "personal_snippet_title", :with => "Personal snippet three"
     fill_in "personal_snippet_file_name", :with => "my_snippet.rb"
-    within('.file-editor') do
+    page.within('.file-editor') do
       find(:xpath, "//input[@id='personal_snippet_content']").set 'Content of snippet three'
     end
     click_button "Create snippet"
   end
 
   step 'I should see snippet "Personal snippet three"' do
-    page.should have_content "Personal snippet three"
-    page.should have_content "Content of snippet three"
+    expect(page).to have_content "Personal snippet three"
+    expect(page).to have_content "Content of snippet three"
   end
 
   step 'I submit new title "Personal snippet new title"' do
@@ -42,7 +42,7 @@ class Spinach::Features::Snippets < Spinach::FeatureSteps
   end
 
   step 'I should see "Personal snippet new title"' do
-    page.should have_content "Personal snippet new title"
+    expect(page).to have_content "Personal snippet new title"
   end
 
   step 'I uncheck "Private" checkbox' do
@@ -51,7 +51,7 @@ class Spinach::Features::Snippets < Spinach::FeatureSteps
   end
 
   step 'I should see "Personal snippet one" public' do
-    page.should have_no_xpath("//i[@class='public-snippet']")
+    expect(page).to have_no_xpath("//i[@class='public-snippet']")
   end
 
   step 'I visit snippet page "Personal snippet one"' do
diff --git a/features/steps/snippets/user.rb b/features/steps/snippets/user.rb
index 146cc535d88fcdb7b1940deb6df5cd39855bc8d6..007fcb2893faf569653094fdee7ee6562be96176 100644
--- a/features/steps/snippets/user.rb
+++ b/features/steps/snippets/user.rb
@@ -8,43 +8,43 @@ class Spinach::Features::SnippetsUser < Spinach::FeatureSteps
   end
 
   step 'I should see "Personal snippet one" in snippets' do
-    page.should have_content "Personal snippet one"
+    expect(page).to have_content "Personal snippet one"
   end
 
   step 'I should see "Personal snippet private" in snippets' do
-    page.should have_content "Personal snippet private"
+    expect(page).to have_content "Personal snippet private"
   end
 
   step 'I should see "Personal snippet internal" in snippets' do
-    page.should have_content "Personal snippet internal"
+    expect(page).to have_content "Personal snippet internal"
   end
 
   step 'I should not see "Personal snippet one" in snippets' do
-    page.should_not have_content "Personal snippet one"
+    expect(page).not_to have_content "Personal snippet one"
   end
 
   step 'I should not see "Personal snippet private" in snippets' do
-    page.should_not have_content "Personal snippet private"
+    expect(page).not_to have_content "Personal snippet private"
   end
 
   step 'I should not see "Personal snippet internal" in snippets' do
-    page.should_not have_content "Personal snippet internal"
+    expect(page).not_to have_content "Personal snippet internal"
   end
 
   step 'I click "Internal" filter' do
-    within('.nav-tabs') do
+    page.within('.nav-tabs') do
       click_link "Internal"
     end
   end
 
   step 'I click "Private" filter' do
-    within('.nav-tabs') do
+    page.within('.nav-tabs') do
       click_link "Private"
     end
   end
 
   step 'I click "Public" filter' do
-    within('.nav-tabs') do
+    page.within('.nav-tabs') do
       click_link "Public"
     end
   end
diff --git a/features/steps/user.rb b/features/steps/user.rb
index 10cae692a88914a1afba9a3604f6c994e7ace4e0..3230234cb6d900417fe2c0467fb0f09a31ad901d 100644
--- a/features/steps/user.rb
+++ b/features/steps/user.rb
@@ -28,13 +28,13 @@ class Spinach::Features::User < Spinach::FeatureSteps
   end
 
   step 'I should see contributed projects' do
-    within '.contributed-projects' do
-      page.should have_content(@contributed_project.name)
+    page.within '.contributed-projects' do
+      expect(page).to have_content(@contributed_project.name)
     end
   end
 
   step 'I should see contributions calendar' do
-    page.should have_css('.cal-heatmap-container')
+    expect(page).to have_css('.cal-heatmap-container')
   end
 
   def contributed_project