diff --git a/composer.json b/composer.json
index 9d92d35..517c6d7 100644
--- a/composer.json
+++ b/composer.json
@@ -18,6 +18,6 @@
     "license": "GPL-2.0+",
     "minimum-stability": "dev",
     "require": {
-        "drupal/core": "^10 || ^11"
+        "drupal/core": "^10.1 || ^11 || ^12"
     }
 }
diff --git a/config_delete.info.yml b/config_delete.info.yml
index 66f100b..6ca0c4a 100644
--- a/config_delete.info.yml
+++ b/config_delete.info.yml
@@ -2,6 +2,6 @@ type: module
 name: 'Config Delete'
 description: 'Delete configuration items from the UI.'
 package: 'Development'
-core_version_requirement: ^10 || ^11
+core_version_requirement: ^10.1 || ^11 || ^12
 dependencies:
   - drupal:config
diff --git a/config_delete.module b/config_delete.module
index 01b68dd..453a54c 100644
--- a/config_delete.module
+++ b/config_delete.module
@@ -5,44 +5,23 @@
  * This is the primary module file.
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\config_delete\Hook\ConfigDeleteHooks;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
 
 /**
  * Implements hook_help().
  */
+#[LegacyHook]
 function config_delete_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    case 'help.page.config_delete':
-      $output = '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('Delete configuration items from the UI.') . '</p>';
-      return $output;
-  }
+  return \Drupal::service(ConfigDeleteHooks::class)->help($route_name, $route_match);
 }
 
 /**
  * Implements hook_form_alter().
  */
+#[LegacyHook]
 function config_delete_form_alter(&$form, FormStateInterface $form_state, $form_id) {
-  if ($form_id == 'config_delete_form') {
-    unset($form['export']);
-
-    $form['config_delete_notice'] = [
-      '#type' => 'markup',
-      '#markup' => t('Notice: Deleting configuration items can potentially break your site! Please use this form only if you know what are you doing.'),
-      '#prefix' => '<strong>',
-      '#suffix' => '</strong>',
-      '#weight' => -100,
-    ];
-
-    $form['delete_dependencies'] = [
-      '#type' => 'checkbox',
-      '#title' => t('Delete config dependencies'),
-    ];
-
-    $form['submit'] = [
-      '#type' => 'submit',
-      '#value' => t('Delete'),
-    ];
-  }
+  \Drupal::service(ConfigDeleteHooks::class)->formAlter($form, $form_state, $form_id);
 }
diff --git a/config_delete.services.yml b/config_delete.services.yml
new file mode 100644
index 0000000..53d6fb9
--- /dev/null
+++ b/config_delete.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\config_delete\Hook\ConfigDeleteHooks:
+    class: Drupal\config_delete\Hook\ConfigDeleteHooks
+    autowire: true
diff --git a/src/Hook/ConfigDeleteHooks.php b/src/Hook/ConfigDeleteHooks.php
new file mode 100644
index 0000000..a83637c
--- /dev/null
+++ b/src/Hook/ConfigDeleteHooks.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Drupal\config_delete\Hook;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for config_delete.
+ */
+class ConfigDeleteHooks {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_help().
+   */
+  #[Hook('help')]
+  public function help($route_name, RouteMatchInterface $route_match) {
+    switch ($route_name) {
+      case 'help.page.config_delete':
+        $output = '<h3>' . $this->t('About') . '</h3>';
+        $output .= '<p>' . $this->t('Delete configuration items from the UI.') . '</p>';
+        return $output;
+    }
+  }
+
+  /**
+   * Implements hook_form_alter().
+   */
+  #[Hook('form_alter')]
+  public function formAlter(&$form, FormStateInterface $form_state, $form_id) {
+    if ($form_id == 'config_delete_form') {
+      unset($form['export']);
+      $form['config_delete_notice'] = [
+        '#type' => 'markup',
+        '#markup' => $this->t('Notice: Deleting configuration items can potentially break your site! Please use this form only if you know what are you doing.'),
+        '#prefix' => '<strong>',
+        '#suffix' => '</strong>',
+        '#weight' => -100,
+      ];
+      $form['delete_dependencies'] = [
+        '#type' => 'checkbox',
+        '#title' => $this->t('Delete config dependencies'),
+      ];
+      $form['submit'] = [
+        '#type' => 'submit',
+        '#value' => $this->t('Delete'),
+      ];
+    }
+  }
+
+}
diff --git a/tests/modules/config_delete_test/config_delete_test.info.yml b/tests/modules/config_delete_test/config_delete_test.info.yml
index a086f2e..b65ba26 100644
--- a/tests/modules/config_delete_test/config_delete_test.info.yml
+++ b/tests/modules/config_delete_test/config_delete_test.info.yml
@@ -2,5 +2,5 @@ type: module
 name: 'Config Delete Test'
 description: 'Config Delete Test module.'
 package: 'Testing'
-core_version_requirement: ^9 || ^10 || ^11
+core_version_requirement: ^10.1 || ^11 || ^12
 hidden: true
diff --git a/tests/src/Functional/ConfigDeleteUITest.php b/tests/src/Functional/ConfigDeleteUITest.php
index cb3c636..7b8327f 100644
--- a/tests/src/Functional/ConfigDeleteUITest.php
+++ b/tests/src/Functional/ConfigDeleteUITest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\config_delete\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Tests\BrowserTestBase;
 
@@ -10,6 +12,8 @@ use Drupal\Tests\BrowserTestBase;
  *
  * @group config_delete
  */
+#[Group('config_delete')]
+#[RunTestsInSeparateProcesses]
 class ConfigDeleteUITest extends BrowserTestBase {
 
   use StringTranslationTrait;
diff --git a/tests/src/FunctionalJavascript/ConfigDeleteUITest.php b/tests/src/FunctionalJavascript/ConfigDeleteUITest.php
index 316d9b8..7b5b959 100644
--- a/tests/src/FunctionalJavascript/ConfigDeleteUITest.php
+++ b/tests/src/FunctionalJavascript/ConfigDeleteUITest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\config_delete\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
 
@@ -10,6 +12,8 @@ use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
  *
  * @group config_delete
  */
+#[Group('config_delete')]
+#[RunTestsInSeparateProcesses]
 class ConfigDeleteUITest extends WebDriverTestBase {
 
   use StringTranslationTrait;
