diff --git a/bert.info.yml b/bert.info.yml
index 12b1eb0..47c6961 100644
--- a/bert.info.yml
+++ b/bert.info.yml
@@ -2,6 +2,6 @@ name: Better Entity Reference Table
 type: module
 description: A more user-friendly entity reference list field widget.
 package: Fields
-core_version_requirement: ^8 || ^9 || ^10 || ^11
+core_version_requirement: ^10.1 || ^11 || ^12
 dependencies:
   - drupal:system (>= 8.6)
diff --git a/bert.module b/bert.module
index 23ad79a..1f04ce9 100644
--- a/bert.module
+++ b/bert.module
@@ -4,7 +4,8 @@
  * @file
  * Contains main functions and hooks for bert module.
  */
-
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\bert\Hook\BertHooks;
 use Drupal\Core\Entity\Display\EntityFormDisplayInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\field\FieldConfigInterface;
@@ -12,42 +13,8 @@ use Drupal\field\FieldConfigInterface;
 /**
  * Implements hook_entity_presave().
  */
-function bert_entity_presave(EntityInterface $entity): void {
-  if (!$entity instanceof EntityFormDisplayInterface) {
-    return;
-  }
-
-  $handler = sprintf('bert:%s', $entity->getTargetEntityTypeId());
-  $fieldManager = \Drupal::getContainer()->get('entity_field.manager');
-
-  foreach ($entity->get('content') as $fieldName => $fieldDisplay) {
-    if (!isset($fieldDisplay['type'], $fieldDisplay['settings'])) {
-      continue;
-    }
-
-    if ($fieldDisplay['type'] !== 'bert') {
-      continue;
-    }
-
-    $fieldDefinitions = $fieldManager->getFieldDefinitions(
-      $entity->getTargetEntityTypeId(),
-      $entity->getTargetBundle()
-    );
-
-    if (!isset($fieldDefinitions[$fieldName])) {
-      continue;
-    }
-
-    $fieldDefinition = $fieldDefinitions[$fieldName];
-    if (!$fieldDefinition instanceof FieldConfigInterface) {
-      continue;
-    }
-
-    if ($fieldDefinition->getSetting('handler') === $handler) {
-      continue;
-    }
-
-    $fieldDefinition->setSetting('handler', $handler);
-    $fieldDefinition->save();
-  }
+#[LegacyHook]
+function bert_entity_presave(EntityInterface $entity): void
+{
+    \Drupal::service(BertHooks::class)->entityPresave($entity);
 }
diff --git a/bert.services.yml b/bert.services.yml
index 16dd565..6e4ecd4 100644
--- a/bert.services.yml
+++ b/bert.services.yml
@@ -6,3 +6,7 @@ services:
   plugin.manager.entity_reference_label_formatter:
     class: Drupal\bert\EntityReferenceLabelFormatterManager
     parent: default_plugin_manager
+
+  Drupal\bert\Hook\BertHooks:
+    class: Drupal\bert\Hook\BertHooks
+    autowire: true
diff --git a/composer.json b/composer.json
index 1a625a7..2417bd2 100644
--- a/composer.json
+++ b/composer.json
@@ -5,7 +5,7 @@
     "license": "GPL-2.0-or-later",
     "require": {
         "php": ">=7.1.0",
-        "drupal/core": "^8.6 || ^9.0 || ^10 || ^11"
+        "drupal/core": "^10.1 || ^11 || ^12"
     },
     "require-dev": {
         "composer-runtime-api": "^2.0"
diff --git a/src/Hook/BertHooks.php b/src/Hook/BertHooks.php
new file mode 100644
index 0000000..4e4c0b2
--- /dev/null
+++ b/src/Hook/BertHooks.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Drupal\bert\Hook;
+
+use Drupal\Core\Entity\Display\EntityFormDisplayInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\field\FieldConfigInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+/**
+ * Hook implementations for bert.
+ */
+class BertHooks
+{
+    /**
+     * Implements hook_entity_presave().
+     */
+    #[Hook('entity_presave')]
+    public function entityPresave(\Drupal\Core\Entity\EntityInterface $entity): void
+    {
+        if (!$entity instanceof \Drupal\Core\Entity\Display\EntityFormDisplayInterface) {
+            return;
+        }
+        $handler = sprintf('bert:%s', $entity->getTargetEntityTypeId());
+        $fieldManager = \Drupal::getContainer()->get('entity_field.manager');
+        foreach ($entity->get('content') as $fieldName => $fieldDisplay) {
+            if (!isset($fieldDisplay['type'], $fieldDisplay['settings'])) {
+                continue;
+            }
+            if ($fieldDisplay['type'] !== 'bert') {
+                continue;
+            }
+            $fieldDefinitions = $fieldManager->getFieldDefinitions($entity->getTargetEntityTypeId(), $entity->getTargetBundle());
+            if (!isset($fieldDefinitions[$fieldName])) {
+                continue;
+            }
+            $fieldDefinition = $fieldDefinitions[$fieldName];
+            if (!$fieldDefinition instanceof \Drupal\field\FieldConfigInterface) {
+                continue;
+            }
+            if ($fieldDefinition->getSetting('handler') === $handler) {
+                continue;
+            }
+            $fieldDefinition->setSetting('handler', $handler);
+            $fieldDefinition->save();
+        }
+    }
+}
