diff --git a/config_split_selective_patch.module b/config_split_selective_patch.module
index 97aab70..acc21f2 100644
--- a/config_split_selective_patch.module
+++ b/config_split_selective_patch.module
@@ -5,55 +5,40 @@
  * Selective patch export for Configuration Split.
  */
 
-use Drupal\config_split_selective_patch\Entity\ConfigSplitEntity;
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\config_split_selective_patch\Hook\ConfigSplitSelectivePatchHooks;
 use Drupal\Core\Form\FormStateInterface;
 
 /**
  * Implements hook_entity_type_alter().
  */
+#[LegacyHook]
 function config_split_selective_patch_entity_type_alter(array &$entity_types): void {
-  if (!isset($entity_types['config_split'])) {
-    return;
-  }
-
-  $entity_types['config_split']->setClass(ConfigSplitEntity::class);
-  $exports = $entity_types['config_split']->get('config_export');
-  if (!in_array('patch_list', $exports, TRUE)) {
-    $exports[] = 'patch_list';
-    $entity_types['config_split']->set('config_export', $exports);
-  }
+  \Drupal::service(ConfigSplitSelectivePatchHooks::class)->entityTypeAlter($entity_types);
 }
 
 /**
  * Implements hook_config_schema_info_alter().
  */
+#[LegacyHook]
 function config_split_selective_patch_config_schema_info_alter(&$definitions): void {
-  if (!isset($definitions['config_split.config_split.*'])) {
-    return;
-  }
-
-  $definitions['config_split.config_split.*']['mapping']['patch_list'] = [
-    'type' => 'sequence',
-    'label' => 'Patch split configuration',
-    'sequence' => [
-      'type' => 'string',
-      'label' => 'Configuration name',
-    ],
-  ];
+  \Drupal::service(ConfigSplitSelectivePatchHooks::class)->configSchemaInfoAlter($definitions);
 }
 
 /**
  * Implements hook_form_FORM_ID_alter() for config_split_edit_form.
  */
+#[LegacyHook]
 function config_split_selective_patch_form_config_split_edit_form_alter(array &$form, FormStateInterface $form_state, $form_id): void {
-  _config_split_selective_patch_alter_split_form($form, $form_state);
+  \Drupal::service(ConfigSplitSelectivePatchHooks::class)->formConfigSplitEditFormAlter($form, $form_state, $form_id);
 }
 
 /**
  * Implements hook_form_FORM_ID_alter() for config_split_add_form.
  */
+#[LegacyHook]
 function config_split_selective_patch_form_config_split_add_form_alter(array &$form, FormStateInterface $form_state, $form_id): void {
-  _config_split_selective_patch_alter_split_form($form, $form_state);
+  \Drupal::service(ConfigSplitSelectivePatchHooks::class)->formConfigSplitAddFormAlter($form, $form_state, $form_id);
 }
 
 /**
diff --git a/config_split_selective_patch.services.yml b/config_split_selective_patch.services.yml
index 5f8e621..2fa1bb0 100644
--- a/config_split_selective_patch.services.yml
+++ b/config_split_selective_patch.services.yml
@@ -20,3 +20,7 @@ services:
       - '@config_split_selective_patch.patch_list_exporter'
     tags:
       - { name: event_subscriber }
+
+  Drupal\config_split_selective_patch\Hook\ConfigSplitSelectivePatchHooks:
+    class: Drupal\config_split_selective_patch\Hook\ConfigSplitSelectivePatchHooks
+    autowire: true
diff --git a/src/Hook/ConfigSplitSelectivePatchHooks.php b/src/Hook/ConfigSplitSelectivePatchHooks.php
new file mode 100644
index 0000000..86caf7e
--- /dev/null
+++ b/src/Hook/ConfigSplitSelectivePatchHooks.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Drupal\config_split_selective_patch\Hook;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\config_split_selective_patch\Entity\ConfigSplitEntity;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for config_split_selective_patch.
+ */
+class ConfigSplitSelectivePatchHooks {
+
+  /**
+   * Implements hook_entity_type_alter().
+   */
+  #[Hook('entity_type_alter')]
+  public static function entityTypeAlter(array &$entity_types): void {
+    if (!isset($entity_types['config_split'])) {
+      return;
+    }
+    $entity_types['config_split']->setClass(ConfigSplitEntity::class);
+    $exports = $entity_types['config_split']->get('config_export');
+    if (!in_array('patch_list', $exports, TRUE)) {
+      $exports[] = 'patch_list';
+      $entity_types['config_split']->set('config_export', $exports);
+    }
+  }
+
+  /**
+   * Implements hook_config_schema_info_alter().
+   */
+  #[Hook('config_schema_info_alter')]
+  public static function configSchemaInfoAlter(&$definitions): void {
+    if (!isset($definitions['config_split.config_split.*'])) {
+      return;
+    }
+    $definitions['config_split.config_split.*']['mapping']['patch_list'] = [
+      'type' => 'sequence',
+      'label' => 'Patch split configuration',
+      'sequence' => [
+        'type' => 'string',
+        'label' => 'Configuration name',
+      ],
+    ];
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for config_split_edit_form.
+   */
+  #[Hook('form_config_split_edit_form_alter')]
+  public static function formConfigSplitEditFormAlter(array &$form, FormStateInterface $form_state, $form_id): void {
+    _config_split_selective_patch_alter_split_form($form, $form_state);
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter() for config_split_add_form.
+   */
+  #[Hook('form_config_split_add_form_alter')]
+  public static function formConfigSplitAddFormAlter(array &$form, FormStateInterface $form_state, $form_id): void {
+    _config_split_selective_patch_alter_split_form($form, $form_state);
+  }
+
+}
diff --git a/tests/src/Kernel/SelectivePatchSplitTest.php b/tests/src/Kernel/SelectivePatchSplitTest.php
index 85be8d5..68f5025 100644
--- a/tests/src/Kernel/SelectivePatchSplitTest.php
+++ b/tests/src/Kernel/SelectivePatchSplitTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\config_split_selective_patch\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\Config;
 use Drupal\Core\Config\ConfigImporter;
@@ -21,6 +24,8 @@ use Drupal\Tests\config_filter\Kernel\ConfigStorageTestTrait;
  *
  * @group config_split_selective_patch
  */
+#[Group('config_split_selective_patch')]
+#[RunTestsInSeparateProcesses]
 class SelectivePatchSplitTest extends KernelTestBase {
 
   use ConfigStorageTestTrait;
@@ -73,6 +78,7 @@ class SelectivePatchSplitTest extends KernelTestBase {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testSelectivePatchExport(string $storage): void {
     $config = $this->createSplitConfig('test_split', [
       'storage' => $storage,
@@ -102,6 +108,7 @@ class SelectivePatchSplitTest extends KernelTestBase {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testConditionalPartialListUnchanged(string $storage): void {
     $config = $this->createSplitConfig('test_split', [
       'storage' => $storage,
@@ -158,6 +165,7 @@ class SelectivePatchSplitTest extends KernelTestBase {
    *
    * @dataProvider storageAlternativesProvider
    */
+  #[DataProvider('storageAlternativesProvider')]
   public function testPatchListWinsOnOverlap(string $storage): void {
     $config = $this->createSplitConfig('test_split', [
       'storage' => $storage,
diff --git a/tests/src/Unit/ConfigNameFilterTest.php b/tests/src/Unit/ConfigNameFilterTest.php
index 9641aed..180f107 100644
--- a/tests/src/Unit/ConfigNameFilterTest.php
+++ b/tests/src/Unit/ConfigNameFilterTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\config_split_selective_patch\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\config_split_selective_patch\ConfigNameFilter;
 use PHPUnit\Framework\TestCase;
 
@@ -10,6 +12,7 @@ use PHPUnit\Framework\TestCase;
  *
  * @group config_split_selective_patch
  */
+#[Group('config_split_selective_patch')]
 class ConfigNameFilterTest extends TestCase {
 
   /**
@@ -17,6 +20,7 @@ class ConfigNameFilterTest extends TestCase {
    *
    * @dataProvider filterListProvider
    */
+  #[DataProvider('filterListProvider')]
   public function testInFilterList(string $name, array $list, bool $expected): void {
     static::assertSame($expected, ConfigNameFilter::inFilterList($name, $list));
   }
