diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 2b758b960c250a09fba50d688df2934ed5f74f29..768595ceeb4b264b29c469a0c08dcd4055992aed 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -15,7 +15,6 @@ class Projects::PipelinesController < Projects::ApplicationController
     @pipelines = PipelinesFinder
       .new(project, scope: @scope)
       .execute
-      .preload(:stages)
       .page(params[:page])
       .per(30)
 
@@ -24,8 +23,6 @@ class Projects::PipelinesController < Projects::ApplicationController
     @finished_count = limited_pipelines_count(project, 'finished')
     @pipelines_count = limited_pipelines_count(project)
 
-    Gitlab::Ci::Pipeline::Preloader.preload!(@pipelines)
-
     respond_to do |format|
       format.html
       format.json do
@@ -35,7 +32,7 @@ class Projects::PipelinesController < Projects::ApplicationController
           pipelines: PipelineSerializer
             .new(project: @project, current_user: @current_user)
             .with_pagination(request, response)
-            .represent(@pipelines, disable_coverage: true),
+            .represent(@pipelines, disable_coverage: true, preload: true),
           count: {
             all: @pipelines_count,
             running: @running_count,
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index 7181f8a6b04b60997d936301e88be35b2b628671..68325cbffa87c6848cd1e4660dea072e0c5e3b5e 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -1,14 +1,12 @@
 class PipelineSerializer < BaseSerializer
   include WithPagination
-
-  InvalidResourceError = Class.new(StandardError)
-
   entity PipelineDetailsEntity
 
   def represent(resource, opts = {})
     if resource.is_a?(ActiveRecord::Relation)
 
       resource = resource.preload([
+        :stages,
         :retryable_builds,
         :cancelable_statuses,
         :trigger_requests,
@@ -19,11 +17,12 @@ class PipelineSerializer < BaseSerializer
       ])
     end
 
-    if paginated?
-      super(@paginator.paginate(resource), opts)
-    else
-      super(resource, opts)
+    if opts.delete(:preload)
+      resource = @paginator.paginate(resource) if paginated?
+      resource = Gitlab::Ci::Pipeline::Preloader.preload!(resource)
     end
+
+    super(resource, opts)
   end
 
   def represent_status(resource)
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index 2e0f9b00023c4d20c6621e2a4f9ec35636a53d54..d7253c90ee5605daeeb36532ddbc7e7a8450075d 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -36,7 +36,7 @@ describe Projects::PipelinesController do
       expect(json_response['count']['running']).to eq '1'
       expect(json_response['count']['pending']).to eq '1'
       expect(json_response['count']['finished']).to eq '2'
-      expect(queries.count).to be < 32
+      expect(queries.count).to be_within(2).of(29)
     end
 
     it 'does not include coverage data for the pipelines' do
diff --git a/spec/lib/gitlab/ci/pipeline/preloader_spec.rb b/spec/lib/gitlab/ci/pipeline/preloader_spec.rb
index 16d3631ec7c089e1abcc397f28f80786a2a68d40..7821d28ab0635502f1cfaebb0cdd3164829eae22 100644
--- a/spec/lib/gitlab/ci/pipeline/preloader_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/preloader_spec.rb
@@ -18,5 +18,15 @@ describe Gitlab::Ci::Pipeline::Preloader do
 
       described_class.preload!([pipeline])
     end
+
+    it 'returns original collection' do
+      allow(commit).to receive(:lazy_author)
+      allow(pipeline).to receive(:number_of_warnings)
+      allow(stage).to receive(:number_of_warnings)
+
+      pipelines = [pipeline, pipeline]
+
+      expect(described_class.preload!(pipelines)).to eq pipelines
+    end
   end
 end