diff --git a/features/profile/profile.feature b/features/profile/profile.feature
index dc1339deb4c5c0636827a97ec10db8d74d1e1079..70f47c97173cc517047f821159d6945bfb3a7d27 100644
--- a/features/profile/profile.feature
+++ b/features/profile/profile.feature
@@ -60,7 +60,9 @@ Feature: Profile
     Then I should see a password error message
 
   Scenario: I visit history tab
-    Given I have activity
+    Given I logout
+    And I sign in via the UI
+    And I have activity
     When I visit Audit Log page
     Then I should see my activity
 
diff --git a/features/project/forked_merge_requests.feature b/features/project/forked_merge_requests.feature
index 67f1e117f7fa9671dc71cd0e2588f958074d6c86..9809b0ea0febf526a6965d0f4a99baf79ff669f0 100644
--- a/features/project/forked_merge_requests.feature
+++ b/features/project/forked_merge_requests.feature
@@ -41,8 +41,7 @@ Feature: Project Forked Merge Requests
 
   @javascript
   Scenario: I see the users in the target project for a new merge request
-    Given I logout
-    And I sign in as an admin
+    Given I sign in as an admin
     And I have a project forked off of "Shop" called "Forked Shop"
     Then I visit project "Forked Shop" merge requests page
     And I click link "New Merge Request"
diff --git a/features/steps/project/forked_merge_requests.rb b/features/steps/project/forked_merge_requests.rb
index ef1bb45361525d2a8164b320d1a69e6657ca4b9a..8081b764be6ec135fe39d300e04b2852c3adc488 100644
--- a/features/steps/project/forked_merge_requests.rb
+++ b/features/steps/project/forked_merge_requests.rb
@@ -6,7 +6,7 @@ class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps
   include Select2Helper
 
   step 'I am a member of project "Shop"' do
-    @project = Project.find_by(name: "Shop")
+    @project = ::Project.find_by(name: "Shop")
     @project ||= create(:project, :repository, name: "Shop")
     @project.team << [@user, :reporter]
   end
diff --git a/features/steps/project/merge_requests/acceptance.rb b/features/steps/project/merge_requests/acceptance.rb
index d7167352e027b3a724614b5d24cc3b8b51562183..7521a9439e32d979227b28a8007eca9571cd3654 100644
--- a/features/steps/project/merge_requests/acceptance.rb
+++ b/features/steps/project/merge_requests/acceptance.rb
@@ -43,7 +43,7 @@ class Spinach::Features::ProjectMergeRequestsAcceptance < Spinach::FeatureSteps
   end
 
   step 'I am signed in as a developer of the project' do
-    login_as(@user)
+    sign_in(@user)
   end
 
   step 'I should see merge request merged' do
diff --git a/features/steps/project/merge_requests/revert.rb b/features/steps/project/merge_requests/revert.rb
index a8f4e4ef027d9abba09139a7fffeb985e5a587ff..1149c1c2426ca58093da37213b13a7f3843c6f50 100644
--- a/features/steps/project/merge_requests/revert.rb
+++ b/features/steps/project/merge_requests/revert.rb
@@ -31,7 +31,7 @@ class Spinach::Features::RevertMergeRequests < Spinach::FeatureSteps
 
   step 'I am signed in as a developer of the project' do
     @user = create(:user) { |u| @project.add_developer(u) }
-    login_as(@user)
+    sign_in(@user)
   end
 
   step 'There is an open Merge Request' do
diff --git a/features/steps/shared/authentication.rb b/features/steps/shared/authentication.rb
index 5c3e724746b069db1bc79bf401820e1f9d18f665..97fac595d8e269490363b37223eb3a67c4c48fe2 100644
--- a/features/steps/shared/authentication.rb
+++ b/features/steps/shared/authentication.rb
@@ -1,23 +1,33 @@
-require Rails.root.join('spec', 'support', 'login_helpers')
+require Rails.root.join('features', 'support', 'login_helpers')
 
 module SharedAuthentication
   include Spinach::DSL
   include LoginHelpers
 
   step 'I sign in as a user' do
-    login_as :user
+    sign_out(@user) if @user
+
+    @user = create(:user)
+    sign_in(@user)
+  end
+
+  step 'I sign in via the UI' do
+    gitlab_sign_in(create(:user))
   end
 
   step 'I sign in as an admin' do
-    login_as :admin
+    sign_out(@user) if @user
+
+    @user = create(:admin)
+    sign_in(@user)
   end
 
   step 'I sign in as "John Doe"' do
-    login_with(user_exists("John Doe"))
+    gitlab_sign_in(user_exists("John Doe"))
   end
 
   step 'I sign in as "Mary Jane"' do
-    login_with(user_exists("Mary Jane"))
+    gitlab_sign_in(user_exists("Mary Jane"))
   end
 
   step 'I should be redirected to sign in page' do
@@ -25,14 +35,41 @@ module SharedAuthentication
   end
 
   step "I logout" do
-    logout
+    gitlab_sign_out
   end
 
   step "I logout directly" do
-    logout_direct
+    gitlab_sign_out
   end
 
   def current_user
     @user || User.reorder(nil).first
   end
+
+  private
+
+  def gitlab_sign_in(user)
+    visit new_user_session_path
+
+    fill_in "user_login", with: user.email
+    fill_in "user_password", with: "12345678"
+    check 'user_remember_me'
+    click_button "Sign in"
+
+    @user = user
+  end
+
+  def gitlab_sign_out
+    return unless @user
+
+    if Capybara.current_driver == Capybara.javascript_driver
+      find('.header-user-dropdown-toggle').click
+      click_link 'Sign out'
+      expect(page).to have_button('Sign in')
+    else
+      sign_out(@user)
+    end
+
+    @user = nil
+  end
 end
diff --git a/features/support/login_helpers.rb b/features/support/login_helpers.rb
new file mode 100644
index 0000000000000000000000000000000000000000..540ff25a4f233f6bc266c085d3dbf6f54d5c5ecd
--- /dev/null
+++ b/features/support/login_helpers.rb
@@ -0,0 +1,19 @@
+module LoginHelpers
+  # After inclusion, IntegrationHelpers calls these two methods that aren't
+  # supported by Spinach, so we perform the end results ourselves
+  class << self
+    def setup(*args)
+      Spinach.hooks.before_scenario do
+        Warden.test_mode!
+      end
+    end
+
+    def teardown(*args)
+      Spinach.hooks.after_scenario do
+        Warden.test_reset!
+      end
+    end
+  end
+
+  include Devise::Test::IntegrationHelpers
+end
diff --git a/spec/support/login_helpers.rb b/spec/support/login_helpers.rb
index 9ffb00be0b8f3212f22c5a15dd2d59e7b69e30b4..e6da852e7288aa09b0a4bd759254c66c8acc921c 100644
--- a/spec/support/login_helpers.rb
+++ b/spec/support/login_helpers.rb
@@ -84,8 +84,4 @@ module LoginHelpers
   def logout_direct
     page.driver.submit :delete, '/users/sign_out', {}
   end
-
-  def skip_ci_admin_auth
-    allow_any_instance_of(Ci::Admin::ApplicationController).to receive_messages(authenticate_admin!: true)
-  end
 end
diff --git a/spec/support/wait_for_ajax.rb b/spec/support/wait_for_ajax.rb
index 0f9dc2dee754e5b6035187db8446e0a9a78e35d0..508de2ee8e1c810d8624c8a9262df45239391e71 100644
--- a/spec/support/wait_for_ajax.rb
+++ b/spec/support/wait_for_ajax.rb
@@ -6,10 +6,13 @@ module WaitForAjax
   end
 
   def finished_all_ajax_requests?
+    return true unless javascript_test?
+    return true if page.evaluate_script('typeof jQuery === "undefined"')
+
     page.evaluate_script('jQuery.active').zero?
   end
 
   def javascript_test?
-    [:selenium, :webkit, :chrome, :poltergeist].include?(Capybara.current_driver)
+    Capybara.current_driver == Capybara.javascript_driver
   end
 end