diff --git a/app/assets/javascripts/issuable_form.js.coffee b/app/assets/javascripts/issuable_form.js.coffee
index 72ae3bde81e1d33fc8e535d4d5b91d3465e1384f..898506fde3221a778cccf06189b23d2271a47193 100644
--- a/app/assets/javascripts/issuable_form.js.coffee
+++ b/app/assets/javascripts/issuable_form.js.coffee
@@ -19,6 +19,7 @@ class @IssuableForm
     @form.on "click", ".btn-cancel", @resetAutosave
 
     @initWip()
+    @initMoveDropdown()
 
     $issuableDueDate = $('#issuable-due-date')
 
@@ -89,3 +90,19 @@ class @IssuableForm
 
   addWip: ->
     @titleField.val "WIP: #{@titleField.val()}"
+
+  initMoveDropdown: ->
+    $moveDropdown = $('.js-move-dropdown')
+
+    if $moveDropdown.length
+      $('.js-move-dropdown').select2
+        ajax:
+          url: $moveDropdown.data('projects-url')
+          results: (data) ->
+            return {
+              results: data
+            }
+        formatResult: (project) ->
+          project.name_with_namespace
+        formatSelection: (project) ->
+          project.name_with_namespace
diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb
index eb0abc80ab43e34d8f3d4812e2e80de34ec5747d..3865b2d61fd1be6091d711c6a9f8b51139486403 100644
--- a/app/controllers/autocomplete_controller.rb
+++ b/app/controllers/autocomplete_controller.rb
@@ -31,6 +31,24 @@ class AutocompleteController < ApplicationController
     render json: @user, only: [:name, :username, :id], methods: [:avatar_url]
   end
 
+  def projects
+    project = Project.find_by_id(params[:project_id])
+
+    projects = current_user.authorized_projects
+    projects = projects.select do |project|
+      current_user.can?(:admin_issue, project)
+    end
+
+    no_project = {
+      id: 0,
+      name_with_namespace: 'No project',
+    }
+    projects.unshift(no_project)
+    projects.delete(project)
+
+    render json: projects.to_json(only: [:id, :name_with_namespace], methods: :name_with_namespace)
+  end
+
   private
 
   def find_users
diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml
index fc3410f425d1363e3e6add928b5fa8204d5a5a05..b430251dbf695ec227b2ebfceca748fc8fed92c0 100644
--- a/app/views/shared/issuable/_form.html.haml
+++ b/app/views/shared/issuable/_form.html.haml
@@ -98,9 +98,7 @@
     = label_tag :move_to_project_id, 'Move', class: 'control-label'
     .col-sm-10
       .issuable-form-select-holder
-        - projects = project_options(issuable, current_user, ability: :admin_issue)
-        = select_tag(:move_to_project_id, projects, include_blank: true,
-                     class: 'select2', data: { placeholder: 'Select project' })
+        = hidden_field_tag :move_to_project_id, nil, class: 'js-move-dropdown', data: { placeholder: 'Select project', projects_url: autocomplete_projects_path(project_id: @project.id) }
       &nbsp;
       %span{ data: { toggle: 'tooltip', placement: 'auto top' }, style: 'cursor: default',
       title: 'Moving an issue will copy the discussion to a different project and close it here. All participants will be notified of the new location.' }
diff --git a/config/routes.rb b/config/routes.rb
index d8a2435b078e87bf0fa596188cc91a5908ce42f2..9a5d0074a0a5c6e202cbccfd12643fa5fe2db9e6 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -56,6 +56,7 @@ Rails.application.routes.draw do
   # Autocomplete
   get '/autocomplete/users' => 'autocomplete#users'
   get '/autocomplete/users/:id' => 'autocomplete#user'
+  get '/autocomplete/projects' => 'autocomplete#projects'
 
   # Emojis
   resources :emojis, only: :index
diff --git a/spec/features/issues/move_spec.rb b/spec/features/issues/move_spec.rb
index 84c8e20ebaa6d03f870ea657d0ac88f4181a1bde..c7019c5aea158698ed51712b9f126ec9094c810d 100644
--- a/spec/features/issues/move_spec.rb
+++ b/spec/features/issues/move_spec.rb
@@ -19,7 +19,7 @@ feature 'issue move to another project' do
     end
 
     scenario 'moving issue to another project not allowed' do
-      expect(page).to have_no_select('move_to_project_id')
+      expect(page).to have_no_selector('#move_to_project_id')
     end
   end
 
@@ -37,7 +37,7 @@ feature 'issue move to another project' do
     end
 
     scenario 'moving issue to another project' do
-      select(new_project.name_with_namespace, from: 'move_to_project_id')
+      first('#move_to_project_id', visible: false).set(new_project.id)
       click_button('Save changes')
 
       expect(current_url).to include project_path(new_project)
@@ -47,14 +47,18 @@ feature 'issue move to another project' do
       expect(page).to have_content(issue.title)
     end
 
-    context 'projects user does not have permission to move issue to exist' do
+    context 'user does not have permission to move the issue to a project', js: true do
       let!(:private_project) { create(:project, :private) }
       let(:another_project) { create(:project) }
       background { another_project.team << [user, :guest] }
 
       scenario 'browsing projects in projects select' do
-        options = [ '', 'No project', new_project.name_with_namespace ]
-        expect(page).to have_select('move_to_project_id', options: options)
+        click_link 'Select project'
+
+        page.within '.select2-results' do
+          expect(page).to have_content 'No project'
+          expect(page).to have_content new_project.name_with_namespace
+        end
       end
     end
 
@@ -65,7 +69,7 @@ feature 'issue move to another project' do
       end
 
       scenario 'user wants to move issue that has already been moved' do
-        expect(page).to have_no_select('move_to_project_id')
+        expect(page).to have_no_selector('#move_to_project_id')
       end
     end
   end