diff --git a/composer.json b/composer.json
index 563eeee..61f55d5 100644
--- a/composer.json
+++ b/composer.json
@@ -12,6 +12,6 @@
         }
     ],
     "require": {
-        "drupal/core": "^10.2 || ^11"
+        "drupal/core": "^11.3 || ^12"
     }
 }
diff --git a/responsive_image_preload.info.yml b/responsive_image_preload.info.yml
index 2191cf5..3f82ee9 100644
--- a/responsive_image_preload.info.yml
+++ b/responsive_image_preload.info.yml
@@ -1,7 +1,7 @@
 name: Responsive Image Preload
 description: Allows responsive images to be preloaded.
 type: module
-core_version_requirement: ^10.2 || ^11
+core_version_requirement: ^11.3 || ^12
 package: Media
 dependencies:
   - drupal:responsive_image
diff --git a/responsive_image_preload.module b/responsive_image_preload.module
index 5f43538..2b50875 100644
--- a/responsive_image_preload.module
+++ b/responsive_image_preload.module
@@ -5,6 +5,8 @@
  * Allows content editors to configure preloaded responsive images.
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\responsive_image_preload\Hook\ResponsiveImagePreloadHooks;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FormatterInterface;
 use Drupal\Core\Form\FormStateInterface;
@@ -12,32 +14,23 @@ use Drupal\Core\Form\FormStateInterface;
 /**
  * Implements hook_field_formatter_third_party_settings_form().
  */
+#[LegacyHook]
 function responsive_image_preload_field_formatter_third_party_settings_form(FormatterInterface $plugin, FieldDefinitionInterface $field_definition, $view_mode, array $form, FormStateInterface $form_state) {
-
-  /** @var \Drupal\responsive_image_preload\ThirdPartySettings $third_party_settings */
-  $third_party_settings = \Drupal::service('responsive_image_preload.third_party_settings');
-
-  return $third_party_settings->settingsForm($plugin);
+  return \Drupal::service(ResponsiveImagePreloadHooks::class)->fieldFormatterThirdPartySettingsForm($plugin, $field_definition, $view_mode, $form, $form_state);
 }
 
 /**
  * Implements hook_field_formatter_settings_summary_alter().
  */
+#[LegacyHook]
 function responsive_image_preload_field_formatter_settings_summary_alter(array &$summary, array $context) {
-
-  /** @var \Drupal\responsive_image_preload\ThirdPartySettings $third_party_settings */
-  $third_party_settings = \Drupal::service('responsive_image_preload.third_party_settings');
-
-  $third_party_settings->settingsSummaryAlter($summary, $context);
+  \Drupal::service(ResponsiveImagePreloadHooks::class)->fieldFormatterSettingsSummaryAlter($summary, $context);
 }
 
 /**
  * Implements hook_preprocess_field().
  */
+#[LegacyHook]
 function responsive_image_preload_preprocess_field(array &$variables) {
-
-  /** @var \Drupal\responsive_image_preload\FieldPreprocessor $field_preprocessor */
-  $field_preprocessor = \Drupal::service('responsive_image_preload.field_preprocessor');
-
-  $field_preprocessor->preprocessField($variables);
+  \Drupal::service(ResponsiveImagePreloadHooks::class)->preprocessField($variables);
 }
diff --git a/responsive_image_preload.services.yml b/responsive_image_preload.services.yml
index ccd08af..7c9e4d5 100644
--- a/responsive_image_preload.services.yml
+++ b/responsive_image_preload.services.yml
@@ -15,3 +15,7 @@ services:
     arguments:
       - '@responsive_image_preload.preload_generator'
       - '@entity_type.manager'
+
+  Drupal\responsive_image_preload\Hook\ResponsiveImagePreloadHooks:
+    class: Drupal\responsive_image_preload\Hook\ResponsiveImagePreloadHooks
+    autowire: true
diff --git a/src/Hook/ResponsiveImagePreloadHooks.php b/src/Hook/ResponsiveImagePreloadHooks.php
new file mode 100644
index 0000000..6aaa5a2
--- /dev/null
+++ b/src/Hook/ResponsiveImagePreloadHooks.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Drupal\responsive_image_preload\Hook;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\FormatterInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for responsive_image_preload.
+ */
+class ResponsiveImagePreloadHooks {
+
+  /**
+   * Implements hook_field_formatter_third_party_settings_form().
+   */
+  #[Hook('field_formatter_third_party_settings_form')]
+  public static function fieldFormatterThirdPartySettingsForm(FormatterInterface $plugin, FieldDefinitionInterface $field_definition, $view_mode, array $form, FormStateInterface $form_state) {
+    /** @var \Drupal\responsive_image_preload\ThirdPartySettings $third_party_settings */
+    $third_party_settings = \Drupal::service('responsive_image_preload.third_party_settings');
+    return $third_party_settings->settingsForm($plugin);
+  }
+
+  /**
+   * Implements hook_field_formatter_settings_summary_alter().
+   */
+  #[Hook('field_formatter_settings_summary_alter')]
+  public static function fieldFormatterSettingsSummaryAlter(array &$summary, array $context) {
+    /** @var \Drupal\responsive_image_preload\ThirdPartySettings $third_party_settings */
+    $third_party_settings = \Drupal::service('responsive_image_preload.third_party_settings');
+    $third_party_settings->settingsSummaryAlter($summary, $context);
+  }
+
+  /**
+   * Implements hook_preprocess_field().
+   */
+  #[Hook('preprocess_field')]
+  public static function preprocessField(array &$variables) {
+    /** @var \Drupal\responsive_image_preload\FieldPreprocessor $field_preprocessor */
+    $field_preprocessor = \Drupal::service('responsive_image_preload.field_preprocessor');
+    $field_preprocessor->preprocessField($variables);
+  }
+
+}
diff --git a/src/PreloadGenerator.php b/src/PreloadGenerator.php
index 5076ccc..9786313 100644
--- a/src/PreloadGenerator.php
+++ b/src/PreloadGenerator.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\responsive_image_preload;
 
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\responsive_image\ResponsiveImageBuilder;
 use Drupal\breakpoint\BreakpointManagerInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\File\FileUrlGeneratorInterface;
@@ -122,11 +124,11 @@ class PreloadGenerator implements PreloadGeneratorInterface {
           switch ($image_style_mapping['image_mapping_type']) {
             case 'sizes':
               foreach ($image_style_mapping['image_mapping']['sizes_image_styles'] as $image_style_name) {
-                $dimensions = responsive_image_get_image_dimensions(
+                $dimensions = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(ResponsiveImageBuilder::class)->getImageDimensions($image_style_name, ['width' => $width, 'height' => $height], $file->getFileUri()), fn() => responsive_image_get_image_dimensions(
                   $image_style_name,
                   ['width' => $width, 'height' => $height],
                   $file->getFileUri()
-                );
+                ));
                 $imagesizes[] = explode(',', $image_style_mapping['image_mapping']['sizes']);
 
                 /** @var \Drupal\image\ImageStyleInterface $image_style */
diff --git a/tests/modules/responsive_image_preload_test/responsive_image_preload_test.info.yml b/tests/modules/responsive_image_preload_test/responsive_image_preload_test.info.yml
index 856ab37..1a5ba7f 100644
--- a/tests/modules/responsive_image_preload_test/responsive_image_preload_test.info.yml
+++ b/tests/modules/responsive_image_preload_test/responsive_image_preload_test.info.yml
@@ -2,6 +2,6 @@ name: 'Responsive image preload test'
 type: module
 description: 'Support module for responsive image preload testing.'
 package: 'Responsive image preload Testing'
-core_version_requirement: ^10.2 || ^11
+core_version_requirement: ^11.3 || ^12
 dependencies:
   - 'responsive_image_preload:responsive_image_preload'
diff --git a/tests/src/Functional/ResponsiveImagePreloadTest.php b/tests/src/Functional/ResponsiveImagePreloadTest.php
index cf67039..af17f53 100644
--- a/tests/src/Functional/ResponsiveImagePreloadTest.php
+++ b/tests/src/Functional/ResponsiveImagePreloadTest.php
@@ -2,11 +2,16 @@
 
 namespace Drupal\Tests\responsive_image_preload\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Contains test cases for complex responsive image style configurations.
  *
  * @group responsive_image_preload
  */
+#[Group('responsive_image_preload')]
+#[RunTestsInSeparateProcesses]
 class ResponsiveImagePreloadTest extends ResponsiveImagePreloadBrowserTestBase {
 
   /**
diff --git a/tests/src/Unit/FieldPreprocessorTest.php b/tests/src/Unit/FieldPreprocessorTest.php
index c5d95ac..402793c 100644
--- a/tests/src/Unit/FieldPreprocessorTest.php
+++ b/tests/src/Unit/FieldPreprocessorTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\responsive_image_preload\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
@@ -15,6 +16,7 @@ use Drupal\Tests\UnitTestCase;
  *
  * @group responsive_image_preload
  */
+#[Group('responsive_image_preload')]
 class FieldPreprocessorTest extends UnitTestCase {
 
   /**
diff --git a/tests/src/Unit/ThirdPartySettingsTest.php b/tests/src/Unit/ThirdPartySettingsTest.php
index 730cffc..af511f0 100644
--- a/tests/src/Unit/ThirdPartySettingsTest.php
+++ b/tests/src/Unit/ThirdPartySettingsTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\responsive_image_preload\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Core\Field\FormatterInterface;
 use Drupal\responsive_image_preload\ThirdPartySettings;
 use Drupal\Tests\UnitTestCase;
@@ -11,6 +12,7 @@ use Drupal\Tests\UnitTestCase;
  *
  * @group responsive_image_preload
  */
+#[Group('responsive_image_preload')]
 class ThirdPartySettingsTest extends UnitTestCase {
 
   /**
