diff --git a/ChangeLog b/ChangeLog
index 66a1f78a9d..e7b252ed9c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Sep 28 09:57:48 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* lib/rubygems.rb, lib/rubygems/*, test/rubygems/*: Update
+	  rubygems to 2.6.7.
+	  Release note of 2.6.7: https://github.com/rubygems/rubygems/commit/60f35bd1d2359fc30301d2d4cd72bc6833e8d12a
+
 Wed Sep 28 00:21:00 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* error.c (rb_warning_s_warn): the argument must be an
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
index ce9dc6a66a..487d7de2ff 100644
--- a/lib/rubygems.rb
+++ b/lib/rubygems.rb
@@ -10,7 +10,7 @@ require 'rbconfig'
 require 'thread'
 
 module Gem
-  VERSION = '2.6.6'
+  VERSION = '2.6.7'
 end
 
 # Must be first since it unloads the prelude from 1.9.2
@@ -296,7 +296,10 @@ module Gem
 
   def self.activate_bin_path name, exec_name, requirement # :nodoc:
     spec = find_spec_for_exe name, exec_name, [requirement]
-    Gem::LOADED_SPECS_MUTEX.synchronize { spec.activate }
+    Gem::LOADED_SPECS_MUTEX.synchronize do
+      spec.activate
+      finish_resolve
+    end
     spec.bin_file exec_name
   end
 
@@ -593,7 +596,6 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
   # Zlib::GzipReader wrapper that unzips +data+.
 
   def self.gunzip(data)
-    require 'rubygems/util'
     Gem::Util.gunzip data
   end
 
@@ -601,7 +603,6 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
   # Zlib::GzipWriter wrapper that zips +data+.
 
   def self.gzip(data)
-    require 'rubygems/util'
     Gem::Util.gzip data
   end
 
@@ -609,7 +610,6 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
   # A Zlib::Inflate#inflate wrapper
 
   def self.inflate(data)
-    require 'rubygems/util'
     Gem::Util.inflate data
   end
 
@@ -971,7 +971,8 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
   # default_sources if the sources list is empty.
 
   def self.sources
-    @sources ||= Gem::SourceList.from(default_sources)
+    source_list = configuration.sources || default_sources
+    @sources ||= Gem::SourceList.from(source_list)
   end
 
   ##
@@ -1146,8 +1147,6 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
     path = path.dup
 
     if path == "-" then
-      require 'rubygems/util'
-
       Gem::Util.traverse_parents Dir.pwd do |directory|
         dep_file = GEM_DEP_FILES.find { |f| File.file?(f) }
 
@@ -1166,18 +1165,24 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
       raise ArgumentError, "Unable to find gem dependencies file at #{path}"
     end
 
-    rs = Gem::RequestSet.new
-    @gemdeps = rs.load_gemdeps path
-
-    rs.resolve_current.map do |s|
-      sp = s.full_spec
-      sp.activate
-      sp
+    ENV["BUNDLE_GEMFILE"] ||= File.expand_path(path)
+    require 'rubygems/user_interaction'
+    Gem::DefaultUserInteraction.use_ui(ui) do
+      require "bundler/postit_trampoline" unless ENV["BUNDLE_DISABLE_POSTIT"]
+      require "bundler"
+      @gemdeps = Bundler.setup
+      Bundler.ui = nil
+      @gemdeps.requested_specs.map(&:to_spec).sort_by(&:name)
+    end
+  rescue => e
+    case e
+    when Gem::LoadError, Gem::UnsatisfiableDependencyError, (defined?(Bundler::GemNotFound) ? Bundler::GemNotFound : Gem::LoadError)
+      warn e.message
+      warn "You may need to `gem install -g` to install missing gems"
+      warn ""
+    else
+      raise
     end
-  rescue Gem::LoadError, Gem::UnsatisfiableDependencyError => e
-    warn e.message
-    warn "You may need to `gem install -g` to install missing gems"
-    warn ""
   end
 
   class << self
@@ -1223,6 +1228,8 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
         prefix_pattern = /^(#{prefix_group})/
       end
 
+      suffix_pattern = /#{Regexp.union(Gem.suffixes)}\z/
+
       spec.files.each do |file|
         if new_format
           file = file.sub(prefix_pattern, "")
@@ -1230,6 +1237,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
         end
 
         @path_to_default_spec_map[file] = spec
+        @path_to_default_spec_map[file.sub(suffix_pattern, "")] = spec
       end
     end
 
@@ -1237,11 +1245,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
     # Find a Gem::Specification of default gem from +path+
 
     def find_unresolved_default_spec(path)
-      Gem.suffixes.each do |suffix|
-        spec = @path_to_default_spec_map["#{path}#{suffix}"]
-        return spec if spec
-      end
-      nil
+      @path_to_default_spec_map[path]
     end
 
     ##
@@ -1327,6 +1331,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
   autoload :SourceList,         'rubygems/source_list'
   autoload :SpecFetcher,        'rubygems/spec_fetcher'
   autoload :Specification,      'rubygems/specification'
+  autoload :Util,               'rubygems/util'
   autoload :Version,            'rubygems/version'
 
   require "rubygems/specification"
diff --git a/lib/rubygems/commands/owner_command.rb b/lib/rubygems/commands/owner_command.rb
index 4b99434e87..8e2271657a 100644
--- a/lib/rubygems/commands/owner_command.rb
+++ b/lib/rubygems/commands/owner_command.rb
@@ -40,7 +40,9 @@ permission to.
       options[:remove] << value
     end
 
-    add_option '-h', '--host HOST', 'Use another gemcutter-compatible host' do |value, options|
+    add_option '-h', '--host HOST',
+               'Use another gemcutter-compatible host',
+               '  (e.g. https://rubygems.org)' do |value, options|
       options[:host] = value
     end
   end
diff --git a/lib/rubygems/commands/push_command.rb b/lib/rubygems/commands/push_command.rb
index 6adeff6b30..d294cbc8df 100644
--- a/lib/rubygems/commands/push_command.rb
+++ b/lib/rubygems/commands/push_command.rb
@@ -33,7 +33,8 @@ command.  For further discussion see the help for the yank command.
     add_key_option
 
     add_option('--host HOST',
-               'Push to another gemcutter-compatible host') do |value, options|
+               'Push to another gemcutter-compatible host',
+               '  (e.g. https://rubygems.org)') do |value, options|
       options[:host] = value
     end
 
diff --git a/lib/rubygems/commands/query_command.rb b/lib/rubygems/commands/query_command.rb
index f25d120b88..813154fa23 100644
--- a/lib/rubygems/commands/query_command.rb
+++ b/lib/rubygems/commands/query_command.rb
@@ -255,22 +255,21 @@ is too hard to use.
         name_tuples.map { |n| n.version }.uniq
       else
         platforms.sort.reverse.map do |version, pls|
-          if pls == [Gem::Platform::RUBY] then
-            if options[:domain] == :remote || specs.all? { |spec| spec.is_a? Gem::Source }
-              version
-            else
-              spec = specs.select { |s| s.version == version }
-              if spec.first.default_gem?
-                "default: #{version}"
-              else
-                version
-              end
+          out = version.to_s
+
+          if options[:domain] == :local
+            default = specs.any? do |s|
+              !s.is_a?(Gem::Source) && s.version == version && s.default_gem?
             end
-          else
-            ruby = pls.delete Gem::Platform::RUBY
-            platform_list = [ruby, *pls.sort].compact
-            "#{version} #{platform_list.join ' '}"
+            out = "default: #{out}" if default
           end
+
+          if pls != [Gem::Platform::RUBY] then
+            platform_list = [pls.delete(Gem::Platform::RUBY), *pls.sort].compact
+            out = platform_list.unshift(out).join(' ')
+          end
+
+          out
         end
       end
 
diff --git a/lib/rubygems/commands/setup_command.rb b/lib/rubygems/commands/setup_command.rb
index ebb08d24d7..1fff2a7dcb 100644
--- a/lib/rubygems/commands/setup_command.rb
+++ b/lib/rubygems/commands/setup_command.rb
@@ -142,6 +142,8 @@ By default, this RubyGems will install gem as:
 
     remove_old_lib_files lib_dir
 
+    install_default_gemspec
+
     say "RubyGems #{Gem::VERSION} installed"
 
     uninstall_old_gemcutter
@@ -202,59 +204,65 @@ By default, this RubyGems will install gem as:
     end
   end
 
-  def install_executables(bin_dir)
-    say "Installing gem executable" if @verbose
 
+  def install_executables(bin_dir)
     @bin_file_names = []
 
-    Dir.chdir 'bin' do
-      bin_files = Dir['*']
+    {
+      'gem' => 'bin',
+      'bundler' => 'bundler/exe',
+    }.each do |tool, path|
+      say "Installing #{tool} executable" if @verbose
 
-      bin_files.delete 'update_rubygems'
+      Dir.chdir path do
+        bin_files = Dir['*']
 
-      bin_files.each do |bin_file|
-        bin_file_formatted = if options[:format_executable] then
-                               Gem.default_exec_format % bin_file
-                             else
-                               bin_file
-                             end
+        bin_files -= %w[update_rubygems bundler bundle_ruby]
 
-        dest_file = File.join bin_dir, bin_file_formatted
-        bin_tmp_file = File.join Dir.tmpdir, "#{bin_file}.#{$$}"
+        bin_files.each do |bin_file|
+          bin_file_formatted = if options[:format_executable] then
+                                 Gem.default_exec_format % bin_file
+                               else
+                                 bin_file
+                               end
 
-        begin
-          bin = File.readlines bin_file
-          bin[0] = "#!#{Gem.ruby}\n"
+          dest_file = File.join bin_dir, bin_file_formatted
+          bin_tmp_file = File.join Dir.tmpdir, "#{bin_file}.#{$$}"
 
-          File.open bin_tmp_file, 'w' do |fp|
-            fp.puts bin.join
+          begin
+            bin = File.readlines bin_file
+            bin[0] = "#!#{Gem.ruby}\n"
+
+            File.open bin_tmp_file, 'w' do |fp|
+              fp.puts bin.join
+            end
+
+            install bin_tmp_file, dest_file, :mode => 0755
+            @bin_file_names << dest_file
+          ensure
+            rm bin_tmp_file
           end
 
-          install bin_tmp_file, dest_file, :mode => 0755
-          @bin_file_names << dest_file
-        ensure
-          rm bin_tmp_file
-        end
+          next unless Gem.win_platform?
 
-        next unless Gem.win_platform?
+          begin
+            bin_cmd_file = File.join Dir.tmpdir, "#{bin_file}.bat"
 
-        begin
-          bin_cmd_file = File.join Dir.tmpdir, "#{bin_file}.bat"
+            File.open bin_cmd_file, 'w' do |file|
+              file.puts <<-TEXT
+  @ECHO OFF
+  IF NOT "%~f0" == "~f0" GOTO :WinNT
+  @"#{File.basename(Gem.ruby).chomp('"')}" "#{dest_file}" %1 %2 %3 %4 %5 %6 %7 %8 %9
+  GOTO :EOF
+  :WinNT
+  @"#{File.basename(Gem.ruby).chomp('"')}" "%~dpn0" %*
+  TEXT
+            end
 
-          File.open bin_cmd_file, 'w' do |file|
-            file.puts <<-TEXT
-@ECHO OFF
-IF NOT "%~f0" == "~f0" GOTO :WinNT
-@"#{File.basename(Gem.ruby).chomp('"')}" "#{dest_file}" %1 %2 %3 %4 %5 %6 %7 %8 %9
-GOTO :EOF
-:WinNT
-@"#{File.basename(Gem.ruby).chomp('"')}" "%~dpn0" %*
-TEXT
+            install bin_cmd_file, "#{dest_file}.bat", :mode => 0755
+          ensure
+            rm bin_cmd_file
           end
-
-          install bin_cmd_file, "#{dest_file}.bat", :mode => 0755
-        ensure
-          rm bin_cmd_file
         end
       end
     end
@@ -269,18 +277,23 @@ TEXT
   end
 
   def install_lib(lib_dir)
-    say "Installing RubyGems" if @verbose
+    {
+      'RubyGems' => 'lib',
+      'Bundler' => 'bundler/lib'
+    }.each do |tool, path|
+      say "Installing #{tool}" if @verbose
 
-    lib_files = rb_files_in 'lib'
-    pem_files = pem_files_in 'lib'
+      lib_files = rb_files_in path
+      pem_files = pem_files_in path
 
-    Dir.chdir 'lib' do
-      lib_files.each do |lib_file|
-        install_file lib_file, lib_dir
-      end
+      Dir.chdir path do
+        lib_files.each do |lib_file|
+          install_file lib_file, lib_dir
+        end
 
-      pem_files.each do |pem_file|
-        install_file pem_file, lib_dir
+        pem_files.each do |pem_file|
+          install_file pem_file, lib_dir
+        end
       end
     end
   end
@@ -326,6 +339,19 @@ TEXT
     return false
   end
 
+  def install_default_gemspec
+    Dir.chdir("bundler") do
+      bundler_spec = Gem::Specification.load("bundler.gemspec")
+      bundler_spec.files = Dir["{*.md,{lib,exe,man}/**/*}"]
+      bundler_spec.executables -= %w[bundler bundle_ruby]
+      Dir.entries(Gem::Specification.default_specifications_dir).
+        select {|gs| gs.start_with?("bundler-") }.
+        each {|gs| File.delete(File.join(Gem::Specification.default_specifications_dir, gs)) }
+      default_spec_path = File.join(Gem::Specification.default_specifications_dir, "#{bundler_spec.full_name}.gemspec")
+      Gem.write_binary(default_spec_path, bundler_spec.to_ruby)
+    end
+  end
+
   def make_destination_dirs(install_destdir)
     lib_dir, bin_dir = Gem.default_rubygems_dirs
 
@@ -416,23 +442,27 @@ abort "#{deprecation_message}"
   end
 
   def remove_old_lib_files lib_dir
-    rubygems_dir = File.join lib_dir, 'rubygems'
-    lib_files = rb_files_in 'lib/rubygems'
+    {
+      File.join(lib_dir, 'rubygems') => 'lib/rubygems',
+      File.join(lib_dir, 'bundler') => 'bundler/lib/bundler',
+    }.each do |old_lib_dir, new_lib_dir|
+      lib_files = rb_files_in(new_lib_dir)
 
-    old_lib_files = rb_files_in rubygems_dir
+      old_lib_files = rb_files_in(old_lib_dir)
 
-    to_remove = old_lib_files - lib_files
+      to_remove = old_lib_files - lib_files
 
-    to_remove.delete_if do |file|
-      file.start_with? 'defaults'
-    end
+      to_remove.delete_if do |file|
+        file.start_with? 'defaults'
+      end
 
-    Dir.chdir rubygems_dir do
-      to_remove.each do |file|
-        FileUtils.rm_f file
+      Dir.chdir old_lib_dir do
+        to_remove.each do |file|
+          FileUtils.rm_f file
 
-        warn "unable to remove old file #{file} please remove it by hand" if
-          File.exist? file
+          warn "unable to remove old file #{file} please remove it by hand" if
+            File.exist? file
+        end
       end
     end
   end
@@ -481,4 +511,3 @@ abort "#{deprecation_message}"
   end
 
 end
-
diff --git a/lib/rubygems/commands/yank_command.rb b/lib/rubygems/commands/yank_command.rb
index 0d6575b272..36809cbd57 100644
--- a/lib/rubygems/commands/yank_command.rb
+++ b/lib/rubygems/commands/yank_command.rb
@@ -42,7 +42,8 @@ as the reason for the removal request.
     add_platform_option("remove")
 
     add_option('--host HOST',
-               'Yank from another gemcutter-compatible host') do |value, options|
+               'Yank from another gemcutter-compatible host',
+               '  (e.g. https://rubygems.org)') do |value, options|
       options[:host] = value
     end
 
diff --git a/lib/rubygems/config_file.rb b/lib/rubygems/config_file.rb
index 3a5e7718df..c95d7dd1f1 100644
--- a/lib/rubygems/config_file.rb
+++ b/lib/rubygems/config_file.rb
@@ -143,6 +143,10 @@ class Gem::ConfigFile
 
   attr_accessor :ssl_ca_cert
 
+  ##
+  # sources to look for gems
+  attr_accessor :sources
+
   ##
   # Path name of directory or file of openssl client certificate, used for remote https connection with client authentication
 
@@ -216,6 +220,7 @@ class Gem::ConfigFile
     @update_sources             = @hash[:update_sources]             if @hash.key? :update_sources
     @verbose                    = @hash[:verbose]                    if @hash.key? :verbose
     @disable_default_gem_server = @hash[:disable_default_gem_server] if @hash.key? :disable_default_gem_server
+    @sources                    = @hash[:sources]                    if @hash.key? :sources
 
     @ssl_verify_mode  = @hash[:ssl_verify_mode]  if @hash.key? :ssl_verify_mode
     @ssl_ca_cert      = @hash[:ssl_ca_cert]      if @hash.key? :ssl_ca_cert
@@ -224,7 +229,6 @@ class Gem::ConfigFile
     @api_keys         = nil
     @rubygems_api_key = nil
 
-    Gem.sources = @hash[:sources] if @hash.key? :sources
     handle_arguments arg_list
   end
 
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index aa56ab5ec4..d23a6fe90a 100755
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -41,8 +41,7 @@ module Kernel
 
     path = path.to_path if path.respond_to? :to_path
 
-    spec = Gem.find_unresolved_default_spec(path)
-    if spec
+    if spec = Gem.find_unresolved_default_spec(path)
       Gem.remove_unresolved_default_spec(spec)
       gem(spec.name)
     end
@@ -61,12 +60,10 @@ module Kernel
     #--
     # TODO request access to the C implementation of this to speed up RubyGems
 
-    spec = Gem::Specification.find_active_stub_by_path path
-
-    begin
+    if Gem::Specification.find_active_stub_by_path(path)
       RUBYGEMS_ACTIVATION_MONITOR.exit
       return gem_original_require(path)
-    end if spec
+    end
 
     # Attempt to find +path+ in any unresolved gems...
 
@@ -104,7 +101,7 @@ module Kernel
 
       # Ok, now find a gem that has no conflicts, starting
       # at the highest version.
-      valid = found_specs.reject { |s| s.has_conflicts? }.first
+      valid = found_specs.find { |s| !s.has_conflicts? }
 
       unless valid then
         le = Gem::LoadError.new "unable to find a version of '#{names.first}' to activate"
@@ -138,4 +135,3 @@ module Kernel
   private :require
 
 end
-
diff --git a/lib/rubygems/exceptions.rb b/lib/rubygems/exceptions.rb
index 9089eae4d5..b7528761fc 100644
--- a/lib/rubygems/exceptions.rb
+++ b/lib/rubygems/exceptions.rb
@@ -154,6 +154,12 @@ class Gem::ImpossibleDependenciesError < Gem::Exception
 end
 
 class Gem::InstallError < Gem::Exception; end
+class Gem::RuntimeRequirementNotMetError < Gem::InstallError
+  attr_accessor :suggestion
+  def message
+    [suggestion, super].compact.join("\n\t")
+  end
+end
 
 ##
 # Potentially raised when a specification is validated.
diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb
index 6e77185547..bd2eed19de 100644
--- a/lib/rubygems/installer.rb
+++ b/lib/rubygems/installer.rb
@@ -282,18 +282,23 @@ class Gem::Installer
 
     run_pre_install_hooks
 
+    # Set loaded_from to ensure extension_dir is correct
+    if @options[:install_as_default] then
+      spec.loaded_from = default_spec_file
+    else
+      spec.loaded_from = spec_file
+    end
+
     # Completely remove any previous gem files
     FileUtils.rm_rf gem_dir
     FileUtils.rm_rf spec.extension_dir
 
     FileUtils.mkdir_p gem_dir
 
-    if @options[:install_as_default]
-      spec.loaded_from = default_spec_file
+    if @options[:install_as_default] then
       extract_bin
       write_default_spec
     else
-      spec.loaded_from = spec_file
       extract_files
 
       build_extensions
@@ -603,7 +608,8 @@ class Gem::Installer
   def ensure_required_ruby_version_met # :nodoc:
     if rrv = spec.required_ruby_version then
       unless rrv.satisfied_by? Gem.ruby_version then
-        raise Gem::InstallError, "#{spec.name} requires Ruby version #{rrv}."
+        raise Gem::RuntimeRequirementNotMetError,
+          "#{spec.name} requires Ruby version #{rrv}."
       end
     end
   end
@@ -611,7 +617,7 @@ class Gem::Installer
   def ensure_required_rubygems_version_met # :nodoc:
     if rrgv = spec.required_rubygems_version then
       unless rrgv.satisfied_by? Gem.rubygems_version then
-        raise Gem::InstallError,
+        raise Gem::RuntimeRequirementNotMetError,
           "#{spec.name} requires RubyGems version #{rrgv}. " +
           "Try 'gem update --system' to update RubyGems itself."
       end
diff --git a/lib/rubygems/remote_fetcher.rb b/lib/rubygems/remote_fetcher.rb
index da4db724a1..e6a13d4b8c 100644
--- a/lib/rubygems/remote_fetcher.rb
+++ b/lib/rubygems/remote_fetcher.rb
@@ -260,6 +260,9 @@ class Gem::RemoteFetcher
          Net::HTTPTemporaryRedirect then
       raise FetchError.new('too many redirects', uri) if depth > 10
 
+      unless location = response['Location']
+        raise FetchError.new("redirecting but no redirect location was given", uri)
+      end
       location = URI.parse response['Location']
 
       if https?(uri) && !https?(location)
diff --git a/lib/rubygems/request_set.rb b/lib/rubygems/request_set.rb
index 5541e64b88..49e56ae6fb 100644
--- a/lib/rubygems/request_set.rb
+++ b/lib/rubygems/request_set.rb
@@ -163,9 +163,26 @@ class Gem::RequestSet
         end
       end
 
-      spec = req.spec.install options do |installer|
-        yield req, installer if block_given?
-      end
+      spec =
+        begin
+          req.spec.install options do |installer|
+            yield req, installer if block_given?
+          end
+        rescue Gem::RuntimeRequirementNotMetError => e
+          recent_match = req.spec.set.find_all(req.request).sort_by(&:version).reverse_each.find do |s|
+            s = s.spec
+            s.required_ruby_version.satisfied_by?(Gem.ruby_version) && s.required_rubygems_version.satisfied_by?(Gem.rubygems_version)
+          end
+          if recent_match
+            suggestion = "The last version of #{req.request} to support your ruby & rubygems was #{recent_match.version}. Try installing it with `gem install #{recent_match.name} -v #{recent_match.version}`"
+            suggestion += " and then running the current command again" unless @always_install.any? { |spec| spec == req.spec.spec }
+          else
+            suggestion = "There are no versions of #{req.request} compatible with your ruby & rubygems"
+            suggestion += ". Maybe try installing an older version of the gem you're looking for?" unless @always_install.any? { |spec| spec == req.spec.spec }
+          end
+          e.suggestion = suggestion
+          raise
+        end
 
       requests << spec
     end
diff --git a/lib/rubygems/resolver.rb b/lib/rubygems/resolver.rb
index 50a547e1be..0a3276daab 100644
--- a/lib/rubygems/resolver.rb
+++ b/lib/rubygems/resolver.rb
@@ -233,8 +233,29 @@ class Gem::Resolver
       exc.errors = @set.errors
       raise exc
     end
-    possibles.sort_by { |s| [s.source, s.version, Gem::Platform.local =~ s.platform ? 1 : 0] }.
-      map { |s| ActivationRequest.new s, dependency, [] }
+
+    sources = []
+
+    groups = Hash.new { |hash, key| hash[key] = [] }
+
+    possibles.each do |spec|
+      source = spec.source
+
+      sources << source unless sources.include? source
+
+      groups[source] << spec
+    end
+
+    activation_requests = []
+
+    sources.sort.each do |source|
+      groups[source].
+        sort_by { |spec| [spec.version, Gem::Platform.local =~ spec.platform ? 1 : 0] }.
+        map { |spec| ActivationRequest.new spec, dependency, [] }.
+        each { |activation_request| activation_requests << activation_request }
+    end
+
+    activation_requests
   end
 
   def dependencies_for(specification)
diff --git a/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb b/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb
index 1a82da0e7a..4170b00af0 100644
--- a/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb
+++ b/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb
@@ -1,5 +1,5 @@
 # frozen_string_literal: true
 module Gem::Resolver::Molinillo
   # The version of Gem::Resolver::Molinillo.
-  VERSION = '0.5.0'.freeze
+  VERSION = '0.5.1'.freeze
 end
diff --git a/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb b/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb
index 1fb7a1e921..e6565119ef 100644
--- a/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb
+++ b/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb
@@ -184,6 +184,8 @@ module Gem::Resolver::Molinillo
           raise VersionConflict.new(c) unless state
           activated.rewind_to(sliced_states.first || :initial_state) if sliced_states
           state.conflicts = c
+          index = states.size - 1
+          @parent_of.reject! { |_, i| i >= index }
         end
       end
 
@@ -209,7 +211,10 @@ module Gem::Resolver::Molinillo
       # @return [Object] the requirement that led to `requirement` being added
       #   to the list of requirements.
       def parent_of(requirement)
-        @parent_of[requirement]
+        return unless requirement
+        return unless index = @parent_of[requirement]
+        return unless parent_state = @states[index]
+        parent_state.requirement
       end
 
       # @return [Object] the requirement that led to a version of a possibility
@@ -418,7 +423,8 @@ module Gem::Resolver::Molinillo
         debug(depth) { "Requiring nested dependencies (#{nested_dependencies.join(', ')})" }
         nested_dependencies.each do |d|
           activated.add_child_vertex(name_for(d), nil, [name_for(activated_spec)], d)
-          @parent_of[d] = requirement
+          parent_index = states.size - 1
+          @parent_of[d] ||= parent_index
         end
 
         push_state_for_requirements(requirements + nested_dependencies, !nested_dependencies.empty?)
diff --git a/lib/rubygems/source.rb b/lib/rubygems/source.rb
index 85f5268fa3..4f07beb1f4 100644
--- a/lib/rubygems/source.rb
+++ b/lib/rubygems/source.rb
@@ -67,7 +67,11 @@ class Gem::Source
 
       return -1 if !other.uri
 
-      @uri.to_s <=> other.uri.to_s
+      # Returning 1 here ensures that when sorting a list of sources, the
+      # original ordering of sources supplied by the user is preserved.
+      return 1 unless @uri.to_s == other.uri.to_s
+
+      0
     else
       nil
     end
diff --git a/lib/rubygems/spec_fetcher.rb b/lib/rubygems/spec_fetcher.rb
index 755d4be1eb..919276e113 100644
--- a/lib/rubygems/spec_fetcher.rb
+++ b/lib/rubygems/spec_fetcher.rb
@@ -184,10 +184,10 @@ class Gem::SpecFetcher
   # Suggests gems based on the supplied +gem_name+. Returns an array of
   # alternative gem names.
 
-  def suggest_gems_from_name gem_name
+  def suggest_gems_from_name(gem_name, type = :latest)
     gem_name        = gem_name.downcase.tr('_-', '')
     max             = gem_name.size / 2
-    names           = available_specs(:latest).first.values.flatten(1)
+    names           = available_specs(type).first.values.flatten(1)
 
     matches = names.map { |n|
       next unless n.match_platform?
@@ -201,7 +201,11 @@ class Gem::SpecFetcher
       [n.name, distance]
     }.compact
 
-    matches = matches.uniq.sort_by { |name, dist| dist }
+    matches = if matches.empty? && type != :prerelease
+      suggest_gems_from_name gem_name, :prerelease
+    else
+      matches.uniq.sort_by { |name, dist| dist }
+    end
 
     matches.first(5).map { |name, dist| name }
   end
diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb
index f7ae97cd8d..3e1924ac63 100644
--- a/lib/rubygems/test_case.rb
+++ b/lib/rubygems/test_case.rb
@@ -25,6 +25,7 @@ unless Gem::Dependency.new('rdoc', '>= 3.10').matching_specs.empty?
   gem 'json'
 end
 
+require 'bundler'
 require 'minitest/autorun'
 
 require 'rubygems/deprecate'
@@ -222,17 +223,25 @@ class Gem::TestCase < MiniTest::Unit::TestCase
     @orig_gem_vendor = ENV['GEM_VENDOR']
     @orig_gem_spec_cache = ENV['GEM_SPEC_CACHE']
     @orig_rubygems_gemdeps = ENV['RUBYGEMS_GEMDEPS']
+    @orig_bundle_gemfile   = ENV['BUNDLE_GEMFILE']
     @orig_rubygems_host = ENV['RUBYGEMS_HOST']
+    @orig_bundle_disable_postit = ENV['BUNDLE_DISABLE_POSTIT']
     ENV.keys.find_all { |k| k.start_with?('GEM_REQUIREMENT_') }.each do |k|
       ENV.delete k
     end
     @orig_gem_env_requirements = ENV.to_hash
 
     ENV['GEM_VENDOR'] = nil
+    ENV['BUNDLE_DISABLE_POSTIT'] = 'true'
 
     @current_dir = Dir.pwd
     @fetcher     = nil
-    @ui          = Gem::MockGemUi.new
+
+    Bundler.ui                     = Bundler::UI::Silent.new
+    @ui                            = Gem::MockGemUi.new
+    # This needs to be a new instance since we call use_ui(@ui) when we want to
+    # capture output
+    Gem::DefaultUserInteraction.ui = Gem::MockGemUi.new
 
     tmpdir = File.expand_path Dir.tmpdir
     tmpdir.untaint
@@ -323,6 +332,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
     Gem.loaded_specs.clear
     Gem.clear_default_specs
     Gem::Specification.unresolved_deps.clear
+    Bundler.reset!
 
     Gem.configuration.verbose = true
     Gem.configuration.update_sources = true
@@ -394,7 +404,9 @@ class Gem::TestCase < MiniTest::Unit::TestCase
     ENV['GEM_VENDOR'] = @orig_gem_vendor
     ENV['GEM_SPEC_CACHE'] = @orig_gem_spec_cache
     ENV['RUBYGEMS_GEMDEPS'] = @orig_rubygems_gemdeps
+    ENV['BUNDLE_GEMFILE']   = @orig_bundle_gemfile
     ENV['RUBYGEMS_HOST'] = @orig_rubygems_host
+    ENV['BUNDLE_DISABLE_POSTIT'] = @orig_bundle_disable_postit
 
     Gem.ruby = @orig_ruby if @orig_ruby
 
diff --git a/lib/rubygems/user_interaction.rb b/lib/rubygems/user_interaction.rb
index 390d0f2aea..cacd782e08 100644
--- a/lib/rubygems/user_interaction.rb
+++ b/lib/rubygems/user_interaction.rb
@@ -7,11 +7,6 @@
 
 require 'rubygems/util'
 
-begin
-  require 'io/console'
-rescue LoadError
-end
-
 ##
 # Module that defines the default UserInteraction.  Any class including this
 # module will have access to the +ui+ method that returns the default UI.
@@ -314,12 +309,21 @@ class Gem::StreamUI
     password
   end
 
-  if IO.method_defined?(:noecho) then
-    def _gets_noecho
-      @ins.noecho {@ins.gets}
+  def require_io_console
+    @require_io_console ||= begin
+      begin
+        require 'io/console'
+      rescue LoadError
+      end
+      true
     end
-  elsif Gem.win_platform?
-    def _gets_noecho
+  end
+
+  def _gets_noecho
+    require_io_console
+    if IO.method_defined?(:noecho) then
+      @ins.noecho {@ins.gets}
+    elsif Gem.win_platform?
       require "Win32API"
       password = ''
 
@@ -332,9 +336,7 @@ class Gem::StreamUI
         end
       end
       password
-    end
-  else
-    def _gets_noecho
+    else
       system "stty -echo"
       begin
         @ins.gets
diff --git a/lib/rubygems/version.rb b/lib/rubygems/version.rb
index 2f6cfae6ed..6eeaafdcc5 100644
--- a/lib/rubygems/version.rb
+++ b/lib/rubygems/version.rb
@@ -237,7 +237,7 @@ class Gem::Version
   end
 
   def hash # :nodoc:
-    @version.hash
+    canonical_segments.hash
   end
 
   def init_with coder # :nodoc:
@@ -331,7 +331,7 @@ class Gem::Version
 
   def <=> other
     return unless Gem::Version === other
-    return 0 if @version == other._version
+    return 0 if @version == other._version || canonical_segments == other.canonical_segments
 
     lhsegments = _segments
     rhsegments = other._segments
@@ -356,6 +356,13 @@ class Gem::Version
     return 0
   end
 
+  def canonical_segments
+    @canonical_segments ||=
+      _split_segments.map! do |segments|
+        segments.reverse_each.drop_while {|s| s == 0 }.reverse
+      end.reduce(&:concat)
+  end
+
   protected
 
   def _version
@@ -371,4 +378,11 @@ class Gem::Version
       /^\d+$/ =~ s ? s.to_i : s
     end.freeze
   end
+
+  def _split_segments
+    string_start = _segments.index {|s| s.is_a?(String) }
+    string_segments  = segments
+    numeric_segments = string_segments.slice!(0, string_start || string_segments.size)
+    return numeric_segments, string_segments
+  end
 end
diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb
index 90695b56d7..b9c0337c0a 100644
--- a/test/rubygems/test_gem.rb
+++ b/test/rubygems/test_gem.rb
@@ -157,6 +157,35 @@ class TestGem < Gem::TestCase
     assert_match 'a-2/bin/exec', Gem.bin_path('a', 'exec', '>= 0')
   end
 
+  def test_activate_bin_path_resolves_eagerly
+    a1 = util_spec 'a', '1' do |s|
+      s.executables = ['exec']
+      s.add_dependency 'b'
+    end
+
+    b1 = util_spec 'b', '1' do |s|
+      s.add_dependency 'c', '2'
+    end
+
+    b2 = util_spec 'b', '2' do |s|
+      s.add_dependency 'c', '1'
+    end
+
+    c1 = util_spec 'c', '1'
+    c2 = util_spec 'c', '2'
+
+    install_specs c1, c2, b1, b2, a1
+
+    Gem.activate_bin_path("a", "exec", ">= 0")
+
+    # If we didn't eagerly resolve, this would activate c-2 and then the
+    # finish_resolve would cause a conflict
+    gem 'c'
+    Gem.finish_resolve
+
+    assert_equal %w(a-1 b-2 c-1), loaded_spec_names
+  end
+
   def test_self_bin_path_no_exec_name
     e = assert_raises ArgumentError do
       Gem.bin_path 'a'
@@ -345,7 +374,7 @@ class TestGem < Gem::TestCase
     begin
       Dir.chdir 'detect/a/b'
 
-      assert_empty Gem.detect_gemdeps
+      assert_equal [BUNDLER_FULL_NAME], Gem.detect_gemdeps.map(&:full_name)
     ensure
       Dir.chdir @tempdir
     end
@@ -961,6 +990,9 @@ class TestGem < Gem::TestCase
 
   def test_self_sources
     assert_equal %w[http://gems.example.com/], Gem.sources
+    Gem.sources = nil
+    Gem.configuration.sources = %w[http://test.example.com/]
+    assert_equal %w[http://test.example.com/], Gem.sources
   end
 
   def test_try_activate_returns_true_for_activated_specs
@@ -1394,7 +1426,7 @@ class TestGem < Gem::TestCase
 
     Gem.detect_gemdeps
 
-    assert_equal %w!a-1 b-1 c-1!, loaded_spec_names
+    assert_equal %W(a-1 b-1 #{BUNDLER_FULL_NAME} c-1), loaded_spec_names
   end
 
   def test_auto_activation_of_detected_gemdeps_file
@@ -1417,10 +1449,40 @@ class TestGem < Gem::TestCase
 
     ENV['RUBYGEMS_GEMDEPS'] = "-"
 
-    assert_equal [a,b,c], Gem.detect_gemdeps.sort_by { |s| s.name }
+    assert_equal [a, b, util_spec("bundler", Bundler::VERSION), c], Gem.detect_gemdeps.sort_by { |s| s.name }
   end
 
   LIB_PATH = File.expand_path "../../../lib".dup.untaint, __FILE__.dup.untaint
+  BUNDLER_LIB_PATH = File.expand_path $LOAD_PATH.find {|lp| File.file?(File.join(lp, "bundler.rb")) }.dup.untaint
+  BUNDLER_FULL_NAME = "bundler-#{Bundler::VERSION}"
+
+  def test_use_gemdeps_uses_bundler_postit_trampoline
+    refute_includes $LOADED_FEATURES, File.join(BUNDLER_LIB_PATH, "bundler/postit_trampoline.rb".dup.untaint)
+    ENV.delete("BUNDLE_DISABLE_POSTIT")
+
+    a = new_spec "a", "1", nil, "lib/a.rb"
+    b = new_spec "b", "1", nil, "lib/b.rb"
+    c = new_spec "c", "1", nil, "lib/c.rb"
+
+    install_specs a, b, c
+
+    path = File.join @tempdir, "gem.deps.rb"
+
+    File.open path, "w" do |f|
+      f.puts "gem 'a'"
+      f.puts "gem 'b'"
+      f.puts "gem 'c'"
+    end
+
+    ENV['RUBYGEMS_GEMDEPS'] = path
+
+    Gem.detect_gemdeps
+
+    assert_equal %W(a-1 b-1 #{BUNDLER_FULL_NAME} c-1), loaded_spec_names
+
+    trampoline_path = RUBY_VERSION > "1.9" ? File.join(BUNDLER_LIB_PATH, "bundler/postit_trampoline.rb".dup.untaint) : "bundler/postit_trampoline.rb"
+    assert_includes $LOADED_FEATURES, trampoline_path
+  end
 
   def test_looks_for_gemdeps_files_automatically_on_start
     util_clear_gems
@@ -1447,9 +1509,9 @@ class TestGem < Gem::TestCase
     ENV['GEM_PATH'] = path
     ENV['RUBYGEMS_GEMDEPS'] = "-"
 
-    out = `#{Gem.ruby.dup.untaint} -I "#{LIB_PATH.untaint}" -rubygems -e "p Gem.loaded_specs.values.map(&:full_name).sort"`
+    out = `#{Gem.ruby.dup.untaint} -I "#{LIB_PATH.untaint}" -I "#{BUNDLER_LIB_PATH.untaint}" -rubygems -e "p Gem.loaded_specs.values.map(&:full_name).sort"`
 
-    assert_equal '["a-1", "b-1", "c-1"]', out.strip
+    assert_equal %W(a-1 b-1 #{BUNDLER_FULL_NAME} c-1).inspect, out.strip
   end
 
   def test_looks_for_gemdeps_files_automatically_on_start_in_parent_dir
@@ -1479,12 +1541,12 @@ class TestGem < Gem::TestCase
 
     Dir.mkdir "sub1"
     out = Dir.chdir "sub1" do
-      `#{Gem.ruby.dup.untaint} -I "#{LIB_PATH.untaint}" -rubygems -e "p Gem.loaded_specs.values.map(&:full_name).sort"`
+      `#{Gem.ruby.dup.untaint} -I "#{LIB_PATH.untaint}" -I "#{BUNDLER_LIB_PATH.untaint}" -rubygems -e "p Gem.loaded_specs.values.map(&:full_name).sort"`
     end
 
     Dir.rmdir "sub1"
 
-    assert_equal '["a-1", "b-1", "c-1"]', out.strip
+    assert_equal %W(a-1 b-1 #{BUNDLER_FULL_NAME} c-1).inspect, out.strip
   end
 
   def test_register_default_spec
@@ -1558,7 +1620,7 @@ class TestGem < Gem::TestCase
 
     Gem.use_gemdeps gem_deps_file
 
-    assert spec.activated?
+    assert_equal %W(a-1 #{BUNDLER_FULL_NAME}), loaded_spec_names
     refute_nil Gem.gemdeps
   end
 
@@ -1619,7 +1681,7 @@ class TestGem < Gem::TestCase
 
     Gem.use_gemdeps
 
-    assert spec.activated?
+    assert_equal %W(a-1 #{BUNDLER_FULL_NAME}), loaded_spec_names
   ensure
     ENV['RUBYGEMS_GEMDEPS'] = rubygems_gemdeps
   end
@@ -1661,8 +1723,14 @@ class TestGem < Gem::TestCase
       io.write 'gem "a"'
     end
 
+    platform = Bundler::GemHelpers.generic_local_platform
+    if platform == Gem::Platform::RUBY
+      platform = ''
+    else
+      platform = " #{platform}"
+    end
     expected = <<-EXPECTED
-Unable to resolve dependency: user requested 'a (>= 0)'
+Could not find gem 'a#{platform}' in any of the gem sources listed in your Gemfile or available on this machine.
 You may need to `gem install -g` to install missing gems
 
     EXPECTED
@@ -1690,7 +1758,7 @@ You may need to `gem install -g` to install missing gems
 
     Gem.use_gemdeps
 
-    assert spec.activated?
+    assert_equal %W(a-1 #{BUNDLER_FULL_NAME}), loaded_spec_names
   ensure
     ENV['RUBYGEMS_GEMDEPS'] = rubygems_gemdeps
   end
diff --git a/test/rubygems/test_gem_commands_query_command.rb b/test/rubygems/test_gem_commands_query_command.rb
index 223f205b2d..329490bb71 100644
--- a/test/rubygems/test_gem_commands_query_command.rb
+++ b/test/rubygems/test_gem_commands_query_command.rb
@@ -557,6 +557,25 @@ EOF
     assert_equal expected, @ui.output
   end
 
+  def test_execute_show_default_gems_with_platform
+    a1 = new_default_spec 'a', 1
+    a1.platform = 'java'
+    install_default_specs a1
+
+    use_ui @ui do
+      @cmd.execute
+    end
+
+    expected = <<-EOF
+
+*** LOCAL GEMS ***
+
+a (default: 1 java)
+EOF
+
+    assert_equal expected, @ui.output
+  end
+
   def test_execute_default_details
     spec_fetcher do |fetcher|
       fetcher.spec 'a', 2
diff --git a/test/rubygems/test_gem_commands_setup_command.rb b/test/rubygems/test_gem_commands_setup_command.rb
index ae3d0500dc..99944cf53e 100644
--- a/test/rubygems/test_gem_commands_setup_command.rb
+++ b/test/rubygems/test_gem_commands_setup_command.rb
@@ -20,6 +20,13 @@ class TestGemCommandsSetupCommand < Gem::TestCase
     open 'lib/rubygems.rb',           'w' do |io| io.puts '# rubygems.rb'  end
     open 'lib/rubygems/test_case.rb', 'w' do |io| io.puts '# test_case.rb' end
     open 'lib/rubygems/ssl_certs/rubygems.org/foo.pem', 'w' do |io| io.puts 'PEM'       end
+
+    FileUtils.mkdir_p 'bundler/exe'
+    FileUtils.mkdir_p 'bundler/lib/bundler'
+
+    open 'bundler/exe/bundle',        'w' do |io| io.puts '# bundle'       end
+    open 'bundler/lib/bundler.rb',    'w' do |io| io.puts '# bundler.rb'   end
+    open 'bundler/lib/bundler/b.rb',  'w' do |io| io.puts '# b.rb'         end
   end
 
   def test_pem_files_in
@@ -40,12 +47,16 @@ class TestGemCommandsSetupCommand < Gem::TestCase
 
       assert_path_exists File.join(dir, 'rubygems.rb')
       assert_path_exists File.join(dir, 'rubygems/ssl_certs/rubygems.org/foo.pem')
+
+      assert_path_exists File.join(dir, 'bundler.rb')
+      assert_path_exists File.join(dir, 'bundler/b.rb')
     end
   end
 
   def test_remove_old_lib_files
     lib                   = File.join @install_dir, 'lib'
     lib_rubygems          = File.join lib, 'rubygems'
+    lib_bundler           = File.join lib, 'bundler'
     lib_rubygems_defaults = File.join lib_rubygems, 'defaults'
 
     securerandom_rb    = File.join lib, 'securerandom.rb'
@@ -55,13 +66,16 @@ class TestGemCommandsSetupCommand < Gem::TestCase
 
     old_builder_rb     = File.join lib_rubygems, 'builder.rb'
     old_format_rb      = File.join lib_rubygems, 'format.rb'
+    old_bundler_c_rb   = File.join lib_bundler,  'c.rb'
 
     FileUtils.mkdir_p lib_rubygems_defaults
+    FileUtils.mkdir_p lib_bundler
 
     open securerandom_rb,    'w' do |io| io.puts '# securerandom.rb'     end
 
     open old_builder_rb,     'w' do |io| io.puts '# builder.rb'          end
     open old_format_rb,      'w' do |io| io.puts '# format.rb'           end
+    open old_bundler_c_rb,   'w' do |io| io.puts '# c.rb'                end
 
     open engine_defaults_rb, 'w' do |io| io.puts '# jruby.rb'            end
     open os_defaults_rb,     'w' do |io| io.puts '# operating_system.rb' end
@@ -70,6 +84,7 @@ class TestGemCommandsSetupCommand < Gem::TestCase
 
     refute_path_exists old_builder_rb
     refute_path_exists old_format_rb
+    refute_path_exists old_bundler_c_rb
 
     assert_path_exists securerandom_rb
     assert_path_exists engine_defaults_rb
diff --git a/test/rubygems/test_gem_config_file.rb b/test/rubygems/test_gem_config_file.rb
index 9b5f0b96f8..e09a76ef98 100644
--- a/test/rubygems/test_gem_config_file.rb
+++ b/test/rubygems/test_gem_config_file.rb
@@ -61,12 +61,11 @@ class TestGemConfigFile < Gem::TestCase
     end
 
     util_config_file
-
     assert_equal true, @cfg.backtrace
     assert_equal 10, @cfg.bulk_threshold
     assert_equal false, @cfg.verbose
     assert_equal false, @cfg.update_sources
-    assert_equal %w[http://more-gems.example.com], Gem.sources
+    assert_equal %w[http://more-gems.example.com], @cfg.sources
     assert_equal '--wrappers', @cfg[:install]
     assert_equal(['/usr/ruby/1.8/lib/ruby/gems/1.8', '/var/ruby/1.8/gem_home'],
                  @cfg.path)
diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb
index 2d747bed72..9083cbe661 100644
--- a/test/rubygems/test_gem_installer.rb
+++ b/test/rubygems/test_gem_installer.rb
@@ -1141,6 +1141,35 @@ gem 'other', version
     refute_path_exists should_be_removed
   end
 
+  def test_install_user_extension_dir
+    @spec.extensions << "extconf.rb"
+    write_file File.join(@tempdir, "extconf.rb") do |io|
+      io.write <<-RUBY
+        require "mkmf"
+        create_makefile("#{@spec.name}")
+      RUBY
+    end
+
+    @spec.files += %w[extconf.rb]
+
+    # Create the non-user ext dir
+    expected_extension_dir = @spec.extension_dir.dup
+    FileUtils.mkdir_p expected_extension_dir
+
+    use_ui @ui do
+      path = Gem::Package.build @spec
+
+      installer = Gem::Installer.at path, :user_install => true
+      installer.install
+    end
+
+    expected_makefile = File.join Gem.user_dir, 'gems', @spec.full_name, 'Makefile'
+
+    assert_path_exists expected_makefile
+    assert_path_exists expected_extension_dir
+    refute_path_exists File.join expected_extension_dir, 'gem_make.out'
+  end
+
   # ruby core repository needs to `depend` file for extension build.
   # but 1.9.2 and earlier mkmf.rb does not create TOUCH file like depend.
   if RUBY_VERSION < '1.9.3'
@@ -1387,7 +1416,7 @@ gem 'other', version
   def test_pre_install_checks_ruby_version
     use_ui @ui do
       installer = Gem::Installer.at old_ruby_required
-      e = assert_raises Gem::InstallError do
+      e = assert_raises Gem::RuntimeRequirementNotMetError do
         installer.pre_install_checks
       end
       assert_equal 'old_ruby_required requires Ruby version = 1.4.6.',
@@ -1406,7 +1435,7 @@ gem 'other', version
 
     use_ui @ui do
       @installer = Gem::Installer.at gem
-      e = assert_raises Gem::InstallError do
+      e = assert_raises Gem::RuntimeRequirementNotMetError do
         @installer.pre_install_checks
       end
       assert_equal 'old_rubygems_required requires RubyGems version < 0. ' +
diff --git a/test/rubygems/test_gem_remote_fetcher.rb b/test/rubygems/test_gem_remote_fetcher.rb
index cf1b27d547..ca62a8342e 100644
--- a/test/rubygems/test_gem_remote_fetcher.rb
+++ b/test/rubygems/test_gem_remote_fetcher.rb
@@ -687,6 +687,23 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
     assert_equal "too many redirects (#{url})", e.message
   end
 
+  def test_fetch_http_redirects_without_location
+    fetcher = Gem::RemoteFetcher.new nil
+    @fetcher = fetcher
+    url = 'http://gems.example.com/redirect'
+
+    def fetcher.request(uri, request_class, last_modified = nil)
+      res = Net::HTTPMovedPermanently.new nil, 301, nil
+      res
+    end
+
+    e = assert_raises Gem::RemoteFetcher::FetchError do
+      fetcher.fetch_http URI.parse(url)
+    end
+
+    assert_equal "redirecting but no redirect location was given (#{url})", e.message
+  end
+
   def test_fetch_http_with_additional_headers
     ENV["http_proxy"] = @proxy_uri
     ENV["no_proxy"] = URI::parse(@server_uri).host
@@ -1036,4 +1053,3 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
   end
 
 end
-
diff --git a/test/rubygems/test_gem_resolver.rb b/test/rubygems/test_gem_resolver.rb
index cf457db198..f2469ac70f 100644
--- a/test/rubygems/test_gem_resolver.rb
+++ b/test/rubygems/test_gem_resolver.rb
@@ -683,6 +683,32 @@ class TestGemResolver < Gem::TestCase
     assert_resolves_to [b1, c1, d2], r
   end
 
+  def test_sorts_by_source_then_version
+    sourceA = Gem::Source.new 'http://example.com/a'
+    sourceB = Gem::Source.new 'http://example.com/b'
+    sourceC = Gem::Source.new 'http://example.com/c'
+
+    spec_A_1 = new_spec 'some-dep', '0.0.1'
+    spec_A_2 = new_spec 'some-dep', '1.0.0'
+    spec_B_1 = new_spec 'some-dep', '0.0.1'
+    spec_B_2 = new_spec 'some-dep', '0.0.2'
+    spec_C_1 = new_spec 'some-dep', '0.1.0'
+
+    set = StaticSet.new [
+      Gem::Resolver::SpecSpecification.new(nil, spec_B_1, sourceB),
+      Gem::Resolver::SpecSpecification.new(nil, spec_B_2, sourceB),
+      Gem::Resolver::SpecSpecification.new(nil, spec_C_1, sourceC),
+      Gem::Resolver::SpecSpecification.new(nil, spec_A_2, sourceA),
+      Gem::Resolver::SpecSpecification.new(nil, spec_A_1, sourceA),
+    ]
+
+    dependency = make_dep 'some-dep', '> 0'
+
+    resolver = Gem::Resolver.new [dependency], set
+
+    assert_resolves_to [spec_B_2], resolver
+  end
+
   def test_select_local_platforms
     r = Gem::Resolver.new nil, nil
 
diff --git a/test/rubygems/test_gem_source.rb b/test/rubygems/test_gem_source.rb
index 64dfa42468..4a93e222f8 100644
--- a/test/rubygems/test_gem_source.rb
+++ b/test/rubygems/test_gem_source.rb
@@ -228,6 +228,15 @@ class TestGemSource < Gem::TestCase
     assert_equal(-1, remote.   <=>(no_uri),    'remote <=> no_uri')
   end
 
+  def test_spaceship_order_is_preserved_when_uri_differs
+    sourceA = Gem::Source.new "http://example.com/a"
+    sourceB = Gem::Source.new "http://example.com/b"
+
+    assert_equal( 0, sourceA. <=>(sourceA), 'sourceA <=> sourceA')
+    assert_equal( 1, sourceA. <=>(sourceB), 'sourceA <=> sourceB')
+    assert_equal( 1, sourceB. <=>(sourceA), 'sourceB <=> sourceA')
+  end
+
   def test_update_cache_eh
     assert @source.update_cache?
   end
diff --git a/test/rubygems/test_gem_spec_fetcher.rb b/test/rubygems/test_gem_spec_fetcher.rb
index 53bb31a910..558869fe99 100644
--- a/test/rubygems/test_gem_spec_fetcher.rb
+++ b/test/rubygems/test_gem_spec_fetcher.rb
@@ -169,6 +169,26 @@ class TestGemSpecFetcher < Gem::TestCase
     assert_equal "bad news from the internet (#{@gem_repo})", sfp.error.message
   end
 
+  def test_suggest_gems_from_name_latest
+    spec_fetcher do|fetcher|
+      fetcher.spec 'example', 1
+      fetcher.spec 'other-example', 1
+    end
+
+    suggestions = @sf.suggest_gems_from_name('examplw')
+    assert_equal ['example'], suggestions
+  end
+
+  def test_suggest_gems_from_name_prerelease
+    spec_fetcher do|fetcher|
+      fetcher.spec 'example', '1.a'
+      fetcher.spec 'other-example', 1
+    end
+
+    suggestions = @sf.suggest_gems_from_name('examplw')
+    assert_equal ['example'], suggestions
+  end
+
   def test_available_specs_latest
     spec_fetcher do |fetcher|
       fetcher.spec 'a', 1
diff --git a/test/rubygems/test_gem_version.rb b/test/rubygems/test_gem_version.rb
index 9898669ce6..46453cd9e9 100644
--- a/test/rubygems/test_gem_version.rb
+++ b/test/rubygems/test_gem_version.rb
@@ -65,7 +65,8 @@ class TestGemVersion < Gem::TestCase
   def test_hash
     assert_equal v("1.2").hash, v("1.2").hash
     refute_equal v("1.2").hash, v("1.3").hash
-    refute_equal v("1.2").hash, v("1.2.0").hash
+    assert_equal v("1.2").hash, v("1.2.0").hash
+    assert_equal v("1.2.pre.1").hash, v("1.2.0.pre.1.0").hash
   end
 
   def test_initialize
@@ -99,6 +100,9 @@ class TestGemVersion < Gem::TestCase
 
     assert_prerelease '1.A'
 
+    assert_prerelease '1-1'
+    assert_prerelease '1-a'
+
     refute_prerelease "1.2.0"
     refute_prerelease "2.9"
     refute_prerelease "22.1.50.0"
@@ -154,6 +158,12 @@ class TestGemVersion < Gem::TestCase
     assert_equal         [9,8,7], v("9.8.7").segments
   end
 
+  def test_canonical_segments
+    assert_equal [1], v("1.0.0").canonical_segments
+    assert_equal [1, "a", 1], v("1.0.0.a.1.0").canonical_segments
+    assert_equal [1, 2, 3, "pre", 1], v("1.2.3-1").canonical_segments
+  end
+
   # Asserts that +version+ is a prerelease.
 
   def assert_prerelease version
@@ -183,6 +193,7 @@ class TestGemVersion < Gem::TestCase
 
   def assert_version_equal expected, actual
     assert_equal v(expected), v(actual)
+    assert_equal v(expected).hash, v(actual).hash, "since #{actual} == #{expected}, they must have the same hash"
   end
 
   # Assert that two versions are eql?. Checks both directions.