diff --git a/composer.json b/composer.json
index c24c12b..23f1c8e 100644
--- a/composer.json
+++ b/composer.json
@@ -4,6 +4,6 @@
   "description": "Advanced multiple dates field type with vanilla JS calendar picker, no external library dependencies.",
   "license": "GPL-2.0-or-later",
   "require": {
-    "drupal/core": "^10 || ^11"
+    "drupal/core": "^10.1 || ^11 || ^12"
   }
 }
diff --git a/multiple_dates.info.yml b/multiple_dates.info.yml
index 9c3d6b1..6976953 100644
--- a/multiple_dates.info.yml
+++ b/multiple_dates.info.yml
@@ -1,7 +1,7 @@
 name: Multiple Dates
 type: module
 description: 'Advanced multiple date picker field with no external library dependencies. Supports large date sets, range selection, and accessible vanilla JS calendar.'
-core_version_requirement: ^10 || ^11
+core_version_requirement: ^10.1 || ^11 || ^12
 package: Multiple Dates
 dependencies:
   - drupal:field
diff --git a/multiple_dates.module b/multiple_dates.module
index d743e01..534e009 100644
--- a/multiple_dates.module
+++ b/multiple_dates.module
@@ -8,42 +8,24 @@
  * calendar picker — no jQuery UI or external library dependencies.
  */
 
-use Drupal\Component\Utility\Html;
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\multiple_dates\Hook\MultipleDatesHooks;
 use Drupal\Core\Routing\RouteMatchInterface;
 
 /**
  * Implements hook_help().
  */
+#[LegacyHook]
 function multiple_dates_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    case 'help.page.multiple_dates':
-      $text = file_get_contents(__DIR__ . '/README.md');
-      if (!\Drupal::moduleHandler()->moduleExists('markdown')) {
-        return '<pre>' . Html::escape($text) . '</pre>';
-      }
-      else {
-        $filter_manager = \Drupal::service('plugin.manager.filter');
-        $settings = \Drupal::configFactory()->get('markdown.settings')->getRawData();
-        $config = ['settings' => $settings];
-        $filter = $filter_manager->createInstance('markdown', $config);
-        return $filter->process($text, 'en');
-      }
-  }
-  return NULL;
+  return \Drupal::service(MultipleDatesHooks::class)->help($route_name, $route_match);
 }
 
 /**
  * Implements hook_theme().
  */
+#[LegacyHook]
 function multiple_dates_theme($existing, $type, $theme, $path) {
-  return [
-    'multiple_dates' => [
-      'variables' => [
-        'multiple_dates' => NULL,
-        'other_data'     => NULL,
-      ],
-    ],
-  ];
+  return \Drupal::service(MultipleDatesHooks::class)->theme($existing, $type, $theme, $path);
 }
 
 /**
diff --git a/multiple_dates.services.yml b/multiple_dates.services.yml
new file mode 100644
index 0000000..3ae3ef5
--- /dev/null
+++ b/multiple_dates.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\multiple_dates\Hook\MultipleDatesHooks:
+    class: Drupal\multiple_dates\Hook\MultipleDatesHooks
+    autowire: true
diff --git a/src/Hook/MultipleDatesHooks.php b/src/Hook/MultipleDatesHooks.php
new file mode 100644
index 0000000..ee77277
--- /dev/null
+++ b/src/Hook/MultipleDatesHooks.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace Drupal\multiple_dates\Hook;
+
+use Drupal\Component\Utility\Html;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for multiple_dates.
+ */
+class MultipleDatesHooks {
+
+  /**
+   * Implements hook_help().
+   */
+  #[Hook('help')]
+  public function help($route_name, RouteMatchInterface $route_match) {
+    switch ($route_name) {
+      case 'help.page.multiple_dates':
+        $text = file_get_contents(__DIR__ . '/README.md');
+        if (!\Drupal::moduleHandler()->moduleExists('markdown')) {
+          return '<pre>' . Html::escape($text) . '</pre>';
+        }
+        else {
+          $filter_manager = \Drupal::service('plugin.manager.filter');
+          $settings = \Drupal::configFactory()->get('markdown.settings')->getRawData();
+          $config = [
+            'settings' => $settings,
+          ];
+          $filter = $filter_manager->createInstance('markdown', $config);
+          return $filter->process($text, 'en');
+        }
+    }
+    return NULL;
+  }
+
+  /**
+   * Implements hook_theme().
+   */
+  #[Hook('theme')]
+  public function theme($existing, $type, $theme, $path) {
+    return [
+      'multiple_dates' => [
+        'variables' => [
+          'multiple_dates' => NULL,
+          'other_data' => NULL,
+        ],
+      ],
+    ];
+  }
+
+}
diff --git a/tests/src/Functional/MultipleDatesFormTest.php b/tests/src/Functional/MultipleDatesFormTest.php
index a77e8b4..e1028e3 100644
--- a/tests/src/Functional/MultipleDatesFormTest.php
+++ b/tests/src/Functional/MultipleDatesFormTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\multiple_dates\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\Tests\BrowserTestBase;
@@ -18,6 +20,8 @@ use Drupal\Tests\BrowserTestBase;
  *
  * @group multiple_dates
  */
+#[Group('multiple_dates')]
+#[RunTestsInSeparateProcesses]
 class MultipleDatesFormTest extends BrowserTestBase {
 
   /**
diff --git a/tests/src/Kernel/MultipleDatesFieldTest.php b/tests/src/Kernel/MultipleDatesFieldTest.php
index cc9f19d..8c7204b 100644
--- a/tests/src/Kernel/MultipleDatesFieldTest.php
+++ b/tests/src/Kernel/MultipleDatesFieldTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\multiple_dates\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\entity_test\Entity\EntityTest;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
@@ -21,6 +23,8 @@ use Drupal\multiple_dates\Plugin\Field\FieldType\MultipleDatesFieldItem;
  *
  * @group multiple_dates
  */
+#[Group('multiple_dates')]
+#[RunTestsInSeparateProcesses]
 class MultipleDatesFieldTest extends EntityKernelTestBase {
 
   /**
