diff --git a/config_split.install b/config_split.install
index c54981d..90c2ce0 100644
--- a/config_split.install
+++ b/config_split.install
@@ -7,6 +7,8 @@
 
 declare(strict_types=1);
 
+use Drupal\Component\Utility\DeprecationHelper;
+
 /**
  * Enable the config_filter module.
  */
@@ -41,7 +43,7 @@ function config_split_update_8002() {
       unset($data[$list . '_skip_equal']);
     }
     $split->setData($data);
-    $split->save(TRUE);
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $split->save(), fn() => $split->save(TRUE));
   }
 }
 
@@ -69,6 +71,6 @@ function config_split_update_8003() {
     }
 
     $split->setData($data);
-    $split->save(TRUE);
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $split->save(), fn() => $split->save(TRUE));
   }
 }
diff --git a/config_split.module b/config_split.module
index 98bf870..2f4d6b5 100644
--- a/config_split.module
+++ b/config_split.module
@@ -5,111 +5,25 @@
  * Configuration split module functions.
  */
 
-use Drupal\Core\Config\Entity\ConfigEntityInterface;
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\config_split\Hook\ConfigSplitHooks;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Link;
 use Drupal\Core\Routing\RouteMatchInterface;
 
 /**
  * Implements hook_form_FORM_ID_alter().
  */
+#[LegacyHook]
 function config_split_form_config_admin_import_form_alter(&$form, FormStateInterface $form_state) {
-
-  $enabled = [];
-  $used_config_split_text = t('You are not using any config split configuration');
-  /** @var \Drupal\config_split\ConfigSplitManager $manager */
-  $manager = \Drupal::service('config_split.manager');
-  $sync = \Drupal::service('config.storage.sync');
-  $splits = $manager->loadMultiple($manager->listAll($sync), $sync);
-  foreach ($splits as $split) {
-    if ($split->get('status')) {
-      $entity = $manager->getSplitEntity($split->getName());
-      if ($entity instanceof ConfigEntityInterface) {
-        $enabled[] = Link::fromTextAndUrl($entity->label(), $entity->toUrl())->toString();
-      }
-      else {
-        $enabled[] = $split->get('label') . ' (new)';
-      }
-    }
-  }
-  if (!empty($enabled)) {
-    $used_config_split_text = t('Used config split configuration:') . ' ' . implode(', ', $enabled);
-  }
-
-  $form['config_split']['#weight'] = -10;
-  $form['config_split']['#markup'] = '<p>' . $used_config_split_text . '</p>';
-
+  \Drupal::service(ConfigSplitHooks::class)->formConfigAdminImportFormAlter($form, $form_state);
 }
 
 /**
  * Implements hook_help().
  */
+#[LegacyHook]
 function config_split_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    case 'help.page.config_split':
-      $output = '';
-      $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('
-The Drupal 8 configuration management works best when importing and exporting
-the whole set of the sites configuration. However, sometimes developers like to
-opt out of the robustness of CM and have a super-set of configuration active on
-their development machine. The canonical example for this is to have the
-<code>devel</code> module enabled or having a few block placements or views in
-the development environment and then not export them into the set of
-configuration to be deployed, yet still being able to share the development
-configuration with colleagues.
-
-This module allows to define sets of configuration that will get exported to
-separate directories when exporting, and get merged together when importing.
-It is possible to define in settings.php which of these sets should be active
-and considered for the export and import.
-
-For more information, see the <a href=":online-documentation">online documentation for the Config Split module</a>.',
-          [
-            ':online-documentation' => 'https://www.drupal.org/docs/8/modules/configuration-split',
-          ])
-        . '</p>';
-      $output .= '<h3>' . t('Uses') . '</h3>';
-      $output .= '<dl>';
-      $output .= '<dt>' . t('Setting up a split') . '</dt>';
-      $output .= '<dd>' . t('
-Let us assume that you configured your sync directory as follows:
-<code>
-$settings["config_sync_directory"] = \'../config/sync\';
-</code>
-Create a split with the folder `../config/my-split-folder` and create that
-directory. Now add a module that is currently active that you wish not to
-export, say `devel`. Next export all the configuration.
-This should have removed devel from `core.extensions` and moved the devel
-configuration to the split folder.') . '</dd>';
-      $output .= '<dt>' . t('Deploy splits') . '</dt>';
-      $output .= '<dd>' . t('
-Now deploy the configuration and devel will be un-installed.
-On another developers machine just import the configuration, add the override,
-clear the cache, and import again to have devel enabled on that environment.
-
-You should only edit active splits as inactive splits will not take effect when
-exporting the configuration.') . '</dd>';
-      $output .= '</dl>';
-
-      return $output;
-
-    case 'entity.config_split.add_form':
-    case 'entity.config_split.edit_form':
-      $output = '';
-      $output .= '<p>' . t('Config Split Help') . '</p>';
-      $output .= '<p>' . t('The configuration listed as part of a split
-      are exported to the split storage rather than the usual sync directory
-      when exporting the whole configuration. When importing the whole
-      configuration, the configuration in the split storages is merged with
-      the default sync directory and overrides the configuration.
-      The configuration does not end up being overwritten in the sense of
-      configuration overrides such as the overrides from settings.php.') . '</p>';
-
-      return $output;
-  }
-
-  return NULL;
+  return \Drupal::service(ConfigSplitHooks::class)->help($route_name, $route_match);
 }
 
 /**
@@ -118,12 +32,7 @@ function config_split_help($route_name, RouteMatchInterface $route_match) {
  * Automatically add any enabled database config splits' partial and complete
  * entries as whitelisted patterns for config_readonly.
  */
+#[LegacyHook]
 function config_split_config_readonly_whitelist_patterns() {
-  $patterns = [];
-  /** @var \Drupal\config_split\Entity\ConfigSplitEntityInterface[] $splits */
-  $splits = \Drupal::entityTypeManager()->getStorage('config_split')->loadByProperties(['storage' => 'database', 'status' => TRUE]);
-  foreach ($splits as $split) {
-    $patterns = array_merge($patterns, $split->get('partial_list'), $split->get('complete_list'));
-  }
-  return $patterns;
+  return \Drupal::service(ConfigSplitHooks::class)->configReadonlyWhitelistPatterns();
 }
diff --git a/config_split.services.yml b/config_split.services.yml
index db36555..670dd13 100644
--- a/config_split.services.yml
+++ b/config_split.services.yml
@@ -56,3 +56,7 @@ services:
       - "@state"
     tags:
       - { name: config.factory.override, priority: 5 }
+
+  Drupal\config_split\Hook\ConfigSplitHooks:
+    class: Drupal\config_split\Hook\ConfigSplitHooks
+    autowire: true
diff --git a/src/EventSubscriber/SplitImportExportSubscriber.php b/src/EventSubscriber/SplitImportExportSubscriber.php
index e067be1..0ac6759 100644
--- a/src/EventSubscriber/SplitImportExportSubscriber.php
+++ b/src/EventSubscriber/SplitImportExportSubscriber.php
@@ -45,7 +45,7 @@ public function __construct(ConfigSplitManager $manager, ConfigFactoryInterface
   /**
    * {@inheritdoc}
    */
-  public static function getSubscribedEvents() {
+  public static function getSubscribedEvents(): array {
     // We get the splits priority from the settings.
     // Unfortunately we can not load the existing splits from the drupal because
     // the subscribed events is compiled into the container in a compiler pass
diff --git a/src/Hook/ConfigSplitHooks.php b/src/Hook/ConfigSplitHooks.php
new file mode 100644
index 0000000..b099869
--- /dev/null
+++ b/src/Hook/ConfigSplitHooks.php
@@ -0,0 +1,133 @@
+<?php
+
+namespace Drupal\config_split\Hook;
+
+use Drupal\Core\Config\Entity\ConfigEntityInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Link;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+/**
+ * Hook implementations for config_split.
+ */
+class ConfigSplitHooks
+{
+    use StringTranslationTrait;
+    /**
+     * Implements hook_form_FORM_ID_alter().
+     */
+    #[Hook('form_config_admin_import_form_alter')]
+    public function formConfigAdminImportFormAlter(&$form, \Drupal\Core\Form\FormStateInterface $form_state)
+    {
+        $enabled = [
+        ];
+        $used_config_split_text = $this->t('You are not using any config split configuration');
+        /** @var \Drupal\config_split\ConfigSplitManager $manager */
+        $manager = \Drupal::service('config_split.manager');
+        $sync = \Drupal::service('config.storage.sync');
+        $splits = $manager->loadMultiple($manager->listAll($sync), $sync);
+        foreach ($splits as $split) {
+            if ($split->get('status')) {
+                $entity = $manager->getSplitEntity($split->getName());
+                if ($entity instanceof \Drupal\Core\Config\Entity\ConfigEntityInterface) {
+                    $enabled[] = \Drupal\Core\Link::fromTextAndUrl($entity->label(), $entity->toUrl())->toString();
+                } else {
+                    $enabled[] = $split->get('label') . ' (new)';
+                }
+            }
+        }
+        if (!empty($enabled)) {
+            $used_config_split_text = $this->t('Used config split configuration:') . ' ' . implode(', ', $enabled);
+        }
+        $form['config_split']['#weight'] = -10;
+        $form['config_split']['#markup'] = '<p>' . $used_config_split_text . '</p>';
+    }
+    /**
+     * Implements hook_help().
+     */
+    #[Hook('help')]
+    public function help($route_name, \Drupal\Core\Routing\RouteMatchInterface $route_match)
+    {
+        switch ($route_name) {
+            case 'help.page.config_split':
+                $output = '';
+                $output .= '<h3>' . $this->t('About') . '</h3>';
+                $output .= '<p>' . $this->t('
+The Drupal 8 configuration management works best when importing and exporting
+the whole set of the sites configuration. However, sometimes developers like to
+opt out of the robustness of CM and have a super-set of configuration active on
+their development machine. The canonical example for this is to have the
+<code>devel</code> module enabled or having a few block placements or views in
+the development environment and then not export them into the set of
+configuration to be deployed, yet still being able to share the development
+configuration with colleagues.
+
+This module allows to define sets of configuration that will get exported to
+separate directories when exporting, and get merged together when importing.
+It is possible to define in settings.php which of these sets should be active
+and considered for the export and import.
+
+For more information, see the <a href=":online-documentation">online documentation for the Config Split module</a>.', [
+                    ':online-documentation' => 'https://www.drupal.org/docs/8/modules/configuration-split',
+                ]) . '</p>';
+                $output .= '<h3>' . $this->t('Uses') . '</h3>';
+                $output .= '<dl>';
+                $output .= '<dt>' . $this->t('Setting up a split') . '</dt>';
+                $output .= '<dd>' . $this->t('
+Let us assume that you configured your sync directory as follows:
+<code>
+$settings["config_sync_directory"] = \'../config/sync\';
+</code>
+Create a split with the folder `../config/my-split-folder` and create that
+directory. Now add a module that is currently active that you wish not to
+export, say `devel`. Next export all the configuration.
+This should have removed devel from `core.extensions` and moved the devel
+configuration to the split folder.') . '</dd>';
+                $output .= '<dt>' . $this->t('Deploy splits') . '</dt>';
+                $output .= '<dd>' . $this->t('
+Now deploy the configuration and devel will be un-installed.
+On another developers machine just import the configuration, add the override,
+clear the cache, and import again to have devel enabled on that environment.
+
+You should only edit active splits as inactive splits will not take effect when
+exporting the configuration.') . '</dd>';
+                $output .= '</dl>';
+                return $output;
+            case 'entity.config_split.add_form':
+            case 'entity.config_split.edit_form':
+                $output = '';
+                $output .= '<p>' . $this->t('Config Split Help') . '</p>';
+                $output .= '<p>' . $this->t('The configuration listed as part of a split
+      are exported to the split storage rather than the usual sync directory
+      when exporting the whole configuration. When importing the whole
+      configuration, the configuration in the split storages is merged with
+      the default sync directory and overrides the configuration.
+      The configuration does not end up being overwritten in the sense of
+      configuration overrides such as the overrides from settings.php.') . '</p>';
+                return $output;
+        }
+        return NULL;
+    }
+    /**
+     * Implements hook_config_readonly_whitelist_patterns().
+     *
+     * Automatically add any enabled database config splits' partial and complete
+     * entries as whitelisted patterns for config_readonly.
+     */
+    #[Hook('config_readonly_whitelist_patterns')]
+    public static function configReadonlyWhitelistPatterns()
+    {
+        $patterns = [
+        ];
+        /** @var \Drupal\config_split\Entity\ConfigSplitEntityInterface[] $splits */
+        $splits = \Drupal::entityTypeManager()->getStorage('config_split')->loadByProperties([
+            'storage' => 'database',
+            'status' => TRUE,
+        ]);
+        foreach ($splits as $split) {
+            $patterns = array_merge($patterns, $split->get('partial_list'), $split->get('complete_list'));
+        }
+        return $patterns;
+    }
+}
diff --git a/tests/modules/config_split_sequence_test/config_split_sequence_test.module b/tests/modules/config_split_sequence_test/config_split_sequence_test.module
index 2227d99..b31f7a7 100644
--- a/tests/modules/config_split_sequence_test/config_split_sequence_test.module
+++ b/tests/modules/config_split_sequence_test/config_split_sequence_test.module
@@ -1,5 +1,12 @@
 <?php
 
+/**
+ * @file
+ */
+
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\config_split_sequence_test\Hook\ConfigSplitSequenceTestHooks;
+
 /**
  * @file
  * Hooks to test config splits sequence api.
@@ -8,13 +15,7 @@
 /**
  * Implements hook_config_schema_info_alter().
  */
+#[LegacyHook]
 function config_split_sequence_test_config_schema_info_alter(&$definitions) {
-  // This illustrates how to set a patch index callback. It works with any
-  // callable that can be serialized.
-  $definitions['config_split_sequence_test.nested_sequences']['mapping']['nested']['settings']['patch index'] = '0.0';
-  $definitions['config_split_sequence_test.nested_sequences']['mapping']['nested']['sequence']['settings']['patch index'] = '0';
-  // This is redundant because the third layer contains strings which will be
-  // used as values anyway. But this demonstrates that instead of a callable
-  // one can just specify "*" and it will take the value.
-  $definitions['config_split_sequence_test.nested_sequences']['mapping']['nested']['sequence']['sequence']['settings']['patch index'] = '*';
+  \Drupal::service(ConfigSplitSequenceTestHooks::class)->configSchemaInfoAlter($definitions);
 }
diff --git a/tests/modules/config_split_sequence_test/config_split_sequence_test.services.yml b/tests/modules/config_split_sequence_test/config_split_sequence_test.services.yml
new file mode 100644
index 0000000..d770a21
--- /dev/null
+++ b/tests/modules/config_split_sequence_test/config_split_sequence_test.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\config_split_sequence_test\Hook\ConfigSplitSequenceTestHooks:
+    class: Drupal\config_split_sequence_test\Hook\ConfigSplitSequenceTestHooks
+    autowire: true
diff --git a/tests/modules/config_split_sequence_test/src/Hook/ConfigSplitSequenceTestHooks.php b/tests/modules/config_split_sequence_test/src/Hook/ConfigSplitSequenceTestHooks.php
new file mode 100644
index 0000000..8ded595
--- /dev/null
+++ b/tests/modules/config_split_sequence_test/src/Hook/ConfigSplitSequenceTestHooks.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Drupal\config_split_sequence_test\Hook;
+
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for config_split_sequence_test.
+ */
+class ConfigSplitSequenceTestHooks {
+  /**
+   * @file
+   * Hooks to test config splits sequence api.
+   */
+
+  /**
+   * Implements hook_config_schema_info_alter().
+   */
+  #[Hook('config_schema_info_alter')]
+  public static function configSchemaInfoAlter(&$definitions) {
+    // This illustrates how to set a patch index callback. It works with any
+    // callable that can be serialized.
+    $definitions['config_split_sequence_test.nested_sequences']['mapping']['nested']['settings']['patch index'] = '0.0';
+    $definitions['config_split_sequence_test.nested_sequences']['mapping']['nested']['sequence']['settings']['patch index'] = '0';
+    // This is redundant because the third layer contains strings which will be
+    // used as values anyway. But this demonstrates that instead of a callable
+    // one can just specify "*" and it will take the value.
+    $definitions['config_split_sequence_test.nested_sequences']['mapping']['nested']['sequence']['sequence']['settings']['patch index'] = '*';
+  }
+
+}
diff --git a/tests/src/Functional/DrushCommandsTest.php b/tests/src/Functional/DrushCommandsTest.php
index 5e934dd..a8b7e94 100644
--- a/tests/src/Functional/DrushCommandsTest.php
+++ b/tests/src/Functional/DrushCommandsTest.php
@@ -4,6 +4,7 @@
 
 namespace Drupal\Tests\config_split\Functional;
 
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\config_split\Entity\ConfigSplitEntity;
 use Drupal\Core\Config\FileStorage;
 use Drupal\Core\Site\Settings;
@@ -15,6 +16,7 @@
  * Test the drush command hook.
  */
 #[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class DrushCommandsTest extends BrowserTestBase {
   use DrushTestTrait;
 
diff --git a/tests/src/Kernel/ConfigSorterTest.php b/tests/src/Kernel/ConfigSorterTest.php
index e885f86..a8908a6 100644
--- a/tests/src/Kernel/ConfigSorterTest.php
+++ b/tests/src/Kernel/ConfigSorterTest.php
@@ -4,6 +4,8 @@
 
 namespace Drupal\Tests\config_split\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\config_split\Config\ConfigSorter;
 use Drupal\Core\Config\FileStorage;
 use Drupal\KernelTests\KernelTestBase;
@@ -13,6 +15,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class ConfigSorterTest extends KernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/ExplicitPriorityTest.php b/tests/src/Kernel/ExplicitPriorityTest.php
index 2718672..5aa8c6f 100644
--- a/tests/src/Kernel/ExplicitPriorityTest.php
+++ b/tests/src/Kernel/ExplicitPriorityTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\config_split\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\Tests\config_filter\Kernel\ConfigStorageTestTrait;
 
@@ -10,6 +12,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class ExplicitPriorityTest extends KernelTestBase {
 
   use ConfigStorageTestTrait;
diff --git a/tests/src/Kernel/InactiveSplitTest.php b/tests/src/Kernel/InactiveSplitTest.php
index 7a0e0b2..dac5734 100644
--- a/tests/src/Kernel/InactiveSplitTest.php
+++ b/tests/src/Kernel/InactiveSplitTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\config_split\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Config\MemoryStorage;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\Tests\config_filter\Kernel\ConfigStorageTestTrait;
@@ -11,6 +13,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class InactiveSplitTest extends KernelTestBase {
 
   use ConfigStorageTestTrait;
diff --git a/tests/src/Kernel/IndividualExportImportTest.php b/tests/src/Kernel/IndividualExportImportTest.php
index 13b072a..7490d77 100644
--- a/tests/src/Kernel/IndividualExportImportTest.php
+++ b/tests/src/Kernel/IndividualExportImportTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\config_split\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\config_split\ConfigSplitCliService;
 use Drupal\Core\Config\MemoryStorage;
 use Drupal\Core\Config\StorageInterface;
@@ -17,6 +19,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class IndividualExportImportTest extends KernelTestBase {
 
   use ConfigStorageTestTrait;
diff --git a/tests/src/Kernel/NewSplitImportTest.php b/tests/src/Kernel/NewSplitImportTest.php
index f1539ed..3c7f9dd 100644
--- a/tests/src/Kernel/NewSplitImportTest.php
+++ b/tests/src/Kernel/NewSplitImportTest.php
@@ -4,6 +4,8 @@
 
 namespace Drupal\Tests\config_split\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Config\MemoryStorage;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\Tests\config_filter\Kernel\ConfigStorageTestTrait;
@@ -13,6 +15,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class NewSplitImportTest extends KernelTestBase {
 
   use ConfigStorageTestTrait;
diff --git a/tests/src/Kernel/NoPatchSplitMergeTest.php b/tests/src/Kernel/NoPatchSplitMergeTest.php
index ba6c213..04b0a34 100644
--- a/tests/src/Kernel/NoPatchSplitMergeTest.php
+++ b/tests/src/Kernel/NoPatchSplitMergeTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\config_split\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\config_split\Config\SplitCollectionStorage;
 use Drupal\Core\Config\MemoryStorage;
 use Drupal\Core\Config\StorageCopyTrait;
@@ -19,6 +22,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class NoPatchSplitMergeTest extends KernelTestBase {
 
   use ConfigStorageTestTrait;
@@ -77,6 +82,7 @@ public static function storageAlternativesProvider(): array {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testSimpleSplitExport($storage) {
     // Simple split with default configuration.
     $config = $this->createSplitConfig('test_split', [
@@ -131,6 +137,7 @@ public function testSimpleSplitExport($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testCompleteAndConditionalSplitExport($storage) {
 
     $config = $this->createSplitConfig('test_split', [
@@ -227,6 +234,7 @@ public function testCompleteAndConditionalSplitExport($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testConditionalSplitWithModuleConfig($storage) {
 
     $config = $this->createSplitConfig('test_split', [
@@ -299,6 +307,7 @@ public function testConditionalSplitWithModuleConfig($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testIncludeDependency($storage) {
     $config = $this->createSplitConfig('test_split', [
       'storage' => $storage,
diff --git a/tests/src/Kernel/PatchSequenceTest.php b/tests/src/Kernel/PatchSequenceTest.php
index 20b22c1..3b28a9f 100644
--- a/tests/src/Kernel/PatchSequenceTest.php
+++ b/tests/src/Kernel/PatchSequenceTest.php
@@ -4,6 +4,9 @@
 
 namespace src\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\config_split\Config\ConfigPatch;
 use Drupal\KernelTests\KernelTestBase;
 
@@ -12,6 +15,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class PatchSequenceTest extends KernelTestBase {
 
   /**
@@ -52,6 +57,7 @@ protected function setUp(): void {
    *
    * @dataProvider sequenceProvider
    */
+  #[DataProvider('sequenceProvider')]
   public function testSequencePatch(string $name, array $configA, array $configB, ?ConfigPatch $expectedAB = NULL) {
     // Create patches in both directions.
     $patchAB = $this->patchMerge->createPatch($configA, $configB, $name);
diff --git a/tests/src/Kernel/RolesSplittingTest.php b/tests/src/Kernel/RolesSplittingTest.php
index 040abab..cd42cb2 100644
--- a/tests/src/Kernel/RolesSplittingTest.php
+++ b/tests/src/Kernel/RolesSplittingTest.php
@@ -4,6 +4,8 @@
 
 namespace Drupal\Tests\config_split\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\config_split\Config\ConfigPatch;
 use Drupal\Core\Config\StorageCopyTrait;
 use Drupal\KernelTests\KernelTestBase;
@@ -15,6 +17,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class RolesSplittingTest extends KernelTestBase {
 
   use ConfigStorageTestTrait;
diff --git a/tests/src/Kernel/SplitCollectionStorageTest.php b/tests/src/Kernel/SplitCollectionStorageTest.php
index ce895cf..7863571 100644
--- a/tests/src/Kernel/SplitCollectionStorageTest.php
+++ b/tests/src/Kernel/SplitCollectionStorageTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\config_split\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\config_split\Config\SplitCollectionStorage;
 use Drupal\Core\Config\NullStorage;
 use Drupal\KernelTests\Core\Config\Storage\MemoryStorageTest;
@@ -11,6 +13,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class SplitCollectionStorageTest extends MemoryStorageTest {
 
   /**
diff --git a/tests/src/Kernel/SplitContentEntityTypeTest.php b/tests/src/Kernel/SplitContentEntityTypeTest.php
index 256bff5..03d1c58 100644
--- a/tests/src/Kernel/SplitContentEntityTypeTest.php
+++ b/tests/src/Kernel/SplitContentEntityTypeTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\config_split\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Core\Config\StorageCopyTrait;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
@@ -18,6 +21,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class SplitContentEntityTypeTest extends KernelTestBase {
 
   use ConfigStorageTestTrait;
@@ -109,6 +114,7 @@ public static function storageAlternativesProvider(): array {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testEntityDisplayDependency($storage) {
     // Create a test split with a module which will be enabled,
     // as well as a piece of config that will be changed and
@@ -153,6 +159,7 @@ public function testEntityDisplayDependency($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testEntityDisplayWithMultipleDependencies($storage) {
     // Create a test split with a module which will be enabled,
     // as well as a piece of config that will be changed and
@@ -205,6 +212,7 @@ public function testEntityDisplayWithMultipleDependencies($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testPatchCreationAfterCompleteSplit($storage) {
     // Make the display depend on the datetime module so that it is completely
     // split when modules are processed.
@@ -249,6 +257,7 @@ public function testPatchCreationAfterCompleteSplit($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testPatchCreationInPartialSplitAfterCompleteSplit($storage) {
     // Partially and completely split the same item.
     $config = $this->createSplitConfig('test_split', [
@@ -289,6 +298,7 @@ public function testPatchCreationInPartialSplitAfterCompleteSplit($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testSingleStackableSplit($storage) {
     $config = $this->createSplitConfig('stackable', [
       'storage' => $storage,
@@ -313,6 +323,7 @@ public function testSingleStackableSplit($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testMultipleStackableSplits($storage) {
 
     $feature_split = $this->createSplitConfig('feature', [
@@ -387,6 +398,7 @@ public function testMultipleStackableSplits($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testMultipleIndependentSplits($storage) {
     $split_a = $this->createSplitConfig('split_a', [
       'storage' => $storage,
@@ -437,6 +449,7 @@ public function testMultipleIndependentSplits($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testNoPatchingSplit($storage) {
     // Create a split, completely splitting the type.
     $config = $this->createSplitConfig('test_split', [
diff --git a/tests/src/Kernel/SplitMergeTest.php b/tests/src/Kernel/SplitMergeTest.php
index 22184ed..12af80d 100644
--- a/tests/src/Kernel/SplitMergeTest.php
+++ b/tests/src/Kernel/SplitMergeTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\config_split\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\config_split\Config\ConfigPatch;
 use Drupal\config_split\Config\SplitCollectionStorage;
 use Drupal\Core\Config\MemoryStorage;
@@ -20,6 +23,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class SplitMergeTest extends KernelTestBase {
 
   use ConfigStorageTestTrait;
@@ -78,6 +83,7 @@ public static function storageAlternativesProvider(): array {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testSimpleSplitExport($storage) {
     // Simple split with default configuration.
     $config = $this->createSplitConfig('test_split', [
@@ -131,6 +137,7 @@ public function testSimpleSplitExport($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testCompleteAndConditionalSplitExport($storage) {
 
     $config = $this->createSplitConfig('test_split', [
@@ -229,6 +236,7 @@ public function testCompleteAndConditionalSplitExport($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testConditionalSplitWithModuleConfig($storage) {
 
     $config = $this->createSplitConfig('test_split', [
@@ -290,6 +298,7 @@ public function testConditionalSplitWithModuleConfig($storage) {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testIncludeDependency($storage) {
     $config = $this->createSplitConfig('test_split', [
       'storage' => $storage,
diff --git a/tests/src/Kernel/StatusOverrideTest.php b/tests/src/Kernel/StatusOverrideTest.php
index 75facb2..a75465e 100644
--- a/tests/src/Kernel/StatusOverrideTest.php
+++ b/tests/src/Kernel/StatusOverrideTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\config_split\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 
 /**
@@ -9,6 +11,8 @@
  *
  * @group config_split
  */
+#[Group('config_split')]
+#[RunTestsInSeparateProcesses]
 class StatusOverrideTest extends KernelTestBase {
 
   use SplitTestTrait;
diff --git a/tests/src/Unit/ConfigPatchTest.php b/tests/src/Unit/ConfigPatchTest.php
index 57fd58a..0f0eae0 100644
--- a/tests/src/Unit/ConfigPatchTest.php
+++ b/tests/src/Unit/ConfigPatchTest.php
@@ -4,6 +4,8 @@
 
 namespace Drupal\Tests\config_split\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Prophecy\PhpUnit\ProphecyTrait;
 use Drupal\config_split\Config\ConfigPatch;
 use Drupal\config_split\Config\ConfigPatchMerge;
@@ -20,6 +22,7 @@
  *
  * @group config_split_patch
  */
+#[Group('config_split_patch')]
 class ConfigPatchTest extends TestCase {
 
   use ProphecyTrait;
@@ -66,6 +69,7 @@ public function setUp(): void {
    *
    * @dataProvider standardPatchMergeProvider
    */
+  #[DataProvider('standardPatchMergeProvider')]
   public function testStandardPatchMerge(array $configA, array $configB, ?ConfigPatch $expectedAB = NULL) {
     $patchAB = $this->patchMerge->createPatch($configA, $configB, 'test');
     $patchBA = $this->patchMerge->createPatch($configB, $configA, 'test');
