diff --git a/imageapi_optimize.install b/imageapi_optimize.install
index dc1456a..4585eab 100644
--- a/imageapi_optimize.install
+++ b/imageapi_optimize.install
@@ -1,5 +1,13 @@
 <?php
 
+/**
+ * @file
+ */
+
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\imageapi_optimize\Entity\ImageAPIOptimizePipeline;
+use Drupal\imageapi_optimize\Exception\PluginNotFoundException;
+
 /**
  * @file
  * Install and update functions for the Image Optimize module.
@@ -39,7 +47,13 @@ function imageapi_optimize_update_8002() {
     // Our config entity prefix changes from processor to pipeline.
     $new_name = 'imageapi_optimize.pipeline.' . substr($config_key, strlen('imageapi_optimize.processor.'));
 
-    $config
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $config
+      // Remove the old config entity.
+      ->delete()
+      // Set the name to the updated name.
+      ->setName($new_name)
+      // Set the old data.
+      ->setData($data)->save(), fn() => $config
       // Remove the old config entity.
       ->delete()
       // Set the name to the updated name.
@@ -47,7 +61,7 @@ function imageapi_optimize_update_8002() {
       // Set the old data.
       ->setData($data)
       // Save with the old data and new name.
-      ->save(TRUE);
+      ->save(TRUE));
   }
 }
 
@@ -57,14 +71,15 @@ function imageapi_optimize_update_8002() {
 function imageapi_optimize_update_8003() {
   $modules = [];
 
-  $pipelines = \Drupal\imageapi_optimize\Entity\ImageAPIOptimizePipeline::loadMultiple();
-  /* @var \Drupal\imageapi_optimize\Entity\ImageAPIOptimizePipeline $pipeline */
+  $pipelines = ImageAPIOptimizePipeline::loadMultiple();
+  /** @var \Drupal\imageapi_optimize\Entity\ImageAPIOptimizePipeline $pipeline */
   foreach ($pipelines as $pipeline) {
     $processors = $pipeline->getProcessorsCollection();
     foreach ($processors->getInstanceIds() as $id) {
       try {
         $processors->get($id);
-      } catch (\Drupal\imageapi_optimize\Exception\PluginNotFoundException $e) {
+      }
+      catch (PluginNotFoundException $e) {
         switch ($e->getPluginId()) {
           case 'advdef':
           case 'advpng':
diff --git a/imageapi_optimize.module b/imageapi_optimize.module
index 142ec88..7082ca8 100644
--- a/imageapi_optimize.module
+++ b/imageapi_optimize.module
@@ -4,6 +4,8 @@
  * @file
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\imageapi_optimize\Hook\ImageapiOptimizeHooks;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\imageapi_optimize\Entity\ImageAPIOptimizePipeline;
 
@@ -42,20 +44,23 @@ function imageapi_optimize_pipeline_options($include_empty = TRUE, $include_site
 /**
  * Implements hook_entity_type_alter().
  */
+#[LegacyHook]
 function imageapi_optimize_entity_type_alter(array &$entity_types) {
-  return \Drupal::service('imageapi_optimize.hooks')->entity_type_alter($entity_types);
+  return \Drupal::service(ImageapiOptimizeHooks::class)->entityTypeAlter($entity_types);
 }
 
 /**
  * Implements hook_config_schema_info_alter().
  */
+#[LegacyHook]
 function imageapi_optimize_config_schema_info_alter(&$definitions) {
-  return \Drupal::service('imageapi_optimize.hooks')->config_schema_info_alter($definitions);
+  return \Drupal::service(ImageapiOptimizeHooks::class)->configSchemaInfoAlter($definitions);
 }
 
 /**
  * Implements hook_form_FORM_ID_alter().
  */
+#[LegacyHook]
 function imageapi_optimize_form_image_style_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) {
-  return \Drupal::service('imageapi_optimize.hooks')->form_image_style_edit_form_alter($form, $form_state, $form_id);
+  return \Drupal::service(ImageapiOptimizeHooks::class)->formImageStyleEditFormAlter($form, $form_state, $form_id);
 }
diff --git a/imageapi_optimize.services.yml b/imageapi_optimize.services.yml
index b666988..45a14cf 100644
--- a/imageapi_optimize.services.yml
+++ b/imageapi_optimize.services.yml
@@ -5,3 +5,7 @@ services:
   imageapi_optimize.hooks:
     class: Drupal\imageapi_optimize\ImageAPIOptimizeHookImplementations
     arguments: ['@string_translation']
+
+  Drupal\imageapi_optimize\Hook\ImageapiOptimizeHooks:
+    class: Drupal\imageapi_optimize\Hook\ImageapiOptimizeHooks
+    autowire: true
diff --git a/src/Entity/ImageAPIOptimizePipeline.php b/src/Entity/ImageAPIOptimizePipeline.php
index c994f01..9eda0ae 100644
--- a/src/Entity/ImageAPIOptimizePipeline.php
+++ b/src/Entity/ImageAPIOptimizePipeline.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\imageapi_optimize\Entity;
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Component\Utility\Crypt;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
@@ -185,8 +186,8 @@ class ImageAPIOptimizePipeline extends ConfigEntityBase implements ImageAPIOptim
     Copy image to optimize to a temp location so that:
     1. It's always a local image.
     2. The filename is only ascii characters.
-    */
-    $file_extension = strtolower(substr(strrchr($image_uri,'.'),1));
+     */
+    $file_extension = strtolower(substr(strrchr($image_uri, '.'), 1));
     $temp_image_uri = 'temporary://image_api_optimize_' . Crypt::randomBytesBase64(8) . '.' . $file_extension;
 
     foreach ($this->getProcessors() as $processor) {
@@ -196,7 +197,7 @@ class ImageAPIOptimizePipeline extends ConfigEntityBase implements ImageAPIOptim
       }
       else {
         // @phpstan-ignore-next-line
-        $temp_image_uri = \Drupal::service('file_system')->copy($image_uri, $temp_image_uri, FileSystemInterface::EXISTS_RENAME);
+        $temp_image_uri = \Drupal::service('file_system')->copy($image_uri, $temp_image_uri, DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.3.0', fn() => FileExists::Rename, fn() => FileSystemInterface::EXISTS_RENAME));
       }
       if ($temp_image_uri === FALSE) {
         return FALSE;
@@ -216,11 +217,11 @@ class ImageAPIOptimizePipeline extends ConfigEntityBase implements ImageAPIOptim
       if ($image_changed) {
         // Copy the temporary file back over the original image.
         if (version_compare(\Drupal::VERSION, '10.3', '>=')) {
-            \Drupal::service('file_system')->move($temp_image_uri, $image_uri, FileExists::Replace);
+          \Drupal::service('file_system')->move($temp_image_uri, $image_uri, FileExists::Replace);
         }
         else {
           // @phpstan-ignore-next-line
-          \Drupal::service('file_system')->move($temp_image_uri, $image_uri, FileSystemInterface::EXISTS_REPLACE);
+          \Drupal::service('file_system')->move($temp_image_uri, $image_uri, DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.3.0', fn() => FileExists::Replace, fn() => FileSystemInterface::EXISTS_REPLACE));
         }
       }
     }
diff --git a/src/Hook/ImageapiOptimizeHooks.php b/src/Hook/ImageapiOptimizeHooks.php
new file mode 100644
index 0000000..ec6a714
--- /dev/null
+++ b/src/Hook/ImageapiOptimizeHooks.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Drupal\imageapi_optimize\Hook;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for imageapi_optimize.
+ */
+class ImageapiOptimizeHooks {
+
+  /**
+   * Implements hook_entity_type_alter().
+   */
+  #[Hook('entity_type_alter')]
+  public static function entityTypeAlter(array &$entity_types) {
+    return \Drupal::service('imageapi_optimize.hooks')->entity_type_alter($entity_types);
+  }
+
+  /**
+   * Implements hook_config_schema_info_alter().
+   */
+  #[Hook('config_schema_info_alter')]
+  public static function configSchemaInfoAlter(&$definitions) {
+    return \Drupal::service('imageapi_optimize.hooks')->config_schema_info_alter($definitions);
+  }
+
+  /**
+   * Implements hook_form_FORM_ID_alter().
+   */
+  #[Hook('form_image_style_edit_form_alter')]
+  public static function formImageStyleEditFormAlter(&$form, FormStateInterface $form_state, $form_id) {
+    return \Drupal::service('imageapi_optimize.hooks')->form_image_style_edit_form_alter($form, $form_state, $form_id);
+  }
+
+}
