diff --git a/image_moderate.install b/image_moderate.install
index 5750283..b7f92db 100644
--- a/image_moderate.install
+++ b/image_moderate.install
@@ -4,7 +4,8 @@
  * @file
  * Install, update and uninstall functions for the image_moderate module.
  */
-
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\Core\Extension\Requirement\RequirementSeverity;
 use Drupal\Core\Url;
 use Drupal\image\Entity\ImageStyle;
 
@@ -50,7 +51,7 @@ function image_moderate_requirements($phase) {
     if (!$key || !$url) {
       $requirements['image_moderate'] = [
         'title' => t('Image Moderation'),
-        'severity' => REQUIREMENT_ERROR,
+        'severity' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Error, fn() => REQUIREMENT_ERROR),
         'description' => t('Microsoft Azure API key and Endpoint URL is not set and it is required for the module to work. Please set it up at the <a href=":settings">Automatic Image Moderation settings page</a>.', [
           ':settings' => Url::fromRoute('image_moderate.settings')->toString(),
         ]),
diff --git a/image_moderate.module b/image_moderate.module
index 181445f..499432c 100644
--- a/image_moderate.module
+++ b/image_moderate.module
@@ -4,7 +4,8 @@
  * @file
  * Contains image_moderate.module.
  */
-
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\image_moderate\Hook\ImageModerateHooks;
 use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Url;
 use Drupal\Core\Entity\EntityInterface;
@@ -15,165 +16,35 @@ use Drupal\image_moderate\Entity\ImageModerate;
 /**
  * Implements hook_modules_installed().
  */
+#[LegacyHook]
 function image_moderate_modules_installed($modules) {
-  if (in_array('image_moderate', $modules)) {
-    \Drupal::messenger()->addStatus(t('Microsoft Azure API key and Endpoint URL is not set and it is required for the module to work. Please set it up at the <a href=":settings">Automatic image moderate settings page</a>.', [
-      ':settings' => Url::fromRoute('image_moderate.settings')->toString(),
-    ]));
-  }
+  \Drupal::service(ImageModerateHooks::class)->modulesInstalled($modules);
 }
 
 /**
  * Implements hook_entity_presave().
  */
+#[LegacyHook]
 function image_moderate_entity_presave(EntityInterface $entity) {
-  /** @var Drupal\Core\Entity\ContentEntityInterface $entity */
-  if ($entity instanceof ContentEntityInterface) {
-    $entity_manager = \Drupal::service('entity_field.manager');
-    foreach ($entity_manager->getFieldDefinitions($entity->getEntityTypeId(), $entity->bundle()) as $field_name => $field_definition) {
-      if (!empty($field_definition->getTargetBundle())) {
-        if ($field_definition->getType() == 'image') {
-          $images = $entity->get($field_name);
-          foreach ($images as $key => $image) {
-            if (image_moderate_check_data($entity->uuid(), $image->target_id) == FALSE) {
-              $entitys = image_moderate_status($entity->uuid(), $image->target_id);
-              if (count($entitys) == 0) {
-                $user = \Drupal::currentUser();
-                $uid = $user->id();
-                $values = [
-                  'fid' => $image->target_id,
-                  'entity_uuid' => $entity->uuid(),
-                  'entity_type' => $entity->getEntityTypeId(),
-                  'user_id' => $uid,
-                  'status' => 0,
-                ];
-                $new_image_moderate = ImageModerate::create($values);
-                $new_image_moderate->save();
-                $entity->set('status', 0);
-              }
-            }
-          }
-        }
-      }
-    }
-  }
+  \Drupal::service(ImageModerateHooks::class)->entityPresave($entity);
 }
 
 /**
  * Implements hook_form_alter().
  */
-function image_moderate_form_alter(&$form, FormStateInterface $form_state, $form_id) {
-  $display_warn = \Drupal::config('image_moderate.settings')->get('display_warn');
-  if (isset($form['#entity_builders'])) {
-    $entity = $form_state->getFormObject()->getEntity();
-    if($entity->getEntityType()->id() != 'field_config'){
-      $entity_manager = \Drupal::service('entity_field.manager');
-      if (!($entity instanceof FieldableEntityInterface)) {
-        return;
-      }
-      foreach ($entity_manager->getFieldDefinitions($entity->getEntityTypeId(), $entity->bundle()) as $field_name => $field_definition) {
-        if (!empty($field_definition->getTargetBundle())) {
-          if ($field_definition->getType() == 'image') {
-            $images = $entity->get($field_name);
-            foreach ($images as $key => $image) {
-              if (isset($form[$field_name]['widget'][$key]['#default_value']['fids'][0])) {
-                $fid = $form[$field_name]['widget'][$key]['#default_value']['fids'][0];
-                if (image_moderate_check_data($entity->uuid(), $fid) == FALSE) {
-                  $entity_manager = \Drupal::entityTypeManager();
-                  $file = $entity_manager->getStorage('file')->load($fid);
-                  $filename = $file->getFilename();
-                  $form[$field_name]['field_image_moderate_status__' . $fid] = [
-                    '#title' => t('Image Moderation Status'),
-                    '#type' => 'select',
-                    '#description' => t("Check the image and decide how to proceed"),
-                    '#options' => [
-                      0 => t('<em>%image</em> needs Review', ['%image' => $filename]),
-                      1 => t('Reviewed, can be published'),
-                      2 => t('Can not be published'),
-                    ],
-                    '#weight' => $form[$field_name]['#weight'],
-                    '#access' => \Drupal::currentUser()->hasPermission('administer image moderate entity'),
-                  ];
-                  $form['field_image_moderate_status__' . $fid] = [
-                    '#type' => 'text',
-                    '#default_value' => $field_name,
-                  ];
-                  $form[$field_name]['#states'] = [
-                    'invisible' => [
-                      'select[name="field_image_moderate_status__' . $fid . '"]',
-                    ],
-                  ];
-                  if (!\Drupal::currentUser()->hasPermission('administer image moderate entity')) {
-                    $form['status']['widget']['value']['#attributes'] = ['disabled' => 'disabled'];
-                    $form['status']['widget']['value']['#description'] = t('Blocked by Automatic Image Moderate. You do not have permission to review and publish this content!');
-                  }
-                  foreach (array_keys($form['actions']) as $action) {
-                    if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
-                      $form['actions'][$action]['#submit'][] = 'image_moderate_form_submit';
-                    }
-                  }
-                }
-                elseif (image_moderate_check_data($entity->uuid(), $fid) !== TRUE) {
-                  $entity_manager = \Drupal::entityTypeManager();
-                  $file = $entity_manager->getStorage('file')->load($fid);
-                  $filename = $file->getFilename();
-                  $entitys = image_moderate_status(($entity->uuid()), $fid);
-                  if (count($entitys) > 0) {
-                    $keys = array_keys($entitys);
-                    $image_moderate_entity = ImageModerate::load($entitys[$keys[0]]);
-                    $reviewer_id = $image_moderate_entity->reviewed_by->getValue()[0]['target_id'];
-                    $reviewer = \Drupal::entityTypeManager()->getStorage('user')->load($reviewer_id)->toLink()->toString();
-                    $form[$field_name]['field_image_moderate_status__' . $fid] = [
-                      '#title' => t('Image Moderation Status'),
-                      '#markup' => t('%image has been reviewed by @reviewer on %review', [
-                        '%image' => $filename,
-                        '@reviewer' => $reviewer,
-                        '%review' => \Drupal::service('date.formatter')->format($image_moderate_entity->reviewed->value),
-                      ]),
-                    ];
-                    //$form[$field_name]['#prefix'] .= 'Has been reviewed by ...';
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
+#[LegacyHook]
+function image_moderate_form_alter(&$form, FormStateInterface $form_state, $form_id)
+{
+    \Drupal::service(ImageModerateHooks::class)->formAlter($form, $form_state, $form_id);
 }
 
 /**
  * Implements hook_form_submit().
  */
-function image_moderate_form_submit($form, FormStateInterface $form_state) {
-  $entity = $form_state->getFormObject()->getEntity();
-  // mymodule_do_something($node);
-  \Drupal::logger('image_moderate')->notice('image_moderate submit ');
-  foreach ($form as $element => $value) {
-    if (strpos($element, 'image_moderate_status__')) {
-      $fid = explode("__", $element)[1];
-      $entitys = image_moderate_status($entity->uuid(), $fid);
-      $form_image_moderate_status = $form[$value['#default_value']][$element]['#value'];
-      if (count($entitys) != 0) {
-        $user = \Drupal::currentUser();
-        $uid = $user->id();
-        $time = \Drupal::time()->getCurrentTime();
-        $keys = array_keys($entitys);
-        $image_moderate_entity = ImageModerate::load($entitys[$keys[0]]);
-        $image_moderate_entity->set('status', $form_image_moderate_status);
-        if ($form_image_moderate_status != 0) {
-          $image_moderate_entity->set('reviewed_by', $uid);
-          $image_moderate_entity->set('reviewed', $time);
-        }
-        $image_moderate_entity->save();
-      }
-      if ($form_image_moderate_status != 1) {
-        $entity->set('status', 0);
-        $entity->save();
-      }
-    }
-  }
+#[LegacyHook]
+function image_moderate_form_submit($form, FormStateInterface $form_state)
+{
+    \Drupal::service(ImageModerateHooks::class)->formSubmit($form, $form_state);
 }
 
 /**
diff --git a/image_moderate.services.yml b/image_moderate.services.yml
index d2a4f63..142d87b 100644
--- a/image_moderate.services.yml
+++ b/image_moderate.services.yml
@@ -2,3 +2,7 @@ services:
   image_moderate.get_data:
     class: Drupal\image_moderate\AzureImageModerate
     arguments: ["@file_system", "@http_client", "@config.factory", "@logger.factory"]
+
+  Drupal\image_moderate\Hook\ImageModerateHooks:
+    class: Drupal\image_moderate\Hook\ImageModerateHooks
+    autowire: true
diff --git a/src/Hook/ImageModerateHooks.php b/src/Hook/ImageModerateHooks.php
new file mode 100644
index 0000000..02cb6ed
--- /dev/null
+++ b/src/Hook/ImageModerateHooks.php
@@ -0,0 +1,190 @@
+<?php
+
+namespace Drupal\image_moderate\Hook;
+
+use Drupal\Core\Entity\FieldableEntityInterface;
+use Drupal\Core\Url;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\image_moderate\Entity\ImageModerate;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+/**
+ * Hook implementations for image_moderate.
+ */
+class ImageModerateHooks
+{
+    use StringTranslationTrait;
+    /**
+     * Implements hook_modules_installed().
+     */
+    #[Hook('modules_installed')]
+    public function modulesInstalled($modules)
+    {
+        if (in_array('image_moderate', $modules)) {
+            \Drupal::messenger()->addStatus($this->t('Microsoft Azure API key and Endpoint URL is not set and it is required for the module to work. Please set it up at the <a href=":settings">Automatic image moderate settings page</a>.', [
+                ':settings' => \Drupal\Core\Url::fromRoute('image_moderate.settings')->toString(),
+            ]));
+        }
+    }
+    /**
+     * Implements hook_entity_presave().
+     */
+    #[Hook('entity_presave')]
+    public static function entityPresave(\Drupal\Core\Entity\EntityInterface $entity)
+    {
+        /** @var Drupal\Core\Entity\ContentEntityInterface $entity */
+        if ($entity instanceof \Drupal\Core\Entity\ContentEntityInterface) {
+            $entity_manager = \Drupal::service('entity_field.manager');
+            foreach ($entity_manager->getFieldDefinitions($entity->getEntityTypeId(), $entity->bundle()) as $field_name => $field_definition) {
+                if (!empty($field_definition->getTargetBundle())) {
+                    if ($field_definition->getType() == 'image') {
+                        $images = $entity->get($field_name);
+                        foreach ($images as $key => $image) {
+                            if (image_moderate_check_data($entity->uuid(), $image->target_id) == FALSE) {
+                                $entitys = image_moderate_status($entity->uuid(), $image->target_id);
+                                if (count($entitys) == 0) {
+                                    $user = \Drupal::currentUser();
+                                    $uid = $user->id();
+                                    $values = [
+                                        'fid' => $image->target_id,
+                                        'entity_uuid' => $entity->uuid(),
+                                        'entity_type' => $entity->getEntityTypeId(),
+                                        'user_id' => $uid,
+                                        'status' => 0,
+                                    ];
+                                    $new_image_moderate = \Drupal\image_moderate\Entity\ImageModerate::create($values);
+                                    $new_image_moderate->save();
+                                    $entity->set('status', 0);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    /**
+     * Implements hook_form_alter().
+     */
+    #[Hook('form_alter')]
+    public function formAlter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id)
+    {
+        $display_warn = \Drupal::config('image_moderate.settings')->get('display_warn');
+        if (isset($form['#entity_builders'])) {
+            $entity = $form_state->getFormObject()->getEntity();
+            if ($entity->getEntityType()->id() != 'field_config') {
+                $entity_manager = \Drupal::service('entity_field.manager');
+                if (!$entity instanceof \Drupal\Core\Entity\FieldableEntityInterface) {
+                    return;
+                }
+                foreach ($entity_manager->getFieldDefinitions($entity->getEntityTypeId(), $entity->bundle()) as $field_name => $field_definition) {
+                    if (!empty($field_definition->getTargetBundle())) {
+                        if ($field_definition->getType() == 'image') {
+                            $images = $entity->get($field_name);
+                            foreach ($images as $key => $image) {
+                                if (isset($form[$field_name]['widget'][$key]['#default_value']['fids'][0])) {
+                                    $fid = $form[$field_name]['widget'][$key]['#default_value']['fids'][0];
+                                    if (image_moderate_check_data($entity->uuid(), $fid) == FALSE) {
+                                        $entity_manager = \Drupal::entityTypeManager();
+                                        $file = $entity_manager->getStorage('file')->load($fid);
+                                        $filename = $file->getFilename();
+                                        $form[$field_name]['field_image_moderate_status__' . $fid] = [
+                                            '#title' => $this->t('Image Moderation Status'),
+                                            '#type' => 'select',
+                                            '#description' => $this->t("Check the image and decide how to proceed"),
+                                            '#options' => [
+                                                0 => $this->t('<em>%image</em> needs Review', [
+                                                    '%image' => $filename,
+                                                ]),
+                                                1 => $this->t('Reviewed, can be published'),
+                                                2 => $this->t('Can not be published'),
+                                            ],
+                                            '#weight' => $form[$field_name]['#weight'],
+                                            '#access' => \Drupal::currentUser()->hasPermission('administer image moderate entity'),
+                                        ];
+                                        $form['field_image_moderate_status__' . $fid] = [
+                                            '#type' => 'text',
+                                            '#default_value' => $field_name,
+                                        ];
+                                        $form[$field_name]['#states'] = [
+                                            'invisible' => [
+                                                'select[name="field_image_moderate_status__' . $fid . '"]',
+                                            ],
+                                        ];
+                                        if (!\Drupal::currentUser()->hasPermission('administer image moderate entity')) {
+                                            $form['status']['widget']['value']['#attributes'] = [
+                                                'disabled' => 'disabled',
+                                            ];
+                                            $form['status']['widget']['value']['#description'] = $this->t('Blocked by Automatic Image Moderate. You do not have permission to review and publish this content!');
+                                        }
+                                        foreach (array_keys($form['actions']) as $action) {
+                                            if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
+                                                $form['actions'][$action]['#submit'][] = 'image_moderate_form_submit';
+                                            }
+                                        }
+                                    } elseif (image_moderate_check_data($entity->uuid(), $fid) !== TRUE) {
+                                        $entity_manager = \Drupal::entityTypeManager();
+                                        $file = $entity_manager->getStorage('file')->load($fid);
+                                        $filename = $file->getFilename();
+                                        $entitys = image_moderate_status($entity->uuid(), $fid);
+                                        if (count($entitys) > 0) {
+                                            $keys = array_keys($entitys);
+                                            $image_moderate_entity = \Drupal\image_moderate\Entity\ImageModerate::load($entitys[$keys[0]]);
+                                            $reviewer_id = $image_moderate_entity->reviewed_by->getValue()[0]['target_id'];
+                                            $reviewer = \Drupal::entityTypeManager()->getStorage('user')->load($reviewer_id)->toLink()->toString();
+                                            $form[$field_name]['field_image_moderate_status__' . $fid] = [
+                                                '#title' => $this->t('Image Moderation Status'),
+                                                '#markup' => $this->t('%image has been reviewed by @reviewer on %review', [
+                                                    '%image' => $filename,
+                                                    '@reviewer' => $reviewer,
+                                                    '%review' => \Drupal::service('date.formatter')->format($image_moderate_entity->reviewed->value),
+                                                ]),
+                                            ];
+                                            //$form[$field_name]['#prefix'] .= 'Has been reviewed by ...';
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    /**
+     * Implements hook_form_submit().
+     */
+    #[Hook('form_submit')]
+    public static function formSubmit($form, \Drupal\Core\Form\FormStateInterface $form_state)
+    {
+        $entity = $form_state->getFormObject()->getEntity();
+        // mymodule_do_something($node);
+        \Drupal::logger('image_moderate')->notice('image_moderate submit ');
+        foreach ($form as $element => $value) {
+            if (strpos($element, 'image_moderate_status__')) {
+                $fid = explode("__", $element)[1];
+                $entitys = image_moderate_status($entity->uuid(), $fid);
+                $form_image_moderate_status = $form[$value['#default_value']][$element]['#value'];
+                if (count($entitys) != 0) {
+                    $user = \Drupal::currentUser();
+                    $uid = $user->id();
+                    $time = \Drupal::time()->getCurrentTime();
+                    $keys = array_keys($entitys);
+                    $image_moderate_entity = \Drupal\image_moderate\Entity\ImageModerate::load($entitys[$keys[0]]);
+                    $image_moderate_entity->set('status', $form_image_moderate_status);
+                    if ($form_image_moderate_status != 0) {
+                        $image_moderate_entity->set('reviewed_by', $uid);
+                        $image_moderate_entity->set('reviewed', $time);
+                    }
+                    $image_moderate_entity->save();
+                }
+                if ($form_image_moderate_status != 1) {
+                    $entity->set('status', 0);
+                    $entity->save();
+                }
+            }
+        }
+    }
+}
