diff --git a/multiselect.info.yml b/multiselect.info.yml
index 3fe46a6..06fb3ce 100644
--- a/multiselect.info.yml
+++ b/multiselect.info.yml
@@ -2,7 +2,7 @@ name: Multiselect
 description: 'Defines a multiple selection field widget, to allow easier multi-selection for users.'
 package: Field types
 type: module
-core_version_requirement: ^9 || ^10 || ^11
+core_version_requirement: ^10.1 || ^11 || ^12
 dependencies:
   - drupal:options
 configure: multiselect.admin_settings
diff --git a/multiselect.module b/multiselect.module
index a44b9eb..ae5dfe9 100644
--- a/multiselect.module
+++ b/multiselect.module
@@ -5,6 +5,8 @@
  * Select multiple items in an easier way than the normal node-reference widget.
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\multiselect\Hook\MultiselectHooks;
 use Drupal\Core\Render\Element;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Template\Attribute;
@@ -13,42 +15,25 @@ use Drupal\multiselect\Element\Multiselect;
 /**
  * Implements hook_help().
  */
+#[LegacyHook]
 function multiselect_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    case 'help.page.multiselect':
-      $output = '';
-      $output .= '<p>' . t('Provides a widget for editing fields that allows users to select from a list of options in a left box, and have them visually moved into the right box when options are chosen.') . '</p>';
-      $output .= '<h3>' . t('Methods of implementing a Multiselect widget') . '</h3>';
-      $output .= '<dl>';
-      $output .= '<dt><h5>' . t('Method 1: Using the Field management UI') . '</h5></dt>';
-      $output .= '<dd>' . t('When creating a new content field, select "Multiselect" as your widget type. You can use Multiselect on fields of type "list_string", "list_float", "list_integer", and "entity_reference".') . '</dd>';
-      $output .= '<dt><h5>' . t('Method 2: Coding your own module') . '</h5></dt>';
-      $output .= '<dd>' . t('If you\'re developing a custom module and wish to use the Multiselect widget in place of a traditional "select" widget, you may use the Form API, by specifying "\'#type\' => \'multiselect\',".') . '</dd>';
-      $output .= '</dl>';
-      return $output;
-  }
+  return \Drupal::service(MultiselectHooks::class)->help($route_name, $route_match);
 }
 
 /**
  * Implements hook_page_attachments().
  */
+#[LegacyHook]
 function multiselect_page_attachments(array &$attachments) {
-  $config = \Drupal::config('multiselect.settings');
-  $widths = $config->get('multiselect.widths');
-  $attachments['#attached']['drupalSettings']['multiselect']['widths'] = $widths;
+  \Drupal::service(MultiselectHooks::class)->pageAttachments($attachments);
 }
 
 /**
  * Implements hook_theme().
  */
+#[LegacyHook]
 function multiselect_theme() {
-  return [
-    'multiselect' => [
-      'arguments' => ['element' => NULL],
-      'render element' => 'element',
-      'template' => 'multiselect',
-    ],
-  ];
+  return \Drupal::service(MultiselectHooks::class)->theme();
 }
 
 /**
diff --git a/multiselect.services.yml b/multiselect.services.yml
new file mode 100644
index 0000000..3f1b02e
--- /dev/null
+++ b/multiselect.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\multiselect\Hook\MultiselectHooks:
+    class: Drupal\multiselect\Hook\MultiselectHooks
+    autowire: true
diff --git a/src/Hook/MultiselectHooks.php b/src/Hook/MultiselectHooks.php
new file mode 100644
index 0000000..8f12702
--- /dev/null
+++ b/src/Hook/MultiselectHooks.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Drupal\multiselect\Hook;
+
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for multiselect.
+ */
+class MultiselectHooks {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_help().
+   */
+  #[Hook('help')]
+  public function help($route_name, RouteMatchInterface $route_match) {
+    switch ($route_name) {
+      case 'help.page.multiselect':
+        $output = '';
+        $output .= '<p>' . $this->t('Provides a widget for editing fields that allows users to select from a list of options in a left box, and have them visually moved into the right box when options are chosen.') . '</p>';
+        $output .= '<h3>' . $this->t('Methods of implementing a Multiselect widget') . '</h3>';
+        $output .= '<dl>';
+        $output .= '<dt><h5>' . $this->t('Method 1: Using the Field management UI') . '</h5></dt>';
+        $output .= '<dd>' . $this->t('When creating a new content field, select "Multiselect" as your widget type. You can use Multiselect on fields of type "list_string", "list_float", "list_integer", and "entity_reference".') . '</dd>';
+        $output .= '<dt><h5>' . $this->t('Method 2: Coding your own module') . '</h5></dt>';
+        $output .= '<dd>' . $this->t('If you\'re developing a custom module and wish to use the Multiselect widget in place of a traditional "select" widget, you may use the Form API, by specifying "\'#type\' => \'multiselect\',".') . '</dd>';
+        $output .= '</dl>';
+        return $output;
+    }
+  }
+
+  /**
+   * Implements hook_page_attachments().
+   */
+  #[Hook('page_attachments')]
+  public function pageAttachments(array &$attachments) {
+    $config = \Drupal::config('multiselect.settings');
+    $widths = $config->get('multiselect.widths');
+    $attachments['#attached']['drupalSettings']['multiselect']['widths'] = $widths;
+  }
+
+  /**
+   * Implements hook_theme().
+   */
+  #[Hook('theme')]
+  public function theme() {
+    return [
+      'multiselect' => [
+        'arguments' => [
+          'element' => NULL,
+        ],
+        'render element' => 'element',
+        'template' => 'multiselect',
+      ],
+    ];
+  }
+
+}
diff --git a/tests/modules/multiselect_test/multiselect_test.info.yml b/tests/modules/multiselect_test/multiselect_test.info.yml
index ecab6e1..842e16c 100644
--- a/tests/modules/multiselect_test/multiselect_test.info.yml
+++ b/tests/modules/multiselect_test/multiselect_test.info.yml
@@ -1,7 +1,7 @@
 name: 'Multiselect test module'
 description: 'Provides a test page with a multiselect form element.'
 type: module
-core_version_requirement: ^9 || ^10 || ^11
+core_version_requirement: ^10.1 || ^11 || ^12
 package: Testing
 dependencies:
   - multiselect:multiselect
diff --git a/tests/src/Functional/MultiselectConfigSchemaTest.php b/tests/src/Functional/MultiselectConfigSchemaTest.php
index 976cbb2..8edcde5 100644
--- a/tests/src/Functional/MultiselectConfigSchemaTest.php
+++ b/tests/src/Functional/MultiselectConfigSchemaTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\multiselect\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\BrowserTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\BrowserTestBase;
  *
  * @group multiselect
  */
+#[Group('multiselect')]
+#[RunTestsInSeparateProcesses]
 class MultiselectConfigSchemaTest extends BrowserTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/MultiselectElementJavascriptTest.php b/tests/src/FunctionalJavascript/MultiselectElementJavascriptTest.php
index 7ee3a68..2eb0980 100644
--- a/tests/src/FunctionalJavascript/MultiselectElementJavascriptTest.php
+++ b/tests/src/FunctionalJavascript/MultiselectElementJavascriptTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\multiselect\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
  *
  * @group multiselect
  */
+#[Group('multiselect')]
+#[RunTestsInSeparateProcesses]
 class MultiselectElementJavascriptTest extends WebDriverTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/MultiselectElementsUITest.php b/tests/src/FunctionalJavascript/MultiselectElementsUITest.php
index 7996a2a..cdf81e0 100644
--- a/tests/src/FunctionalJavascript/MultiselectElementsUITest.php
+++ b/tests/src/FunctionalJavascript/MultiselectElementsUITest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\multiselect\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Entity\Entity\EntityFormDisplay;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
@@ -12,6 +14,8 @@ use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
  *
  * @group multiselect
  */
+#[Group('multiselect')]
+#[RunTestsInSeparateProcesses]
 class MultiselectElementsUITest extends WebDriverTestBase {
 
   /**
