diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 9fa8d17e74ec9ba6fb5fb5f86438dcb11a4e2d65..38554e7a0ca23b713b08261c307519516803f24a 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -1,6 +1,7 @@
 class CommitStatus < ActiveRecord::Base
   include HasStatus
   include Importable
+  include AfterCommitQueue
 
   self.table_name = 'ci_builds'
 
@@ -84,20 +85,6 @@ class CommitStatus < ActiveRecord::Base
       commit_status.update_attributes finished_at: Time.now
     end
 
-    after_transition do |commit_status, transition|
-      commit_status.pipeline.try do |pipeline|
-        break if transition.loopback?
-
-        if commit_status.complete?
-          ProcessPipelineWorker.perform_async(pipeline.id)
-        end
-
-        UpdatePipelineWorker.perform_async(pipeline.id)
-      end
-
-      true
-    end
-
     after_transition [:created, :pending, :running] => :success do |commit_status|
       MergeRequests::MergeWhenBuildSucceedsService.new(commit_status.pipeline.project, nil).trigger(commit_status)
     end
@@ -105,10 +92,26 @@ class CommitStatus < ActiveRecord::Base
     after_transition any => :failed do |commit_status|
       MergeRequests::AddTodoWhenBuildFailsService.new(commit_status.pipeline.project, nil).execute(commit_status)
     end
+
+    after_transition do: :schedule_pipeline_update
   end
 
   delegate :sha, :short_sha, to: :pipeline
 
+  def schedule_pipeline_update
+    run_after_commit(:process_pipeline!)
+  end
+
+  def process_pipeline!
+    pipeline.try do |pipeline|
+      if complete?
+        ProcessPipelineWorker.perform_async(pipeline.id)
+      else
+        UpdatePipelineWorker.perform_async(pipeline.id)
+      end
+    end
+  end
+
   def before_sha
     pipeline.before_sha || Gitlab::Git::BLANK_SHA
   end
diff --git a/app/services/ci/process_pipeline_service.rb b/app/services/ci/process_pipeline_service.rb
index 36c93dddadbde82ae28d3ac96eac9c13d9af259c..d3dd30b2588fb0af2fa338cef66af59823bd53a5 100644
--- a/app/services/ci/process_pipeline_service.rb
+++ b/app/services/ci/process_pipeline_service.rb
@@ -16,6 +16,8 @@ module Ci
             process_stage(index)
           end
 
+        @pipeline.update_status
+
         # Return a flag if a when builds got enqueued
         new_builds.flatten.any?
       end