diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb
index 4a2599dda37fd2d6a65f0496e098c43450669dee..1b9dd5680432f38b8ff24e94124ef29e8917b399 100644
--- a/app/controllers/projects/notes_controller.rb
+++ b/app/controllers/projects/notes_controller.rb
@@ -106,7 +106,7 @@ class Projects::NotesController < Projects::ApplicationController
           { notes_left: [note], notes_right: [] }
         else
           { notes_left: [], notes_right: [note] }
-       end
+        end
     else
       template = "projects/notes/_diff_notes_with_reply"
       locals = { notes: [note] }
diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb
index a8486e6a5a1ecb3c62f7d507e666d9eee9e2943a..8d9661167b522483ea89eb75f16010243fcfdb27 100644
--- a/app/services/notes/create_service.rb
+++ b/app/services/notes/create_service.rb
@@ -6,27 +6,12 @@ module Notes
       note.system = false
 
       if note.save
-        notification_service.new_note(note)
-
-        # Skip system notes, like status changes and cross-references and awards
-        unless note.system || note.is_award
-          event_service.leave_note(note, note.author)
-          note.create_cross_references!
-          execute_hooks(note)
-        end
+        # Finish the harder work in the background
+        NewNoteWorker.perform_in(2.seconds, note.id, params)
       end
 
       note
     end
 
-    def hook_data(note)
-      Gitlab::NoteDataBuilder.build(note, current_user)
-    end
-
-    def execute_hooks(note)
-      note_data = hook_data(note)
-      note.project.execute_hooks(note_data, :note_hooks)
-      note.project.execute_services(note_data, :note_hooks)
-    end
   end
 end
diff --git a/app/services/notes/post_process_service.rb b/app/services/notes/post_process_service.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f37d3c50cdd145470bc9bb7363f97cd7a40d8d26
--- /dev/null
+++ b/app/services/notes/post_process_service.rb
@@ -0,0 +1,30 @@
+module Notes
+  class PostProcessService
+
+    attr_accessor :note
+
+    def initialize(note)
+      @note = note
+    end
+
+    def execute
+      # Skip system notes, like status changes and cross-references and awards
+      unless @note.system || @note.is_award
+        EventCreateService.new.leave_note(@note, @note.author)
+        @note.create_cross_references!
+        execute_note_hooks
+      end
+    end
+
+    def hook_data
+      Gitlab::NoteDataBuilder.build(@note, @note.author)
+    end
+
+    def execute_note_hooks
+      note_data = hook_data
+      @note.project.execute_hooks(note_data, :note_hooks)
+      @note.project.execute_services(note_data, :note_hooks)
+    end
+
+  end
+end
diff --git a/app/workers/new_note_worker.rb b/app/workers/new_note_worker.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1b3232cd36521d62fbe3d9dcc726b62d23d221a2
--- /dev/null
+++ b/app/workers/new_note_worker.rb
@@ -0,0 +1,12 @@
+class NewNoteWorker
+  include Sidekiq::Worker
+
+  sidekiq_options queue: :default
+
+  def perform(note_id, note_params)
+    note = Note.find(note_id)
+
+    NotificationService.new.new_note(note)
+    Notes::PostProcessService.new(note).execute
+  end
+end