diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index b0a03ee45cce92e8ea042122c6ac10bd74f5d9f3..e3486f576c08afa4a52647677b042b52f663bb12 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -88,6 +88,11 @@ class Projects::IssuesController < Projects::ApplicationController
 
   def update
     @issue = Issues::UpdateService.new(project, current_user, issue_params).execute(issue)
+    move_service = Issues::MoveService.new(project, current_user, params.require(:issue).permit!, @issue)
+
+    if move_service.move?
+      @issue = move_service.execute
+    end
 
     respond_to do |format|
       format.js
diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb
index e2ab06ac33265e241bcbcaa4c2713ad666b50b57..935bd8a87f7e75ed6686acfafa80dddba79680bb 100644
--- a/app/services/issues/move_service.rb
+++ b/app/services/issues/move_service.rb
@@ -1,11 +1,20 @@
 module Issues
   class MoveService < Issues::BaseService
-    def execute(issue_old, project_new)
-      @issue_old = issue_old
-      @issue_new = issue_old.dup
-      @project_new = project_new
+    def initialize(project, current_user, params, issue)
+      super(project, current_user, params)
+
+      @issue_old = issue
+      @issue_new = @issue_old.dup
       @project_old = @project
 
+      if params['move_to_project_id']
+        @project_new = Project.find(params['move_to_project_id'])
+      end
+    end
+
+    def execute
+      return unless move?
+
       open_new_issue
       rewrite_notes
       close_old_issue
@@ -14,8 +23,20 @@ module Issues
       @issue_new
     end
 
+    def move?
+      return false unless @project_new
+      return false unless @issue_new
+      return false unless can_move?
+
+      true
+    end
+
     private
 
+    def can_move?
+      true
+    end
+
     def open_new_issue
       @issue_new.project = @project_new
       @issue_new.save!
diff --git a/spec/services/issues/move_service_spec.rb b/spec/services/issues/move_service_spec.rb
index 569e155e6174b2d36758652edfeb7e767f97def6..412a817208e9ab6b51eaab773a11c429b27a7952 100644
--- a/spec/services/issues/move_service_spec.rb
+++ b/spec/services/issues/move_service_spec.rb
@@ -5,26 +5,44 @@ describe Issues::MoveService, services: true do
   let(:issue) { create(:issue, title: 'Some issue', description: 'Some issue description') }
   let(:current_project) { issue.project }
   let(:new_project) { create(:project) }
+  let(:move_params) { { 'move_to_project_id' => new_project.id } }
+  let(:move_service) { described_class.new(current_project, user, move_params, issue) }
 
   before do
     current_project.team << [user, :master]
   end
 
-  describe '#execute' do
-    let!(:new_issue) do
-      described_class.new(current_project, user).execute(issue, new_project)
+  context 'issue movable' do
+    describe '#move?' do
+      subject { move_service.move? }
+      it { is_expected.to be_truthy }
     end
 
-    it 'should create a new issue in a new project' do
-      expect(new_issue.project).to eq new_project
-    end
+    describe '#execute' do
+      let!(:new_issue) { move_service.execute }
+
+      it 'should create a new issue in a new project' do
+        expect(new_issue.project).to eq new_project
+      end
+
+      it 'should add system note to old issue' do
+        expect(issue.notes.last.note).to match /^Moved to/
+      end
 
-    it 'should add system note to old issue' do
-      expect(issue.notes.last.note).to match /^Moved to/
+      it 'should add system note to new issue' do
+        expect(new_issue.notes.last.note).to match /^Moved from/
+      end
     end
+  end
+
+  context 'issue not movable' do
+    context 'move not requested' do
+      let(:move_params) { {} }
 
-    it 'should add system note to new issue' do
-      expect(new_issue.notes.last.note).to match /^Moved from/
+      describe '#move?' do
+        subject { move_service.move? }
+        it { is_expected.to be_falsey }
+      end
     end
   end
 end
diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb
index e0ae49ab37cf0a12362c458db90386731d682bad..7efb9f2ddbad1eb340409c51070d81569f6c0918 100644
--- a/spec/services/system_note_service_spec.rb
+++ b/spec/services/system_note_service_spec.rb
@@ -486,7 +486,7 @@ describe SystemNoteService, services: true do
     end
 
     context 'invalid direction' do
-      let (:direction) { :invalid }
+      let(:direction) { :invalid }
 
       it 'should raise error' do
         expect { subject }.to raise_error StandardError, /Invalid direction/