diff --git a/Gemfile b/Gemfile
index 808c5df7caf60ba0a4d05b16a71f87e7295ce29c..91c909a2e7dbd829c48d41d69b51312556701b3e 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,6 +1,7 @@
 source "https://rubygems.org"
 
 gem 'rails', '4.2.4'
+gem 'rails-deprecated_sanitizer', '~> 1.0.3'
 
 # Responders respond_to and respond_with
 gem 'responders', '~> 2.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index 1671edbc6fd2871d9647034e2862e08d58c2fe73..0800137991096eb7ddc0c1cc42fe850732ea42b6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -930,6 +930,7 @@ DEPENDENCIES
   rack-cors (~> 0.4.0)
   rack-oauth2 (~> 1.2.1)
   rails (= 4.2.4)
+  rails-deprecated_sanitizer (~> 1.0.3)
   raphael-rails (~> 2.1.2)
   rblineprof
   rdoc (~> 3.6)
diff --git a/Procfile b/Procfile
index 08880b9c425aa2af24dc07bd904b72bfd4084b4c..fd5f7ecb94b97e07069fb8e950d66aba5226b725 100644
--- a/Procfile
+++ b/Procfile
@@ -1,3 +1,3 @@
 web: bundle exec unicorn_rails -p ${PORT:="3000"} -E ${RAILS_ENV:="development"} -c ${UNICORN_CONFIG:="config/unicorn.rb"}
-worker: bundle exec sidekiq -q post_receive -q mailer -q archive_repo -q system_hook -q project_web_hook -q gitlab_shell -q incoming_email -q runner -q common -q default
+worker: bundle exec sidekiq -q post_receive -q mailer -q archive_repo -q system_hook -q project_web_hook -q gitlab_shell -q incoming_email -q runner -q common -q mailers -q default
 # mail_room: bundle exec mail_room -q -c config/mail_room.yml
diff --git a/app/controllers/abuse_reports_controller.rb b/app/controllers/abuse_reports_controller.rb
index 2f4054eaa117e2fd1403905c77b2e894858dcde7..d8e905943327310a04c28aa6801f4c8f210ac305 100644
--- a/app/controllers/abuse_reports_controller.rb
+++ b/app/controllers/abuse_reports_controller.rb
@@ -10,7 +10,7 @@ def create
 
     if @abuse_report.save
       if current_application_settings.admin_notification_email.present?
-        AbuseReportMailer.delay.notify(@abuse_report.id)
+        AbuseReportMailer.deliver_later.notify(@abuse_report.id)
       end
 
       message = "Thank you for your report. A GitLab administrator will look into it shortly."
diff --git a/app/mailers/base_mailer.rb b/app/mailers/base_mailer.rb
index aedb0889185cf27e2393d0fb6abb9e2d34bc5a03..8b83bbd93b74fc42d04bf4470f0d4d39586486e0 100644
--- a/app/mailers/base_mailer.rb
+++ b/app/mailers/base_mailer.rb
@@ -8,10 +8,6 @@ class BaseMailer < ActionMailer::Base
   default from:     Proc.new { default_sender_address.format }
   default reply_to: Proc.new { default_reply_to_address.format }
 
-  def self.delay
-    delay_for(2.seconds)
-  end
-
   def can?
     Ability.abilities.allowed?(current_user, action, subject)
   end
diff --git a/app/models/project_services/ci/mail_service.rb b/app/models/project_services/ci/mail_service.rb
index d31dd6899c1eeb8939ec45eb0d1701872a7d343b..bdc85667e9d06651f20c46dc781ab2017986be50 100644
--- a/app/models/project_services/ci/mail_service.rb
+++ b/app/models/project_services/ci/mail_service.rb
@@ -78,7 +78,7 @@ def update_project
     end
 
     def mailer
-      Ci::Notify.delay
+      Ci::Notify.deliver_later
     end
   end
 end
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index d6550fbb555e65c1f30e4551d0e45ab5f3c2d3ae..03fe8c8fe110f0471a351d0d8f5649129629d5f6 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -13,14 +13,14 @@ class NotificationService
   # even if user disabled notifications
   def new_key(key)
     if key.user
-      mailer.new_ssh_key_email(key.id)
+      mailer.new_ssh_key_email(key.id).deliver_later
     end
   end
 
   # Always notify user about email added to profile
   def new_email(email)
     if email.user
-      mailer.new_email_email(email.id)
+      mailer.new_email_email(email.id).deliver_later
     end
   end
 
@@ -79,17 +79,27 @@ def reopen_issue(issue, current_user)
   end
 
   def merge_mr(merge_request, current_user)
-    close_resource_email(merge_request, merge_request.target_project, current_user, 'merged_merge_request_email')
+    close_resource_email(
+      merge_request,
+      merge_request.target_project,
+      current_user,
+      'merged_merge_request_email'
+    )
   end
 
   def reopen_mr(merge_request, current_user)
-    reopen_resource_email(merge_request, merge_request.target_project, current_user, 'merge_request_status_email', 'reopened')
+    reopen_resource_email(
+      merge_request,
+      merge_request.target_project,
+      current_user, 'merge_request_status_email',
+      'reopened'
+    )
   end
 
   # Notify new user with email after creation
   def new_user(user, token = nil)
     # Don't email omniauth created users
-    mailer.new_user_email(user.id, token) unless user.identities.any?
+    mailer.new_user_email(user.id, token).deliver_later unless user.identities.any?
   end
 
   # Notify users on new note in system
@@ -140,48 +150,58 @@ def new_note(note)
     notify_method = "note_#{note.noteable_type.underscore}_email".to_sym
 
     recipients.each do |recipient|
-      mailer.send(notify_method, recipient.id, note.id)
+      mailer.send(notify_method, recipient.id, note.id).deliver_later
     end
   end
 
   def invite_project_member(project_member, token)
-    mailer.project_member_invited_email(project_member.id, token)
+    mailer.project_member_invited_email(project_member.id, token).deliver_later
   end
 
   def accept_project_invite(project_member)
-    mailer.project_invite_accepted_email(project_member.id)
+    mailer.project_invite_accepted_email(project_member.id).deliver_later
   end
 
   def decline_project_invite(project_member)
-    mailer.project_invite_declined_email(project_member.project.id, project_member.invite_email, project_member.access_level, project_member.created_by_id)
+    mailer.project_invite_declined_email(
+      project_member.project.id,
+      project_member.invite_email,
+      project_member.access_level,
+      project_member.created_by_id
+    ).deliver_later
   end
 
   def new_project_member(project_member)
-    mailer.project_access_granted_email(project_member.id)
+    mailer.project_access_granted_email(project_member.id).deliver_later
   end
 
   def update_project_member(project_member)
-    mailer.project_access_granted_email(project_member.id)
+    mailer.project_access_granted_email(project_member.id).deliver_later
   end
 
   def invite_group_member(group_member, token)
-    mailer.group_member_invited_email(group_member.id, token)
+    mailer.group_member_invited_email(group_member.id, token).deliver_later
   end
 
   def accept_group_invite(group_member)
-    mailer.group_invite_accepted_email(group_member.id)
+    mailer.group_invite_accepted_email(group_member.id).deliver_later
   end
 
   def decline_group_invite(group_member)
-    mailer.group_invite_declined_email(group_member.group.id, group_member.invite_email, group_member.access_level, group_member.created_by_id)
+    mailer.group_invite_declined_email(
+      group_member.group.id,
+      group_member.invite_email,
+      group_member.access_level,
+      group_member.created_by_id
+    ).deliver_later
   end
 
   def new_group_member(group_member)
-    mailer.group_access_granted_email(group_member.id)
+    mailer.group_access_granted_email(group_member.id).deliver_later
   end
 
   def update_group_member(group_member)
-    mailer.group_access_granted_email(group_member.id)
+    mailer.group_access_granted_email(group_member.id).deliver_later
   end
 
   def project_was_moved(project, old_path_with_namespace)
@@ -189,7 +209,11 @@ def project_was_moved(project, old_path_with_namespace)
     recipients = reject_muted_users(recipients, project)
 
     recipients.each do |recipient|
-      mailer.project_was_moved_email(project.id, recipient.id, old_path_with_namespace)
+      mailer.project_was_moved_email(
+        project.id,
+        recipient.id,
+        old_path_with_namespace
+      ).deliver_later
     end
   end
 
@@ -339,7 +363,7 @@ def new_resource_email(target, project, method)
     recipients = build_recipients(target, project, target.author)
 
     recipients.each do |recipient|
-      mailer.send(method, recipient.id, target.id)
+      mailer.send(method, recipient.id, target.id).deliver_later
     end
   end
 
@@ -347,7 +371,7 @@ def close_resource_email(target, project, current_user, method)
     recipients = build_recipients(target, project, current_user)
 
     recipients.each do |recipient|
-      mailer.send(method, recipient.id, target.id, current_user.id)
+      mailer.send(method, recipient.id, target.id, current_user.id).deliver
     end
   end
 
@@ -358,7 +382,13 @@ def reassign_resource_email(target, project, current_user, method)
     recipients = build_recipients(target, project, current_user, [previous_assignee])
 
     recipients.each do |recipient|
-      mailer.send(method, recipient.id, target.id, previous_assignee_id, current_user.id)
+      mailer.send(
+        method,
+        recipient.id,
+        target.id,
+        previous_assignee_id,
+        current_user.id
+      ).deliver_later
     end
   end
 
@@ -366,7 +396,7 @@ def reopen_resource_email(target, project, current_user, method, status)
     recipients = build_recipients(target, project, current_user)
 
     recipients.each do |recipient|
-      mailer.send(method, recipient.id, target.id, status, current_user.id)
+      mailer.send(method, recipient.id, target.id, status, current_user.id).deliver
     end
   end
 
@@ -388,7 +418,7 @@ def build_recipients(target, project, current_user, extra_recipients = nil)
   end
 
   def mailer
-    Notify.delay
+    Notify
   end
 
   def previous_record(object, attribute)
diff --git a/app/workers/email_receiver_worker.rb b/app/workers/email_receiver_worker.rb
index 5a921a73fe9b46faea572994d9d7c65d9d60f6be..1df8de1db797bdb51518301f6f46ef46114274e4 100644
--- a/app/workers/email_receiver_worker.rb
+++ b/app/workers/email_receiver_worker.rb
@@ -46,6 +46,6 @@ def handle_failure(raw, e)
       return
     end
 
-    EmailRejectionMailer.delay.rejection(reason, raw, can_retry)
+    EmailRejectionMailer.deliver_later.rejection(reason, raw, can_retry)
   end
 end
diff --git a/config/application.rb b/config/application.rb
index bfa2a809dd7d7fd472990b00d6f38c8948fd36ce..d255ff0719f52405d2d0d9eac1868d6bb4027d03 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -99,6 +99,10 @@ class Application < Rails::Application
     redis_config_hash[:expires_in] = 2.weeks # Cache should not grow forever
     config.cache_store = :redis_store, redis_config_hash
 
+    config.active_record.raise_in_transactional_callbacks = true
+
+    config.active_job.queue_adapter = :sidekiq
+
     # This is needed for gitlab-shell
     ENV['GITLAB_PATH_OUTSIDE_HOOK'] = ENV['PATH']
   end
diff --git a/config/environments/production.rb b/config/environments/production.rb
index e8250d66452693b24b8d60e661d2678367261c81..317b113e100281b10a1338d0c9732ede8a5e6482 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -9,7 +9,7 @@
   config.action_controller.perform_caching = true
 
   # Disable Rails's static asset server (Apache or nginx will already do this)
-  config.serve_static_assets = false
+  config.serve_static_files = false
 
   # Compress JavaScripts and CSS.
   config.assets.js_compressor = :uglifier
diff --git a/config/environments/test.rb b/config/environments/test.rb
index 46982be2864d68be23fb704b00dad916530f4749..2eddf0605d25fbd9e4c9db03e855890d52efbad3 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -8,7 +8,7 @@
   config.cache_classes = false
 
   # Configure static asset server for tests with Cache-Control for performance
-  config.serve_static_assets = true
+  config.serve_static_files = true
   config.static_cache_control = "public, max-age=3600"
 
   # Show full error reports and disable caching
diff --git a/config/initializers/static_files.rb b/config/initializers/static_files.rb
index d9042c652bb401fa3e1cd473392ca0160747c8c9..d6dbf8b9fbfca8d9edc43a8e09a650cd1a3c5904 100644
--- a/config/initializers/static_files.rb
+++ b/config/initializers/static_files.rb
@@ -1,6 +1,6 @@
 app = Rails.application
 
-if app.config.serve_static_assets
+if app.config.serve_static_files
   # The `ActionDispatch::Static` middleware intercepts requests for static files 
   # by checking if they exist in the `/public` directory. 
   # We're replacing it with our `Gitlab::Middleware::Static` that does the same,
diff --git a/lib/gitlab/markdown/label_reference_filter.rb b/lib/gitlab/markdown/label_reference_filter.rb
index 618acb7a57814c32c1bc31f131a2d6cde8fdb40d..13581b8fb136671a0c51b8dd74e8e1e2a0b22f65 100644
--- a/lib/gitlab/markdown/label_reference_filter.rb
+++ b/lib/gitlab/markdown/label_reference_filter.rb
@@ -60,8 +60,7 @@ def label_link_filter(text)
       def url_for_label(project, label)
         h = Gitlab::Application.routes.url_helpers
         h.namespace_project_issues_path(project.namespace, project,
-                                        label_name: label.name,
-                                        only_path: context[:only_path])
+                                        label_name: label.name)
       end
 
       def render_colored_label(label)
diff --git a/lib/gitlab/seeder.rb b/lib/gitlab/seeder.rb
index 31aa3528c4c37a4aa4416da61e6d0df01368b9c0..2ef0e982256cdefa8f60090221d4534053e2ed6e 100644
--- a/lib/gitlab/seeder.rb
+++ b/lib/gitlab/seeder.rb
@@ -14,7 +14,7 @@ def self.by_user(user)
 
     def self.mute_mailer
       code = <<-eos
-def Notify.delay
+def Notify.deliver_later
   self
 end
       eos