diff --git a/composer.json b/composer.json
index ffd759e..0aa0b6f 100644
--- a/composer.json
+++ b/composer.json
@@ -6,8 +6,8 @@
     "license": "GPL-2.0-or-later",
     "require": {
         "php": ">=8.2",
-        "drupal/core": "^10.5 || ^11.2",
-        "drupal/entity_route_context": "^4.1.0"
+        "drupal/entity_route_context": "^4.1.0",
+        "drupal/core": "^10.5 || ^11.2 || ^12"
     },
     "require-dev": {
         "drupal/core-composer-scaffold": "^10.2 || ^11.2",
diff --git a/entity_editor_tabs.info.yml b/entity_editor_tabs.info.yml
index 087066a..f35501f 100644
--- a/entity_editor_tabs.info.yml
+++ b/entity_editor_tabs.info.yml
@@ -1,6 +1,6 @@
 name: Entity Editor Tabs
 type: module
-core_version_requirement: '^10.5 || ^11.2'
+core_version_requirement: ^10.5 || ^11.2 || ^12
 php: 8.1
 dependencies:
   - entity_route_context:entity_route_context
diff --git a/entity_editor_tabs.module b/entity_editor_tabs.module
index a908bd8..97fa568 100644
--- a/entity_editor_tabs.module
+++ b/entity_editor_tabs.module
@@ -7,25 +7,24 @@
 
 declare(strict_types=1);
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\entity_editor_tabs\Hook\EntityEditorTabsHooks;
 use Drupal\Core\Entity\EntityInterface;
-use Drupal\entity_editor_tabs\EetHooks;
 
 /**
  * Implements hook_local_tasks_alter().
  *
  * @see \Drupal\entity_editor_tabs\EetHooks::hookLocalTasksAlter
  */
+#[LegacyHook]
 function entity_editor_tabs_local_tasks_alter(array &$localTasks): void {
-  /** @var \Drupal\entity_editor_tabs\EetHooks $hooks */
-  $hooks = \Drupal::service(EetHooks::class);
-  $hooks->hookLocalTasksAlter($localTasks);
+  \Drupal::service(EntityEditorTabsHooks::class)->localTasksAlter($localTasks);
 }
 
 /**
  * Implements hook_entity_operation_alter().
  */
+#[LegacyHook]
 function entity_editor_tabs_entity_operation_alter(array &$operations, EntityInterface $entity): void {
-  /** @var \Drupal\entity_editor_tabs\EetHooks $hooks */
-  $hooks = \Drupal::service(EetHooks::class);
-  $hooks->hookEntityOperationAlter($operations, $entity);
+  \Drupal::service(EntityEditorTabsHooks::class)->entityOperationAlter($operations, $entity);
 }
diff --git a/entity_editor_tabs.services.yml b/entity_editor_tabs.services.yml
index fe32727..7a29b6e 100644
--- a/entity_editor_tabs.services.yml
+++ b/entity_editor_tabs.services.yml
@@ -6,3 +6,7 @@ services:
 
   Drupal\entity_editor_tabs\EetUtility: ~
   Drupal\entity_editor_tabs\EetHooks: ~
+
+  Drupal\entity_editor_tabs\Hook\EntityEditorTabsHooks:
+    class: Drupal\entity_editor_tabs\Hook\EntityEditorTabsHooks
+    autowire: true
diff --git a/src/Hook/EntityEditorTabsHooks.php b/src/Hook/EntityEditorTabsHooks.php
new file mode 100644
index 0000000..95b8700
--- /dev/null
+++ b/src/Hook/EntityEditorTabsHooks.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Drupal\entity_editor_tabs\Hook;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\entity_editor_tabs\EetHooks;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for entity_editor_tabs.
+ */
+class EntityEditorTabsHooks {
+
+  /**
+   * Implements hook_local_tasks_alter().
+   *
+   * @see \Drupal\entity_editor_tabs\EetHooks::hookLocalTasksAlter
+   */
+  #[Hook('local_tasks_alter')]
+  public static function localTasksAlter(array &$localTasks): void {
+    /** @var \Drupal\entity_editor_tabs\EetHooks $hooks */
+    $hooks = \Drupal::service(EetHooks::class);
+    $hooks->hookLocalTasksAlter($localTasks);
+  }
+
+  /**
+   * Implements hook_entity_operation_alter().
+   */
+  #[Hook('entity_operation_alter')]
+  public static function entityOperationAlter(array &$operations, EntityInterface $entity): void {
+    /** @var \Drupal\entity_editor_tabs\EetHooks $hooks */
+    $hooks = \Drupal::service(EetHooks::class);
+    $hooks->hookEntityOperationAlter($operations, $entity);
+  }
+
+}
