diff --git a/.gitignore b/.gitignore
index 4c25c8abf8209223a2384c21086d3e422587fa72..aa822771ec2e9af23161d0e1e64ba792085bcaab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,3 +35,4 @@ doc/code/*
 *.log
 public/uploads.*
 public/assets/
+.envrc
diff --git a/Gemfile b/Gemfile
index 922b617e72ad5b1ba30957e5af237a57e873cf8b..dc7b60dd3803ca805e9d752caa80a0944fcebb50 100644
--- a/Gemfile
+++ b/Gemfile
@@ -114,6 +114,7 @@ gem 'settingslogic'
 
 # Misc
 gem "foreman"
+gem 'version_sorter'
 
 # Cache
 gem "redis-rails"
diff --git a/Gemfile.lock b/Gemfile.lock
index 70cb8b9ec4ca6f41cc8381439f2d1c6e076d3637..709f57119165108a74f73272c245fa130ff95390 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -537,6 +537,7 @@ GEM
       raindrops (~> 0.7)
     unicorn-worker-killer (0.4.2)
       unicorn (~> 4)
+    version_sorter (1.1.0)
     virtus (1.0.1)
       axiom-types (~> 0.0.5)
       coercible (~> 1.0)
@@ -662,4 +663,5 @@ DEPENDENCIES
   underscore-rails (~> 1.4.4)
   unicorn (~> 4.6.3)
   unicorn-worker-killer
+  version_sorter
   webmock
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 240477b5b73369c310735a206eea2056351f0618..90b050271557107a8a4ac3f996a1f3c8069db2fe 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -89,16 +89,15 @@ def last_commit(project)
     "Never"
   end
 
-  def grouped_options_refs(destination = :tree)
+  def grouped_options_refs
     repository = @project.repository
 
     options = [
       ["Branches", repository.branch_names],
-      ["Tags", repository.tag_names]
+      ["Tags", VersionSorter.rsort(repository.tag_names)]
     ]
 
-    # If reference is commit id -
-    # we should add it to branch/tag selectbox
+    # If reference is commit id - we should add it to branch/tag selectbox
     if(@ref && !options.flatten.include?(@ref) &&
        @ref =~ /^[0-9a-zA-Z]{6,52}$/)
       options << ["Commit", [@ref]]
diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index 101b06d95869616b69aa4741cc7c01d9c610f889..767674e1e8486da884d7ffc0d2fe0d586c3ba9e6 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -489,7 +489,7 @@ namespace :gitlab do
               "sudo -u #{gitlab_shell_ssh_user} ln -sf #{gitlab_shell_hook_file} #{project_hook_file}"
             )
             for_more_information(
-              "#{gitlab_shell_user_home}/gitlab-shell/support/rewrite-hooks.sh"
+              "#{gitlab_shell_path}/support/rewrite-hooks.sh"
             )
             fix_and_rerun
             next
@@ -513,7 +513,7 @@ namespace :gitlab do
     end
 
     def check_gitlab_shell_self_test
-      gitlab_shell_repo_base = File.expand_path('gitlab-shell', gitlab_shell_user_home)
+      gitlab_shell_repo_base = gitlab_shell_path
       check_cmd = File.expand_path('bin/check', gitlab_shell_repo_base)
       puts "Running #{check_cmd}"
       if system(check_cmd, chdir: gitlab_shell_repo_base)
@@ -559,8 +559,8 @@ namespace :gitlab do
     # Helper methods
     ########################
 
-    def gitlab_shell_user_home
-      File.expand_path("~#{Gitlab.config.gitlab_shell.ssh_user}")
+    def gitlab_shell_path
+      Gitlab.config.gitlab_shell.path
     end
 
     def gitlab_shell_version
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index c285a9360bb0a62b849f152ea8345be3f4406f54..61c561335e53d8333e4841d23c97bbba1dfeca91 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -116,7 +116,45 @@
       allow(self).to receive(:request).and_return(double(:ssl? => false))
       gravatar_icon(user_email).should == gravatar_icon(user_email.upcase + " ")
     end
+  end
+
+  describe "grouped_options_refs" do
+    # Override Rails' grouped_options_for_select helper since HTML is harder to work with
+    def grouped_options_for_select(options, *args)
+      options
+    end
+
+    let(:options) { grouped_options_refs }
+
+    before do
+      # Must be an instance variable
+      @project = create(:project)
+    end
+
+    it "includes a list of branch names" do
+      options[0][0].should == 'Branches'
+      options[0][1].should include('master', 'stable')
+    end
+
+    it "includes a list of tag names" do
+      options[1][0].should == 'Tags'
+      options[1][1].should include('v0.9.4','v1.2.0')
+    end
+
+    it "includes a specific commit ref if defined" do
+      # Must be an instance variable
+      @ref = '2ed06dc41dbb5936af845b87d79e05bbf24c73b8'
 
+      options[2][0].should == 'Commit'
+      options[2][1].should == [@ref]
+    end
+
+    it "sorts tags in a natural order" do
+      # Stub repository.tag_names to make sure we get some valid testing data
+      expect(@project.repository).to receive(:tag_names).and_return(["v1.0.9", "v1.0.10", "v2.0", "v3.1.4.2", "v1.0.9a"])
+
+      options[1][1].should == ["v3.1.4.2", "v2.0", "v1.0.10", "v1.0.9a", "v1.0.9"]
+    end
   end
 
   describe "user_color_scheme_class" do