diff --git a/bin/rails b/bin/rails
index 0138d79b751b9668a1036329a9ef29a213836162..228f812ccaf658a031037900241e68b3c55f6435 100755
--- a/bin/rails
+++ b/bin/rails
@@ -1,9 +1,14 @@
 #!/usr/bin/env ruby
-begin
-  load File.expand_path('../spring', __FILE__)
-rescue LoadError => e
-  raise unless e.message.include?('spring')
+
+# Remove this block when upgraded to rails 5.0.
+unless %w[1 true].include?(ENV["RAILS5"])
+  begin
+    load File.expand_path('../spring', __FILE__)
+  rescue LoadError => e
+    raise unless e.message.include?('spring')
+  end
 end
-APP_PATH = File.expand_path('../../config/application', __FILE__)
+
+APP_PATH = File.expand_path('../config/application', __dir__)
 require_relative '../config/boot'
 require 'rails/commands'
diff --git a/bin/rake b/bin/rake
index d87d5f578104597c1d1b951b55942e37f8af1277..b52a8321f1a3ed7a299151f6847852da30cac6ef 100755
--- a/bin/rake
+++ b/bin/rake
@@ -1,9 +1,14 @@
 #!/usr/bin/env ruby
-begin
-  load File.expand_path('../spring', __FILE__)
-rescue LoadError => e
-  raise unless e.message.include?('spring')
+
+# Remove this block when upgraded to rails 5.0.
+unless %w[1 true].include?(ENV["RAILS5"])
+  begin
+    load File.expand_path('../spring', __FILE__)
+  rescue LoadError => e
+    raise unless e.message.include?('spring')
+  end
 end
+
 require_relative '../config/boot'
 require 'rake'
 Rake.application.run
diff --git a/bin/setup b/bin/setup
index 6cb2d7f1e3a52f1621dd62b6b2790878b4984aa0..c60c1267e069c4d1ddb667151a3bc30e120d4903 100755
--- a/bin/setup
+++ b/bin/setup
@@ -1,29 +1,61 @@
 #!/usr/bin/env ruby
-require 'pathname'
+
+def rails5?
+  %w[1 true].include?(ENV["RAILS5"])
+end
+
+require "pathname"
 
 # path to your application root.
-APP_ROOT = Pathname.new File.expand_path('../../',  __FILE__)
+APP_ROOT = Pathname.new File.expand_path("../../", __FILE__)
+
+if rails5?
+  def system!(*args)
+    system(*args) || abort("\n== Command #{args} failed ==")
+  end
+end
 
 Dir.chdir APP_ROOT do
   # This script is a starting point to setup your application.
   # Add necessary setup steps to this file:
 
   puts "== Installing dependencies =="
-  system "gem install bundler --conservative"
-  system "bundle check || bundle install"
+
+  if rails5?
+    system! "gem install bundler --conservative"
+    system("bundle check") || system!("bundle install")
+  else
+    system "gem install bundler --conservative"
+    system "bundle check || bundle install"
+  end
 
   # puts "\n== Copying sample files =="
   # unless File.exist?("config/database.yml")
-  #   system "cp config/database.yml.sample config/database.yml"
+  #   cp "config/database.yml.sample", "config/database.yml"
   # end
 
   puts "\n== Preparing database =="
-  system "bin/rake db:reset"
+
+  if rails5?
+    system! "bin/rails db:setup"
+  else
+    system "bin/rake db:reset"
+  end
 
   puts "\n== Removing old logs and tempfiles =="
-  system "rm -f log/*"
-  system "rm -rf tmp/cache"
+
+  if rails5?
+    system! "bin/rails log:clear tmp:clear"
+  else
+    system "rm -f log/*"
+    system "rm -rf tmp/cache"
+  end
 
   puts "\n== Restarting application server =="
-  system "touch tmp/restart.txt"
+
+  if rails5?
+    system! "bin/rails restart"
+  else
+    system "touch tmp/restart.txt"
+  end
 end
diff --git a/bin/update b/bin/update
new file mode 100755
index 0000000000000000000000000000000000000000..a8e4462f20340b73db6df04da3a3fa0dd842713f
--- /dev/null
+++ b/bin/update
@@ -0,0 +1,29 @@
+#!/usr/bin/env ruby
+require 'pathname'
+require 'fileutils'
+include FileUtils
+
+# path to your application root.
+APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
+
+def system!(*args)
+  system(*args) || abort("\n== Command #{args} failed ==")
+end
+
+chdir APP_ROOT do
+  # This script is a way to update your development environment automatically.
+  # Add necessary update steps to this file.
+
+  puts '== Installing dependencies =='
+  system! 'gem install bundler --conservative'
+  system('bundle check') || system!('bundle install')
+
+  puts "\n== Updating database =="
+  system! 'bin/rails db:migrate'
+
+  puts "\n== Removing old logs and tempfiles =="
+  system! 'bin/rails log:clear tmp:clear'
+
+  puts "\n== Restarting application server =="
+  system! 'bin/rails restart'
+end
diff --git a/config/boot.rb b/config/boot.rb
index f2830ae3166dc7fc2849feff72258dccca1e5f97..84f390f3228cfdf3639db352842ea9590fada7c1 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -1,6 +1,11 @@
-require 'rubygems'
+def rails5?
+  %w[1 true].include?(ENV["RAILS5"])
+end
 
-# Set up gems listed in the Gemfile.
-ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
+require 'rubygems' unless rails5?
+
+gemfile = rails5? ? "Gemfile.rails5" : "Gemfile"
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../#{gemfile}", __dir__)
 
+# Set up gems listed in the Gemfile.
 require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
diff --git a/config/environment.rb b/config/environment.rb
index df3006d349c2ce2456c6225cb0fcdf1f621c4390..487a4564b4774823e62dbede689863e5c1092dd1 100644
--- a/config/environment.rb
+++ b/config/environment.rb
@@ -1,5 +1,11 @@
 # Load the rails application
-require File.expand_path('../application', __FILE__)
+
+# Remove this condition when upgraded to rails 5.0.
+if %w[1 true].include?(ENV["RAILS5"])
+  require_relative 'application'
+else
+  require File.expand_path('../application', __FILE__)
+end
 
 # Initialize the rails application
 Rails.application.initialize!
diff --git a/config/environments/production.rb b/config/environments/production.rb
index c5cbfcf64cfd3ebfcda210e7b4bcc65956cc7c11..9941987929ca4103dac86a9be3ae9b5d6c6187e1 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -9,7 +9,11 @@
   config.action_controller.perform_caching = true
 
   # Disable Rails's static asset server (Apache or nginx will already do this)
-  config.serve_static_files = false
+  if Gitlab.rails5?
+    config.public_file_server.enabled = false
+  else
+    config.serve_static_files = false
+  end
 
   # Compress JavaScripts and CSS.
   config.assets.js_compressor = :uglifier
diff --git a/config/environments/test.rb b/config/environments/test.rb
index d09e51e766aa6c6d033398457be97ce142cf1b3a..1849c984351ef5d71f620e154180733e2ec65eff 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -18,7 +18,13 @@
 
   # Configure static asset server for tests with Cache-Control for performance
   config.assets.compile = false if ENV['CI']
-  config.serve_static_files = true
+
+  if Gitlab.rails5?
+    config.public_file_server.enabled = true
+  else
+    config.serve_static_files = true
+  end
+
   config.static_cache_control = "public, max-age=3600"
 
   # Show full error reports and disable caching
diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a65f8aecf9ea80fcd265ace29701144441fbe911
--- /dev/null
+++ b/config/initializers/application_controller_renderer.rb
@@ -0,0 +1,12 @@
+# Remove this `if` condition when upgraded to rails 5.0.
+# The body must be kept.
+if Gitlab.rails5?
+  # Be sure to restart your server when you modify this file.
+
+  # ActiveSupport::Reloader.to_prepare do
+  #   ApplicationController.renderer.defaults.merge!(
+  #     http_host: 'example.org',
+  #     https: false
+  #   )
+  # end
+end
diff --git a/config/initializers/new_framework_defaults.rb b/config/initializers/new_framework_defaults.rb
new file mode 100644
index 0000000000000000000000000000000000000000..2d130bc0bf8a9ee145dbec431f9b7f63c101c62f
--- /dev/null
+++ b/config/initializers/new_framework_defaults.rb
@@ -0,0 +1,29 @@
+# Remove this `if` condition when upgraded to rails 5.0.
+# The body must be kept.
+if Gitlab.rails5?
+  # Be sure to restart your server when you modify this file.
+  #
+  # This file contains migration options to ease your Rails 5.0 upgrade.
+  #
+  # Once upgraded flip defaults one by one to migrate to the new default.
+  #
+  # Read the Guide for Upgrading Ruby on Rails for more info on each option.
+
+  Rails.application.config.action_controller.raise_on_unfiltered_parameters = true
+
+  # Enable per-form CSRF tokens. Previous versions had false.
+  Rails.application.config.action_controller.per_form_csrf_tokens = false
+
+  # Enable origin-checking CSRF mitigation. Previous versions had false.
+  Rails.application.config.action_controller.forgery_protection_origin_check = false
+
+  # Make Ruby 2.4 preserve the timezone of the receiver when calling `to_time`.
+  # Previous versions had false.
+  ActiveSupport.to_time_preserves_timezone = false
+
+  # Require `belongs_to` associations by default. Previous versions had false.
+  Rails.application.config.active_record.belongs_to_required_by_default = false
+
+  # Do not halt callback chains when a callback returns false. Previous versions had true.
+  ActiveSupport.halt_callback_chains_on_return_false = true
+end
diff --git a/config/spring.rb b/config/spring.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c9119b40c08eff8aef2d607f5bf42424483cbd15
--- /dev/null
+++ b/config/spring.rb
@@ -0,0 +1,6 @@
+%w(
+  .ruby-version
+  .rbenv-vars
+  tmp/restart.txt
+  tmp/caching-dev.txt
+).each { |path| Spring.watch(path) }