diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 88e21b5886da92384d2dd11fee634aac2601e4e7..04386258c1981fe01ea2b3f1ee2a9eb80b9ea711 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -489,13 +489,12 @@ class Projects::MergeRequestsController < Projects::ApplicationController
     @noteable = @merge_request
     @commits_count = @merge_request.commits.count
 
-    @pipeline = @merge_request.pipeline
-    @statuses = @pipeline.statuses.relevant if @pipeline
-
     if @merge_request.locked_long_ago?
       @merge_request.unlock_mr
       @merge_request.close
     end
+
+    define_pipelines_vars
   end
 
   # Discussion tab data is rendered on html responses of actions
@@ -523,7 +522,6 @@ class Projects::MergeRequestsController < Projects::ApplicationController
 
   def define_widget_vars
     @pipeline = @merge_request.pipeline
-    @pipelines = [@pipeline].compact
   end
 
   def define_commit_vars
@@ -550,6 +548,15 @@ class Projects::MergeRequestsController < Projects::ApplicationController
     )
   end
 
+  def define_pipelines_vars
+    @pipelines = @merge_request.all_pipelines
+
+    if @pipelines.any?
+      @pipeline = @pipelines.first
+      @statuses = @pipeline.statuses.relevant
+    end
+  end
+
   def define_new_vars
     @noteable = @merge_request
 
@@ -565,10 +572,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController
     @commit = @merge_request.diff_head_commit
     @base_commit = @merge_request.diff_base_commit
 
-    @pipeline = @merge_request.pipeline
-    @statuses = @pipeline.statuses.relevant if @pipeline
     @note_counts = Note.where(commit_id: @commits.map(&:id)).
       group(:commit_id).count
+
+    define_pipelines_vars
   end
 
   def invalid_mr
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 8c6905a442de644369cab82bc85961fd9977200e..fedc35102ef572616f025ad4b5359b8ffd51f00f 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -787,21 +787,21 @@ class MergeRequest < ActiveRecord::Base
   def all_pipelines
     return unless source_project
 
-    @all_pipelines ||= begin
-      sha = if persisted?
-              all_commits_sha
-            else
-              diff_head_sha
-            end
-
-      source_project.pipelines.order(id: :desc).
-        where(sha: sha, ref: source_branch)
-    end
+    @all_pipelines ||= source_project.pipelines
+      .where(sha: all_commits_sha, ref: source_branch)
+      .order(id: :desc)
   end
 
   # Note that this could also return SHA from now dangling commits
+  #
   def all_commits_sha
-    merge_request_diffs.flat_map(&:commits_sha).uniq
+    if persisted?
+      merge_request_diffs.flat_map(&:commits_sha).uniq
+    elsif compare_commits
+      compare_commits.to_a.reverse.map(&:id)
+    else
+      [diff_head_sha]
+    end
   end
 
   def merge_commit
diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml
index da6927879a4300717f37582be9eb237041f3be08..9c6f562f7db2f65a70503251bd97dd10cbe5be38 100644
--- a/app/views/projects/merge_requests/_new_submit.html.haml
+++ b/app/views/projects/merge_requests/_new_submit.html.haml
@@ -29,7 +29,11 @@
         = link_to url_for(params), data: {target: 'div#commits', action: 'new', toggle: 'tab'} do
           Commits
           %span.badge= @commits.size
-      - if @pipeline
+      - if @pipelines.any?
+        %li.builds-tab
+          = link_to url_for(params), data: {target: 'div#pipelines', action: 'pipelines', toggle: 'tab'} do
+            Pipelines
+            %span.badge= @pipelines.size
         %li.builds-tab
           = link_to url_for(params), data: {target: 'div#builds', action: 'builds', toggle: 'tab'} do
             Builds
@@ -44,9 +48,11 @@
         = render "projects/merge_requests/show/commits"
       #diffs.diffs.tab-pane
         - # This tab is always loaded via AJAX
-      - if @pipeline
+      - if @pipelines.any?
         #builds.builds.tab-pane
           = render "projects/merge_requests/show/builds"
+        #pipelines.pipelines.tab-pane
+          = render "projects/merge_requests/show/pipelines"
 
   .mr-loading-status
     = spinner
@@ -59,5 +65,5 @@
 :javascript
   var merge_request = new MergeRequest({
     action: "#{(@show_changes_tab ? 'new/diffs' : 'new')}",
-    buildsLoaded: "#{@pipeline ? 'true' : 'false'}"
+    buildsLoaded: "#{@pipelines.any? ? 'true' : 'false'}"
   });
diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml
index 5c41db36e44fb3149ccfc665771783a6b14442c0..cd98aaf8d7529ac8eb79ed2721a377ac238e78d8 100644
--- a/app/views/projects/merge_requests/_show.html.haml
+++ b/app/views/projects/merge_requests/_show.html.haml
@@ -61,7 +61,7 @@
           %li.pipelines-tab
             = link_to pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: { target: '#pipelines', action: 'pipelines', toggle: 'tab' } do
               Pipelines
-              %span.badge= @merge_request.all_pipelines.size
+              %span.badge= @pipelines.size
           %li.builds-tab
             = link_to builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: { target: '#builds', action: 'builds', toggle: 'tab' } do
               Builds
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 1acc8d748afb5ab481bac85ea9e2f90d6cc30460..6db5e7f7d80999a2c7d57ca9947658427b48c079 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -640,32 +640,56 @@ describe MergeRequest, models: true do
   end
 
   describe '#all_commits_sha' do
-    let(:all_commits_sha) do
-      subject.merge_request_diffs.flat_map(&:commits).map(&:sha).uniq
-    end
+    context 'when merge request is persisted' do
+      let(:all_commits_sha) do
+        subject.merge_request_diffs.flat_map(&:commits).map(&:sha).uniq
+      end
 
-    shared_examples 'returning all SHA' do
-      it 'returns all SHA from all merge_request_diffs' do
-        expect(subject.merge_request_diffs.size).to eq(2)
-        expect(subject.all_commits_sha).to eq(all_commits_sha)
+      shared_examples 'returning all SHA' do
+        it 'returns all SHA from all merge_request_diffs' do
+          expect(subject.merge_request_diffs.size).to eq(2)
+          expect(subject.all_commits_sha).to eq(all_commits_sha)
+        end
       end
-    end
 
-    context 'with a completely different branch' do
-      before do
-        subject.update(target_branch: 'v1.0.0')
+      context 'with a completely different branch' do
+        before do
+          subject.update(target_branch: 'v1.0.0')
+        end
+
+        it_behaves_like 'returning all SHA'
       end
 
-      it_behaves_like 'returning all SHA'
+      context 'with a branch having no difference' do
+        before do
+          subject.update(target_branch: 'v1.1.0')
+          subject.reload # make sure commits were not cached
+        end
+
+        it_behaves_like 'returning all SHA'
+      end
     end
 
-    context 'with a branch having no difference' do
-      before do
-        subject.update(target_branch: 'v1.1.0')
-        subject.reload # make sure commits were not cached
+    context 'when merge request is not persisted' do
+      context 'when compare commits are set in the service' do
+        let(:commit) { spy('commit') }
+
+        subject do
+          build(:merge_request, compare_commits: [commit, commit])
+        end
+
+        it 'returns commits from compare commits temporary data' do
+          expect(subject.all_commits_sha).to eq [commit, commit]
+        end
       end
 
-      it_behaves_like 'returning all SHA'
+      context 'when compare commits are not set in the service' do
+        subject { build(:merge_request) }
+
+        it 'returns array with diff head sha element only' do
+          expect(subject.all_commits_sha).to eq [subject.diff_head_sha]
+        end
+      end
     end
   end