diff --git a/CHANGELOG b/CHANGELOG
index 455a4339420339371a2cc5c6166deed01c115bcc..53258e7fd1a9b5b2cb00b7adb6df4ba83fdf5fc2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -9,6 +9,7 @@ v 7.13.0 (unreleased)
   - Allow users to customize their default Dashboard page.
   - Update ssl_ciphers in Nginx example to remove DHE settings. This will deny forward secrecy for Android 2.3.7, Java 6 and OpenSSL 0.9.8
   - Convert CRLF newlines to LF when committing using the web editor.
+  - API request /projects/:project_id/merge_requests?state=closed will return only closed merge requests without merged one. If you need ones that were merged - use state=merged.  
 
 v 7.12.0 (unreleased)
   - Fix Error 500 when one user attempts to access a personal, internal snippet (Stan Hu)
@@ -51,8 +52,8 @@ v 7.12.0 (unreleased)
   - Add validation to wiki page creation (only [a-zA-Z0-9/_-] are allowed) (Jeroen van Baarsen)
   - Fix new/empty milestones showing 100% completion value (Jonah Bishop)
   - Add a note when an Issue or Merge Request's title changes
-  - Consistently refer to MRs as either Accepted or Rejected.
-  - Add Accepted and Rejected tabs to MR lists.
+  - Consistently refer to MRs as either Merged or Closed.
+  - Add Merged tab to MR lists.
   - Prefix EmailsOnPush email subject with `[Git]`.
   - Group project contributions by both name and email.
   - Clarify navigation labels for Project Settings and Group Settings.
diff --git a/Gemfile b/Gemfile
index 4f01d13a1278884f9f75aa290be371586caf7a67..bda2fac1eeca3be83213f629acce55df2872fcff 100644
--- a/Gemfile
+++ b/Gemfile
@@ -222,16 +222,16 @@ group :development do
 end
 
 group :development, :test do
+  gem 'awesome_print'
+  gem 'byebug'
+  gem 'pry-rails'
+
   gem 'coveralls', require: false
+  gem 'database_cleaner', '~> 1.4.0'
+  gem 'factory_girl_rails'
+  gem 'rspec-rails', '~> 3.3.0'
   gem 'rubocop', '0.28.0', require: false
   gem 'spinach-rails'
-  gem "rspec-rails", '2.99'
-  gem 'capybara', '~> 2.2.1'
-  gem 'capybara-screenshot', '~> 1.0.0'
-  gem "pry-rails"
-  gem "awesome_print"
-  gem "database_cleaner"
-  gem 'factory_girl_rails'
 
   # Prevent occasions where minitest is not bundled in packaged versions of ruby (see #3826)
   gem 'minitest', '~> 5.3.0'
@@ -239,8 +239,9 @@ group :development, :test do
   # Generate Fake data
   gem 'ffaker', '~> 2.0.0'
 
-  # PhantomJS driver for Capybara
-  gem 'poltergeist', '~> 1.5.1'
+  gem 'capybara',            '~> 2.3.0'
+  gem 'capybara-screenshot', '~> 1.0.0'
+  gem 'poltergeist',         '~> 1.6.0'
 
   gem 'teaspoon', '~> 1.0.0'
   gem 'teaspoon-jasmine'
@@ -249,14 +250,12 @@ group :development, :test do
   gem 'spring-commands-rspec',    '~> 1.0.0'
   gem 'spring-commands-spinach',  '~> 1.0.0'
   gem 'spring-commands-teaspoon', '~> 0.0.2'
-
-  gem "byebug"
 end
 
 group :test do
   gem 'simplecov', require: false
   gem 'shoulda-matchers', '~> 2.8.0', require: false
-  gem 'email_spec'
+  gem 'email_spec', '~> 1.6.0'
   gem 'webmock', '~> 1.21.0'
   gem 'test_after_commit'
 end
diff --git a/Gemfile.lock b/Gemfile.lock
index e64a32b6230899ef50cdceeb9f2a848eb87edbb0..b719dd4ab06fa65382f1fb1f740f0a3ee59fce35 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -82,7 +82,7 @@ GEM
       columnize (~> 0.8)
       debugger-linecache (~> 1.2)
     cal-heatmap-rails (0.0.1)
-    capybara (2.2.1)
+    capybara (2.3.0)
       mime-types (>= 1.16)
       nokogiri (>= 1.3.3)
       rack (>= 1.0.0)
@@ -125,7 +125,7 @@ GEM
     d3_rails (3.5.5)
       railties (>= 3.1.0)
     daemons (1.1.9)
-    database_cleaner (1.3.0)
+    database_cleaner (1.4.1)
     debug_inspector (0.0.2)
     debugger-linecache (1.2.0)
     default_value_for (3.0.0)
@@ -154,7 +154,7 @@ GEM
     dotenv (0.9.0)
     dropzonejs-rails (0.4.14)
       rails (> 3.1)
-    email_spec (1.5.0)
+    email_spec (1.6.0)
       launchy (~> 2.1)
       mail (~> 2.2)
     encryptor (1.3.0)
@@ -348,7 +348,7 @@ GEM
       actionpack (>= 3.0.0)
       activesupport (>= 3.0.0)
     kgio (2.9.2)
-    launchy (2.4.2)
+    launchy (2.4.3)
       addressable (~> 2.3)
     letter_opener (1.1.2)
       launchy (~> 2.2)
@@ -431,8 +431,8 @@ GEM
     orm_adapter (0.5.0)
     parser (2.2.0.2)
       ast (>= 1.1, < 3.0)
-    pg (0.15.1)
-    poltergeist (1.5.1)
+    pg (0.18.2)
+    poltergeist (1.6.0)
       capybara (~> 2.1)
       cliver (~> 0.3.1)
       multi_json (~> 1.0)
@@ -449,7 +449,7 @@ GEM
     quiet_assets (1.0.2)
       railties (>= 3.1, < 5.0)
     racc (1.4.10)
-    rack (1.5.4)
+    rack (1.5.5)
     rack-accept (0.4.5)
       rack (>= 0.4)
     rack-attack (4.3.0)
@@ -530,21 +530,23 @@ GEM
     rqrcode (0.4.2)
     rqrcode-rails3 (0.1.7)
       rqrcode (>= 0.4.2)
-    rspec-collection_matchers (1.1.2)
-      rspec-expectations (>= 2.99.0.beta1)
-    rspec-core (2.99.2)
-    rspec-expectations (2.99.2)
-      diff-lcs (>= 1.1.3, < 2.0)
-    rspec-mocks (2.99.3)
-    rspec-rails (2.99.0)
-      actionpack (>= 3.0)
-      activemodel (>= 3.0)
-      activesupport (>= 3.0)
-      railties (>= 3.0)
-      rspec-collection_matchers
-      rspec-core (~> 2.99.0)
-      rspec-expectations (~> 2.99.0)
-      rspec-mocks (~> 2.99.0)
+    rspec-core (3.3.1)
+      rspec-support (~> 3.3.0)
+    rspec-expectations (3.3.0)
+      diff-lcs (>= 1.2.0, < 2.0)
+      rspec-support (~> 3.3.0)
+    rspec-mocks (3.3.0)
+      diff-lcs (>= 1.2.0, < 2.0)
+      rspec-support (~> 3.3.0)
+    rspec-rails (3.3.2)
+      actionpack (>= 3.0, < 4.3)
+      activesupport (>= 3.0, < 4.3)
+      railties (>= 3.0, < 4.3)
+      rspec-core (~> 3.3.0)
+      rspec-expectations (~> 3.3.0)
+      rspec-mocks (~> 3.3.0)
+      rspec-support (~> 3.3.0)
+    rspec-support (3.3.0)
     rubocop (0.28.0)
       astrolabe (~> 1.3)
       parser (>= 2.2.0.pre.7, < 3.0)
@@ -707,7 +709,9 @@ GEM
     webmock (1.21.0)
       addressable (>= 2.3.6)
       crack (>= 0.3.2)
-    websocket-driver (0.3.3)
+    websocket-driver (0.5.4)
+      websocket-extensions (>= 0.1.0)
+    websocket-extensions (0.1.2)
     wikicloth (0.8.1)
       builder
       expression_parser
@@ -735,7 +739,7 @@ DEPENDENCIES
   browser (~> 0.8.0)
   byebug
   cal-heatmap-rails (~> 0.0.1)
-  capybara (~> 2.2.1)
+  capybara (~> 2.3.0)
   capybara-screenshot (~> 1.0.0)
   carrierwave
   charlock_holmes
@@ -744,7 +748,7 @@ DEPENDENCIES
   coveralls
   creole (~> 0.3.6)
   d3_rails (~> 3.5.5)
-  database_cleaner
+  database_cleaner (~> 1.4.0)
   default_value_for (~> 3.0.0)
   devise (= 3.2.4)
   devise-async (= 0.9.0)
@@ -752,7 +756,7 @@ DEPENDENCIES
   diffy (~> 3.0.3)
   doorkeeper (= 2.1.3)
   dropzonejs-rails
-  email_spec
+  email_spec (~> 1.6.0)
   enumerize
   factory_girl_rails
   ffaker (~> 2.0.0)
@@ -800,7 +804,7 @@ DEPENDENCIES
   omniauth-twitter
   org-ruby (= 0.9.12)
   pg
-  poltergeist (~> 1.5.1)
+  poltergeist (~> 1.6.0)
   pry-rails
   quiet_assets (~> 1.0.1)
   rack-attack (~> 4.3.0)
@@ -815,7 +819,7 @@ DEPENDENCIES
   request_store
   rerun (~> 0.10.0)
   rqrcode-rails3
-  rspec-rails (= 2.99)
+  rspec-rails (~> 3.3.0)
   rubocop (= 0.28.0)
   rugments (~> 1.0.0.beta7)
   sanitize (~> 2.0)
diff --git a/README.md b/README.md
index 85ea5c876afa44b11506844da7c1532a6f8d8220..336196a623dd5cfa9dc1eb54394aa4ae33d8923f 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 The source of GitLab Community Edition is [hosted on GitLab.com](https://gitlab.com/gitlab-org/gitlab-ce/) and there are mirrors to make [contributing](CONTRIBUTING.md) as easy as possible.
 
-# ![logo](https://about.gitlab.com/images/gitlab_logo.png) GitLab
+# ![logo](https://about.gitlab.com/images/logo.svg) GitLab
 
 ## Open source software to collaborate on code
 
@@ -101,4 +101,4 @@ Please see [Getting help for GitLab](https://about.gitlab.com/getting-help/) on
 ## Is it awesome?
 
 Thanks for [asking this question](https://twitter.com/supersloth/status/489462789384056832) Joshua.
-[These people](https://twitter.com/gitlab/favorites) seem to like it.
\ No newline at end of file
+[These people](https://twitter.com/gitlab/favorites) seem to like it.
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index 17ddde68f93efc0a4db76e8ebc55114d00094de7..d2f0c43929f9230a75b553cd05cddb655f31ec2c 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -1,7 +1,7 @@
 class DashboardController < Dashboard::ApplicationController
-  before_action :load_projects, except: [:projects]
+  before_action :load_projects
   before_action :event_filter, only: :show
-  
+
   respond_to :html
 
   def show
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index 0bed2115dc7addae67eebd62b5474fbbc2d09ddc..2eccc0ee31f118436f10e2791c7cdddb3dd1b128 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -45,10 +45,10 @@ class IssuableFinder
   def group
     return @group if defined?(@group)
 
-    @group = 
+    @group =
       if params[:group_id].present?
         Group.find(params[:group_id])
-      else 
+      else
         nil
       end
   end
@@ -56,10 +56,10 @@ class IssuableFinder
   def project
     return @project if defined?(@project)
 
-    @project = 
+    @project =
       if params[:project_id].present?
         Project.find(params[:project_id])
-      else 
+      else
         nil
       end
   end
@@ -76,7 +76,7 @@ class IssuableFinder
     return @milestones if defined?(@milestones)
 
     @milestones =
-      if milestones? && params[:milestone_title] != NONE 
+      if milestones? && params[:milestone_title] != NONE
         Milestone.where(title: params[:milestone_title])
       else
         nil
@@ -90,7 +90,7 @@ class IssuableFinder
   def assignee
     return @assignee if defined?(@assignee)
 
-    @assignee = 
+    @assignee =
       if assignee? && params[:assignee_id] != NONE
         User.find(params[:assignee_id])
       else
@@ -105,7 +105,7 @@ class IssuableFinder
   def author
     return @author if defined?(@author)
 
-    @author = 
+    @author =
       if author? && params[:author_id] != NONE
         User.find(params[:author_id])
       else
@@ -148,8 +148,6 @@ class IssuableFinder
     case params[:state]
     when 'closed'
       items.closed
-    when 'rejected'
-      items.respond_to?(:rejected) ? items.rejected : items.closed
     when 'merged'
       items.respond_to?(:merged) ? items.merged : items.closed
     when 'all'
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 9889c995c7453daf5f389b495c9fc53a835e7f19..0b46db4b1c38b4b6ee0ca75f6e40035d53c45423 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -281,10 +281,9 @@ module ApplicationHelper
 
   def state_filters_text_for(entity, project)
     titles = {
-      opened: "Open",
-      merged:  "Accepted"
+      opened: "Open"
     }
-    
+
     entity_title = titles[entity] || entity.to_s.humanize
 
     count =
diff --git a/app/helpers/broadcast_messages_helper.rb b/app/helpers/broadcast_messages_helper.rb
index 29ff47663dace2ed459de012e4173fd6495d42a7..6484dca6b5539dd97016fa2403bf87de5b6286a3 100644
--- a/app/helpers/broadcast_messages_helper.rb
+++ b/app/helpers/broadcast_messages_helper.rb
@@ -1,9 +1,16 @@
 module BroadcastMessagesHelper
   def broadcast_styling(broadcast_message)
-    if(broadcast_message.color || broadcast_message.font)
-      "background-color:#{broadcast_message.color};color:#{broadcast_message.font}"
-    else
-      ""
+    styling = ''
+
+    if broadcast_message.color.present?
+      styling << "background-color: #{broadcast_message.color}"
+      styling << '; ' if broadcast_message.font.present?
     end
+
+    if broadcast_message.font.present?
+      styling << "color: #{broadcast_message.font}"
+    end
+
+    styling
   end
 end
diff --git a/app/helpers/icons_helper.rb b/app/helpers/icons_helper.rb
index a730684f8f39ec401c748444911cd874c4b53773..30b17a736a74f64f6b128cf3a50e6c58ab870896 100644
--- a/app/helpers/icons_helper.rb
+++ b/app/helpers/icons_helper.rb
@@ -1,4 +1,6 @@
 module IconsHelper
+  include FontAwesome::Rails::IconHelper
+
   # Creates an icon tag given icon name(s) and possible icon modifiers.
   #
   # Right now this method simply delegates directly to `fa_icon` from the
diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb
index f771fe761efc19e9adb674845c2a2b3fe7edbf1e..2f8e64c375f5ca86dbe481738354dea22b747adb 100644
--- a/app/helpers/notifications_helper.rb
+++ b/app/helpers/notifications_helper.rb
@@ -1,4 +1,6 @@
 module NotificationsHelper
+  include IconsHelper
+
   def notification_icon(notification)
     if notification.disabled?
       icon('volume-off', class: 'ns-mute')
diff --git a/app/models/concerns/mentionable.rb b/app/models/concerns/mentionable.rb
index 10c39cb1ecec3397b39c0b680d8b41be77bf0bc8..56849f28ff08b380c04013af96d022681343b7f5 100644
--- a/app/models/concerns/mentionable.rb
+++ b/app/models/concerns/mentionable.rb
@@ -75,7 +75,7 @@ module Mentionable
     refs.reject! { |ref| without.include?(ref) }
 
     refs.each do |ref|
-      Note.create_cross_reference_note(ref, local_reference, a)
+      SystemNoteService.cross_reference(ref, local_reference, a)
     end
   end
 
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 487d62e65b60ebeaaaca5eb0bde928e141be6e99..7ecdaf6b2e0a7fbcf91ee403e8f12b5b3b475cd7 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -125,16 +125,14 @@ class MergeRequest < ActiveRecord::Base
   validate :validate_fork
 
   scope :of_group, ->(group) { where("source_project_id in (:group_project_ids) OR target_project_id in (:group_project_ids)", group_project_ids: group.project_ids) }
-  scope :merged, -> { with_state(:merged) }
   scope :by_branch, ->(branch_name) { where("(source_branch LIKE :branch) OR (target_branch LIKE :branch)", branch: branch_name) }
   scope :cared, ->(user) { where('assignee_id = :user OR author_id = :user', user: user.id) }
   scope :by_milestone, ->(milestone) { where(milestone_id: milestone) }
   scope :in_projects, ->(project_ids) { where("source_project_id in (:project_ids) OR target_project_id in (:project_ids)", project_ids: project_ids) }
   scope :of_projects, ->(ids) { where(target_project_id: ids) }
-  # Closed scope for merge request should return
-  # both merged and closed mr's
-  scope :closed, -> { with_states(:closed, :merged) }
-  scope :rejected, -> { with_states(:closed) }
+  scope :merged, -> { with_state(:merged) }
+  scope :closed, -> { with_state(:closed) }
+  scope :closed_and_merged, -> { with_states(:closed, :merged) }
 
   def self.reference_prefix
     '!'
@@ -417,4 +415,14 @@ class MergeRequest < ActiveRecord::Base
   def can_be_merged_by?(user)
     ::Gitlab::GitAccess.new(user, project).can_push_to_branch?(target_branch)
   end
+
+  def state_human_name
+    if merged?
+      "Merged"
+    elsif closed?
+      "Closed"
+    else
+      "Open"
+    end
+  end
 end
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index 9c543b370238cc17ed145af62c8a4534b4703085..e0c5fec97b7b3b84da1363bdf466cc2fbf2b53f9 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -56,7 +56,7 @@ class Milestone < ActiveRecord::Base
   end
 
   def closed_items_count
-    self.issues.closed.count + self.merge_requests.closed.count
+    self.issues.closed.count + self.merge_requests.closed_and_merged.count
   end
 
   def total_items_count
diff --git a/app/models/note.rb b/app/models/note.rb
index 6a74d62b715c03551099917b3e74e7656e20f0fd..68b9d433ae02d843dfc1e1ad0403d3d790c3e580 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -63,11 +63,6 @@ class Note < ActiveRecord::Base
   after_update :set_references
 
   class << self
-    # TODO (rspeicher): Update usages
-    def create_cross_reference_note(*args)
-      SystemNoteService.cross_reference(*args)
-    end
-
     def discussions_from_notes(notes)
       discussion_ids = []
       discussions = []
diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb
index 68d3b915fc96931eda363a1b24af6c656660395b..6135ae65007820d233c443e504a98d90fa138d8f 100644
--- a/app/services/git_push_service.rb
+++ b/app/services/git_push_service.rb
@@ -105,7 +105,7 @@ class GitPushService
       author ||= commit_user(commit)
 
       refs.each do |r|
-        Note.create_cross_reference_note(r, commit, author)
+        SystemNoteService.cross_reference(r, commit, author)
       end
     end
   end
diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb
index 0ff37c41743d86694b138c2e1349f8c0c4aa39e2..482c0444049bdef61d8c8fab5e4b0fac8779a265 100644
--- a/app/services/notes/create_service.rb
+++ b/app/services/notes/create_service.rb
@@ -15,7 +15,7 @@ module Notes
           # Create a cross-reference note if this Note contains GFM that names an
           # issue, merge request, or commit.
           note.references.each do |mentioned|
-            Note.create_cross_reference_note(mentioned, note.noteable, note.author)
+            SystemNoteService.cross_reference(mentioned, note.noteable, note.author)
           end
 
           execute_hooks(note)
diff --git a/app/services/notes/update_service.rb b/app/services/notes/update_service.rb
index 45a0db761ec4b5783394141f3892658e35d72ebc..b5611d46257b63d835a6b13791beccd46e25ca61 100644
--- a/app/services/notes/update_service.rb
+++ b/app/services/notes/update_service.rb
@@ -13,7 +13,7 @@ module Notes
           # Create a cross-reference note if this Note contains GFM that
           # names an issue, merge request, or commit.
           note.references.each do |mentioned|
-            Note.create_cross_reference_note(mentioned, note.noteable, note.author)
+            SystemNoteService.cross_reference(mentioned, note.noteable, note.author)
           end
         end
       end
diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml
index d79c45482473d65a0a154add9fb0d03c5d444881..0bcd543fee7f58414597b4c5b5874ef140a0d9da 100644
--- a/app/views/projects/merge_requests/_merge_request.html.haml
+++ b/app/views/projects/merge_requests/_merge_request.html.haml
@@ -9,11 +9,11 @@
       - if merge_request.merged?
         %span
           %i.fa.fa-check
-          ACCEPTED
+          MERGED
       - elsif merge_request.closed?
         %span
           %i.fa.fa-ban
-          REJECTED
+          CLOSED
       - else
         %span.hidden-xs.hidden-sm
           %span.label-branch<
diff --git a/app/views/projects/merge_requests/show/_mr_title.html.haml b/app/views/projects/merge_requests/show/_mr_title.html.haml
index 0690fdb769f4fe2f97e95138309e3ae659d7c730..83baf157a92d1116c4ffd2918fe160f505abfa75 100644
--- a/app/views/projects/merge_requests/show/_mr_title.html.haml
+++ b/app/views/projects/merge_requests/show/_mr_title.html.haml
@@ -1,11 +1,6 @@
 %h4.page-title
   .issue-box{ class: issue_box_class(@merge_request) }
-    - if @merge_request.merged?
-      Accepted
-    - elsif @merge_request.closed?
-      Rejected
-    - else
-      Open
+    = @merge_request.state_human_name
   = "Merge Request ##{@merge_request.iid}"
   %small.creator
     &middot;
diff --git a/app/views/projects/merge_requests/widget/_closed.html.haml b/app/views/projects/merge_requests/widget/_closed.html.haml
index 18164ba771f1d1dc2c5059ff91efac0d282a8288..b5704c502c864a103e81e1bdd9f04ff69e6fe20d 100644
--- a/app/views/projects/merge_requests/widget/_closed.html.haml
+++ b/app/views/projects/merge_requests/widget/_closed.html.haml
@@ -2,7 +2,7 @@
   = render 'projects/merge_requests/widget/heading'
   .mr-widget-body
     %h4
-      Rejected
+      Closed
       - if @merge_request.closed_event
         by #{link_to_member(@project, @merge_request.closed_event.author, avatar: true)}
         #{time_ago_with_tooltip(@merge_request.closed_event.created_at)}
diff --git a/app/views/projects/merge_requests/widget/_merged.html.haml b/app/views/projects/merge_requests/widget/_merged.html.haml
index 17c3fdacda8b5392d05f0fc84bb4d69e416cdcae..a3b13140810a102745340f8f5912af5249902d23 100644
--- a/app/views/projects/merge_requests/widget/_merged.html.haml
+++ b/app/views/projects/merge_requests/widget/_merged.html.haml
@@ -2,7 +2,7 @@
   = render 'projects/merge_requests/widget/heading'
   .mr-widget-body
     %h4
-      Accepted
+      Merged
       - if @merge_request.merge_event
         by #{link_to_member(@project, @merge_request.merge_event.author, avatar: true)}
         #{time_ago_with_tooltip(@merge_request.merge_event.created_at)}
diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml
index 417eaa1b09d0f205a5b100d9e48125e8b998dfc2..5c85092a045c9403c756d033f9805766b34e9bc2 100644
--- a/app/views/projects/milestones/show.html.haml
+++ b/app/views/projects/milestones/show.html.haml
@@ -86,10 +86,10 @@
       .col-md-3
         = render('merge_requests', title: 'Waiting for merge (open and assigned)', merge_requests: @merge_requests.opened.assigned, id: 'ongoing')
       .col-md-3
-        = render('merge_requests', title: 'Rejected (closed)', merge_requests: @merge_requests.rejected, id: 'closed')
+        = render('merge_requests', title: 'Rejected (closed)', merge_requests: @merge_requests.closed, id: 'closed')
       .col-md-3
         .panel.panel-primary
-          .panel-heading Accepted
+          .panel-heading Merged
           %ul.well-list
             - @merge_requests.merged.each do |merge_request|
               = render 'merge_request', merge_request: merge_request
diff --git a/app/views/search/results/_merge_request.html.haml b/app/views/search/results/_merge_request.html.haml
index adfdd1c75066ebd5bd5678211efc3c781fa91358..2efa616d6644e453a53415d6fcf8fbdac5eb4c33 100644
--- a/app/views/search/results/_merge_request.html.haml
+++ b/app/views/search/results/_merge_request.html.haml
@@ -11,6 +11,6 @@
     #{merge_request.project.name_with_namespace}
   .pull-right
     - if merge_request.merged?
-      %span.label.label-primary Accepted
+      %span.label.label-primary Merged
     - elsif merge_request.closed?
-      %span.label.label-danger Rejected
+      %span.label.label-danger Closed
diff --git a/app/views/shared/_issuable_filter.html.haml b/app/views/shared/_issuable_filter.html.haml
index a5187fa4ea75a28ed6f7aad43ed319f5fbc98005..a355eb62813b90d333f7a6962583195dcf3d169f 100644
--- a/app/views/shared/_issuable_filter.html.haml
+++ b/app/views/shared/_issuable_filter.html.haml
@@ -12,10 +12,10 @@
             = icon('check-circle')
             #{state_filters_text_for(:merged, @project)}
 
-        %li{class: ("active" if params[:state] == 'rejected')}
-          = link_to page_filter_path(state: 'rejected') do
+        %li{class: ("active" if params[:state] == 'closed')}
+          = link_to page_filter_path(state: 'closed') do
             = icon('ban')
-            #{state_filters_text_for(:rejected, @project)}
+            #{state_filters_text_for(:closed, @project)}
       - else
         %li{class: ("active" if params[:state] == 'closed')}
           = link_to page_filter_path(state: 'closed') do
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index 1694818aef6261b1943edf2c35774e13210d30e5..15d53499e037b2ba36696831bd127361ddbb3037 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -9,7 +9,8 @@
 .row
   %section.col-md-8
     .header-with-avatar
-      = image_tag avatar_icon(@user.email, 90), class: "avatar avatar-tile s90", alt: ''
+      = link_to avatar_icon(@user.email), target: '_blank' do
+        = image_tag avatar_icon(@user.email, 90), class: "avatar avatar-tile s90", alt: ''
       %h3
         = @user.name
         - if @user == current_user
diff --git a/doc/install/installation.md b/doc/install/installation.md
index ff0361c5e520de7938231935bc3f520b56d8bf70..8b918cba1337123decd51e031838d6f091988b03 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -368,6 +368,9 @@ Make sure to edit the config file to match your setup:
 
     # Change YOUR_SERVER_FQDN to the fully-qualified
     # domain name of your host serving GitLab.
+    # If using Ubuntu default nginx install:
+    # either remove the default_server from the listen line
+    # or else rm -f /etc/sites-enabled/default
     sudo editor /etc/nginx/sites-available/gitlab
 
 **Note:** If you want to use HTTPS, replace the `gitlab` Nginx config with `gitlab-ssl`. See [Using HTTPS](#using-https) for HTTPS configuration details.
diff --git a/features/project/commits/comments.feature b/features/project/commits/comments.feature
index c41075d7ad43fad991f2bbca8606017923299d33..320f008abb63a42ce47289b5dfbdaee9c0740ed7 100644
--- a/features/project/commits/comments.feature
+++ b/features/project/commits/comments.feature
@@ -39,6 +39,7 @@ Feature: Project Commits Comments
   @javascript
   Scenario: I can delete a comment
     Given I leave a comment like "XML attached"
+    Then I should see a comment saying "XML attached"
     And I delete a comment
     Then I should not see a comment saying "XML attached"
 
diff --git a/features/project/merge_requests.feature b/features/project/merge_requests.feature
index eb091c291e99680be1f4561724ddcdbd7fe0ab53..d043badbc46ae10e07e16bfa725f112dcb2bf925 100644
--- a/features/project/merge_requests.feature
+++ b/features/project/merge_requests.feature
@@ -11,7 +11,7 @@ Feature: Project Merge Requests
     And I should not see "Feature NS-03" in merge requests
 
   Scenario: I should see rejected merge requests
-    Given I click link "Rejected"
+    Given I click link "Closed"
     Then I should see "Feature NS-03" in merge requests
     And I should not see "Bug NS-04" in merge requests
 
diff --git a/features/project/wiki.feature b/features/project/wiki.feature
index 7a70f3487541619925f17c3a1c00d183c03f2f87..2ebfa3c16600940d6e791e476468d282e4b35df7 100644
--- a/features/project/wiki.feature
+++ b/features/project/wiki.feature
@@ -69,7 +69,7 @@ Feature: Project Wiki
     And I click on the "Pages" button
     Then I should see non-escaped link in the pages list
 
-  @javascript @focus
+  @javascript
   Scenario: Creating an invalid new page
     Given I create a New page with an invalid name
     Then I should see an error message
diff --git a/features/steps/admin/broadcast_messages.rb b/features/steps/admin/broadcast_messages.rb
index 2ecb6f0191a7bb20dd75852ffd10f1e24ff3fc4c..f6daf8529775238a8d76c80fa797be26dbf689d4 100644
--- a/features/steps/admin/broadcast_messages.rb
+++ b/features/steps/admin/broadcast_messages.rb
@@ -36,6 +36,6 @@ class Spinach::Features::AdminBroadcastMessages < Spinach::FeatureSteps
 
   step 'I should see a customized broadcast message' do
     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"])
+    expect(page).to have_selector %(div[style="background-color: #f2dede; color: #b94a48"])
   end
 end
diff --git a/features/steps/admin/settings.rb b/features/steps/admin/settings.rb
index 1c0b7a4b712ea42db7f7ee8861b204eef1148365..147a4bd7486a93cf6a85df2057fc1bdde2ca0962 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
-    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'
+    expect(current_application_settings.gravatar_enabled).to be_falsey
+    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
diff --git a/features/steps/dashboard/new_project.rb b/features/steps/dashboard/new_project.rb
index b4ade65ee534d0008a1f3e0dbe57894a244d9425..d4440c1fb4d088c46a35f74843f8718dee07a570 100644
--- a/features/steps/dashboard/new_project.rb
+++ b/features/steps/dashboard/new_project.rb
@@ -10,7 +10,7 @@ class Spinach::Features::NewProject < Spinach::FeatureSteps
   end
 
   step 'I see "New project" page' do
-    expect(page).to have_content("Project path")
+    expect(page).to have_content('Project path')
   end
 
   step 'I click on "Import project from GitHub"' do
diff --git a/features/steps/groups.rb b/features/steps/groups.rb
index c6c855a7c2215608b6c949d6ee2ee294fb305227..2812c5473e9a3a3d757d26fe6586b757a41aad7a 100644
--- a/features/steps/groups.rb
+++ b/features/steps/groups.rb
@@ -128,14 +128,14 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I change group "Owned" avatar' do
-    attach_file(:group_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png'))
+    attach_file(:group_avatar, File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif'))
     click_button "Save group"
     Group.find_by(name: "Owned").reload
   end
 
   step 'I should see new group "Owned" avatar' do
     expect(Group.find_by(name: "Owned").avatar).to be_instance_of AvatarUploader
-    expect(Group.find_by(name: "Owned").avatar.url).to eq "/uploads/group/avatar/#{ Group.find_by(name:"Owned").id }/gitlab_logo.png"
+    expect(Group.find_by(name: "Owned").avatar.url).to eq "/uploads/group/avatar/#{ Group.find_by(name:"Owned").id }/banana_sample.gif"
   end
 
   step 'I should see the "Remove avatar" button' do
@@ -143,7 +143,7 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I have group "Owned" avatar' do
-    attach_file(:group_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png'))
+    attach_file(:group_avatar, File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif'))
     click_button "Save group"
     Group.find_by(name: "Owned").reload
   end
@@ -154,7 +154,7 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
   end
 
   step 'I should not see group "Owned" avatar' do
-    expect(Group.find_by(name: "Owned").avatar?).to be_false
+    expect(Group.find_by(name: "Owned").avatar?).to eq false
   end
 
   step 'I should not see the "Remove avatar" button' do
diff --git a/features/steps/profile/profile.rb b/features/steps/profile/profile.rb
index 10bd307320edd753e5f9ce5f489990bc7f795351..11e1163c3520eca22ea65a28ac9d538a1d70a87c 100644
--- a/features/steps/profile/profile.rb
+++ b/features/steps/profile/profile.rb
@@ -27,14 +27,14 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I change my avatar' do
-    attach_file(:user_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png'))
+    attach_file(:user_avatar, File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif'))
     click_button "Save changes"
     @user.reload
   end
 
   step 'I should see new avatar' do
     expect(@user.avatar).to be_instance_of AvatarUploader
-    expect(@user.avatar.url).to eq "/uploads/user/avatar/#{ @user.id }/gitlab_logo.png"
+    expect(@user.avatar.url).to eq "/uploads/user/avatar/#{ @user.id }/banana_sample.gif"
   end
 
   step 'I should see the "Remove avatar" button' do
@@ -42,7 +42,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I have an avatar' do
-    attach_file(:user_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png'))
+    attach_file(:user_avatar, File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif'))
     click_button "Save changes"
     @user.reload
   end
@@ -53,7 +53,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step 'I should see my gravatar' do
-    expect(@user.avatar?).to be_false
+    expect(@user.avatar?).to eq false
   end
 
   step 'I should not see the "Remove avatar" button' do
@@ -87,11 +87,15 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
   end
 
   step "I should see a missing password error message" do
-    expect(page).to have_content "You must provide a valid current password"
+    page.within ".flash-container" do
+      expect(page).to have_content "You must provide a valid current password"
+    end
   end
 
   step "I should see a password error message" do
-    expect(page).to have_content "Password confirmation doesn't match"
+    page.within '.alert' do
+      expect(page).to have_content "Password confirmation doesn't match"
+    end
   end
 
   step 'I reset my token' do
@@ -120,7 +124,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
 
   step "I am not an ldap user" do
     current_user.identities.delete
-    expect(current_user.ldap_user?).to be_false
+    expect(current_user.ldap_user?).to eq false
   end
 
   step 'I redirected to expired password page' do
diff --git a/features/steps/project/merge_requests.rb b/features/steps/project/merge_requests.rb
index 62c64e60f6d0cfe1e5742df89b81f017c84f7551..5684d66152756b440afd03277eb7b92eb4800f7e 100644
--- a/features/steps/project/merge_requests.rb
+++ b/features/steps/project/merge_requests.rb
@@ -19,8 +19,8 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
     click_link "All"
   end
 
-  step 'I click link "Rejected"' do
-    click_link "Rejected"
+  step 'I click link "Closed"' do
+    click_link "Closed"
   end
 
   step 'I should see merge request "Wiki Feature"' do
@@ -31,8 +31,8 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
 
   step 'I should see closed merge request "Bug NS-04"' do
     merge_request = MergeRequest.find_by!(title: "Bug NS-04")
-    expect(merge_request.closed?).to be_true
-    expect(page).to have_content "Rejected by"
+    expect(merge_request).to be_closed
+    expect(page).to have_content "Closed by"
   end
 
   step 'I should see merge request "Bug NS-04"' do
@@ -125,7 +125,7 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
     expect(buttons.count).to eq(2)
 
     buttons.each do |b|
-      expect(expect(b['href'])).not_to have_content('json')
+      expect(b['href']).not_to have_content('json')
     end
   end
 
@@ -164,20 +164,26 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
   end
 
   step 'I should see a discussion has started on diff' do
-    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"
+    page.within(".notes .discussion") 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"
+    end
   end
 
   step 'I should see a discussion has started on commit diff' do
-    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"
+    page.within(".notes .discussion") 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"
+    end
   end
 
   step 'I should see a discussion has started on commit' do
-    expect(page).to have_content "#{current_user.name} started a discussion on commit"
-    expect(page).to have_content "One comment to rule them all"
+    page.within(".notes .discussion") do
+      page.should have_content "#{current_user.name} started a discussion on commit"
+      page.should have_content "One comment to rule them all"
+    end
   end
 
   step 'merge request is mergeable' do
@@ -206,7 +212,7 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
 
   step 'I should see merged request' do
     page.within '.issue-box' do
-      expect(page).to have_content "Accepted"
+      expect(page).to have_content "Merged"
     end
   end
 
@@ -329,12 +335,13 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
   end
 
   def leave_comment(message)
-    page.within(".js-discussion-note-form") do
+    page.within(".js-discussion-note-form", visible: true) do
       fill_in "note_note", with: message
       click_button "Add Comment"
     end
-
-    expect(page).to have_content message
+    page.within(".notes_holder", visible: true) do
+      expect(page).to have_content message
+    end
   end
 
   def init_diff_note_first_file
diff --git a/features/steps/project/project.rb b/features/steps/project/project.rb
index ee4c7cd0f06083e67e2aabb6fa39b59d0a210523..b4a0ba1e27f68394d5ff634ff1b40bdc6763dc40 100644
--- a/features/steps/project/project.rb
+++ b/features/steps/project/project.rb
@@ -28,7 +28,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps
   step 'I change the project avatar' do
     attach_file(
       :project_avatar,
-      File.join(Rails.root, 'public', 'gitlab_logo.png')
+      File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')
     )
     click_button 'Save changes'
     @project.reload
@@ -37,7 +37,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps
   step 'I should see new project avatar' do
     expect(@project.avatar).to be_instance_of AvatarUploader
     url = @project.avatar.url
-    expect(url).to eq "/uploads/project/avatar/#{ @project.id }/gitlab_logo.png"
+    expect(url).to eq "/uploads/project/avatar/#{ @project.id }/banana_sample.gif"
   end
 
   step 'I should see the "Remove avatar" button' do
@@ -47,7 +47,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps
   step 'I have an project avatar' do
     attach_file(
       :project_avatar,
-      File.join(Rails.root, 'public', 'gitlab_logo.png')
+      File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')
     )
     click_button 'Save changes'
     @project.reload
@@ -59,7 +59,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps
   end
 
   step 'I should see the default project avatar' do
-    expect(@project.avatar?).to be_false
+    expect(@project.avatar?).to eq false
   end
 
   step 'I should not see the "Remove avatar" button' do
diff --git a/features/steps/search.rb b/features/steps/search.rb
index fec5d9f0e4e986c507923f63d1c792405e2eab27..87893aa02057b6715325efe463be8e20cedab151 100644
--- a/features/steps/search.rb
+++ b/features/steps/search.rb
@@ -52,7 +52,9 @@ class Spinach::Features::Search < Spinach::FeatureSteps
   end
 
   step 'I should see code results for project "Shop"' do
-    expect(page).to have_content 'Update capybara, rspec-rails, poltergeist to recent versions'
+    page.within('.results') do
+      page.should have_content 'Update capybara, rspec-rails, poltergeist to recent versions'
+    end
   end
 
   step 'I search for "Contibuting"' do
@@ -71,7 +73,9 @@ class Spinach::Features::Search < Spinach::FeatureSteps
   end
 
   step 'I should see "Foo" link in the search results' do
-    expect(find(:css, '.search-results')).to have_link 'Foo'
+    page.within('.results') do
+      find(:css, '.search-results').should have_link 'Foo'
+    end
   end
 
   step 'I should not see "Bar" link in the search results' do
@@ -79,7 +83,9 @@ class Spinach::Features::Search < Spinach::FeatureSteps
   end
 
   step 'I should see "test_wiki" link in the search results' do
-    expect(find(:css, '.search-results')).to have_link 'test_wiki.md'
+    page.within('.results') do
+      find(:css, '.search-results').should have_link 'test_wiki.md'
+    end
   end
 
   step 'project has Wiki content' do
diff --git a/features/steps/shared/diff_note.rb b/features/steps/shared/diff_note.rb
index c4f89ca31c9a7092d9021c4ac2eb41f5dd86fc18..27a95aeb19ac8d69f80b230f33a7b58c649d291d 100644
--- a/features/steps/shared/diff_note.rb
+++ b/features/steps/shared/diff_note.rb
@@ -20,11 +20,14 @@ module SharedDiffNote
   end
 
   step 'I leave a diff comment like "Typo, please fix"' do
-    click_diff_line(sample_commit.line_code)
-    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
+    page.within(diff_file_selector) do
+      click_diff_line(sample_commit.line_code)
+
+      page.within("form[rel$='#{sample_commit.line_code}']") do
+        fill_in "note[note]", with: "Typo, please fix"
+        find(".js-comment-button").trigger("click")
+        sleep 0.05
+      end
     end
   end
 
@@ -45,28 +48,37 @@ module SharedDiffNote
   end
 
   step 'I preview a diff comment text like "Should fix it :smile:"' do
-    click_diff_line(sample_commit.line_code)
-    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
+    page.within(diff_file_selector) do
+      click_diff_line(sample_commit.line_code)
+
+      page.within("form[rel$='#{sample_commit.line_code}']") do
+        fill_in "note[note]", with: "Should fix it :smile:"
+        find('.js-md-preview-button').click
+      end
     end
   end
 
   step 'I preview another diff comment text like "DRY this up"' do
-    click_diff_line(sample_commit.del_line_code)
+    page.within(diff_file_selector) do
+      click_diff_line(sample_commit.del_line_code)
 
-    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
+      page.within("form[rel$='#{sample_commit.del_line_code}']") do
+        fill_in "note[note]", with: "DRY this up"
+        find('.js-md-preview-button').click
+      end
     end
   end
 
   step 'I open a diff comment form' do
-    click_diff_line(sample_commit.line_code)
+    page.within(diff_file_selector) do
+      click_diff_line(sample_commit.line_code)
+    end
   end
 
   step 'I open another diff comment form' do
-    click_diff_line(sample_commit.del_line_code)
+    page.within(diff_file_selector) do
+      click_diff_line(sample_commit.del_line_code)
+    end
   end
 
   step 'I write a diff comment like ":-1: I don\'t like this"' do
@@ -194,7 +206,7 @@ module SharedDiffNote
   end
 
   def diff_file_selector
-    ".diff-file:nth-of-type(1)"
+    '.diff-file:nth-of-type(1)'
   end
 
   def click_diff_line(code)
diff --git a/features/steps/shared/note.rb b/features/steps/shared/note.rb
index b2675546a14f70bbd5414c0365da81fa30ab9832..f6aabfefeffb3eab37e11c414feca40785192e1c 100644
--- a/features/steps/shared/note.rb
+++ b/features/steps/shared/note.rb
@@ -2,8 +2,10 @@ module SharedNote
   include Spinach::DSL
 
   step 'I delete a comment' do
-    find('.note').hover
-    find(".js-note-delete").click
+    page.within('.notes') do
+      find('.note').hover
+      find(".js-note-delete").click
+    end
   end
 
   step 'I haven\'t written any comment text' do
@@ -16,7 +18,6 @@ module SharedNote
     page.within(".js-main-target-form") do
       fill_in "note[note]", with: "XML attached"
       click_button "Add Comment"
-      sleep 0.05
     end
   end
 
@@ -123,13 +124,14 @@ module SharedNote
   end
 
   step 'I edit the last comment with a +1' do
-    find(".note").hover
-    find('.js-note-edit').click
+    page.within(".notes") do
+      find(".note").hover
+      find('.js-note-edit').click
+    end
 
     page.within(".current-note-edit-form") do
       fill_in 'note[note]', with: '+1 Awesome!'
       click_button 'Save Comment'
-      sleep 0.05
     end
   end
 
diff --git a/features/support/env.rb b/features/support/env.rb
index d4a878ea4ce683e346c819a439836c5c9fd3a08f..672251af084972a12cb8e2cc130112bd73c34e63 100644
--- a/features/support/env.rb
+++ b/features/support/env.rb
@@ -25,6 +25,7 @@ WebMock.allow_net_connect!
 
 Spinach.hooks.before_run do
   include RSpec::Mocks::ExampleMethods
+  RSpec::Mocks.setup
   TestEnv.init(mailer: false)
 
   include FactoryGirl::Syntax::Methods
diff --git a/lib/support/nginx/gitlab b/lib/support/nginx/gitlab
index 4688a527eba23efe640c3893b65c6296a499f7af..edb987875dfcbf076c97909368539e28d54ede1a 100644
--- a/lib/support/nginx/gitlab
+++ b/lib/support/nginx/gitlab
@@ -40,6 +40,10 @@ upstream gitlab {
 
 ## Normal HTTP host
 server {
+  ## Either remove "default_server" from the listen line below, 
+  ## or delete the /etc/nginx/sites-enabled/default file. This will cause gitlab
+  ## to be served if you visit any address that your server responds to, eg.
+  ## the ip address of the server (http://x.x.x.x/)n 0.0.0.0:80 default_server;
   listen 0.0.0.0:80 default_server;
   listen [::]:80 default_server;
   server_name YOUR_SERVER_FQDN; ## Replace this with something like gitlab.example.com
diff --git a/lib/support/nginx/gitlab-ssl b/lib/support/nginx/gitlab-ssl
index 5c94ec634327aa977e0c9aa3aeb47a5615fc033a..766559b49f6f878ad42ba177c5358a96bb2d82c3 100644
--- a/lib/support/nginx/gitlab-ssl
+++ b/lib/support/nginx/gitlab-ssl
@@ -44,6 +44,10 @@ upstream gitlab {
 
 ## Redirects all HTTP traffic to the HTTPS host
 server {
+  ## Either remove "default_server" from the listen line below, 
+  ## or delete the /etc/nginx/sites-enabled/default file. This will cause gitlab
+  ## to be served if you visit any address that your server responds to, eg.
+  ## the ip address of the server (http://x.x.x.x/)
   listen 0.0.0.0:80;
   listen [::]:80 ipv6only=on default_server;
   server_name YOUR_SERVER_FQDN; ## Replace this with something like gitlab.example.com
diff --git a/spec/controllers/autocomplete_controller_spec.rb b/spec/controllers/autocomplete_controller_spec.rb
index 1ea1227b28b3b1c404b7674c84b01b50f9667262..9ad9cb41cc14e3aa3063f9caac50ff26d6d3dbc0 100644
--- a/spec/controllers/autocomplete_controller_spec.rb
+++ b/spec/controllers/autocomplete_controller_spec.rb
@@ -16,7 +16,7 @@ describe AutocompleteController do
     let(:body) { JSON.parse(response.body) }
 
     it { expect(body).to be_kind_of(Array) }
-    it { expect(body.size).to eq(1) }
+    it { expect(body.size).to eq 1 }
     it { expect(body.first["username"]).to eq user.username }
   end
 
@@ -33,7 +33,7 @@ describe AutocompleteController do
     let(:body) { JSON.parse(response.body) }
 
     it { expect(body).to be_kind_of(Array) }
-    it { expect(body.size).to eq(1) }
+    it { expect(body.size).to eq 1 }
     it { expect(body.first["username"]).to eq user.username }
   end
 
@@ -46,6 +46,6 @@ describe AutocompleteController do
     let(:body) { JSON.parse(response.body) }
 
     it { expect(body).to be_kind_of(Array) }
-    it { expect(body.size).to eq(User.count) }
+    it { expect(body.size).to eq User.count }
   end
 end
diff --git a/spec/controllers/commit_controller_spec.rb b/spec/controllers/commit_controller_spec.rb
index 2dfc8e2821ff2c0084d128030f1efa0f8224e925..bb3d87f384081f488d4fd500e837be9a72d75661 100644
--- a/spec/controllers/commit_controller_spec.rb
+++ b/spec/controllers/commit_controller_spec.rb
@@ -49,10 +49,10 @@ describe Projects::CommitController do
             project_id: project.to_param,
             id: commit.id, format: format)
 
-        expect(response.body).to_not include('&amp;')
-        expect(response.body).to_not include('&gt;')
-        expect(response.body).to_not include('&lt;')
-        expect(response.body).to_not include('&quot;')
+        expect(response.body).not_to include('&amp;')
+        expect(response.body).not_to include('&gt;')
+        expect(response.body).not_to include('&lt;')
+        expect(response.body).not_to include('&quot;')
       end
     end
 
diff --git a/spec/controllers/import/bitbucket_controller_spec.rb b/spec/controllers/import/bitbucket_controller_spec.rb
index ddeeaf74fcb962cc96902f8ed6b3fb0c2fa8401c..d5d9310e6032a62ec6f9c2431d3c007f4d310457 100644
--- a/spec/controllers/import/bitbucket_controller_spec.rb
+++ b/spec/controllers/import/bitbucket_controller_spec.rb
@@ -1,11 +1,14 @@
 require 'spec_helper'
+require_relative 'import_spec_helper'
 
 describe Import::BitbucketController do
+  include ImportSpecHelper
+
   let(:user) { create(:user, bitbucket_access_token: 'asd123', bitbucket_access_token_secret: "sekret") }
 
   before do
     sign_in(user)
-    controller.stub(:bitbucket_import_enabled?).and_return(true)
+    allow(controller).to receive(:bitbucket_import_enabled?).and_return(true)
   end
 
   describe "GET callback" do
@@ -17,8 +20,9 @@ describe Import::BitbucketController do
       token = "asdasd12345"
       secret = "sekrettt"
       access_token = double(token: token, secret: secret)
-      Gitlab::BitbucketImport::Client.any_instance.stub(:get_token).and_return(access_token)
-      Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "bitbucket")
+      allow_any_instance_of(Gitlab::BitbucketImport::Client).
+        to receive(:get_token).and_return(access_token)
+      stub_omniauth_provider('bitbucket')
 
       get :callback
 
@@ -35,7 +39,7 @@ describe Import::BitbucketController do
 
     it "assigns variables" do
       @project = create(:project, import_type: 'bitbucket', creator_id: user.id)
-      controller.stub_chain(:client, :projects).and_return([@repo])
+      stub_client(projects: [@repo])
 
       get :status
 
@@ -45,7 +49,7 @@ describe Import::BitbucketController do
 
     it "does not show already added project" do
       @project = create(:project, import_type: 'bitbucket', creator_id: user.id, import_source: 'asd/vim')
-      controller.stub_chain(:client, :projects).and_return([@repo])
+      stub_client(projects: [@repo])
 
       get :status
 
@@ -70,8 +74,7 @@ describe Import::BitbucketController do
         to receive(:new).with(bitbucket_repo, user).
         and_return(double(execute: true))
 
-      controller.stub_chain(:client, :user).and_return(bitbucket_user)
-      controller.stub_chain(:client, :project).and_return(bitbucket_repo)
+      stub_client(user: bitbucket_user, project: bitbucket_repo)
     end
 
     context "when the repository owner is the Bitbucket user" do
diff --git a/spec/controllers/import/github_controller_spec.rb b/spec/controllers/import/github_controller_spec.rb
index 5f2a09280b23f1425858a3a94c78409aba478708..0bc14059a350fb0ac82db681336340d889596306 100644
--- a/spec/controllers/import/github_controller_spec.rb
+++ b/spec/controllers/import/github_controller_spec.rb
@@ -1,11 +1,14 @@
 require 'spec_helper'
+require_relative 'import_spec_helper'
 
 describe Import::GithubController do
+  include ImportSpecHelper
+
   let(:user) { create(:user, github_access_token: 'asd123') }
 
   before do
     sign_in(user)
-    controller.stub(:github_import_enabled?).and_return(true)
+    allow(controller).to receive(:github_import_enabled?).and_return(true)
   end
 
   describe "GET callback" do
@@ -13,9 +16,7 @@ describe Import::GithubController do
       token = "asdasd12345"
       allow_any_instance_of(Gitlab::GithubImport::Client).
         to receive(:get_token).and_return(token)
-      Gitlab.config.omniauth.providers << OpenStruct.new(app_id: 'asd123',
-                                                         app_secret: 'asd123',
-                                                         name: 'github')
+      stub_omniauth_provider('github')
 
       get :callback
 
@@ -33,9 +34,7 @@ describe Import::GithubController do
 
     it "assigns variables" do
       @project = create(:project, import_type: 'github', creator_id: user.id)
-      controller.stub_chain(:client, :repos).and_return([@repo])
-      controller.stub_chain(:client, :orgs).and_return([@org])
-      controller.stub_chain(:client, :org_repos).with(@org.login).and_return([@org_repo])
+      stub_client(repos: [@repo], orgs: [@org], org_repos: [@org_repo])
 
       get :status
 
@@ -45,8 +44,7 @@ describe Import::GithubController do
 
     it "does not show already added project" do
       @project = create(:project, import_type: 'github', creator_id: user.id, import_source: 'asd/vim')
-      controller.stub_chain(:client, :repos).and_return([@repo])
-      controller.stub_chain(:client, :orgs).and_return([])
+      stub_client(repos: [@repo], orgs: [])
 
       get :status
 
@@ -67,8 +65,7 @@ describe Import::GithubController do
     end
 
     before do
-      controller.stub_chain(:client, :user).and_return(github_user)
-      controller.stub_chain(:client, :repo).and_return(github_repo)
+      stub_client(user: github_user, repo: github_repo)
     end
 
     context "when the repository owner is the GitHub user" do
diff --git a/spec/controllers/import/gitlab_controller_spec.rb b/spec/controllers/import/gitlab_controller_spec.rb
index a0c5ce1fe5b619dada8332f6804c417c49072ce8..4bc67c8670380cc2f031d64d34baa701949e1b67 100644
--- a/spec/controllers/import/gitlab_controller_spec.rb
+++ b/spec/controllers/import/gitlab_controller_spec.rb
@@ -1,18 +1,22 @@
 require 'spec_helper'
+require_relative 'import_spec_helper'
 
 describe Import::GitlabController do
+  include ImportSpecHelper
+
   let(:user) { create(:user, gitlab_access_token: 'asd123') }
 
   before do
     sign_in(user)
-    controller.stub(:gitlab_import_enabled?).and_return(true)
+    allow(controller).to receive(:gitlab_import_enabled?).and_return(true)
   end
 
   describe "GET callback" do
     it "updates access token" do
       token = "asdasd12345"
-      Gitlab::GitlabImport::Client.any_instance.stub_chain(:client, :auth_code, :get_token, :token).and_return(token)
-      Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "gitlab")
+      allow_any_instance_of(Gitlab::GitlabImport::Client).
+        to receive(:get_token).and_return(token)
+      stub_omniauth_provider('gitlab')
 
       get :callback
 
@@ -28,7 +32,7 @@ describe Import::GitlabController do
 
     it "assigns variables" do
       @project = create(:project, import_type: 'gitlab', creator_id: user.id)
-      controller.stub_chain(:client, :projects).and_return([@repo])
+      stub_client(projects: [@repo])
 
       get :status
 
@@ -38,7 +42,7 @@ describe Import::GitlabController do
 
     it "does not show already added project" do
       @project = create(:project, import_type: 'gitlab', creator_id: user.id, import_source: 'asd/vim')
-      controller.stub_chain(:client, :projects).and_return([@repo])
+      stub_client(projects: [@repo])
 
       get :status
 
@@ -62,8 +66,7 @@ describe Import::GitlabController do
     end
 
     before do
-      controller.stub_chain(:client, :user).and_return(gitlab_user)
-      controller.stub_chain(:client, :project).and_return(gitlab_repo)
+      stub_client(user: gitlab_user, project: gitlab_repo)
     end
 
     context "when the repository owner is the GitLab.com user" do
diff --git a/spec/controllers/import/gitorious_controller_spec.rb b/spec/controllers/import/gitorious_controller_spec.rb
index 07c9484bf1a2fafa2e98ccb64b0546dbcb5718d4..7cb1b85a46d666a7712f73bc5dc71cf3c433191a 100644
--- a/spec/controllers/import/gitorious_controller_spec.rb
+++ b/spec/controllers/import/gitorious_controller_spec.rb
@@ -1,6 +1,9 @@
 require 'spec_helper'
+require_relative 'import_spec_helper'
 
 describe Import::GitoriousController do
+  include ImportSpecHelper
+
   let(:user) { create(:user) }
 
   before do
@@ -30,7 +33,7 @@ describe Import::GitoriousController do
 
     it "assigns variables" do
       @project = create(:project, import_type: 'gitorious', creator_id: user.id)
-      controller.stub_chain(:client, :repos).and_return([@repo])
+      stub_client(repos: [@repo])
 
       get :status
 
@@ -40,7 +43,7 @@ describe Import::GitoriousController do
 
     it "does not show already added project" do
       @project = create(:project, import_type: 'gitorious', creator_id: user.id, import_source: 'asd/vim')
-      controller.stub_chain(:client, :repos).and_return([@repo])
+      stub_client(repos: [@repo])
 
       get :status
 
@@ -59,7 +62,7 @@ describe Import::GitoriousController do
       expect(Gitlab::GitoriousImport::ProjectCreator).
         to receive(:new).with(@repo, namespace, user).
         and_return(double(execute: true))
-      controller.stub_chain(:client, :repo).and_return(@repo)
+      stub_client(repo: @repo)
 
       post :create, format: :js
     end
diff --git a/spec/controllers/import/google_code_controller_spec.rb b/spec/controllers/import/google_code_controller_spec.rb
index 78c0f5079cc6ee6157ff7a35486493e178dda94c..66088139a69bb06778d8d2cbbe96b1634e55aa79 100644
--- a/spec/controllers/import/google_code_controller_spec.rb
+++ b/spec/controllers/import/google_code_controller_spec.rb
@@ -1,6 +1,9 @@
 require 'spec_helper'
+require_relative 'import_spec_helper'
 
 describe Import::GoogleCodeController do
+  include ImportSpecHelper
+
   let(:user) { create(:user) }
   let(:dump_file) { fixture_file_upload(Rails.root + 'spec/fixtures/GoogleCodeProjectHosting.json', 'application/json') }
 
@@ -21,13 +24,12 @@ describe Import::GoogleCodeController do
   describe "GET status" do
     before do
       @repo = OpenStruct.new(name: 'vim')
-      controller.stub_chain(:client, :valid?).and_return(true)
+      stub_client(valid?: true)
     end
 
     it "assigns variables" do
       @project = create(:project, import_type: 'google_code', creator_id: user.id)
-      controller.stub_chain(:client, :repos).and_return([@repo])
-      controller.stub_chain(:client, :incompatible_repos).and_return([])
+      stub_client(repos: [@repo], incompatible_repos: [])
 
       get :status
 
@@ -38,8 +40,7 @@ describe Import::GoogleCodeController do
 
     it "does not show already added project" do
       @project = create(:project, import_type: 'google_code', creator_id: user.id, import_source: 'vim')
-      controller.stub_chain(:client, :repos).and_return([@repo])
-      controller.stub_chain(:client, :incompatible_repos).and_return([])
+      stub_client(repos: [@repo], incompatible_repos: [])
 
       get :status
 
@@ -48,8 +49,7 @@ describe Import::GoogleCodeController do
     end
 
     it "does not show any invalid projects" do
-      controller.stub_chain(:client, :repos).and_return([])
-      controller.stub_chain(:client, :incompatible_repos).and_return([@repo])
+      stub_client(repos: [], incompatible_repos: [@repo])
 
       get :status
 
diff --git a/spec/controllers/import/import_spec_helper.rb b/spec/controllers/import/import_spec_helper.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9d7648e25a71b7036b34359c218f9dd0aeb6bebe
--- /dev/null
+++ b/spec/controllers/import/import_spec_helper.rb
@@ -0,0 +1,33 @@
+require 'ostruct'
+
+# Helper methods for controller specs in the Import namespace
+#
+# Must be included manually.
+module ImportSpecHelper
+  # Stub `controller` to return a null object double with the provided messages
+  # when `client` is called
+  #
+  # Examples:
+  #
+  #   stub_client(foo: %w(foo))
+  #
+  #   controller.client.foo         # => ["foo"]
+  #   controller.client.bar.baz.foo # => ["foo"]
+  #
+  # Returns the client double
+  def stub_client(messages = {})
+    client = double('client', messages).as_null_object
+    allow(controller).to receive(:client).and_return(client)
+
+    client
+  end
+
+  def stub_omniauth_provider(name)
+    provider = OpenStruct.new(
+      name: name,
+      app_id: 'asd123',
+      app_secret: 'asd123'
+    )
+    Gitlab.config.omniauth.providers << provider
+  end
+end
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index bda931666f79cf0dad0757ab2a9a75e53a576b69..b8db8591709b5932abadd5ed98f7b6ba909f1348 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -52,10 +52,10 @@ describe Projects::MergeRequestsController do
             id: merge_request.iid,
             format: format)
 
-        expect(response.body).to_not include('&amp;')
-        expect(response.body).to_not include('&gt;')
-        expect(response.body).to_not include('&lt;')
-        expect(response.body).to_not include('&quot;')
+        expect(response.body).not_to include('&amp;')
+        expect(response.body).not_to include('&gt;')
+        expect(response.body).not_to include('&lt;')
+        expect(response.body).not_to include('&quot;')
       end
     end
 
diff --git a/spec/features/gitlab_flavored_markdown_spec.rb b/spec/features/gitlab_flavored_markdown_spec.rb
index 16d1ca55f8d070985523002a9ea5174044557e53..0c1bc53cdb51fba3764b4749bf887056c27cedb5 100644
--- a/spec/features/gitlab_flavored_markdown_spec.rb
+++ b/spec/features/gitlab_flavored_markdown_spec.rb
@@ -11,7 +11,8 @@ describe "GitLab Flavored Markdown", feature: true do
   end
 
   before do
-    Commit.any_instance.stub(title: "fix #{issue.to_reference}\n\nask #{fred.to_reference} for details")
+    allow_any_instance_of(Commit).to receive(:title).
+      and_return("fix #{issue.to_reference}\n\nask #{fred.to_reference} for details")
   end
 
   let(:commit) { project.commit }
diff --git a/spec/features/profile_spec.rb b/spec/features/profile_spec.rb
index 3d36a3c02d043cc989cfc682273d2c5c6b989e2d..9fe2e610555ddcfa30f30d517ae737bf193cd7e2 100644
--- a/spec/features/profile_spec.rb
+++ b/spec/features/profile_spec.rb
@@ -9,7 +9,8 @@ describe 'Profile account page', feature: true do
 
   describe 'when signup is enabled' do
     before do
-      ApplicationSetting.any_instance.stub(signup_enabled?: true)
+      allow_any_instance_of(ApplicationSetting).
+        to receive(:signup_enabled?).and_return(true)
       visit profile_account_path
     end
 
@@ -23,7 +24,8 @@ describe 'Profile account page', feature: true do
 
   describe 'when signup is disabled' do
     before do
-      ApplicationSetting.any_instance.stub(signup_enabled?: false)
+      allow_any_instance_of(ApplicationSetting).
+        to receive(:signup_enabled?).and_return(false)
       visit profile_account_path
     end
 
diff --git a/spec/features/profiles/preferences_spec.rb b/spec/features/profiles/preferences_spec.rb
index 69d15f41706227b90da8cd64eed4256a749f58a0..03e78c533db2785d246c086276f07ab7cc268774 100644
--- a/spec/features/profiles/preferences_spec.rb
+++ b/spec/features/profiles/preferences_spec.rb
@@ -75,7 +75,7 @@ describe 'Profile > Preferences' do
   end
 
   def expect_preferences_saved_message
-    within('.flash-container') do
+    page.within('.flash-container') do
       expect(page).to have_content('Preferences saved.')
     end
   end
diff --git a/spec/features/security/profile_access_spec.rb b/spec/features/security/profile_access_spec.rb
index 2b09771851e3288fc872d8b4a5e120cedf64b911..8f7a9606262b1827a5f5156eee2d5e36f2b34ed7 100644
--- a/spec/features/security/profile_access_spec.rb
+++ b/spec/features/security/profile_access_spec.rb
@@ -6,7 +6,7 @@ describe "Profile access", feature: true  do
   end
 
   describe "GET /login" do
-    it { expect(new_user_session_path).not_to be_404_for :visitor }
+    it { expect(new_user_session_path).not_to be_not_found_for :visitor }
   end
 
   describe "GET /profile/keys" do
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index 1297e789793044164e774ca28c5320865a73af30..8fd3d8f407b1d2284ed43bb7e5b521434c78c625 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -40,15 +40,15 @@ describe ApplicationHelper do
   end
 
   describe 'project_icon' do
-    avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png')
+    avatar_file_path = File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')
 
     it 'should return an url for the avatar' do
       project = create(:project)
       project.avatar = File.open(avatar_file_path)
       project.save!
-      avatar_url = "http://localhost/uploads/project/avatar/#{ project.id }/gitlab_logo.png"
+      avatar_url = "http://localhost/uploads/project/avatar/#{ project.id }/banana_sample.gif"
       expect(project_icon("#{project.namespace.to_param}/#{project.to_param}").to_s).to eq(
-        "<img alt=\"Gitlab logo\" src=\"#{avatar_url}\" />"
+        "<img alt=\"Banana sample\" src=\"#{avatar_url}\" />"
       )
     end
 
@@ -65,25 +65,25 @@ describe ApplicationHelper do
   end
 
   describe 'avatar_icon' do
-    avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png')
+    avatar_file_path = File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')
 
     it 'should return an url for the avatar' do
       user = create(:user)
       user.avatar = File.open(avatar_file_path)
       user.save!
       expect(avatar_icon(user.email).to_s).
-        to match("/uploads/user/avatar/#{ user.id }/gitlab_logo.png")
+        to match("/uploads/user/avatar/#{ user.id }/banana_sample.gif")
     end
 
     it 'should return an url for the avatar with relative url' do
-      Gitlab.config.gitlab.stub(relative_url_root: '/gitlab')
-      Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))
+      allow(Gitlab.config.gitlab).to receive(:relative_url_root).and_return('/gitlab')
+      allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
 
       user = create(:user)
       user.avatar = File.open(avatar_file_path)
       user.save!
       expect(avatar_icon(user.email).to_s).
-        to match("/gitlab/uploads/user/avatar/#{ user.id }/gitlab_logo.png")
+        to match("/gitlab/uploads/user/avatar/#{ user.id }/banana_sample.gif")
     end
 
     it 'should call gravatar_icon when no avatar is present' do
@@ -97,7 +97,7 @@ describe ApplicationHelper do
     let(:user_email) { 'user@email.com' }
 
     it 'should return a generic avatar path when Gravatar is disabled' do
-      ApplicationSetting.any_instance.stub(gravatar_enabled?: false)
+      allow_any_instance_of(ApplicationSetting).to receive(:gravatar_enabled?).and_return(false)
       expect(gravatar_icon(user_email)).to match('no_avatar.png')
     end
 
@@ -106,13 +106,13 @@ describe ApplicationHelper do
     end
 
     it 'should return default gravatar url' do
-      Gitlab.config.gitlab.stub(https: false)
+      allow(Gitlab.config.gitlab).to receive(:https).and_return(false)
       url = 'http://www.gravatar.com/avatar/b58c6f14d292556214bd64909bcdb118'
       expect(gravatar_icon(user_email)).to match(url)
     end
 
     it 'should use SSL when appropriate' do
-      Gitlab.config.gitlab.stub(https: true)
+      allow(Gitlab.config.gitlab).to receive(:https).and_return(true)
       expect(gravatar_icon(user_email)).to match('https://secure.gravatar.com')
     end
 
diff --git a/spec/helpers/broadcast_messages_helper_spec.rb b/spec/helpers/broadcast_messages_helper_spec.rb
index f6df12662bb1a78a44d1647823d8f538979274c6..c7c6f45d14439886bac8b57f17caf5bfad9b1a99 100644
--- a/spec/helpers/broadcast_messages_helper_spec.rb
+++ b/spec/helpers/broadcast_messages_helper_spec.rb
@@ -2,20 +2,20 @@ require 'spec_helper'
 
 describe BroadcastMessagesHelper do
   describe 'broadcast_styling' do
-    let(:broadcast_message) { double(color: "", font: "") }
+    let(:broadcast_message) { double(color: '', font: '') }
 
     context "default style" do
       it "should have no style" do
-        expect(broadcast_styling(broadcast_message)).to match('')
+        expect(broadcast_styling(broadcast_message)).to eq ''
       end
     end
 
-    context "customiezd style" do
-      before { broadcast_message.stub(color: "#f2dede", font: "#b94a48") }
+    context "customized style" do
+      let(:broadcast_message) { double(color: "#f2dede", font: '#b94a48') }
 
       it "should have a customized style" do
         expect(broadcast_styling(broadcast_message)).
-          to match('background-color:#f2dede;color:#b94a48')
+          to match('background-color: #f2dede; color: #b94a48')
       end
     end
   end
diff --git a/spec/helpers/diff_helper_spec.rb b/spec/helpers/diff_helper_spec.rb
index e0be2df0e5e94c89fc46a96c36d401961b75c0e5..7c96a74e5816c0329a4094f82cd63ee95f40f3fb 100644
--- a/spec/helpers/diff_helper_spec.rb
+++ b/spec/helpers/diff_helper_spec.rb
@@ -48,19 +48,19 @@ describe DiffHelper do
     end
 
     it 'should return only the first file if the diff line count in the 2nd file takes the total beyond safe limits' do
-      diffs[1].diff.stub(lines: [""] * 4999) #simulate 4999 lines
+      allow(diffs[1].diff).to receive(:lines).and_return([""] * 4999) #simulate 4999 lines
       expect(safe_diff_files(diffs).length).to eq(1)
     end
 
     it 'should return all files from a commit that is beyond safe limit for numbers of lines if force diff is true' do
       allow(controller).to receive(:params) { { force_show_diff: true } }
-      diffs[1].diff.stub(lines: [""] * 4999) #simulate 4999 lines
+      allow(diffs[1].diff).to receive(:lines).and_return([""] * 4999) #simulate 4999 lines
       expect(safe_diff_files(diffs).length).to eq(2)
     end
 
     it 'should return only the first file if the diff line count in the 2nd file takes the total beyond hard limits' do
       allow(controller).to receive(:params) { { force_show_diff: true } }
-      diffs[1].diff.stub(lines: [""] * 49999) #simulate 49999 lines
+      allow(diffs[1].diff).to receive(:lines).and_return([""] * 49999) #simulate 49999 lines
       expect(safe_diff_files(diffs).length).to eq(1)
     end
 
diff --git a/spec/helpers/groups_helper.rb b/spec/helpers/groups_helper.rb
index 3e99ab84ec93312b8579d297b5de3d220be1ae35..5d1744606818a3efbc04e15f22cc444fb49c644d 100644
--- a/spec/helpers/groups_helper.rb
+++ b/spec/helpers/groups_helper.rb
@@ -2,14 +2,14 @@ require 'spec_helper'
 
 describe GroupsHelper do
   describe 'group_icon' do
-    avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png')
+    avatar_file_path = File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')
 
     it 'should return an url for the avatar' do
       group = create(:group)
       group.avatar = File.open(avatar_file_path)
       group.save!
       expect(group_icon(group.path).to_s).
-        to match("/uploads/group/avatar/#{ group.id }/gitlab_logo.png")
+        to match("/uploads/group/avatar/#{ group.id }/banana_sample.gif")
     end
 
     it 'should give default avatar_icon when no avatar is present' do
diff --git a/spec/helpers/notifications_helper_spec.rb b/spec/helpers/notifications_helper_spec.rb
index 482cb33e94ff1f39d8e39365e769abb652a09f08..f1aba4cfdf3aa3cb7183aaf636f1ac063feb0458 100644
--- a/spec/helpers/notifications_helper_spec.rb
+++ b/spec/helpers/notifications_helper_spec.rb
@@ -1,14 +1,11 @@
 require 'spec_helper'
 
 describe NotificationsHelper do
-  include FontAwesome::Rails::IconHelper
-  include IconsHelper
-
   describe 'notification_icon' do
     let(:notification) { double(disabled?: false, participating?: false, watch?: false) }
 
     context "disabled notification" do
-      before { notification.stub(disabled?: true) }
+      before { allow(notification).to receive(:disabled?).and_return(true) }
 
       it "has a red icon" do
         expect(notification_icon(notification)).to match('class="fa fa-volume-off ns-mute"')
@@ -16,7 +13,7 @@ describe NotificationsHelper do
     end
 
     context "participating notification" do
-      before { notification.stub(participating?: true) }
+      before { allow(notification).to receive(:participating?).and_return(true) }
 
       it "has a blue icon" do
         expect(notification_icon(notification)).to match('class="fa fa-volume-down ns-part"')
@@ -24,7 +21,7 @@ describe NotificationsHelper do
     end
 
     context "watched notification" do
-      before { notification.stub(watch?: true) }
+      before { allow(notification).to receive(:watch?).and_return(true) }
 
       it "has a green icon" do
         expect(notification_icon(notification)).to match('class="fa fa-volume-up ns-watch"')
diff --git a/spec/helpers/submodule_helper_spec.rb b/spec/helpers/submodule_helper_spec.rb
index e98b75afabcf88741851bc292f0d5a8b940c0e9d..a7abf9d3839358949b4c4122097f328aa2ac5bb1 100644
--- a/spec/helpers/submodule_helper_spec.rb
+++ b/spec/helpers/submodule_helper_spec.rb
@@ -14,41 +14,41 @@ describe SubmoduleHelper do
 
     context 'submodule on self' do
       before do
-        Gitlab.config.gitlab.stub(protocol: 'http') # set this just to be sure
+        allow(Gitlab.config.gitlab).to receive(:protocol).and_return('http') # set this just to be sure
       end
 
       it 'should detect ssh on standard port' do
-        Gitlab.config.gitlab_shell.stub(ssh_port: 22) # set this just to be sure
-        Gitlab.config.gitlab_shell.stub(ssh_path_prefix: Settings.send(:build_gitlab_shell_ssh_path_prefix))
+        allow(Gitlab.config.gitlab_shell).to receive(:ssh_port).and_return(22) # set this just to be sure
+        allow(Gitlab.config.gitlab_shell).to receive(:ssh_path_prefix).and_return(Settings.send(:build_gitlab_shell_ssh_path_prefix))
         stub_url([ config.user, '@', config.host, ':gitlab-org/gitlab-ce.git' ].join(''))
         expect(submodule_links(submodule_item)).to eq([ namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash') ])
       end
 
       it 'should detect ssh on non-standard port' do
-        Gitlab.config.gitlab_shell.stub(ssh_port: 2222)
-        Gitlab.config.gitlab_shell.stub(ssh_path_prefix: Settings.send(:build_gitlab_shell_ssh_path_prefix))
+        allow(Gitlab.config.gitlab_shell).to receive(:ssh_port).and_return(2222)
+        allow(Gitlab.config.gitlab_shell).to receive(:ssh_path_prefix).and_return(Settings.send(:build_gitlab_shell_ssh_path_prefix))
         stub_url([ 'ssh://', config.user, '@', config.host, ':2222/gitlab-org/gitlab-ce.git' ].join(''))
         expect(submodule_links(submodule_item)).to eq([ namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash') ])
       end
 
       it 'should detect http on standard port' do
-        Gitlab.config.gitlab.stub(port: 80)
-        Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))
+        allow(Gitlab.config.gitlab).to receive(:port).and_return(80)
+        allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
         stub_url([ 'http://', config.host, '/gitlab-org/gitlab-ce.git' ].join(''))
         expect(submodule_links(submodule_item)).to eq([ namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash') ])
       end
 
       it 'should detect http on non-standard port' do
-        Gitlab.config.gitlab.stub(port: 3000)
-        Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))
+        allow(Gitlab.config.gitlab).to receive(:port).and_return(3000)
+        allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
         stub_url([ 'http://', config.host, ':3000/gitlab-org/gitlab-ce.git' ].join(''))
         expect(submodule_links(submodule_item)).to eq([ namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash') ])
       end
 
       it 'should work with relative_url_root' do
-        Gitlab.config.gitlab.stub(port: 80) # set this just to be sure
-        Gitlab.config.gitlab.stub(relative_url_root: '/gitlab/root')
-        Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))
+        allow(Gitlab.config.gitlab).to receive(:port).and_return(80) # set this just to be sure
+        allow(Gitlab.config.gitlab).to receive(:relative_url_root).and_return('/gitlab/root')
+        allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
         stub_url([ 'http://', config.host, '/gitlab/root/gitlab-org/gitlab-ce.git' ].join(''))
         expect(submodule_links(submodule_item)).to eq([ namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash') ])
       end
@@ -156,6 +156,6 @@ describe SubmoduleHelper do
   end
 
   def stub_url(url)
-    repo.stub(submodule_url_for: url)
+    allow(repo).to receive(:submodule_url_for).and_return(url)
   end
 end
diff --git a/spec/lib/extracts_path_spec.rb b/spec/lib/extracts_path_spec.rb
index 85f35d9da66345d962744666962b7d36113aa5c5..f077c80d4789a197880e3cdf7f88abb683e8a372 100644
--- a/spec/lib/extracts_path_spec.rb
+++ b/spec/lib/extracts_path_spec.rb
@@ -9,8 +9,11 @@ describe ExtractsPath do
 
   before do
     @project = project
-    project.stub(repository: double(ref_names: ['master', 'foo/bar/baz', 'v1.0.0', 'v2.0.0']))
-    project.stub(path_with_namespace: 'gitlab/gitlab-ci')
+
+    repo = double(ref_names: ['master', 'foo/bar/baz', 'v1.0.0', 'v2.0.0'])
+    allow(project).to receive(:repository).and_return(repo)
+    allow(project).to receive(:path_with_namespace).
+      and_return('gitlab/gitlab-ci')
   end
 
   describe '#assign_ref' do
diff --git a/spec/lib/gitlab/auth_spec.rb b/spec/lib/gitlab/auth_spec.rb
index 95fc7e16a1102b8838a0395af3eb6fbd54352cd8..72806bebe1f033e095bc6f1a5395c49712a6d1e7 100644
--- a/spec/lib/gitlab/auth_spec.rb
+++ b/spec/lib/gitlab/auth_spec.rb
@@ -27,16 +27,18 @@ describe Gitlab::Auth do
 
     it "should not find user with invalid password" do
       password = 'wrong'
-      expect( gl_auth.find(username, password) ).to_not eql user
+      expect( gl_auth.find(username, password) ).not_to eql user
     end
 
     it "should not find user with invalid login" do
       user = 'wrong'
-      expect( gl_auth.find(username, password) ).to_not eql user
+      expect( gl_auth.find(username, password) ).not_to eql user
     end
 
     context "with ldap enabled" do
-      before { Gitlab::LDAP::Config.stub(enabled?: true) }
+      before do
+        allow(Gitlab::LDAP::Config).to receive(:enabled?).and_return(true)
+      end
 
       it "tries to autheticate with db before ldap" do
         expect(Gitlab::LDAP::Authentication).not_to receive(:login)
diff --git a/spec/lib/gitlab/backend/shell_spec.rb b/spec/lib/gitlab/backend/shell_spec.rb
index 27279465c1aece0b6f00bccfac48a57520386e9c..b6d04330599bd2988f13e0e06f828418fc8f7f07 100644
--- a/spec/lib/gitlab/backend/shell_spec.rb
+++ b/spec/lib/gitlab/backend/shell_spec.rb
@@ -5,7 +5,7 @@ describe Gitlab::Shell do
   let(:gitlab_shell) { Gitlab::Shell.new }
 
   before do
-    Project.stub(find: project)
+    allow(Project).to receive(:find).and_return(project)
   end
 
   it { is_expected.to respond_to :add_key }
diff --git a/spec/lib/gitlab/google_code_import/client_spec.rb b/spec/lib/gitlab/google_code_import/client_spec.rb
index a66b811e0fd1df3b48ee4f5ee82873fdc35caca5..6aa4428f36758d2d3e79f555916e51628a4ff462 100644
--- a/spec/lib/gitlab/google_code_import/client_spec.rb
+++ b/spec/lib/gitlab/google_code_import/client_spec.rb
@@ -15,7 +15,7 @@ describe Gitlab::GoogleCodeImport::Client do
       let(:raw_data) { "No clue" }
 
       it "returns true" do
-        expect(subject).to_not be_valid
+        expect(subject).not_to be_valid
       end
     end
   end
diff --git a/spec/lib/gitlab/google_code_import/importer_spec.rb b/spec/lib/gitlab/google_code_import/importer_spec.rb
index 3879a6ab8980930bbcb4b3a61940f8e3c8ba325d..c53ddeb87b58ca5988865b0299c71a8138cc1db0 100644
--- a/spec/lib/gitlab/google_code_import/importer_spec.rb
+++ b/spec/lib/gitlab/google_code_import/importer_spec.rb
@@ -24,7 +24,7 @@ describe Gitlab::GoogleCodeImport::Importer do
       subject.execute
 
       %w(New NeedInfo Accepted Wishlist Started Fixed Invalid Duplicate WontFix Incomplete).each do |status|
-        expect(project.labels.find_by(name: "Status: #{status}")).to_not be_nil
+        expect(project.labels.find_by(name: "Status: #{status}")).not_to be_nil
       end
     end
 
@@ -38,7 +38,7 @@ describe Gitlab::GoogleCodeImport::Importer do
         Component-Systray Component-Clock Component-Launcher Component-Tint2conf Component-Docs Component-New
       ).each do |label|
         label.sub!("-", ": ")
-        expect(project.labels.find_by(name: label)).to_not be_nil
+        expect(project.labels.find_by(name: label)).not_to be_nil
       end
     end
 
@@ -46,7 +46,7 @@ describe Gitlab::GoogleCodeImport::Importer do
       subject.execute
 
       issue = project.issues.first
-      expect(issue).to_not be_nil
+      expect(issue).not_to be_nil
       expect(issue.iid).to eq(169)
       expect(issue.author).to eq(project.creator)
       expect(issue.assignee).to eq(mapped_user)
@@ -71,7 +71,7 @@ describe Gitlab::GoogleCodeImport::Importer do
       subject.execute
 
       note = project.issues.first.notes.first
-      expect(note).to_not be_nil
+      expect(note).not_to be_nil
       expect(note.note).to include("Comment 1")
       expect(note.note).to include("@#{mapped_user.username}")
       expect(note.note).to include("November 18, 2009 05:14")
diff --git a/spec/lib/gitlab/ldap/access_spec.rb b/spec/lib/gitlab/ldap/access_spec.rb
index 038ac7e0d75c9837f24c9898f707e34db8f5dee2..c38f212b405171114c8fe3411efde5867904036a 100644
--- a/spec/lib/gitlab/ldap/access_spec.rb
+++ b/spec/lib/gitlab/ldap/access_spec.rb
@@ -8,16 +8,24 @@ describe Gitlab::LDAP::Access do
     subject { access.allowed? }
 
     context 'when the user cannot be found' do
-      before { Gitlab::LDAP::Person.stub(find_by_dn: nil) }
+      before do
+        allow(Gitlab::LDAP::Person).to receive(:find_by_dn).and_return(nil)
+      end
 
       it { is_expected.to be_falsey }
     end
 
     context 'when the user is found' do
-      before { Gitlab::LDAP::Person.stub(find_by_dn: :ldap_user) }
+      before do
+        allow(Gitlab::LDAP::Person).
+          to receive(:find_by_dn).and_return(:ldap_user)
+      end
 
       context 'and the user is disabled via active directory' do
-        before { Gitlab::LDAP::Person.stub(disabled_via_active_directory?: true) }
+        before do
+          allow(Gitlab::LDAP::Person).
+            to receive(:disabled_via_active_directory?).and_return(true)
+        end
 
         it { is_expected.to be_falsey }
 
@@ -30,8 +38,9 @@ describe Gitlab::LDAP::Access do
       context 'and has no disabled flag in active diretory' do
         before do
           user.block
-          
-          Gitlab::LDAP::Person.stub(disabled_via_active_directory?: false)
+
+          allow(Gitlab::LDAP::Person).
+            to receive(:disabled_via_active_directory?).and_return(false)
         end
 
         it { is_expected.to be_truthy }
@@ -39,7 +48,8 @@ describe Gitlab::LDAP::Access do
         context 'when auto-created users are blocked' do
 
           before do
-            Gitlab::LDAP::Config.any_instance.stub(block_auto_created_users: true)
+            allow_any_instance_of(Gitlab::LDAP::Config).
+              to receive(:block_auto_created_users).and_return(true)
           end
 
           it "does not unblock user in GitLab" do
@@ -51,7 +61,8 @@ describe Gitlab::LDAP::Access do
         context "when auto-created users are not blocked" do
 
           before do
-            Gitlab::LDAP::Config.any_instance.stub(block_auto_created_users: false)
+            allow_any_instance_of(Gitlab::LDAP::Config).
+              to receive(:block_auto_created_users).and_return(false)
           end
 
           it "should unblock user in GitLab" do
@@ -63,8 +74,9 @@ describe Gitlab::LDAP::Access do
 
       context 'without ActiveDirectory enabled' do
         before do
-          Gitlab::LDAP::Config.stub(enabled?: true)
-          Gitlab::LDAP::Config.any_instance.stub(active_directory: false)
+          allow(Gitlab::LDAP::Config).to receive(:enabled?).and_return(true)
+          allow_any_instance_of(Gitlab::LDAP::Config).
+            to receive(:active_directory).and_return(false)
         end
 
         it { is_expected.to be_truthy }
diff --git a/spec/lib/gitlab/ldap/adapter_spec.rb b/spec/lib/gitlab/ldap/adapter_spec.rb
index b609e4b38f21c28c21445bded0723288922e1906..38076602df93d0d689d3e109007b383926f295f0 100644
--- a/spec/lib/gitlab/ldap/adapter_spec.rb
+++ b/spec/lib/gitlab/ldap/adapter_spec.rb
@@ -3,27 +3,32 @@ require 'spec_helper'
 describe Gitlab::LDAP::Adapter do
   let(:adapter) { Gitlab::LDAP::Adapter.new 'ldapmain' }
 
-  describe :dn_matches_filter? do
+  describe '#dn_matches_filter?' do
     let(:ldap) { double(:ldap) }
     subject { adapter.dn_matches_filter?(:dn, :filter) }
-    before { adapter.stub(ldap: ldap) }
+    before { allow(adapter).to receive(:ldap).and_return(ldap) }
 
     context "when the search is successful" do
       context "and the result is non-empty" do
-        before { ldap.stub(search: [:foo]) }
+        before { allow(ldap).to receive(:search).and_return([:foo]) }
 
         it { is_expected.to be_truthy }
       end
 
       context "and the result is empty" do
-        before { ldap.stub(search: []) }
+        before { allow(ldap).to receive(:search).and_return([]) }
 
         it { is_expected.to be_falsey }
       end
     end
 
     context "when the search encounters an error" do
-      before { ldap.stub(search: nil, get_operation_result: double(code: 1, message: 'some error')) }
+      before do
+        allow(ldap).to receive_messages(
+          search: nil,
+          get_operation_result: double(code: 1, message: 'some error')
+        )
+      end
 
       it { is_expected.to be_falsey }
     end
diff --git a/spec/lib/gitlab/ldap/authentication_spec.rb b/spec/lib/gitlab/ldap/authentication_spec.rb
index e98b59553216c506e9650038226fc794744cf9ab..6e3de914a45fec27aa8c0d0de21df8e0db63e155 100644
--- a/spec/lib/gitlab/ldap/authentication_spec.rb
+++ b/spec/lib/gitlab/ldap/authentication_spec.rb
@@ -1,53 +1,58 @@
 require 'spec_helper'
 
 describe Gitlab::LDAP::Authentication do
-  let(:klass) { Gitlab::LDAP::Authentication }
-  let(:user) { create(:omniauth_user, extern_uid: dn) }
-  let(:dn) { 'uid=john,ou=people,dc=example,dc=com' }
-  let(:login) { 'john' }
+  let(:user)     { create(:omniauth_user, extern_uid: dn) }
+  let(:dn)       { 'uid=john,ou=people,dc=example,dc=com' }
+  let(:login)    { 'john' }
   let(:password) { 'password' }
 
-  describe :login do
-    let(:adapter) { double :adapter }
+  describe 'login' do
     before do
-      Gitlab::LDAP::Config.stub(enabled?: true)
+      allow(Gitlab::LDAP::Config).to receive(:enabled?).and_return(true)
     end
 
     it "finds the user if authentication is successful" do
-      user
+      expect(user).not_to be_nil
+
       # try only to fake the LDAP call
-      klass.any_instance.stub(adapter: double(:adapter,
-        bind_as: double(:ldap_user, dn: dn)
-      ))
-      expect(klass.login(login, password)).to be_truthy
+      adapter = double('adapter', dn: dn).as_null_object
+      allow_any_instance_of(described_class).
+        to receive(:adapter).and_return(adapter)
+
+      expect(described_class.login(login, password)).to be_truthy
     end
 
     it "is false if the user does not exist" do
       # try only to fake the LDAP call
-      klass.any_instance.stub(adapter: double(:adapter,
-        bind_as: double(:ldap_user, dn: dn)
-      ))
-      expect(klass.login(login, password)).to be_falsey
+      adapter = double('adapter', dn: dn).as_null_object
+      allow_any_instance_of(described_class).
+        to receive(:adapter).and_return(adapter)
+
+      expect(described_class.login(login, password)).to be_falsey
     end
 
     it "is false if authentication fails" do
-      user
+      expect(user).not_to be_nil
+
       # try only to fake the LDAP call
-      klass.any_instance.stub(adapter: double(:adapter, bind_as: nil))
-      expect(klass.login(login, password)).to be_falsey
+      adapter = double('adapter', bind_as: nil).as_null_object
+      allow_any_instance_of(described_class).
+        to receive(:adapter).and_return(adapter)
+
+      expect(described_class.login(login, password)).to be_falsey
     end
 
     it "fails if ldap is disabled" do
-      Gitlab::LDAP::Config.stub(enabled?: false)
-      expect(klass.login(login, password)).to be_falsey
+      allow(Gitlab::LDAP::Config).to receive(:enabled?).and_return(false)
+      expect(described_class.login(login, password)).to be_falsey
     end
 
     it "fails if no login is supplied" do
-      expect(klass.login('', password)).to be_falsey
+      expect(described_class.login('', password)).to be_falsey
     end
 
     it "fails if no password is supplied" do
-      expect(klass.login(login, '')).to be_falsey
+      expect(described_class.login(login, '')).to be_falsey
     end
   end
 end
diff --git a/spec/lib/gitlab/ldap/config_spec.rb b/spec/lib/gitlab/ldap/config_spec.rb
index 00e9076c787b18e64a9b3f39a6e685ca5f4786f8..3548d647c84ae18988e21ac2ce6842d37d74ab41 100644
--- a/spec/lib/gitlab/ldap/config_spec.rb
+++ b/spec/lib/gitlab/ldap/config_spec.rb
@@ -14,7 +14,7 @@ describe Gitlab::LDAP::Config do
     end
 
     it "raises an error if a unknow provider is used" do
-      expect{ Gitlab::LDAP::Config.new 'unknown' }.to raise_error
+      expect{ Gitlab::LDAP::Config.new 'unknown' }.to raise_error(RuntimeError)
     end
   end
 end
diff --git a/spec/lib/gitlab/ldap/user_spec.rb b/spec/lib/gitlab/ldap/user_spec.rb
index 42015c28c81ab6cb64695624c790a6522559d94e..7cfca96f4e03d0b776614a17ddaf10a396177fb2 100644
--- a/spec/lib/gitlab/ldap/user_spec.rb
+++ b/spec/lib/gitlab/ldap/user_spec.rb
@@ -16,31 +16,31 @@ describe Gitlab::LDAP::User do
 
   describe :changed? do
     it "marks existing ldap user as changed" do
-      existing_user = create(:omniauth_user, extern_uid: 'my-uid', provider: 'ldapmain')
+      create(:omniauth_user, extern_uid: 'my-uid', provider: 'ldapmain')
       expect(ldap_user.changed?).to be_truthy
     end
 
     it "marks existing non-ldap user if the email matches as changed" do
-      existing_user = create(:user, email: 'john@example.com')
+      create(:user, email: 'john@example.com')
       expect(ldap_user.changed?).to be_truthy
     end
 
     it "dont marks existing ldap user as changed" do
-      existing_user = create(:omniauth_user, email: 'john@example.com', extern_uid: 'my-uid', provider: 'ldapmain')
+      create(:omniauth_user, email: 'john@example.com', extern_uid: 'my-uid', provider: 'ldapmain')
       expect(ldap_user.changed?).to be_falsey
     end
   end
 
   describe :find_or_create do
     it "finds the user if already existing" do
-      existing_user = create(:omniauth_user, extern_uid: 'my-uid', provider: 'ldapmain')
+      create(:omniauth_user, extern_uid: 'my-uid', provider: 'ldapmain')
 
-      expect{ ldap_user.save }.to_not change{ User.count }
+      expect{ ldap_user.save }.not_to change{ User.count }
     end
 
     it "connects to existing non-ldap user if the email matches" do
       existing_user = create(:omniauth_user, email: 'john@example.com', provider: "twitter")
-      expect{ ldap_user.save }.to_not change{ User.count }
+      expect{ ldap_user.save }.not_to change{ User.count }
 
       existing_user.reload
       expect(existing_user.ldap_identity.extern_uid).to eql 'my-uid'
@@ -52,11 +52,15 @@ describe Gitlab::LDAP::User do
     end
   end
 
-
   describe 'blocking' do
+    def configure_block(value)
+      allow_any_instance_of(Gitlab::LDAP::Config).
+        to receive(:block_auto_created_users).and_return(value)
+    end
+
     context 'signup' do
       context 'dont block on create' do
-        before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: false }
+        before { configure_block(false) }
 
         it do
           ldap_user.save
@@ -66,7 +70,7 @@ describe Gitlab::LDAP::User do
       end
 
       context 'block on create' do
-        before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: true }
+        before { configure_block(true) }
 
         it do
           ldap_user.save
@@ -83,7 +87,7 @@ describe Gitlab::LDAP::User do
       end
 
       context 'dont block on create' do
-        before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: false }
+        before { configure_block(false) }
 
         it do
           ldap_user.save
@@ -93,7 +97,7 @@ describe Gitlab::LDAP::User do
       end
 
       context 'block on create' do
-        before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: true }
+        before { configure_block(true) }
 
         it do
           ldap_user.save
diff --git a/spec/lib/gitlab/o_auth/auth_hash_spec.rb b/spec/lib/gitlab/o_auth/auth_hash_spec.rb
index d957fe82a45dc6b3e6eb9a9b676375807baf10e5..4c0a4a49d2a2daf503fec9c019aecc3f761f73ec 100644
--- a/spec/lib/gitlab/o_auth/auth_hash_spec.rb
+++ b/spec/lib/gitlab/o_auth/auth_hash_spec.rb
@@ -51,7 +51,7 @@ describe Gitlab::OAuth::AuthHash do
     it { expect(auth_hash.email).to eql email_utf8 }
     it { expect(auth_hash.username).to eql nickname_utf8 }
     it { expect(auth_hash.name).to eql name_utf8 }
-    it { expect(auth_hash.password).to_not be_empty }
+    it { expect(auth_hash.password).not_to be_empty }
   end
 
   context 'email not provided' do
diff --git a/spec/lib/gitlab/o_auth/user_spec.rb b/spec/lib/gitlab/o_auth/user_spec.rb
index d383ea2d051f3168d5ccb1e3ee23068a1c9735e8..c6cca98a037dcf0ddcf675971e83a076f83ee3af 100644
--- a/spec/lib/gitlab/o_auth/user_spec.rb
+++ b/spec/lib/gitlab/o_auth/user_spec.rb
@@ -19,23 +19,34 @@ describe Gitlab::OAuth::User do
     let!(:existing_user) { create(:omniauth_user, extern_uid: 'my-uid', provider: 'my-provider') }
 
     it "finds an existing user based on uid and provider (facebook)" do
+      # FIXME (rspeicher): It's unlikely that this test is actually doing anything
+      # `auth` is never used and removing it entirely doesn't break the test, so
+      # what's it doing?
       auth = double(info: double(name: 'John'), uid: 'my-uid', provider: 'my-provider')
       expect( oauth_user.persisted? ).to be_truthy
     end
 
     it "returns false if use is not found in database" do
-      auth_hash.stub(uid: 'non-existing')
+      allow(auth_hash).to receive(:uid).and_return('non-existing')
       expect( oauth_user.persisted? ).to be_falsey
     end
   end
 
   describe :save do
+    def stub_omniauth_config(messages)
+      allow(Gitlab.config.omniauth).to receive_messages(messages)
+    end
+
+    def stub_ldap_config(messages)
+      allow(Gitlab::LDAP::Config).to receive_messages(messages)
+    end
+
     let(:provider) { 'twitter' }
 
     describe 'signup' do
       shared_examples "to verify compliance with allow_single_sign_on" do
         context "with allow_single_sign_on enabled" do
-          before { Gitlab.config.omniauth.stub allow_single_sign_on: true }
+          before { stub_omniauth_config(allow_single_sign_on: true) }
 
           it "creates a user from Omniauth" do
             oauth_user.save
@@ -48,7 +59,7 @@ describe Gitlab::OAuth::User do
         end
 
         context "with allow_single_sign_on disabled (Default)" do
-          before { Gitlab.config.omniauth.stub allow_single_sign_on: false }
+          before { stub_omniauth_config(allow_single_sign_on: false) }
           it "throws an error" do
             expect{ oauth_user.save }.to raise_error StandardError
           end
@@ -56,36 +67,36 @@ describe Gitlab::OAuth::User do
       end
 
       context "with auto_link_ldap_user disabled (default)" do
-        before { Gitlab.config.omniauth.stub auto_link_ldap_user: false }
+        before { stub_omniauth_config(auto_link_ldap_user: false) }
         include_examples "to verify compliance with allow_single_sign_on"
       end
 
       context "with auto_link_ldap_user enabled" do
-        before { Gitlab.config.omniauth.stub auto_link_ldap_user: true }
-        
+        before { stub_omniauth_config(auto_link_ldap_user: true) }
+
         context "and no LDAP provider defined" do
-          before { allow(Gitlab::LDAP::Config).to receive(:providers).and_return([]) }
-          
+          before { stub_ldap_config(providers: []) }
+
           include_examples "to verify compliance with allow_single_sign_on"
         end
-        
+
         context "and at least one LDAP provider is defined" do
-          before { allow(Gitlab::LDAP::Config).to receive(:providers).and_return(['ldapmain']) }
+          before { stub_ldap_config(providers: %w(ldapmain)) }
 
           context "and a corresponding LDAP person" do
             before do
-              ldap_user.stub(:uid) { uid }
-              ldap_user.stub(:username) { uid }
-              ldap_user.stub(:email) { ['johndoe@example.com','john2@example.com'] }
-              ldap_user.stub(:dn) { 'uid=user1,ou=People,dc=example' }
+              allow(ldap_user).to receive(:uid) { uid }
+              allow(ldap_user).to receive(:username) { uid }
+              allow(ldap_user).to receive(:email) { ['johndoe@example.com','john2@example.com'] }
+              allow(ldap_user).to receive(:dn) { 'uid=user1,ou=People,dc=example' }
               allow(Gitlab::LDAP::Person).to receive(:find_by_uid).and_return(ldap_user)
             end
-  
+
             context "and no account for the LDAP user" do
-  
+
               it "creates a user with dual LDAP and omniauth identities" do
                 oauth_user.save
-  
+
                 expect(gl_user).to be_valid
                 expect(gl_user.username).to eql uid
                 expect(gl_user.email).to eql 'johndoe@example.com'
@@ -97,12 +108,12 @@ describe Gitlab::OAuth::User do
                   ])
               end
             end
-  
+
             context "and LDAP user has an account already" do
               let!(:existing_user) { create(:omniauth_user, email: 'john@example.com', extern_uid: 'uid=user1,ou=People,dc=example', provider: 'ldapmain', username: 'john') }
               it "adds the omniauth identity to the LDAP account" do
                 oauth_user.save
-  
+
                 expect(gl_user).to be_valid
                 expect(gl_user.username).to eql 'john'
                 expect(gl_user.email).to eql 'john@example.com'
@@ -115,10 +126,10 @@ describe Gitlab::OAuth::User do
               end
             end
           end
-  
+
           context "and no corresponding LDAP person" do
             before { allow(Gitlab::LDAP::Person).to receive(:find_by_uid).and_return(nil) }
-  
+
             include_examples "to verify compliance with allow_single_sign_on"
           end
         end
@@ -128,11 +139,11 @@ describe Gitlab::OAuth::User do
 
     describe 'blocking' do
       let(:provider) { 'twitter' }
-      before { Gitlab.config.omniauth.stub allow_single_sign_on: true }
+      before { stub_omniauth_config(allow_single_sign_on: true) }
 
       context 'signup with omniauth only' do
         context 'dont block on create' do
-          before { Gitlab.config.omniauth.stub block_auto_created_users: false }
+          before { stub_omniauth_config(block_auto_created_users: false) }
 
           it do
             oauth_user.save
@@ -142,7 +153,7 @@ describe Gitlab::OAuth::User do
         end
 
         context 'block on create' do
-          before { Gitlab.config.omniauth.stub block_auto_created_users: true }
+          before { stub_omniauth_config(block_auto_created_users: true) }
 
           it do
             oauth_user.save
@@ -154,17 +165,17 @@ describe Gitlab::OAuth::User do
 
       context 'signup with linked omniauth and LDAP account' do
         before do
-          Gitlab.config.omniauth.stub auto_link_ldap_user: true
-          ldap_user.stub(:uid) { uid }
-          ldap_user.stub(:username) { uid }
-          ldap_user.stub(:email) { ['johndoe@example.com','john2@example.com'] }
-          ldap_user.stub(:dn) { 'uid=user1,ou=People,dc=example' }
+          stub_omniauth_config(auto_link_ldap_user: true)
+          allow(ldap_user).to receive(:uid) { uid }
+          allow(ldap_user).to receive(:username) { uid }
+          allow(ldap_user).to receive(:email) { ['johndoe@example.com','john2@example.com'] }
+          allow(ldap_user).to receive(:dn) { 'uid=user1,ou=People,dc=example' }
           allow(oauth_user).to receive(:ldap_person).and_return(ldap_user)
         end
 
         context "and no account for the LDAP user" do
           context 'dont block on create (LDAP)' do
-            before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: false }
+            before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: false) }
 
             it do
               oauth_user.save
@@ -174,7 +185,7 @@ describe Gitlab::OAuth::User do
           end
 
           context 'block on create (LDAP)' do
-            before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: true }
+            before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: true) }
 
             it do
               oauth_user.save
@@ -188,7 +199,7 @@ describe Gitlab::OAuth::User do
           let!(:existing_user) { create(:omniauth_user, email: 'john@example.com', extern_uid: 'uid=user1,ou=People,dc=example', provider: 'ldapmain', username: 'john') }
 
           context 'dont block on create (LDAP)' do
-            before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: false }
+            before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: false) }
 
             it do
               oauth_user.save
@@ -198,7 +209,7 @@ describe Gitlab::OAuth::User do
           end
 
           context 'block on create (LDAP)' do
-            before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: true }
+            before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: true) }
 
             it do
               oauth_user.save
@@ -217,7 +228,7 @@ describe Gitlab::OAuth::User do
         end
 
         context 'dont block on create' do
-          before { Gitlab.config.omniauth.stub block_auto_created_users: false }
+          before { stub_omniauth_config(block_auto_created_users: false) }
 
           it do
             oauth_user.save
@@ -227,7 +238,7 @@ describe Gitlab::OAuth::User do
         end
 
         context 'block on create' do
-          before { Gitlab.config.omniauth.stub block_auto_created_users: true }
+          before { stub_omniauth_config(block_auto_created_users: true) }
 
           it do
             oauth_user.save
@@ -237,7 +248,7 @@ describe Gitlab::OAuth::User do
         end
 
         context 'dont block on create (LDAP)' do
-          before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: false }
+          before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: false) }
 
           it do
             oauth_user.save
@@ -247,7 +258,7 @@ describe Gitlab::OAuth::User do
         end
 
         context 'block on create (LDAP)' do
-          before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: true }
+          before { allow_any_instance_of(Gitlab::LDAP::Config).to receive_messages(block_auto_created_users: true) }
 
           it do
             oauth_user.save
diff --git a/spec/lib/gitlab/popen_spec.rb b/spec/lib/gitlab/popen_spec.rb
index 0bc1d5630e623efe2763282f1dbd80f35dbdd607..e53efec6c67c4f5734652b55de4d443b17b6dccb 100644
--- a/spec/lib/gitlab/popen_spec.rb
+++ b/spec/lib/gitlab/popen_spec.rb
@@ -28,7 +28,7 @@ describe 'Gitlab::Popen', no_db: true do
 
   context 'unsafe string command' do
     it 'raises an error when it gets called with a string argument' do
-      expect { @klass.new.popen('ls', path) }.to raise_error
+      expect { @klass.new.popen('ls', path) }.to raise_error(RuntimeError)
     end
   end
 
diff --git a/spec/lib/gitlab/satellite/merge_action_spec.rb b/spec/lib/gitlab/satellite/merge_action_spec.rb
index 27912573dcef05f121cc8b0896c24a7b2fecf25e..9b1c9a34e294198cca4ccd3164e5255e71ad6874 100644
--- a/spec/lib/gitlab/satellite/merge_action_spec.rb
+++ b/spec/lib/gitlab/satellite/merge_action_spec.rb
@@ -27,7 +27,7 @@ describe 'Gitlab::Satellite::MergeAction' do
 
     context 'between branches' do
       it 'should raise exception -- not expected to be used by non forks' do
-        expect { Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between }.to raise_error
+        expect { Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between }.to raise_error(RuntimeError)
       end
     end
   end
@@ -75,7 +75,7 @@ describe 'Gitlab::Satellite::MergeAction' do
 
     context 'between branches' do
       it 'should get proper diffs' do
-        expect{ Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite }.to raise_error
+        expect{ Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite }.to raise_error(RuntimeError)
       end
     end
   end
diff --git a/spec/lib/gitlab/upgrader_spec.rb b/spec/lib/gitlab/upgrader_spec.rb
index baa4bd0f28f9ed46bb8b9cfdd856176ec8816dbe..8df84665e166a6cc18eda8f75bf8d0d83a7ae78e 100644
--- a/spec/lib/gitlab/upgrader_spec.rb
+++ b/spec/lib/gitlab/upgrader_spec.rb
@@ -10,14 +10,14 @@ describe Gitlab::Upgrader do
 
   describe 'latest_version?' do
     it 'should be true if newest version' do
-      upgrader.stub(latest_version_raw: current_version)
+      allow(upgrader).to receive(:latest_version_raw).and_return(current_version)
       expect(upgrader.latest_version?).to be_truthy
     end
   end
 
   describe 'latest_version_raw' do
     it 'should be latest version for GitLab 5' do
-      upgrader.stub(current_version_raw: "5.3.0")
+      allow(upgrader).to receive(:current_version_raw).and_return("5.3.0")
       expect(upgrader.latest_version_raw).to eq("v5.4.2")
     end
 
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
index c1d82c5367d0112754965b6456811faacf51de8c..97c07ad7d550ccde80a3584c39a251bd2ed2b167 100644
--- a/spec/mailers/notify_spec.rb
+++ b/spec/mailers/notify_spec.rb
@@ -1,4 +1,5 @@
 require 'spec_helper'
+require 'email_spec'
 
 describe Notify do
   include EmailSpec::Helpers
diff --git a/spec/models/commit_range_spec.rb b/spec/models/commit_range_spec.rb
index 5e7efadde28e55b94785e85126677f29f80c397d..1031af097bd0c396d043c3186f459b3f82dc16ac 100644
--- a/spec/models/commit_range_spec.rb
+++ b/spec/models/commit_range_spec.rb
@@ -14,7 +14,7 @@ describe CommitRange do
   let(:range2) { described_class.new("#{sha_from}..#{sha_to}") }
 
   it 'raises ArgumentError when given an invalid range string' do
-    expect { described_class.new("Foo") }.to raise_error
+    expect { described_class.new("Foo") }.to raise_error(ArgumentError)
   end
 
   describe '#to_s' do
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index 27eb02a870bdd14120a88b65173269c5280d84c8..e303a97e6b55edd290ced7c3b79f93f5d6934cfd 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -77,13 +77,13 @@ eos
     let(:other_issue) { create :issue, project: other_project }
 
     it 'detects issues that this commit is marked as closing' do
-      commit.stub(safe_message: "Fixes ##{issue.iid}")
+      allow(commit).to receive(:safe_message).and_return("Fixes ##{issue.iid}")
       expect(commit.closes_issues).to eq([issue])
     end
 
     it 'does not detect issues from other projects' do
       ext_ref = "#{other_project.path_with_namespace}##{other_issue.iid}"
-      commit.stub(safe_message: "Fixes #{ext_ref}")
+      allow(commit).to receive(:safe_message).and_return("Fixes #{ext_ref}")
       expect(commit.closes_issues).to be_empty
     end
   end
@@ -93,7 +93,9 @@ eos
 
     let(:author) { create(:user, email: commit.author_email) }
     let(:backref_text) { "commit #{subject.id}" }
-    let(:set_mentionable_text) { ->(txt){ subject.stub(safe_message: txt) } }
+    let(:set_mentionable_text) do
+      ->(txt) { allow(subject).to receive(:safe_message).and_return(txt) }
+    end
 
     # Include the subject in the repository stub.
     let(:extra_commits) { [subject] }
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
index 86c395a8e8ee60aef4762fb680dfa61e215ac5e1..b6d80451d2ec76cfe01c441010c912d77d496a19 100644
--- a/spec/models/concerns/issuable_spec.rb
+++ b/spec/models/concerns/issuable_spec.rb
@@ -11,7 +11,10 @@ describe Issue, "Issuable" do
   end
 
   describe "Validation" do
-    before { subject.stub(set_iid: false) }
+    before do
+      allow(subject).to receive(:set_iid).and_return(false)
+    end
+
     it { is_expected.to validate_presence_of(:project) }
     it { is_expected.to validate_presence_of(:iid) }
     it { is_expected.to validate_presence_of(:author) }
diff --git a/spec/models/concerns/mentionable_spec.rb b/spec/models/concerns/mentionable_spec.rb
index 22237f2e9f20b905ae7d73a2234e2b5749895d05..f7f66987b5f6ee516114884716f01bbe7836525a 100644
--- a/spec/models/concerns/mentionable_spec.rb
+++ b/spec/models/concerns/mentionable_spec.rb
@@ -23,7 +23,7 @@ describe Issue, "Mentionable" do
     end
 
     it 'correctly removes already-mentioned Commits' do
-      expect(Note).not_to receive(:create_cross_reference_note)
+      expect(SystemNoteService).not_to receive(:cross_reference)
 
       issue.create_cross_references!(project, author, [commit2])
     end
diff --git a/spec/models/forked_project_link_spec.rb b/spec/models/forked_project_link_spec.rb
index a518c42f491848f0e41d981cfa3a1c682c0da206..d90fbfe1ea5965ff371e940a27de7059732460e0 100644
--- a/spec/models/forked_project_link_spec.rb
+++ b/spec/models/forked_project_link_spec.rb
@@ -58,9 +58,10 @@ describe :forked_from_project do
 end
 
 def fork_project(from_project, user)
-  context = Projects::ForkService.new(from_project, user)
-  shell = double("gitlab_shell")
-  shell.stub(fork_repository: true)
-  context.stub(gitlab_shell: shell)
-  context.execute
+  shell = double('gitlab_shell', fork_repository: true)
+
+  service = Projects::ForkService.new(from_project, user)
+  allow(service).to receive(:gitlab_shell).and_return(shell)
+
+  service.execute
 end
diff --git a/spec/models/hooks/service_hook_spec.rb b/spec/models/hooks/service_hook_spec.rb
index 98cc0ede42edec137665731470fb8be2410d450d..4c8b8910ae7e40651e79d1b62db3ac9b7465ce9b 100644
--- a/spec/models/hooks/service_hook_spec.rb
+++ b/spec/models/hooks/service_hook_spec.rb
@@ -50,7 +50,7 @@ describe ServiceHook do
     it "catches exceptions" do
       expect(WebHook).to receive(:post).and_raise("Some HTTP Post error")
 
-      expect { @service_hook.execute(@data) }.to raise_error
+      expect { @service_hook.execute(@data) }.to raise_error(RuntimeError)
     end
   end
 end
diff --git a/spec/models/hooks/web_hook_spec.rb b/spec/models/hooks/web_hook_spec.rb
index c74432d9739fee2d71b2ddaacb0db45760bc2b1f..23f30881d99a7e7af0bd83ad33af5bc5e01b5120 100644
--- a/spec/models/hooks/web_hook_spec.rb
+++ b/spec/models/hooks/web_hook_spec.rb
@@ -71,7 +71,7 @@ describe ProjectHook do
     it "catches exceptions" do
       expect(WebHook).to receive(:post).and_raise("Some HTTP Post error")
 
-      expect { @project_hook.execute(@data, 'push_hooks') }.to raise_error
+      expect { @project_hook.execute(@data, 'push_hooks') }.to raise_error(RuntimeError)
     end
   end
 end
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index 614b648bb52b07313fc30e66daea55c7374bf225..9bac451c28cefb7e4a9b0a8c4fb8dd01a68c65a5 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -70,7 +70,7 @@ describe Issue do
   it_behaves_like 'an editable mentionable' do
     subject { create(:issue, project: project) }
 
-    let(:backref_text) { "issue ##{subject.iid}" }
+    let(:backref_text) { "issue #{subject.to_reference}" }
     let(:set_mentionable_text) { ->(txt){ subject.description = txt } }
   end
 
diff --git a/spec/models/members/group_member_spec.rb b/spec/models/members/group_member_spec.rb
index 7c10c9f0f4861490dadd899b6a24a1df1e304872..652026729bb056c6f00ce87c60a533a9e1a17148 100644
--- a/spec/models/members/group_member_spec.rb
+++ b/spec/models/members/group_member_spec.rb
@@ -24,8 +24,11 @@ describe GroupMember do
     describe "#after_create" do
       it "should send email to user" do
         membership = build(:group_member)
-        membership.stub(notification_service: double('NotificationService').as_null_object)
+
+        allow(membership).to receive(:notification_service).
+          and_return(double('NotificationService').as_null_object)
         expect(membership).to receive(:notification_service)
+
         membership.save
       end
     end
@@ -33,7 +36,8 @@ describe GroupMember do
     describe "#after_update" do
       before do
         @group_member = create :group_member
-        @group_member.stub(notification_service: double('NotificationService').as_null_object)
+        allow(@group_member).to receive(:notification_service).
+          and_return(double('NotificationService').as_null_object)
       end
 
       it "should send email to user" do
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 0465aa3484322318385bddd9157fc7144532bb1f..76f6d8c54c4ba2048ab6ed69d7f5234544a1032b 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -111,17 +111,18 @@ describe MergeRequest do
     let(:commit2) { double('commit2', closes_issues: [issue1]) }
 
     before do
-      subject.stub(commits: [commit0, commit1, commit2])
+      allow(subject).to receive(:commits).and_return([commit0, commit1, commit2])
     end
 
     it 'accesses the set of issues that will be closed on acceptance' do
-      subject.project.stub(default_branch: subject.target_branch)
+      allow(subject.project).to receive(:default_branch).
+        and_return(subject.target_branch)
 
       expect(subject.closes_issues).to eq([issue0, issue1].sort_by(&:id))
     end
 
     it 'only lists issues as to be closed if it targets the default branch' do
-      subject.project.stub(default_branch: 'master')
+      allow(subject.project).to receive(:default_branch).and_return('master')
       subject.target_branch = 'something-else'
 
       expect(subject.closes_issues).to be_empty
@@ -130,7 +131,8 @@ describe MergeRequest do
     it 'detects issues mentioned in the description' do
       issue2 = create(:issue, project: subject.project)
       subject.description = "Closes #{issue2.to_reference}"
-      subject.project.stub(default_branch: subject.target_branch)
+      allow(subject.project).to receive(:default_branch).
+        and_return(subject.target_branch)
 
       expect(subject.closes_issues).to include(issue2)
     end
@@ -163,10 +165,10 @@ describe MergeRequest do
   end
 
   it_behaves_like 'an editable mentionable' do
-    subject { create(:merge_request, source_project: project, target_project: project) }
+    subject { create(:merge_request, source_project: project) }
 
-    let(:backref_text) { "merge request !#{subject.iid}" }
-    let(:set_mentionable_text) { ->(txt){ subject.title = txt } }
+    let(:backref_text) { "merge request #{subject.to_reference}" }
+    let(:set_mentionable_text) { ->(txt){ subject.description = txt } }
   end
 
   it_behaves_like 'a Taskable' do
diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb
index eb73aa763fcb25b92bab216d13a86d6ac8ef61f8..36352e1ecce2688fdde11a6b5415a59258670f64 100644
--- a/spec/models/milestone_spec.rb
+++ b/spec/models/milestone_spec.rb
@@ -21,11 +21,11 @@ describe Milestone do
     it { is_expected.to have_many(:issues) }
   end
 
-  describe "Mass assignment" do
-  end
-
   describe "Validation" do
-    before { subject.stub(set_iid: false) }
+    before do
+      allow(subject).to receive(:set_iid).and_return(false)
+    end
+
     it { is_expected.to validate_presence_of(:title) }
     it { is_expected.to validate_presence_of(:project) }
   end
@@ -66,7 +66,7 @@ describe Milestone do
   describe :expired? do
     context "expired" do
       before do
-        milestone.stub(due_date: Date.today.prev_year)
+        allow(milestone).to receive(:due_date).and_return(Date.today.prev_year)
       end
 
       it { expect(milestone.expired?).to be_truthy }
@@ -74,7 +74,7 @@ describe Milestone do
 
     context "not expired" do
       before do
-        milestone.stub(due_date: Date.today.next_year)
+        allow(milestone).to receive(:due_date).and_return(Date.today.next_year)
       end
 
       it { expect(milestone.expired?).to be_falsey }
@@ -83,7 +83,7 @@ describe Milestone do
 
   describe :percent_complete do
     before do
-      milestone.stub(
+      allow(milestone).to receive_messages(
         closed_items_count: 3,
         total_items_count: 4
       )
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index e87432fdf6263663d56cf6a7d69afc47d47eab0d..1d72a9503ae553b83c448c89c27edb41357ef525 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -53,7 +53,7 @@ describe Namespace do
   describe :move_dir do
     before do
       @namespace = create :namespace
-      @namespace.stub(path_changed?: true)
+      allow(@namespace).to receive(:path_changed?).and_return(true)
     end
 
     it "should raise error when directory exists" do
@@ -62,8 +62,8 @@ describe Namespace do
 
     it "should move dir if path changed" do
       new_path = @namespace.path + "_new"
-      @namespace.stub(path_was: @namespace.path)
-      @namespace.stub(path: new_path)
+      allow(@namespace).to receive(:path_was).and_return(@namespace.path)
+      allow(@namespace).to receive(:path).and_return(new_path)
       expect(@namespace.move_dir).to be_truthy
     end
   end
diff --git a/spec/models/project_services/asana_service_spec.rb b/spec/models/project_services/asana_service_spec.rb
index cc1f99e0c72812303edca79d9f47595e5eddbc56..64bb92fba955ef6476ff0afea79c26c525bdc202 100644
--- a/spec/models/project_services/asana_service_spec.rb
+++ b/spec/models/project_services/asana_service_spec.rb
@@ -42,7 +42,7 @@ describe AsanaService, models: true do
 
     before do
       @asana = AsanaService.new
-      @asana.stub(
+      allow(@asana).to receive_messages(
         project: project,
         project_id: project.id,
         service_hook: true,
diff --git a/spec/models/project_services/assembla_service_spec.rb b/spec/models/project_services/assembla_service_spec.rb
index 9aee754dd63b69ccf69d280ff43d694e69f9b652..17e9361dd5cd00d854c9db517e9823fe5a908d7f 100644
--- a/spec/models/project_services/assembla_service_spec.rb
+++ b/spec/models/project_services/assembla_service_spec.rb
@@ -32,7 +32,7 @@ describe AssemblaService, models: true do
 
     before do
       @assembla_service = AssemblaService.new
-      @assembla_service.stub(
+      allow(@assembla_service).to receive_messages(
         project_id: project.id,
         project: project,
         service_hook: true,
diff --git a/spec/models/project_services/buildkite_service_spec.rb b/spec/models/project_services/buildkite_service_spec.rb
index 6db54243eac57b70b32f9adb7a4909077376f4e0..9445d96c337e119af86ffcead5e672d9f80511ae 100644
--- a/spec/models/project_services/buildkite_service_spec.rb
+++ b/spec/models/project_services/buildkite_service_spec.rb
@@ -29,12 +29,10 @@ describe BuildkiteService do
   describe 'commits methods' do
     before do
       @project = Project.new
-      @project.stub(
-        default_branch: 'default-brancho'
-      )
+      allow(@project).to receive(:default_branch).and_return('default-brancho')
 
       @service = BuildkiteService.new
-      @service.stub(
+      allow(@service).to receive_messages(
         project: @project,
         service_hook: true,
         project_url: 'https://buildkite.com/account-name/example-project',
diff --git a/spec/models/project_services/flowdock_service_spec.rb b/spec/models/project_services/flowdock_service_spec.rb
index e6e8fbba6a7f376c427ee38aa7d103540e559e87..7e5b15cb09eef3f9783d6e77a1805033da647793 100644
--- a/spec/models/project_services/flowdock_service_spec.rb
+++ b/spec/models/project_services/flowdock_service_spec.rb
@@ -32,7 +32,7 @@ describe FlowdockService do
 
     before do
       @flowdock_service = FlowdockService.new
-      @flowdock_service.stub(
+      allow(@flowdock_service).to receive_messages(
         project_id: project.id,
         project: project,
         service_hook: true,
diff --git a/spec/models/project_services/gemnasium_service_spec.rb b/spec/models/project_services/gemnasium_service_spec.rb
index 1a7765e5c2a331fa2a31c04cd4ca2f3c3d78d8fa..9e1564723168da1f1d049593589388ba65a7a3f7 100644
--- a/spec/models/project_services/gemnasium_service_spec.rb
+++ b/spec/models/project_services/gemnasium_service_spec.rb
@@ -32,7 +32,7 @@ describe GemnasiumService do
 
     before do
       @gemnasium_service = GemnasiumService.new
-      @gemnasium_service.stub(
+      allow(@gemnasium_service).to receive_messages(
         project_id: project.id,
         project: project,
         service_hook: true,
diff --git a/spec/models/project_services/gitlab_ci_service_spec.rb b/spec/models/project_services/gitlab_ci_service_spec.rb
index c92cf3cdae616a176ca9e2dcfc4c00b3f0c8cbc6..fedc37c9b94e4743987fcc97aeaed9bedc772a30 100644
--- a/spec/models/project_services/gitlab_ci_service_spec.rb
+++ b/spec/models/project_services/gitlab_ci_service_spec.rb
@@ -21,18 +21,15 @@
 require 'spec_helper'
 
 describe GitlabCiService do
-  describe "Associations" do
-    it { is_expected.to belong_to :project }
-    it { is_expected.to have_one :service_hook }
-  end
-
-  describe "Mass assignment" do
+  describe 'associations' do
+    it { is_expected.to belong_to(:project) }
+    it { is_expected.to have_one(:service_hook) }
   end
 
   describe 'commits methods' do
     before do
       @service = GitlabCiService.new
-      @service.stub(
+      allow(@service).to receive_messages(
         service_hook: true,
         project_url: 'http://ci.gitlab.org/projects/2',
         token: 'verySecret'
@@ -56,9 +53,9 @@ describe GitlabCiService do
 
       it "calls ci_yaml_file" do
         service_hook = double
-        service_hook.should_receive(:execute)
-        @service.should_receive(:service_hook).and_return(service_hook)
-        @service.should_receive(:ci_yaml_file).with(push_sample_data[:checkout_sha])
+        expect(service_hook).to receive(:execute)
+        expect(@service).to receive(:service_hook).and_return(service_hook)
+        expect(@service).to receive(:ci_yaml_file).with(push_sample_data[:checkout_sha])
 
         @service.execute(push_sample_data)
       end
@@ -72,7 +69,7 @@ describe GitlabCiService do
       @user = create(:user)
 
       @service = GitlabCiService.new
-      @service.stub(
+      allow(@service).to receive_messages(
         service_hook: true,
         project_url: 'http://ci.gitlab.org/projects/2',
         token: 'verySecret',
diff --git a/spec/models/project_services/hipchat_service_spec.rb b/spec/models/project_services/hipchat_service_spec.rb
index 8e2fcca265722dc872cd7c0ec840ddc082e8486a..4707673269ad945213fa29081f24b86d0a75d6af 100644
--- a/spec/models/project_services/hipchat_service_spec.rb
+++ b/spec/models/project_services/hipchat_service_spec.rb
@@ -37,7 +37,7 @@ describe HipchatService do
     let(:push_sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) }
 
     before(:each) do
-      hipchat.stub(
+      allow(hipchat).to receive_messages(
         project_id: project.id,
         project: project,
         room: 123456,
@@ -48,7 +48,7 @@ describe HipchatService do
     end
 
     it 'should use v1 if version is provided' do
-      hipchat.stub(api_version: 'v1')
+      allow(hipchat).to receive(:api_version).and_return('v1')
       expect(HipChat::Client).to receive(:new).
                                      with(token,
                                           api_version: 'v1',
@@ -59,7 +59,7 @@ describe HipchatService do
     end
 
     it 'should use v2 as the version when nothing is provided' do
-      hipchat.stub(api_version: '')
+      allow(hipchat).to receive(:api_version).and_return('')
       expect(HipChat::Client).to receive(:new).
                                      with(token,
                                           api_version: 'v2',
@@ -245,12 +245,12 @@ describe HipchatService do
       end
 
       it "should set notfiy to true" do
-        hipchat.stub(notify: '1')
+        allow(hipchat).to receive(:notify).and_return('1')
         expect(hipchat.send(:message_options)).to eq({ notify: true, color: 'yellow' })
       end
 
       it "should set the color" do
-        hipchat.stub(color: 'red')
+        allow(hipchat).to receive(:color).and_return('red')
         expect(hipchat.send(:message_options)).to eq({ notify: false, color: 'red' })
       end
     end
diff --git a/spec/models/project_services/irker_service_spec.rb b/spec/models/project_services/irker_service_spec.rb
index 4c437aab12b98ae68e14993b6eaf40edf0c0b891..37690434ec866b4c2e88121e9d16755f7ae73547 100644
--- a/spec/models/project_services/irker_service_spec.rb
+++ b/spec/models/project_services/irker_service_spec.rb
@@ -24,8 +24,8 @@ require 'json'
 
 describe IrkerService do
   describe 'Associations' do
-    it { should belong_to :project }
-    it { should have_one :service_hook }
+    it { is_expected.to belong_to :project }
+    it { is_expected.to have_one :service_hook }
   end
 
   describe 'Validations' do
@@ -66,7 +66,7 @@ describe IrkerService do
     let(:colorize_messages) { '1' }
 
     before do
-      irker.stub(
+      allow(irker).to receive_messages(
         active: true,
         project: project,
         project_id: project.id,
diff --git a/spec/models/project_services/pushover_service_spec.rb b/spec/models/project_services/pushover_service_spec.rb
index 5f93703b50a2ceb4d41c699b9090162496b24d75..ac10ffbd39b0115cf550e398f1054cfdcb592eb2 100644
--- a/spec/models/project_services/pushover_service_spec.rb
+++ b/spec/models/project_services/pushover_service_spec.rb
@@ -52,7 +52,7 @@ describe PushoverService do
     let(:api_url) { 'https://api.pushover.net/1/messages.json' }
 
     before do
-      pushover.stub(
+      allow(pushover).to receive_messages(
         project: project,
         project_id: project.id,
         service_hook: true,
diff --git a/spec/models/project_services/slack_service_spec.rb b/spec/models/project_services/slack_service_spec.rb
index e9105677d23ebb2fd9f435304d03d85011a0e11b..69466b11f096dbd8cb53183c0e2e14db8fd253eb 100644
--- a/spec/models/project_services/slack_service_spec.rb
+++ b/spec/models/project_services/slack_service_spec.rb
@@ -46,7 +46,7 @@ describe SlackService do
     let(:channel) { 'slack_channel' }
 
     before do
-      slack.stub(
+      allow(slack).to receive_messages(
         project: project,
         project_id: project.id,
         service_hook: true,
@@ -96,7 +96,7 @@ describe SlackService do
     end
 
     it 'should use the username as an option for slack when configured' do
-      slack.stub(username: username)
+      allow(slack).to receive(:username).and_return(username)
       expect(Slack::Notifier).to receive(:new).
        with(webhook_url, username: username).
        and_return(
@@ -106,7 +106,7 @@ describe SlackService do
     end
 
     it 'should use the channel as an option when it is configured' do
-      slack.stub(channel: channel)
+      allow(slack).to receive(:channel).and_return(channel)
       expect(Slack::Notifier).to receive(:new).
         with(webhook_url, channel: channel).
         and_return(
@@ -130,11 +130,11 @@ describe SlackService do
     let(:webhook_url) { 'https://hooks.slack.com/services/SVRWFV0VVAR97N/B02R25XN3/ZBqu7xMupaEEICInN685' }
 
     before do
-      slack.stub(
-          project: project,
-          project_id: project.id,
-          service_hook: true,
-          webhook: webhook_url
+      allow(slack).to receive_messages(
+        project: project,
+        project_id: project.id,
+        service_hook: true,
+        webhook: webhook_url
       )
 
       WebMock.stub_request(:post, webhook_url)
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 87c67fa32c38da6a89456230b675fdeffe9f30ff..63091e913ffe5a977be730a538ee10ed8fe2a35a 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -127,7 +127,7 @@ describe Project do
 
     describe 'last_activity' do
       it 'should alias last_activity to last_event' do
-        project.stub(last_event: last_event)
+        allow(project).to receive(:last_event).and_return(last_event)
         expect(project.last_activity).to eq(last_event)
       end
     end
diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb
index 869ace885f044ec9e742d1d2685e35a6b874396e..ca11758ee06748bef2bafe24a07695caa75ce7b4 100644
--- a/spec/models/service_spec.rb
+++ b/spec/models/service_spec.rb
@@ -39,9 +39,7 @@ describe Service do
       let(:project) { create :project }
 
       before do
-        @service.stub(
-          project: project
-        )
+        allow(@service).to receive(:project).and_return(project)
         @testable = @service.can_test?
       end
 
@@ -54,9 +52,7 @@ describe Service do
       let(:project) { create :project }
 
       before do
-        @service.stub(
-          project: project
-        )
+        allow(@service).to receive(:project).and_return(project)
         @testable = @service.can_test?
       end
 
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index afdd9f71af208416dbfc651712aa77cd4cb96972..9f7c83f3476ea0de282c2cb60a1b14b8464e2006 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -458,21 +458,25 @@ describe User do
 
     it 'is false when LDAP is disabled' do
       # Create a condition which would otherwise cause 'true' to be returned
-      user.stub(ldap_user?: true)
+      allow(user).to receive(:ldap_user?).and_return(true)
       user.last_credential_check_at = nil
       expect(user.requires_ldap_check?).to be_falsey
     end
 
     context 'when LDAP is enabled' do
-      before { Gitlab.config.ldap.stub(enabled: true) }
+      before do
+        allow(Gitlab.config.ldap).to receive(:enabled).and_return(true)
+      end
 
       it 'is false for non-LDAP users' do
-        user.stub(ldap_user?: false)
+        allow(user).to receive(:ldap_user?).and_return(false)
         expect(user.requires_ldap_check?).to be_falsey
       end
 
       context 'and when the user is an LDAP user' do
-        before { user.stub(ldap_user?: true) }
+        before do
+          allow(user).to receive(:ldap_user?).and_return(true)
+        end
 
         it 'is true when the user has never had an LDAP check before' do
           user.last_credential_check_at = nil
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
new file mode 100644
index 0000000000000000000000000000000000000000..671fd6c8666d71309e31af8ca915c81428a7c99d
--- /dev/null
+++ b/spec/rails_helper.rb
@@ -0,0 +1 @@
+require "spec_helper"
diff --git a/spec/requests/api/api_helpers_spec.rb b/spec/requests/api/api_helpers_spec.rb
index 20cb30a39bb208cc11d05795b21fd57f6c687a48..4048c297013e0def9b08476a8e38b4ad1fc3171a 100644
--- a/spec/requests/api/api_helpers_spec.rb
+++ b/spec/requests/api/api_helpers_spec.rb
@@ -47,7 +47,7 @@ describe API, api: true do
 
     it "should return nil for a user without access" do
       env[API::APIHelpers::PRIVATE_TOKEN_HEADER] = user.private_token
-      Gitlab::UserAccess.stub(allowed?: false)
+      allow(Gitlab::UserAccess).to receive(:allowed?).and_return(false)
       expect(current_user).to be_nil
     end
 
@@ -72,13 +72,13 @@ describe API, api: true do
 
     it "should throw an error when the current user is not an admin and attempting to sudo" do
       set_env(user, admin.id)
-      expect { current_user }.to raise_error
+      expect { current_user }.to raise_error(Exception)
       set_param(user, admin.id)
-      expect { current_user }.to raise_error
+      expect { current_user }.to raise_error(Exception)
       set_env(user, admin.username)
-      expect { current_user }.to raise_error
+      expect { current_user }.to raise_error(Exception)
       set_param(user, admin.username)
-      expect { current_user }.to raise_error
+      expect { current_user }.to raise_error(Exception)
     end
 
     it "should throw an error when the user cannot be found for a given id" do
@@ -86,10 +86,10 @@ describe API, api: true do
       expect(user.id).not_to eq(id)
       expect(admin.id).not_to eq(id)
       set_env(admin, id)
-      expect { current_user }.to raise_error
+      expect { current_user }.to raise_error(Exception)
 
       set_param(admin, id)
-      expect { current_user }.to raise_error
+      expect { current_user }.to raise_error(Exception)
     end
 
     it "should throw an error when the user cannot be found for a given username" do
@@ -97,10 +97,10 @@ describe API, api: true do
       expect(user.username).not_to eq(username)
       expect(admin.username).not_to eq(username)
       set_env(admin, username)
-      expect { current_user }.to raise_error
+      expect { current_user }.to raise_error(Exception)
 
       set_param(admin, username)
-      expect { current_user }.to raise_error
+      expect { current_user }.to raise_error(Exception)
     end
 
     it "should handle sudo's to oneself" do
diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb
index f40d68b75a4ea2399760d6714e57f55b618d2e11..cb6e5e89625d2898bf44aa13cde600ae40e7f265 100644
--- a/spec/requests/api/branches_spec.rb
+++ b/spec/requests/api/branches_spec.rb
@@ -141,7 +141,9 @@ describe API::API, api: true  do
   end
 
   describe "DELETE /projects/:id/repository/branches/:branch" do
-    before { Repository.any_instance.stub(rm_branch: true) }
+    before do
+      allow_any_instance_of(Repository).to receive(:rm_branch).and_return(true)
+    end
 
     it "should remove branch" do
       delete api("/projects/#{project.id}/repository/branches/#{branch_name}", user)
diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb
index 27a26b56fefdbd4952242e194bf40f1fc165e999..6c7860511e8ff47780ae2b71783228d87b96afe1 100644
--- a/spec/requests/api/files_spec.rb
+++ b/spec/requests/api/files_spec.rb
@@ -60,9 +60,8 @@ describe API::API, api: true  do
     end
 
     it "should return a 400 if editor fails to create file" do
-      Repository.any_instance.stub(
-        commit_file: false,
-      )
+      allow_any_instance_of(Repository).to receive(:commit_file).
+        and_return(false)
 
       post api("/projects/#{project.id}/repository/files", user), valid_params
       expect(response.status).to eq(400)
@@ -112,9 +111,7 @@ describe API::API, api: true  do
     end
 
     it "should return a 400 if satellite fails to create file" do
-      Repository.any_instance.stub(
-        remove_file: false,
-      )
+      allow_any_instance_of(Repository).to receive(:remove_file).and_return(false)
 
       delete api("/projects/#{project.id}/repository/files", user), valid_params
       expect(response.status).to eq(400)
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index e0574151abb748b72f7777392e41c267f84bbde1..c5a4ac7e4c48df152831368bd8439b9d24693f94 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -167,7 +167,8 @@ describe API::API, api: true  do
   describe "POST /groups/:id/projects/:project_id" do
     let(:project) { create(:project) }
     before(:each) do
-      Projects::TransferService.any_instance.stub(execute: true)
+      allow_any_instance_of(Projects::TransferService).
+        to receive(:execute).and_return(true)
       allow(Project).to receive(:find).and_return(project)
     end
 
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index cb7da3aa3c46dda8cbc5b5c4e930cd2de17e12e0..7030c105b5881c2ce836ed581244b2d9acbc3b9b 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -50,9 +50,8 @@ describe API::API, api: true  do
         get api("/projects/#{project.id}/merge_requests?state=closed", user)
         expect(response.status).to eq(200)
         expect(json_response).to be_an Array
-        expect(json_response.length).to eq(2)
-        expect(json_response.second['title']).to eq(merge_request_closed.title)
-        expect(json_response.first['title']).to eq(merge_request_merged.title)
+        expect(json_response.length).to eq(1)
+        expect(json_response.first['title']).to eq(merge_request_closed.title)
       end
 
       it "should return an array of merged merge_requests" do
@@ -302,14 +301,20 @@ describe API::API, api: true  do
 
   describe "PUT /projects/:id/merge_request/:merge_request_id/merge" do
     it "should return merge_request in case of success" do
-      MergeRequest.any_instance.stub(can_be_merged?: true, automerge!: true)
+      allow_any_instance_of(MergeRequest).
+        to receive_messages(can_be_merged?: true, automerge!: true)
+
       put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user)
+
       expect(response.status).to eq(200)
     end
 
     it "should return 405 if branch can't be merged" do
-      MergeRequest.any_instance.stub(can_be_merged?: false)
+      allow_any_instance_of(MergeRequest).
+        to receive(:can_be_merged?).and_return(false)
+
       put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user)
+
       expect(response.status).to eq(405)
       expect(json_response['message']).to eq('Branch cannot be merged')
     end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 2ec8e0f354c3045c8d030b0cf4af7f4f54018b65..e9ff832603fdbab91f89627611bdb2f6fc161233 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -121,15 +121,13 @@ describe API::API, api: true  do
         get api('/projects/all', admin)
         expect(response.status).to eq(200)
         expect(json_response).to be_an Array
-        project_name = project.name
 
-        expect(json_response.detect do |project|
-          project['name'] == project_name
-        end['name']).to eq(project_name)
-
-        expect(json_response.detect do |project|
-          project['owner']['username'] == user.username
-        end['owner']['username']).to eq(user.username)
+        expect(json_response).to satisfy do |response|
+          response.one? do |entry|
+            entry['name'] == project.name &&
+              entry['owner']['username'] == user.username
+          end
+        end
       end
     end
   end
@@ -138,9 +136,8 @@ describe API::API, api: true  do
     context 'maximum number of projects reached' do
       it 'should not create new project and respond with 403' do
         allow_any_instance_of(User).to receive(:projects_limit_left).and_return(0)
-        expect do
-          post api('/projects', user2), name: 'foo'
-        end.to change {Project.count}.by(0)
+        expect { post api('/projects', user2), name: 'foo' }.
+          to change {Project.count}.by(0)
         expect(response.status).to eq(403)
       end
     end
@@ -158,7 +155,7 @@ describe API::API, api: true  do
     end
 
     it 'should not create new project without name and return 400' do
-      expect { post api('/projects', user) }.to_not change { Project.count }
+      expect { post api('/projects', user) }.not_to change { Project.count }
       expect(response.status).to eq(400)
     end
 
@@ -257,7 +254,7 @@ describe API::API, api: true  do
 
     it 'should respond with 400 on failure and not project' do
       expect { post api("/projects/user/#{user.id}", admin) }.
-        to_not change { Project.count }
+        not_to change { Project.count }
 
       expect(response.status).to eq(400)
       expect(json_response['message']['name']).to eq([
diff --git a/spec/services/archive_repository_service_spec.rb b/spec/services/archive_repository_service_spec.rb
index a7a783ea2e4beac22259fe9428fe7b1eb8a5218d..0ec70c51b3a42d10b552bb7be52bacd7db131925 100644
--- a/spec/services/archive_repository_service_spec.rb
+++ b/spec/services/archive_repository_service_spec.rb
@@ -17,7 +17,7 @@ describe ArchiveRepositoryService do
       end
 
       it "raises an error" do
-        expect { subject.execute(timeout: 0.0) }.to raise_error
+        expect { subject.execute(timeout: 0.0) }.to raise_error(RuntimeError)
       end
     end
 
diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb
index b3e59d7a0db8a33a222a376004b8548de18718dd..3373b97bfd4ed7323bd79ddb178cfc2ed83b00fe 100644
--- a/spec/services/git_push_service_spec.rb
+++ b/spec/services/git_push_service_spec.rb
@@ -124,7 +124,9 @@ describe GitPushService do
       end
 
       it "when pushing a branch for the first time with default branch protection disabled" do
-        ApplicationSetting.any_instance.stub(default_branch_protection: 0)
+        allow(ApplicationSetting.current_application_settings).
+          to receive(:default_branch_protection).
+          and_return(Gitlab::Access::PROTECTION_NONE)
 
         expect(project).to receive(:execute_hooks)
         expect(project.default_branch).to eq("master")
@@ -133,7 +135,9 @@ describe GitPushService do
       end
 
       it "when pushing a branch for the first time with default branch protection set to 'developers can push'" do
-        ApplicationSetting.any_instance.stub(default_branch_protection: 1)
+        allow(ApplicationSetting.current_application_settings).
+          to receive(:default_branch_protection).
+          and_return(Gitlab::Access::PROTECTION_DEV_CAN_PUSH)
 
         expect(project).to receive(:execute_hooks)
         expect(project.default_branch).to eq("master")
@@ -154,32 +158,35 @@ describe GitPushService do
     let(:commit) { project.commit }
 
     before do
-      commit.stub({
+      allow(commit).to receive_messages(
         safe_message: "this commit \n mentions ##{issue.id}",
         references: [issue],
         author_name: commit_author.name,
         author_email: commit_author.email
-      })
-      project.repository.stub(commits_between: [commit])
+      )
+      allow(project.repository).to receive(:commits_between).and_return([commit])
     end
 
     it "creates a note if a pushed commit mentions an issue" do
-      expect(Note).to receive(:create_cross_reference_note).with(issue, commit, commit_author)
+      expect(SystemNoteService).to receive(:cross_reference).with(issue, commit, commit_author)
 
       service.execute(project, user, @oldrev, @newrev, @ref)
     end
 
     it "only creates a cross-reference note if one doesn't already exist" do
-      Note.create_cross_reference_note(issue, commit, user)
+      SystemNoteService.cross_reference(issue, commit, user)
 
-      expect(Note).not_to receive(:create_cross_reference_note).with(issue, commit, commit_author)
+      expect(SystemNoteService).not_to receive(:cross_reference).with(issue, commit, commit_author)
 
       service.execute(project, user, @oldrev, @newrev, @ref)
     end
 
     it "defaults to the pushing user if the commit's author is not known" do
-      commit.stub(author_name: 'unknown name', author_email: 'unknown@email.com')
-      expect(Note).to receive(:create_cross_reference_note).with(issue, commit, user)
+      allow(commit).to receive_messages(
+        author_name: 'unknown name',
+        author_email: 'unknown@email.com'
+      )
+      expect(SystemNoteService).to receive(:cross_reference).with(issue, commit, user)
 
       service.execute(project, user, @oldrev, @newrev, @ref)
     end
@@ -188,7 +195,7 @@ describe GitPushService do
       allow(project.repository).to receive(:commits_between).with(@blankrev, @newrev).and_return([])
       allow(project.repository).to receive(:commits_between).with("master", @newrev).and_return([commit])
 
-      expect(Note).to receive(:create_cross_reference_note).with(issue, commit, commit_author)
+      expect(SystemNoteService).to receive(:cross_reference).with(issue, commit, commit_author)
 
       service.execute(project, user, @blankrev, @newrev, 'refs/heads/other')
     end
@@ -201,14 +208,15 @@ describe GitPushService do
     let(:closing_commit) { project.commit }
 
     before do
-      closing_commit.stub({
+      allow(closing_commit).to receive_messages(
         issue_closing_regex: /^([Cc]loses|[Ff]ixes) #\d+/,
         safe_message: "this is some work.\n\ncloses ##{issue.iid}",
         author_name: commit_author.name,
         author_email: commit_author.email
-      })
+      )
 
-      project.repository.stub(commits_between: [closing_commit])
+      allow(project.repository).to receive(:commits_between).
+        and_return([closing_commit])
     end
 
     it "closes issues with commit messages" do
@@ -224,7 +232,7 @@ describe GitPushService do
     end
 
     it "doesn't close issues when pushed to non-default branches" do
-      project.stub(default_branch: 'durf')
+      allow(project).to receive(:default_branch).and_return('durf')
 
       # The push still shouldn't create cross-reference notes.
       expect do
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index 62a99d1595255d89206eb1a9ea71d5cb0c6cfe43..253e5823499093226f3ace334f6f1a0acf1227bd 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -58,7 +58,7 @@ describe NotificationService do
         end
 
         it 'filters out "mentioned in" notes' do
-          mentioned_note = Note.create_cross_reference_note(mentioned_issue, issue, issue.author)
+          mentioned_note = SystemNoteService.cross_reference(mentioned_issue, issue, issue.author)
 
           expect(Notify).not_to receive(:note_issue_email)
           notification.new_note(mentioned_note)
@@ -130,7 +130,7 @@ describe NotificationService do
         end
 
         it 'filters out "mentioned in" notes' do
-          mentioned_note = Note.create_cross_reference_note(mentioned_issue, issue, issue.author)
+          mentioned_note = SystemNoteService.cross_reference(mentioned_issue, issue, issue.author)
 
           expect(Notify).not_to receive(:note_issue_email)
           notification.new_note(mentioned_note)
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 9c8004ab55571362ed24131871f100c46f754d6b..666d56079d70364e34d86d6e1b1182e878544a0e 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -2,7 +2,6 @@ ENV["RAILS_ENV"] ||= 'test'
 require File.expand_path("../../config/environment", __FILE__)
 require 'rspec/rails'
 require 'shoulda/matchers'
-require 'email_spec'
 require 'sidekiq/testing/inline'
 
 # Requires supporting ruby files with custom matchers and macros, etc,
diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb
index 3e41aec425af13c9ed1ebb21d11cf7c746570f94..fed1ab6ee33f743b181ab69ab8a74056b5020978 100644
--- a/spec/support/capybara.rb
+++ b/spec/support/capybara.rb
@@ -19,36 +19,3 @@ unless ENV['CI'] || ENV['CI_SERVER']
   # Keep only the screenshots generated from the last failing test suite
   Capybara::Screenshot.prune_strategy = :keep_last_run
 end
-
-module CapybaraHelpers
-  # Execute a block a certain number of times before considering it a failure
-  #
-  # The given block is called, and if it raises a `Capybara::ExpectationNotMet`
-  # error, we wait `interval` seconds and then try again, until `retries` is
-  # met.
-  #
-  # This allows for better handling of timing-sensitive expectations in a
-  # sketchy CI environment, for example.
-  #
-  # interval - Delay between retries in seconds (default: 0.5)
-  # retries  - Number of times to execute before failing (default: 5)
-  def allowing_for_delay(interval: 0.5, retries: 5)
-    tries = 0
-
-    begin
-      yield
-    rescue Capybara::ExpectationNotMet => ex
-      if tries <= retries
-        tries += 1
-        sleep interval
-        retry
-      else
-        raise ex
-      end
-    end
-  end
-end
-
-RSpec.configure do |config|
-  config.include CapybaraHelpers, type: :feature
-end
diff --git a/spec/support/capybara_helpers.rb b/spec/support/capybara_helpers.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9b5c3065eed423753949cc6dad4864ee54427ed9
--- /dev/null
+++ b/spec/support/capybara_helpers.rb
@@ -0,0 +1,34 @@
+module CapybaraHelpers
+  # Execute a block a certain number of times before considering it a failure
+  #
+  # The given block is called, and if it raises a `Capybara::ExpectationNotMet`
+  # error, we wait `interval` seconds and then try again, until `retries` is
+  # met.
+  #
+  # This allows for better handling of timing-sensitive expectations in a
+  # sketchy CI environment, for example.
+  #
+  # interval - Delay between retries in seconds (default: 0.5)
+  # retries  - Number of times to execute before failing (default: 5)
+  def allowing_for_delay(interval: 0.5, retries: 5)
+    tries = 0
+
+    begin
+      sleep interval
+
+      yield
+    rescue Capybara::ExpectationNotMet => ex
+      if tries <= retries
+        tries += 1
+        sleep interval
+        retry
+      else
+        raise ex
+      end
+    end
+  end
+end
+
+RSpec.configure do |config|
+  config.include CapybaraHelpers, type: :feature
+end
diff --git a/spec/support/db_cleaner.rb b/spec/support/db_cleaner.rb
index 6250737b9cdd8cd87a7e787f6f84430c23c7f57d..e0dbc9aa84c786f3ce2f3fb12b6d04d9eb72e66e 100644
--- a/spec/support/db_cleaner.rb
+++ b/spec/support/db_cleaner.rb
@@ -1,21 +1,3 @@
-# RSpec.configure do |config|
-
-#   config.around(:each) do |example|
-#     DatabaseCleaner.strategy = :transaction
-#     DatabaseCleaner.clean_with(:truncation)
-#     DatabaseCleaner.cleaning do
-#       example.run
-#     end
-#   end
-
-#   config.around(:each, js: true) do |example|
-#     DatabaseCleaner.strategy = :truncation
-#     DatabaseCleaner.clean_with(:truncation)
-#     DatabaseCleaner.cleaning do
-#       example.run
-#     end
-#   end
-# end
 RSpec.configure do |config|
   config.before(:suite) do
     DatabaseCleaner.clean_with(:truncation)
@@ -36,15 +18,4 @@ RSpec.configure do |config|
   config.after(:each) do
     DatabaseCleaner.clean
   end
-
-  # rspec-rails 3 will no longer automatically infer an example group's spec type
-  # from the file location. You can explicitly opt-in to the feature using this
-  # config option.
-  # To explicitly tag specs without using automatic inference, set the `:type`
-  # metadata manually:
-  #
-  #     describe ThingsController, :type => :controller do
-  #       # Equivalent to being in spec/controllers
-  #     end
-  config.infer_spec_type_from_file_location!
 end
diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb
index 5f0c270f967abbf6218a59d869c0e5381b94426b..e5ebc6e7ec8983432f688e21dad4e9c6787f2600 100644
--- a/spec/support/matchers.rb
+++ b/spec/support/matchers.rb
@@ -1,30 +1,43 @@
 RSpec::Matchers.define :be_valid_commit do
   match do |actual|
-    !actual.nil?
-    actual.id == ValidCommit::ID
-    actual.message == ValidCommit::MESSAGE
-    actual.author_name == ValidCommit::AUTHOR_FULL_NAME
+    actual &&
+      actual.id == ValidCommit::ID &&
+      actual.message == ValidCommit::MESSAGE &&
+      actual.author_name == ValidCommit::AUTHOR_FULL_NAME
   end
 end
 
+def emulate_user(user)
+  user = case user
+        when :user then create(:user)
+        when :visitor then nil
+        when :admin then create(:admin)
+        else user
+        end
+  login_with(user) if user
+end
+
 RSpec::Matchers.define :be_allowed_for do |user|
   match do |url|
-    include UrlAccess
-    url_allowed?(user, url)
+    emulate_user(user)
+    visit url
+    status_code != 404 && current_path != new_user_session_path
   end
 end
 
 RSpec::Matchers.define :be_denied_for do |user|
   match do |url|
-    include UrlAccess
-    url_denied?(user, url)
+    emulate_user(user)
+    visit url
+    status_code == 404 || current_path == new_user_session_path
   end
 end
 
-RSpec::Matchers.define :be_404_for do |user|
+RSpec::Matchers.define :be_not_found_for do |user|
   match do |url|
-    include UrlAccess
-    url_404?(user, url)
+    emulate_user(user)
+    visit url
+    status_code == 404
   end
 end
 
@@ -33,38 +46,12 @@ RSpec::Matchers.define :include_module do |expected|
     described_class.included_modules.include?(expected)
   end
 
-  failure_message_for_should do
-    "expected #{described_class} to include the #{expected} module"
+  description do
+    "includes the #{expected} module"
   end
-end
 
-module UrlAccess
-  def url_allowed?(user, url)
-    emulate_user(user)
-    visit url
-    (status_code != 404 && current_path != new_user_session_path)
-  end
-
-  def url_denied?(user, url)
-    emulate_user(user)
-    visit url
-    (status_code == 404 || current_path == new_user_session_path)
-  end
-
-  def url_404?(user, url)
-    emulate_user(user)
-    visit url
-    status_code == 404
-  end
-
-  def emulate_user(user)
-    user = case user
-           when :user then create(:user)
-           when :visitor then nil
-           when :admin then create(:admin)
-           else user
-           end
-    login_with(user) if user
+  failure_message do
+    "expected #{described_class} to include the #{expected} module"
   end
 end
 
diff --git a/spec/support/mentionable_shared_examples.rb b/spec/support/mentionable_shared_examples.rb
index d29c8a55c82b38f72a935e6009fd187ef3ac595b..a2a0b6905f9561592e5cde5f13afd2f774fba08c 100644
--- a/spec/support/mentionable_shared_examples.rb
+++ b/spec/support/mentionable_shared_examples.rb
@@ -80,7 +80,7 @@ shared_examples 'a mentionable' do
                          ext_issue, ext_mr, ext_commit]
 
     mentioned_objects.each do |referenced|
-      expect(Note).to receive(:create_cross_reference_note).
+      expect(SystemNoteService).to receive(:cross_reference).
         with(referenced, subject.local_reference, author)
     end
 
@@ -88,7 +88,7 @@ shared_examples 'a mentionable' do
   end
 
   it 'detects existing cross-references' do
-    Note.create_cross_reference_note(mentioned_issue, subject.local_reference, author)
+    SystemNoteService.cross_reference(mentioned_issue, subject.local_reference, author)
 
     expect(subject).to have_mentioned(mentioned_issue)
     expect(subject).not_to have_mentioned(mentioned_mr)
@@ -132,13 +132,13 @@ shared_examples 'an editable mentionable' do
     # These three objects were already referenced, and should not receive new
     # notes
     [mentioned_issue, mentioned_commit, ext_issue].each do |oldref|
-      expect(Note).not_to receive(:create_cross_reference_note).
+      expect(SystemNoteService).not_to receive(:cross_reference).
         with(oldref, any_args)
     end
 
     # These two issues are new and should receive reference notes
     new_issues.each do |newref|
-      expect(Note).to receive(:create_cross_reference_note).
+      expect(SystemNoteService).to receive(:cross_reference).
         with(newref, subject.local_reference, author)
     end
 
diff --git a/spec/support/test_env.rb b/spec/support/test_env.rb
index 6d4a806791012e9b6ab7a404d98c583e82095980..8bdd6b43cdd96812961d52a851ca0a8b750bc502 100644
--- a/spec/support/test_env.rb
+++ b/spec/support/test_env.rb
@@ -41,11 +41,13 @@ module TestEnv
   end
 
   def disable_mailer
-    NotificationService.any_instance.stub(mailer: double.as_null_object)
+    allow_any_instance_of(NotificationService).to receive(:mailer).
+      and_return(double.as_null_object)
   end
 
   def enable_mailer
-    allow_any_instance_of(NotificationService).to receive(:mailer).and_call_original
+    allow_any_instance_of(NotificationService).to receive(:mailer).
+      and_call_original
   end
 
   # Clean /tmp/tests
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb
index c85214e50ddb5aafeeb91b78a3999513d38dc676..2f90b67aef1ac68a73edd5ec5b22f751b42eb711 100644
--- a/spec/tasks/gitlab/backup_rake_spec.rb
+++ b/spec/tasks/gitlab/backup_rake_spec.rb
@@ -23,30 +23,33 @@ describe 'gitlab:app namespace rake task' do
 
     context 'gitlab version' do
       before do
-        Dir.stub glob: []
-        allow(Dir).to receive :chdir
-        File.stub exists?: true
-        Kernel.stub system: true
-        FileUtils.stub cp_r: true
-        FileUtils.stub mv: true
-        Rake::Task["gitlab:shell:setup"].stub invoke: true
+        allow(Dir).to receive(:glob).and_return([])
+        allow(Dir).to receive(:chdir)
+        allow(File).to receive(:exists?).and_return(true)
+        allow(Kernel).to receive(:system).and_return(true)
+        allow(FileUtils).to receive(:cp_r).and_return(true)
+        allow(FileUtils).to receive(:mv).and_return(true)
+        allow(Rake::Task["gitlab:shell:setup"]).
+          to receive(:invoke).and_return(true)
       end
 
       let(:gitlab_version) { Gitlab::VERSION }
 
       it 'should fail on mismatch' do
-        YAML.stub load_file: { gitlab_version: "not #{gitlab_version}" }
-        expect { run_rake_task('gitlab:backup:restore') }.to(
-          raise_error SystemExit
-        )
+        allow(YAML).to receive(:load_file).
+          and_return({gitlab_version: "not #{gitlab_version}" })
+
+        expect { run_rake_task('gitlab:backup:restore') }.
+          to raise_error(SystemExit)
       end
 
       it 'should invoke restoration on mach' do
-        YAML.stub load_file: { gitlab_version: gitlab_version }
-        expect(Rake::Task["gitlab:backup:db:restore"]).to receive :invoke
-        expect(Rake::Task["gitlab:backup:repo:restore"]).to receive :invoke
-        expect(Rake::Task["gitlab:shell:setup"]).to receive :invoke
-        expect { run_rake_task('gitlab:backup:restore') }.to_not raise_error
+        allow(YAML).to receive(:load_file).
+          and_return({gitlab_version: gitlab_version})
+        expect(Rake::Task["gitlab:backup:db:restore"]).to receive(:invoke)
+        expect(Rake::Task["gitlab:backup:repo:restore"]).to receive(:invoke)
+        expect(Rake::Task["gitlab:shell:setup"]).to receive(:invoke)
+        expect { run_rake_task('gitlab:backup:restore') }.not_to raise_error
       end
     end
 
@@ -140,13 +143,14 @@ describe 'gitlab:app namespace rake task' do
     end
 
     it 'does not invoke repositories restore' do
-      Rake::Task["gitlab:shell:setup"].stub invoke: true
+      allow(Rake::Task["gitlab:shell:setup"]).
+        to receive(:invoke).and_return(true)
       allow($stdout).to receive :write
 
       expect(Rake::Task["gitlab:backup:db:restore"]).to receive :invoke
       expect(Rake::Task["gitlab:backup:repo:restore"]).not_to receive :invoke
       expect(Rake::Task["gitlab:shell:setup"]).to receive :invoke
-      expect { run_rake_task('gitlab:backup:restore') }.to_not raise_error
+      expect { run_rake_task('gitlab:backup:restore') }.not_to raise_error
     end
   end
 end # gitlab:app namespace
diff --git a/spec/tasks/gitlab/mail_google_schema_whitelisting.rb b/spec/tasks/gitlab/mail_google_schema_whitelisting.rb
index 22e746870dc701cee6518b165970ff49df06a442..37feb5e6faf735751ff2c5cc00a4cdecf67c0528 100644
--- a/spec/tasks/gitlab/mail_google_schema_whitelisting.rb
+++ b/spec/tasks/gitlab/mail_google_schema_whitelisting.rb
@@ -21,7 +21,7 @@ describe 'gitlab:mail_google_schema_whitelisting rake task' do
     end
 
     it 'should run the task without errors' do
-      expect { run_rake_task }.to_not raise_error
+      expect { run_rake_task }.not_to raise_error
     end
   end
 end
diff --git a/spec/workers/post_receive_spec.rb b/spec/workers/post_receive_spec.rb
index df1a2b84a53c644d443e40f1d536e4f45ba31fc2..46eae9ab0816fbf11e91418720d96e006543a82f 100644
--- a/spec/workers/post_receive_spec.rb
+++ b/spec/workers/post_receive_spec.rb
@@ -30,7 +30,7 @@ describe PostReceive do
     end
 
     it "asks the project to trigger all hooks" do
-      Project.stub(find_with_namespace: project)
+      allow(Project).to receive(:find_with_namespace).and_return(project)
       expect(project).to receive(:execute_hooks).twice
       expect(project).to receive(:execute_services).twice
       expect(project).to receive(:update_merge_requests)