diff --git a/.rubocop_todo/gitlab/namespaced_class.yml b/.rubocop_todo/gitlab/namespaced_class.yml
index eff4a6506cf0695b0628cc459564a2bdbb6b9441..730cb013cd4fb5025ef6e1e691b21d07f6a999ad 100644
--- a/.rubocop_todo/gitlab/namespaced_class.yml
+++ b/.rubocop_todo/gitlab/namespaced_class.yml
@@ -135,7 +135,6 @@ Gitlab/NamespacedClass:
     - 'app/models/container_repository.rb'
     - 'app/models/context_commits_diff.rb'
     - 'app/models/custom_emoji.rb'
-    - 'app/models/data_list.rb'
     - 'app/models/deploy_key.rb'
     - 'app/models/deploy_keys_project.rb'
     - 'app/models/deploy_token.rb'
@@ -625,9 +624,7 @@ Gitlab/NamespacedClass:
     - 'app/services/base_project_service.rb'
     - 'app/services/base_renderer.rb'
     - 'app/services/base_service.rb'
-    - 'app/services/bulk_create_integration_service.rb'
     - 'app/services/bulk_push_event_payload_service.rb'
-    - 'app/services/bulk_update_integration_service.rb'
     - 'app/services/cohorts_service.rb'
     - 'app/services/compare_service.rb'
     - 'app/services/event_create_service.rb'
diff --git a/.rubocop_todo/rspec/feature_category.yml b/.rubocop_todo/rspec/feature_category.yml
index 7395ea63e610a2883dc74f45d42d55fee20f0b2e..a742b64408d8e7690503329d8e8dabd9fd71481a 100644
--- a/.rubocop_todo/rspec/feature_category.yml
+++ b/.rubocop_todo/rspec/feature_category.yml
@@ -4391,7 +4391,6 @@ RSpec/FeatureCategory:
     - 'spec/models/customer_relations/issue_contact_spec.rb'
     - 'spec/models/customer_relations/organization_spec.rb'
     - 'spec/models/cycle_analytics/project_level_stage_adapter_spec.rb'
-    - 'spec/models/data_list_spec.rb'
     - 'spec/models/dependency_proxy/blob_spec.rb'
     - 'spec/models/dependency_proxy/group_setting_spec.rb'
     - 'spec/models/dependency_proxy/image_ttl_group_policy_spec.rb'
diff --git a/.rubocop_todo/rspec/named_subject.yml b/.rubocop_todo/rspec/named_subject.yml
index 4e471da63bf622b8cd7d2dffdf7c09179819cc0d..ff8e1ef5391bd9dfe470397a492fe670cc2f9f5e 100644
--- a/.rubocop_todo/rspec/named_subject.yml
+++ b/.rubocop_todo/rspec/named_subject.yml
@@ -2719,7 +2719,6 @@ RSpec/NamedSubject:
     - 'spec/models/integrations/external_wiki_spec.rb'
     - 'spec/models/integrations/gitlab_slack_application_spec.rb'
     - 'spec/models/integrations/google_play_spec.rb'
-    - 'spec/models/integrations/integration_list_spec.rb'
     - 'spec/models/integrations/irker_spec.rb'
     - 'spec/models/integrations/jenkins_spec.rb'
     - 'spec/models/integrations/jira_spec.rb'
diff --git a/.rubocop_todo/style/inline_disable_annotation.yml b/.rubocop_todo/style/inline_disable_annotation.yml
index c1711c1ca4d04b74978cde901b896dade67567d1..c8b4dfedc41077bf037324dfbe919b92bccfa5e6 100644
--- a/.rubocop_todo/style/inline_disable_annotation.yml
+++ b/.rubocop_todo/style/inline_disable_annotation.yml
@@ -588,7 +588,6 @@ Style/InlineDisableAnnotation:
     - 'app/services/bulk_imports/relation_export_service.rb'
     - 'app/services/bulk_imports/tree_export_service.rb'
     - 'app/services/bulk_imports/uploads_export_service.rb'
-    - 'app/services/bulk_update_integration_service.rb'
     - 'app/services/chat_names/find_user_service.rb'
     - 'app/services/ci/abort_pipelines_service.rb'
     - 'app/services/ci/archive_trace_service.rb'
@@ -643,6 +642,7 @@ Style/InlineDisableAnnotation:
     - 'app/services/groups/destroy_service.rb'
     - 'app/services/groups/import_export/import_service.rb'
     - 'app/services/groups/transfer_service.rb'
+    - 'app/services/integrations/propagation/bulk_update_service.rb'
     - 'app/services/integrations/slack_options/label_search_handler.rb'
     - 'app/services/integrations/slack_options/user_search_handler.rb'
     - 'app/services/issuable_base_service.rb'
diff --git a/app/controllers/projects/settings/integrations_controller.rb b/app/controllers/projects/settings/integrations_controller.rb
index a0e72fb168740132901e995e1add0a859d488460..ad8ddf182b713893a4b478da1f1d9e3319e87c8e 100644
--- a/app/controllers/projects/settings/integrations_controller.rb
+++ b/app/controllers/projects/settings/integrations_controller.rb
@@ -34,18 +34,18 @@ def update
         if use_inherited_settings?(attributes)
           integration.inherit_from_id = default_integration.id
 
-          if saved = integration.save(context: :manual_change)
-            BulkUpdateIntegrationService.new(default_integration, [integration]).execute
+          if updated = integration.save(context: :manual_change)
+            ::Integrations::Propagation::BulkUpdateService.new(default_integration, [integration]).execute
           end
         else
           attributes[:inherit_from_id] = nil
           integration.attributes = attributes
-          saved = integration.save(context: :manual_change)
+          updated = integration.save(context: :manual_change)
         end
 
         respond_to do |format|
           format.html do
-            if saved
+            if updated
               redirect_to redirect_path, notice: success_message
             else
               render 'edit'
@@ -53,7 +53,7 @@ def update
           end
 
           format.json do
-            status = saved ? :ok : :unprocessable_entity
+            status = updated ? :ok : :unprocessable_entity
 
             render json: serialize_as_json, status: status
           end
diff --git a/app/models/data_list.rb b/app/models/data_list.rb
deleted file mode 100644
index e99364b270926615c4cc3daf00b0e3b251b9ce45..0000000000000000000000000000000000000000
--- a/app/models/data_list.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-class DataList
-  def initialize(batch, data_fields_hash, data_fields_klass)
-    @batch = batch
-    @data_fields_hash = data_fields_hash
-    @data_fields_klass = data_fields_klass
-  end
-
-  def to_array
-    [data_fields_klass, columns, values]
-  end
-
-  private
-
-  attr_reader :batch, :data_fields_hash, :data_fields_klass
-
-  def columns
-    data_fields_hash.keys << data_fields_foreign_key
-  end
-
-  def data_fields_foreign_key
-    data_fields_klass.reflections['integration'].foreign_key
-  end
-
-  def values
-    batch.map do |record|
-      data_fields_hash.values << record['id']
-    end
-  end
-end
diff --git a/app/models/integrations/integration_list.rb b/app/models/integrations/integration_list.rb
deleted file mode 100644
index ab03e5c0e0a687fcf450a6d80d484af39e07cf11..0000000000000000000000000000000000000000
--- a/app/models/integrations/integration_list.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-module Integrations
-  class IntegrationList
-    def initialize(batch, integration_hash, association)
-      @batch = batch
-      @integration_hash = integration_hash
-      @association = association
-    end
-
-    def to_array
-      [Integration, columns, values]
-    end
-
-    private
-
-    attr_reader :batch, :integration_hash, :association
-
-    def columns
-      integration_hash.keys << "#{association}_id"
-    end
-
-    def values
-      batch.select(:id).map do |record|
-        integration_hash.values << record.id
-      end
-    end
-  end
-end
diff --git a/app/services/bulk_create_integration_service.rb b/app/services/bulk_create_integration_service.rb
deleted file mode 100644
index 70c77444f13c232ea58418604ec2649832c47fb0..0000000000000000000000000000000000000000
--- a/app/services/bulk_create_integration_service.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-class BulkCreateIntegrationService
-  include Integrations::BulkOperationHashes
-
-  def initialize(integration, batch, association)
-    @integration = integration
-    @batch = batch
-    @association = association
-  end
-
-  def execute
-    integration_list = Integrations::IntegrationList.new(batch, integration_hash(:create), association).to_array
-
-    Integration.transaction do
-      results = bulk_insert(*integration_list)
-
-      if integration.data_fields_present?
-        data_list = DataList.new(results, data_fields_hash(:create), integration.data_fields.class).to_array
-
-        bulk_insert(*data_list)
-      end
-    end
-  end
-
-  private
-
-  attr_reader :integration, :batch, :association
-
-  def bulk_insert(klass, columns, values_array)
-    items_to_insert = values_array.map { |array| Hash[columns.zip(array)] }
-
-    klass.insert_all(items_to_insert, returning: [:id])
-  end
-end
diff --git a/app/services/bulk_update_integration_service.rb b/app/services/bulk_update_integration_service.rb
deleted file mode 100644
index 57ceec579621196654ff8e6c5857cf72c2393790..0000000000000000000000000000000000000000
--- a/app/services/bulk_update_integration_service.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-class BulkUpdateIntegrationService
-  include Integrations::BulkOperationHashes
-
-  def initialize(integration, batch)
-    @integration = integration
-    @batch = batch
-  end
-
-  # rubocop: disable CodeReuse/ActiveRecord
-  def execute
-    Integration.transaction do
-      Integration.where(id: batch_ids).update_all(integration_hash(:update))
-
-      if integration.data_fields_present?
-        integration.data_fields.class.where(data_fields_foreign_key => batch_ids)
-          .update_all(
-            data_fields_hash(:update)
-          )
-      end
-    end
-  end
-  # rubocop: enable CodeReuse/ActiveRecord
-
-  private
-
-  attr_reader :integration, :batch
-
-  # service_id or integration_id
-  def data_fields_foreign_key
-    integration.data_fields.class.reflections['integration'].foreign_key
-  end
-
-  def batch_ids
-    @batch_ids ||=
-      if batch.is_a?(ActiveRecord::Relation)
-        batch.select(:id)
-      else
-        batch.map(&:id)
-      end
-  end
-end
diff --git a/app/services/concerns/integrations/bulk_operation_hashes.rb b/app/services/concerns/integrations/bulk_operation_hashes.rb
deleted file mode 100644
index 3f13c764ebe780450e40cbc4e18caf3b8f15943c..0000000000000000000000000000000000000000
--- a/app/services/concerns/integrations/bulk_operation_hashes.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-# Returns hashes of attributes suitable for passing to `.insert_all` or `update_all`
-module Integrations
-  module BulkOperationHashes
-    private
-
-    def integration_hash(operation)
-      integration
-        .to_database_hash
-        .merge('inherit_from_id' => integration.inherit_from_id || integration.id)
-        .merge(update_timestamps(operation))
-    end
-
-    def data_fields_hash(operation)
-      integration
-        .data_fields
-        .to_database_hash
-        .merge(update_timestamps(operation))
-    end
-
-    def update_timestamps(operation)
-      time_now = Time.current
-
-      {
-        'created_at' => (time_now if operation == :create),
-        'updated_at' => time_now
-      }.compact
-    end
-  end
-end
diff --git a/app/services/concerns/integrations/propagation/bulk_operation_hashes.rb b/app/services/concerns/integrations/propagation/bulk_operation_hashes.rb
new file mode 100644
index 0000000000000000000000000000000000000000..5ec0b25e9aa0fd8f633138078b918209db3ac4ef
--- /dev/null
+++ b/app/services/concerns/integrations/propagation/bulk_operation_hashes.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+# Returns hashes of attributes suitable for passing to `.insert_all` or `update_all`
+module Integrations
+  module Propagation
+    module BulkOperationHashes
+      private
+
+      def integration_hash(operation)
+        integration
+          .to_database_hash
+          .merge('inherit_from_id' => integration.inherit_from_id || integration.id)
+          .merge(update_timestamps(operation))
+      end
+
+      def data_fields_hash(operation)
+        integration
+          .data_fields
+          .to_database_hash
+          .merge(update_timestamps(operation))
+      end
+
+      def update_timestamps(operation)
+        time_now = Time.current
+
+        {
+          'created_at' => (time_now if operation == :create),
+          'updated_at' => time_now
+        }.compact
+      end
+    end
+  end
+end
diff --git a/app/services/integrations/propagation/bulk_create_service.rb b/app/services/integrations/propagation/bulk_create_service.rb
new file mode 100644
index 0000000000000000000000000000000000000000..766516a1ff3f38dc9c7d144fcd6b4faef2c6cb8a
--- /dev/null
+++ b/app/services/integrations/propagation/bulk_create_service.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Propagation
+    class BulkCreateService
+      include BulkOperationHashes
+
+      def initialize(integration, batch, association)
+        @integration = integration
+        @batch = batch
+        @association = association
+      end
+
+      def execute
+        Integration.transaction do
+          inserted_ids = bulk_insert_integrations
+
+          bulk_insert_data_fields(inserted_ids) if integration.data_fields_present?
+        end
+      end
+
+      private
+
+      attr_reader :integration, :batch, :association
+
+      def bulk_insert_new(model, items_to_insert)
+        model.insert_all(
+          items_to_insert,
+          returning: [:id]
+        ).rows.flatten
+      end
+
+      def bulk_insert_integrations
+        attributes = integration_hash(:create)
+
+        items_to_insert = batch.select(:id).map do |record|
+          attributes.merge("#{association}_id" => record.id)
+        end
+
+        bulk_insert_new(Integration, items_to_insert)
+      end
+
+      def bulk_insert_data_fields(integration_ids)
+        model = integration.data_fields.class
+        integration_fk_name = model.reflections['integration'].foreign_key
+        attributes = data_fields_hash(:create)
+
+        items_to_insert = integration_ids.map do |id|
+          attributes.merge(integration_fk_name => id)
+        end
+
+        bulk_insert_new(model, items_to_insert)
+      end
+    end
+  end
+end
diff --git a/app/services/integrations/propagation/bulk_update_service.rb b/app/services/integrations/propagation/bulk_update_service.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e4a4c27c4ebe8d1eedfef60c7c9bc73680170f0d
--- /dev/null
+++ b/app/services/integrations/propagation/bulk_update_service.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Propagation
+    class BulkUpdateService
+      include BulkOperationHashes
+
+      def initialize(integration, batch)
+        @integration = integration
+        @batch = batch
+      end
+
+      # rubocop: disable CodeReuse/ActiveRecord
+      def execute
+        Integration.transaction do
+          Integration.where(id: batch_ids).update_all(integration_hash(:update))
+
+          if integration.data_fields_present?
+            integration.data_fields.class.where(data_fields_foreign_key => batch_ids)
+              .update_all(
+                data_fields_hash(:update)
+              )
+          end
+        end
+      end
+      # rubocop: enable CodeReuse/ActiveRecord
+
+      private
+
+      attr_reader :integration, :batch
+
+      # service_id or integration_id
+      def data_fields_foreign_key
+        integration.data_fields.class.reflections['integration'].foreign_key
+      end
+
+      def batch_ids
+        @batch_ids ||=
+          if batch.is_a?(ActiveRecord::Relation)
+            batch.select(:id)
+          else
+            batch.map(&:id)
+          end
+      end
+    end
+  end
+end
diff --git a/app/workers/propagate_integration_group_worker.rb b/app/workers/propagate_integration_group_worker.rb
index ed08e90f38d92f5918fe8f6b05ff5d54fc2d6acc..c76fa881924eefcd27323f9e686821f0d0d24e99 100644
--- a/app/workers/propagate_integration_group_worker.rb
+++ b/app/workers/propagate_integration_group_worker.rb
@@ -23,7 +23,7 @@ def perform(integration_id, min_id, max_id)
 
     return if batch.empty?
 
-    BulkCreateIntegrationService.new(integration, batch, 'group').execute
+    Integrations::Propagation::BulkCreateService.new(integration, batch, 'group').execute
   end
   # rubocop: enable CodeReuse/ActiveRecord
 end
diff --git a/app/workers/propagate_integration_inherit_descendant_worker.rb b/app/workers/propagate_integration_inherit_descendant_worker.rb
index 8b3ecc1f05713e608c92002e657ee8dd9f5080b6..2d5cf676a812594f5a2d7f297977ddc623f1028d 100644
--- a/app/workers/propagate_integration_inherit_descendant_worker.rb
+++ b/app/workers/propagate_integration_inherit_descendant_worker.rb
@@ -17,7 +17,7 @@ def perform(integration_id, min_id, max_id)
 
     batch = Integration.inherited_descendants_from_self_or_ancestors_from(integration).where(id: min_id..max_id)
 
-    BulkUpdateIntegrationService.new(integration, batch).execute
+    Integrations::Propagation::BulkUpdateService.new(integration, batch).execute
   end
   # rubocop: enable CodeReuse/ActiveRecord
 end
diff --git a/app/workers/propagate_integration_inherit_worker.rb b/app/workers/propagate_integration_inherit_worker.rb
index f0a53f8cb076c628d99a0cc1a75984083d4aaaee..b9f41d41413359cea2546f838907987855681e23 100644
--- a/app/workers/propagate_integration_inherit_worker.rb
+++ b/app/workers/propagate_integration_inherit_worker.rb
@@ -17,7 +17,7 @@ def perform(integration_id, min_id, max_id)
 
     batch = Integration.where(id: min_id..max_id).by_type(integration.type).inherit_from_id(integration.id)
 
-    BulkUpdateIntegrationService.new(integration, batch).execute
+    Integrations::Propagation::BulkUpdateService.new(integration, batch).execute
   end
   # rubocop: enable CodeReuse/ActiveRecord
 end
diff --git a/app/workers/propagate_integration_project_worker.rb b/app/workers/propagate_integration_project_worker.rb
index bc55b7ff504e91d77d3b07d59ff5323dff9d95fe..035bc112e1a76063e8411b428b14cc67a329ffd1 100644
--- a/app/workers/propagate_integration_project_worker.rb
+++ b/app/workers/propagate_integration_project_worker.rb
@@ -20,7 +20,7 @@ def perform(integration_id, min_id, max_id)
 
     return if batch.empty?
 
-    BulkCreateIntegrationService.new(integration, batch, 'project').execute
+    Integrations::Propagation::BulkCreateService.new(integration, batch, 'project').execute
   end
   # rubocop: enable CodeReuse/ActiveRecord
 end
diff --git a/doc/integration/jira/troubleshooting.md b/doc/integration/jira/troubleshooting.md
index aae0962b65a7e2d10261726459f1cc8e234e8ac1..0b8e778a3d99e6c38d040e21c6ff15f09abf23c4 100644
--- a/doc/integration/jira/troubleshooting.md
+++ b/doc/integration/jira/troubleshooting.md
@@ -141,7 +141,10 @@ To change all Jira projects to use instance-level integration settings:
        integration.inherit_from_id = default_integration.id
 
        if integration.save(context: :manual_change)
-         BulkUpdateIntegrationService.new(default_integration, [integration]).execute
+         # In GitLab 16.9 and later:
+         Integrations::Propagation::BulkUpdateService.new(default_integration, [integration]).execute
+         # In GitLab 16.8 and earlier, instead do:
+         # BulkUpdateIntegrationService.new(default_integration, [integration]).execute
        end
      end
      ```
@@ -175,7 +178,10 @@ To change all Jira projects in a group (and its subgroups) to use group-level in
     integration.inherit_from_id = default_integration.id
 
     if integration.save(context: :manual_change)
-      BulkUpdateIntegrationService.new(default_integration, [integration]).execute
+      # In GitLab 16.9 and later:
+      Integrations::Propagation::BulkUpdateService.new(default_integration, [integration]).execute
+      # In GitLab 16.8 and earlier, instead do:
+      # BulkUpdateIntegrationService.new(default_integration, [integration]).execute
     end
   end
 
diff --git a/spec/models/data_list_spec.rb b/spec/models/data_list_spec.rb
deleted file mode 100644
index 6e01f4786ba21d300ff2950d890b6d67f2b28e59..0000000000000000000000000000000000000000
--- a/spec/models/data_list_spec.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe DataList do
-  describe '#to_array' do
-    let(:jira_integration) { create(:jira_integration) }
-    let(:zentao_integration) { create(:zentao_integration) }
-    let(:cases) do
-      [
-        [jira_integration, 'Integrations::JiraTrackerData', 'integration_id'],
-        [zentao_integration, 'Integrations::ZentaoTrackerData', 'integration_id']
-      ]
-    end
-
-    def data_list(integration)
-      DataList.new([integration], integration.to_database_hash, integration.data_fields.class).to_array
-    end
-
-    it 'returns current data' do
-      cases.each do |integration, data_fields_class_name, foreign_key|
-        data_fields_klass, columns, values_items = data_list(integration)
-
-        expect(data_fields_klass.to_s).to eq data_fields_class_name
-        expect(columns.last).to eq foreign_key
-        values = values_items.first
-        expect(values.last).to eq integration.id
-      end
-    end
-  end
-end
diff --git a/spec/models/integrations/integration_list_spec.rb b/spec/models/integrations/integration_list_spec.rb
deleted file mode 100644
index 4bb7b100bc0eb7aa4162ca5dfba173823587750a..0000000000000000000000000000000000000000
--- a/spec/models/integrations/integration_list_spec.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Integrations::IntegrationList, feature_category: :integrations do
-  let_it_be(:projects) { create_pair(:project, :small_repo) }
-  let(:batch) { Project.where(id: projects.pluck(:id)) }
-  let(:integration_hash) { { 'active' => 'true', 'category' => 'common' } }
-  let(:association) { 'project' }
-
-  subject { described_class.new(batch, integration_hash, association) }
-
-  describe '#to_array' do
-    it 'returns array of Integration, columns, and values' do
-      expect(subject.to_array).to match_array([
-        Integration,
-        %w[active category project_id],
-        contain_exactly(['true', 'common', projects.first.id], ['true', 'common', projects.second.id])
-      ])
-    end
-  end
-end
diff --git a/spec/services/bulk_create_integration_service_spec.rb b/spec/services/integrations/propagation/bulk_create_service_spec.rb
similarity index 88%
rename from spec/services/bulk_create_integration_service_spec.rb
rename to spec/services/integrations/propagation/bulk_create_service_spec.rb
index 57bdfdbd4cb30da0bf00eda3ff0b88889c5f9e58..8888e06ee651eb024385606b69805ba920721c57 100644
--- a/spec/services/bulk_create_integration_service_spec.rb
+++ b/spec/services/integrations/propagation/bulk_create_service_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-RSpec.describe BulkCreateIntegrationService, feature_category: :integrations do
+RSpec.describe Integrations::Propagation::BulkCreateService, feature_category: :integrations do
   include JiraIntegrationHelpers
 
   before_all do
@@ -32,7 +32,7 @@ def attributes(record)
       expect(attributes(created_integration)).to eq attributes(integration)
     end
 
-    context 'integration with data fields' do
+    context 'when integration has data fields' do
       let(:excluded_attributes) { %w[id service_id integration_id created_at updated_at] }
 
       it 'updates the data fields from inherited integrations' do
@@ -68,7 +68,7 @@ def attributes(record)
     end
   end
 
-  context 'passing an instance-level integration' do
+  context 'with an instance-level integration' do
     let(:integration) { instance_integration }
     let(:inherit_from_id) { integration.id }
 
@@ -91,14 +91,14 @@ def attributes(record)
     end
   end
 
-  context 'passing a group integration' do
+  context 'with a group-level integration' do
     let_it_be(:group) { create(:group) }
 
     context 'with a project association' do
       let!(:project) { create(:project, group: group) }
       let(:integration) { create(:jira_integration, :group, group: group) }
       let(:created_integration) { project.jira_integration }
-      let(:batch) { Project.where(id: Project.minimum(:id)..Project.maximum(:id)).without_integration(integration).in_namespace(integration.group.self_and_descendants) }
+      let(:batch) { Project.without_integration(integration).in_namespace(integration.group.self_and_descendants) }
       let(:association) { 'project' }
       let(:inherit_from_id) { integration.id }
 
@@ -123,7 +123,9 @@ def attributes(record)
       it_behaves_like 'creates integration successfully'
 
       context 'with different foreign key of data_fields' do
-        let(:integration) { create(:zentao_integration, :group, group: group, inherit_from_id: instance_integration.id) }
+        let(:integration) do
+          create(:zentao_integration, :group, group: group, inherit_from_id: instance_integration.id)
+        end
 
         it_behaves_like 'creates integration successfully'
       end
diff --git a/spec/services/bulk_update_integration_service_spec.rb b/spec/services/integrations/propagation/bulk_update_service_spec.rb
similarity index 95%
rename from spec/services/bulk_update_integration_service_spec.rb
rename to spec/services/integrations/propagation/bulk_update_service_spec.rb
index 9095fa9a0fab06cfc24362ecd6499c01cb0522ab..837ddbb64563b0779a9c5cd2733f7367b40060c1 100644
--- a/spec/services/bulk_update_integration_service_spec.rb
+++ b/spec/services/integrations/propagation/bulk_update_service_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-RSpec.describe BulkUpdateIntegrationService, feature_category: :integrations do
+RSpec.describe Integrations::Propagation::BulkUpdateService, feature_category: :integrations do
   include JiraIntegrationHelpers
 
   before_all do
@@ -17,7 +17,9 @@
   end
 
   let(:batch) do
-    Integration.inherited_descendants_from_self_or_ancestors_from(subgroup_integration).where(id: group_integration.id..integration.id)
+    Integration
+      .inherited_descendants_from_self_or_ancestors_from(subgroup_integration)
+      .where(id: group_integration.id..integration.id)
   end
 
   let_it_be(:group) { create(:group) }
diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml
index 0f678828bc8d7241f9aa627bfb40b0f1be553110..a3e59c074a42264937e2292dd8d82076c5f8cd5a 100644
--- a/spec/support/rspec_order_todo.yml
+++ b/spec/support/rspec_order_todo.yml
@@ -7176,7 +7176,6 @@
 - './spec/models/customer_relations/issue_contact_spec.rb'
 - './spec/models/customer_relations/organization_spec.rb'
 - './spec/models/cycle_analytics/project_level_stage_adapter_spec.rb'
-- './spec/models/data_list_spec.rb'
 - './spec/models/dependency_proxy/blob_spec.rb'
 - './spec/models/dependency_proxy/group_setting_spec.rb'
 - './spec/models/dependency_proxy/image_ttl_group_policy_spec.rb'
diff --git a/spec/workers/propagate_integration_group_worker_spec.rb b/spec/workers/propagate_integration_group_worker_spec.rb
index 0d797d2213769760b97f0d8ec03c2e383825f158..a477f368674855812e76d39437a252a084fcd30b 100644
--- a/spec/workers/propagate_integration_group_worker_spec.rb
+++ b/spec/workers/propagate_integration_group_worker_spec.rb
@@ -13,8 +13,8 @@
     let(:job_args) { [integration.id, group.id, subgroup2.id] }
 
     it_behaves_like 'an idempotent worker' do
-      it 'calls to BulkCreateIntegrationService' do
-        expect(BulkCreateIntegrationService).to receive(:new)
+      it 'calls to Integrations::Propagation::BulkCreateService' do
+        expect(Integrations::Propagation::BulkCreateService).to receive(:new)
           .with(integration, match_array([group, another_group, subgroup1, subgroup2]), 'group').twice
           .and_return(double(execute: nil))
 
@@ -24,8 +24,8 @@
       context 'with a group integration' do
         let_it_be(:integration) { create(:redmine_integration, :group, group: group) }
 
-        it 'calls to BulkCreateIntegrationService' do
-          expect(BulkCreateIntegrationService).to receive(:new)
+        it 'calls to Integrations::Propagation::BulkCreateService' do
+          expect(Integrations::Propagation::BulkCreateService).to receive(:new)
             .with(integration, match_array([subgroup1, subgroup2]), 'group').twice
             .and_return(double(execute: nil))
 
@@ -36,7 +36,7 @@
 
     context 'with an invalid integration id' do
       it 'returns without failure' do
-        expect(BulkCreateIntegrationService).not_to receive(:new)
+        expect(Integrations::Propagation::BulkCreateService).not_to receive(:new)
 
         subject.perform(0, 1, 100)
       end
diff --git a/spec/workers/propagate_integration_inherit_descendant_worker_spec.rb b/spec/workers/propagate_integration_inherit_descendant_worker_spec.rb
index d69dd45a2094bfe7e76ac8547e6a5a7fadc550c8..1b6ffe77875c94a5efe1d7a908e8555ee67dcf51 100644
--- a/spec/workers/propagate_integration_inherit_descendant_worker_spec.rb
+++ b/spec/workers/propagate_integration_inherit_descendant_worker_spec.rb
@@ -11,8 +11,8 @@
   it_behaves_like 'an idempotent worker' do
     let(:job_args) { [group_integration.id, subgroup_integration.id, subgroup_integration.id] }
 
-    it 'calls to BulkUpdateIntegrationService' do
-      expect(BulkUpdateIntegrationService).to receive(:new)
+    it 'calls to Integrations::Propagation::BulkUpdateService' do
+      expect(Integrations::Propagation::BulkUpdateService).to receive(:new)
         .with(group_integration, match_array(subgroup_integration)).twice
         .and_return(double(execute: nil))
 
@@ -22,7 +22,7 @@
 
   context 'with an invalid integration id' do
     it 'returns without failure' do
-      expect(BulkUpdateIntegrationService).not_to receive(:new)
+      expect(Integrations::Propagation::BulkUpdateService).not_to receive(:new)
 
       subject.perform(0, subgroup_integration.id, subgroup_integration.id)
     end
diff --git a/spec/workers/propagate_integration_inherit_worker_spec.rb b/spec/workers/propagate_integration_inherit_worker_spec.rb
index f5535696fd17240890de027176b4b68671acd9ea..5d2c03196c3a446ee2c297b841b7d43abcc8d74d 100644
--- a/spec/workers/propagate_integration_inherit_worker_spec.rb
+++ b/spec/workers/propagate_integration_inherit_worker_spec.rb
@@ -12,8 +12,8 @@
     it_behaves_like 'an idempotent worker' do
       let(:job_args) { [integration.id, integration1.id, integration3.id] }
 
-      it 'calls to BulkUpdateIntegrationService' do
-        expect(BulkUpdateIntegrationService).to receive(:new)
+      it 'calls to Integrations::Propagation::BulkUpdateService' do
+        expect(Integrations::Propagation::BulkUpdateService).to receive(:new)
           .with(integration, match_array(integration1)).twice
           .and_return(double(execute: nil))
 
@@ -23,7 +23,7 @@
 
     context 'with an invalid integration id' do
       it 'returns without failure' do
-        expect(BulkUpdateIntegrationService).not_to receive(:new)
+        expect(Integrations::Propagation::BulkUpdateService).not_to receive(:new)
 
         subject.perform(0, integration1.id, integration3.id)
       end
diff --git a/spec/workers/propagate_integration_project_worker_spec.rb b/spec/workers/propagate_integration_project_worker_spec.rb
index c7adf1b826fc933afb8d48305e36349b2fff9095..68d8b29a9736f83038f1562cb3aaf759e3edaeba 100644
--- a/spec/workers/propagate_integration_project_worker_spec.rb
+++ b/spec/workers/propagate_integration_project_worker_spec.rb
@@ -13,8 +13,8 @@
     let(:job_args) { [integration.id, project1.id, project3.id] }
 
     it_behaves_like 'an idempotent worker' do
-      it 'calls to BulkCreateIntegrationService' do
-        expect(BulkCreateIntegrationService).to receive(:new)
+      it 'calls to Integrations::Propagation::BulkCreateService' do
+        expect(Integrations::Propagation::BulkCreateService).to receive(:new)
           .with(integration, match_array([project1, project2, project3]), 'project').twice
           .and_return(double(execute: nil))
 
@@ -24,8 +24,8 @@
       context 'with a group integration' do
         let_it_be(:integration) { create(:redmine_integration, :group, group: group) }
 
-        it 'calls to BulkCreateIntegrationService' do
-          expect(BulkCreateIntegrationService).to receive(:new)
+        it 'calls to Integrations::Propagation::BulkCreateService' do
+          expect(Integrations::Propagation::BulkCreateService).to receive(:new)
             .with(integration, match_array([project2, project3]), 'project').twice
             .and_return(double(execute: nil))
 
@@ -36,7 +36,7 @@
 
     context 'with an invalid integration id' do
       it 'returns without failure' do
-        expect(BulkCreateIntegrationService).not_to receive(:new)
+        expect(Integrations::Propagation::BulkCreateService).not_to receive(:new)
 
         subject.perform(0, 1, 100)
       end