diff --git a/inline_entity_form.api.php b/inline_entity_form.api.php
index 5c95fab..d790647 100644
--- a/inline_entity_form.api.php
+++ b/inline_entity_form.api.php
@@ -1,5 +1,11 @@
 <?php
 
+/**
+ * @file
+ */
+
+use Drupal\Core\Form\FormStateInterface;
+
 /**
  * @file
  * Hooks provided by the Inline Entity Form module.
@@ -15,7 +21,7 @@
  * @param \Drupal\Core\Form\FormStateInterface $form_state
  *   The form state of the parent form.
  */
-function hook_inline_entity_form_entity_form_alter(array &$entity_form, \Drupal\Core\Form\FormStateInterface &$form_state) {
+function hook_inline_entity_form_entity_form_alter(array &$entity_form, FormStateInterface &$form_state) {
   if ($entity_form['#entity_type'] == 'commerce_line_item') {
     $entity_form['quantity']['#description'] = t('New quantity description.');
   }
@@ -34,7 +40,7 @@ function hook_inline_entity_form_entity_form_alter(array &$entity_form, \Drupal\
  * @param \Drupal\Core\Form\FormStateInterface $form_state
  *   The form state of the parent form.
  */
-function hook_inline_entity_form_reference_form_alter(array &$reference_form, \Drupal\Core\Form\FormStateInterface &$form_state) {
+function hook_inline_entity_form_reference_form_alter(array &$reference_form, FormStateInterface &$form_state) {
   $reference_form['entity_id']['#description'] = t('New autocomplete description');
 }
 
diff --git a/inline_entity_form.module b/inline_entity_form.module
index 7bb004e..f318bd3 100644
--- a/inline_entity_form.module
+++ b/inline_entity_form.module
@@ -10,13 +10,13 @@
  * managed outside the parent form.
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\inline_entity_form\Hook\InlineEntityFormHooks;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\Element;
-use Drupal\inline_entity_form\ElementSubmit;
 use Drupal\inline_entity_form\Form\EntityInlineForm;
 use Drupal\inline_entity_form\Plugin\Field\FieldWidget\InlineEntityFormComplex;
-use Drupal\inline_entity_form\WidgetSubmit;
 use Drupal\migrate\Plugin\MigrateSourceInterface;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
@@ -24,40 +24,25 @@ use Drupal\migrate\Row;
 /**
  * Implements hook_entity_type_build().
  */
+#[LegacyHook]
 function inline_entity_form_entity_type_build(array &$entity_types) {
-  /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
-  if (isset($entity_types['node']) && !$entity_types['node']->getHandlerClass('inline_form')) {
-    $entity_types['node']->setHandlerClass('inline_form', '\Drupal\inline_entity_form\Form\NodeInlineForm');
-  }
-
-  foreach ($entity_types as &$entity_type) {
-    if (!$entity_type->hasHandlerClass('inline_form')) {
-      $entity_type->setHandlerClass('inline_form', '\Drupal\inline_entity_form\Form\EntityInlineForm');
-    }
-  }
+  \Drupal::service(InlineEntityFormHooks::class)->entityTypeBuild($entity_types);
 }
 
 /**
  * Implements hook_form_alter().
  */
+#[LegacyHook]
 function inline_entity_form_form_alter(&$form, FormStateInterface $form_state, $form_id) {
-  // Attach the IEF handlers only if the current form has an IEF widget.
-  $widget_state = $form_state->get('inline_entity_form');
-  if (!is_null($widget_state)) {
-    ElementSubmit::attach($form, $form_state);
-    WidgetSubmit::attach($form, $form_state);
-  }
+  \Drupal::service(InlineEntityFormHooks::class)->formAlter($form, $form_state, $form_id);
 }
 
 /**
  * Implements hook_theme().
  */
+#[LegacyHook]
 function inline_entity_form_theme() {
-  return [
-    'inline_entity_form_entity_table' => [
-      'render element' => 'form',
-    ],
-  ];
+  return \Drupal::service(InlineEntityFormHooks::class)->theme();
 }
 
 /**
@@ -475,15 +460,15 @@ function template_preprocess_inline_entity_form_entity_table(array &$variables)
 /**
  * Implements hook_migrate_prepare_row().
  */
+#[LegacyHook]
 function inline_entity_form_migrate_prepare_row(Row $row, MigrateSourceInterface $source, MigrationInterface $migration) {
-  \Drupal::service('inline_entity_form.migration_helper')
-    ->alterRow($row, $source, $migration);
+  \Drupal::service(InlineEntityFormHooks::class)->migratePrepareRow($row, $source, $migration);
 }
 
 /**
  * Implements hook_migration_plugins_alter().
  */
+#[LegacyHook]
 function inline_entity_form_migration_plugins_alter(array &$migrations) {
-  \Drupal::service('inline_entity_form.migration_helper')
-    ->alterPlugins($migrations);
+  \Drupal::service(InlineEntityFormHooks::class)->migrationPluginsAlter($migrations);
 }
diff --git a/inline_entity_form.services.yml b/inline_entity_form.services.yml
index e270e1d..abd6c5a 100644
--- a/inline_entity_form.services.yml
+++ b/inline_entity_form.services.yml
@@ -2,3 +2,7 @@ services:
   inline_entity_form.migration_helper:
     class: Drupal\inline_entity_form\MigrationHelper
     arguments: ['@?plugin.manager.migrate.source']
+
+  Drupal\inline_entity_form\Hook\InlineEntityFormHooks:
+    class: Drupal\inline_entity_form\Hook\InlineEntityFormHooks
+    autowire: true
diff --git a/src/Hook/InlineEntityFormHooks.php b/src/Hook/InlineEntityFormHooks.php
new file mode 100644
index 0000000..1584646
--- /dev/null
+++ b/src/Hook/InlineEntityFormHooks.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Drupal\inline_entity_form\Hook;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate\Plugin\MigrateSourceInterface;
+use Drupal\migrate\Row;
+use Drupal\inline_entity_form\WidgetSubmit;
+use Drupal\inline_entity_form\ElementSubmit;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for inline_entity_form.
+ */
+class InlineEntityFormHooks {
+
+  /**
+   * Implements hook_entity_type_build().
+   */
+  #[Hook('entity_type_build')]
+  public static function entityTypeBuild(array &$entity_types) {
+    /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
+    if (isset($entity_types['node']) && !$entity_types['node']->getHandlerClass('inline_form')) {
+      $entity_types['node']->setHandlerClass('inline_form', '\Drupal\inline_entity_form\Form\NodeInlineForm');
+    }
+    foreach ($entity_types as &$entity_type) {
+      if (!$entity_type->hasHandlerClass('inline_form')) {
+        $entity_type->setHandlerClass('inline_form', '\Drupal\inline_entity_form\Form\EntityInlineForm');
+      }
+    }
+  }
+
+  /**
+   * Implements hook_form_alter().
+   */
+  #[Hook('form_alter')]
+  public static function formAlter(&$form, FormStateInterface $form_state, $form_id) {
+    // Attach the IEF handlers only if the current form has an IEF widget.
+    $widget_state = $form_state->get('inline_entity_form');
+    if (!is_null($widget_state)) {
+      ElementSubmit::attach($form, $form_state);
+      WidgetSubmit::attach($form, $form_state);
+    }
+  }
+
+  /**
+   * Implements hook_theme().
+   */
+  #[Hook('theme')]
+  public static function theme() {
+    return [
+      'inline_entity_form_entity_table' => [
+        'render element' => 'form',
+      ],
+    ];
+  }
+
+  /**
+   * Implements hook_migrate_prepare_row().
+   */
+  #[Hook('migrate_prepare_row')]
+  public static function migratePrepareRow(Row $row, MigrateSourceInterface $source, MigrationInterface $migration) {
+    \Drupal::service('inline_entity_form.migration_helper')->alterRow($row, $source, $migration);
+  }
+
+  /**
+   * Implements hook_migration_plugins_alter().
+   */
+  #[Hook('migration_plugins_alter')]
+  public static function migrationPluginsAlter(array &$migrations) {
+    \Drupal::service('inline_entity_form.migration_helper')->alterPlugins($migrations);
+  }
+
+}
diff --git a/src/MigrationHelper.php b/src/MigrationHelper.php
index 15d9513..2afb54a 100644
--- a/src/MigrationHelper.php
+++ b/src/MigrationHelper.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\inline_entity_form;
 
+use Drupal\migrate_plus\Entity\MigrationGroup;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\field\Plugin\migrate\source\d7\FieldInstance;
 use Drupal\field\Plugin\migrate\source\d7\FieldInstancePerFormDisplay;
@@ -174,7 +175,7 @@ class MigrationHelper {
     // Integrate shared group configuration into the migration.
     if (!empty($migration['migration_group']) && class_exists('\Drupal\migrate_plus\Entity\MigrationGroup')) {
       // phpcs:ignore Drupal.Classes.FullyQualifiedNamespace
-      $group = \Drupal\migrate_plus\Entity\MigrationGroup::load($migration['migration_group']);
+      $group = MigrationGroup::load($migration['migration_group']);
       $shared_configuration = !empty($group) ? $group->get('shared_configuration') : [];
       if (!empty($shared_configuration)) {
         foreach ($shared_configuration as $key => $group_value) {
diff --git a/tests/src/FunctionalJavascript/ComplexSimpleWidgetTest.php b/tests/src/FunctionalJavascript/ComplexSimpleWidgetTest.php
index 62ce09c..5d4b9d9 100644
--- a/tests/src/FunctionalJavascript/ComplexSimpleWidgetTest.php
+++ b/tests/src/FunctionalJavascript/ComplexSimpleWidgetTest.php
@@ -4,6 +4,8 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\inline_entity_form\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 
 /**
@@ -11,6 +13,8 @@ use Drupal\Core\Field\FieldStorageDefinitionInterface;
  *
  * @group inline_entity_form
  */
+#[Group('inline_entity_form')]
+#[RunTestsInSeparateProcesses]
 class ComplexSimpleWidgetTest extends InlineEntityFormTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/ComplexWidgetRevisionsTest.php b/tests/src/FunctionalJavascript/ComplexWidgetRevisionsTest.php
index 6ab3b96..bf9f0eb 100644
--- a/tests/src/FunctionalJavascript/ComplexWidgetRevisionsTest.php
+++ b/tests/src/FunctionalJavascript/ComplexWidgetRevisionsTest.php
@@ -4,11 +4,17 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\inline_entity_form\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use PHPUnit\Framework\Attributes\DataProvider;
+
 /**
  * IEF complex entity reference revisions tests.
  *
  * @group inline_entity_form
  */
+#[Group('inline_entity_form')]
+#[RunTestsInSeparateProcesses]
 class ComplexWidgetRevisionsTest extends InlineEntityFormTestBase {
 
   /**
@@ -80,6 +86,7 @@ class ComplexWidgetRevisionsTest extends InlineEntityFormTestBase {
    *
    * @dataProvider revisionsAtDepthDataProvider
    */
+  #[DataProvider('revisionsAtDepthDataProvider')]
   public function testRevisionsAtDepth(bool $inner_widget_adds_revisions) {
     $page = $this->getSession()->getPage();
     $assert_session = $this->assertSession();
diff --git a/tests/src/FunctionalJavascript/ComplexWidgetTest.php b/tests/src/FunctionalJavascript/ComplexWidgetTest.php
index b47ac06..362e319 100644
--- a/tests/src/FunctionalJavascript/ComplexWidgetTest.php
+++ b/tests/src/FunctionalJavascript/ComplexWidgetTest.php
@@ -4,6 +4,9 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\inline_entity_form\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Behat\Mink\Element\NodeElement;
 use Drupal\node\Entity\Node;
 use Drupal\node\NodeInterface;
@@ -11,12 +14,13 @@ use Drupal\Tests\TestFileCreationTrait;
 use Drupal\user\Entity\Role;
 
 // cspell:ignore Bojan WSOD
-
 /**
  * IEF complex field widget tests.
  *
  * @group inline_entity_form
  */
+#[Group('inline_entity_form')]
+#[RunTestsInSeparateProcesses]
 class ComplexWidgetTest extends InlineEntityFormTestBase {
 
   use TestFileCreationTrait {
@@ -1169,6 +1173,7 @@ class ComplexWidgetTest extends InlineEntityFormTestBase {
    *
    * @dataProvider simpleFalseTrueDataProvider
    */
+  #[DataProvider('simpleFalseTrueDataProvider')]
   public function testNestedCreateAndEditWontClash(bool $required) {
     // Get the xpath selectors for the input fields in this test.
     $top_title_field_xpath = $this->getXpathForNthInputByLabelText('Title', 1);
diff --git a/tests/src/FunctionalJavascript/ElementWebTest.php b/tests/src/FunctionalJavascript/ElementWebTest.php
index e3fd957..9473e7d 100644
--- a/tests/src/FunctionalJavascript/ElementWebTest.php
+++ b/tests/src/FunctionalJavascript/ElementWebTest.php
@@ -4,11 +4,16 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\inline_entity_form\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+
 /**
  * Tests the IEF element on a custom form.
  *
  * @group inline_entity_form
  */
+#[Group('inline_entity_form')]
+#[RunTestsInSeparateProcesses]
 class ElementWebTest extends InlineEntityFormTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/SimpleWidgetTest.php b/tests/src/FunctionalJavascript/SimpleWidgetTest.php
index 4b60710..eacd0a0 100644
--- a/tests/src/FunctionalJavascript/SimpleWidgetTest.php
+++ b/tests/src/FunctionalJavascript/SimpleWidgetTest.php
@@ -4,6 +4,8 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\inline_entity_form\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\node\Entity\Node;
 use Drupal\node\NodeInterface;
@@ -13,6 +15,8 @@ use Drupal\node\NodeInterface;
  *
  * @group inline_entity_form
  */
+#[Group('inline_entity_form')]
+#[RunTestsInSeparateProcesses]
 class SimpleWidgetTest extends InlineEntityFormTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/TranslationTest.php b/tests/src/FunctionalJavascript/TranslationTest.php
index 2da8b1b..4dab002 100644
--- a/tests/src/FunctionalJavascript/TranslationTest.php
+++ b/tests/src/FunctionalJavascript/TranslationTest.php
@@ -4,16 +4,19 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\inline_entity_form\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\node\Entity\Node;
 
 // cspell:ignore animaux haus haut kangourou kann maison nguru peut sautent
 // cspell:ignore sauter springen tous
-
 /**
  * Tests translating inline entities.
  *
  * @group inline_entity_form
  */
+#[Group('inline_entity_form')]
+#[RunTestsInSeparateProcesses]
 class TranslationTest extends InlineEntityFormTestBase {
 
   /**
diff --git a/tests/src/Kernel/Migrate/MigrateFieldInstanceTest.php b/tests/src/Kernel/Migrate/MigrateFieldInstanceTest.php
index 136d620..d0af3ef 100644
--- a/tests/src/Kernel/Migrate/MigrateFieldInstanceTest.php
+++ b/tests/src/Kernel/Migrate/MigrateFieldInstanceTest.php
@@ -4,6 +4,8 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\inline_entity_form\Kernel\Migrate;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\FieldConfigInterface;
 
@@ -12,6 +14,8 @@ use Drupal\field\FieldConfigInterface;
  *
  * @group inline_entity_form
  */
+#[Group('inline_entity_form')]
+#[RunTestsInSeparateProcesses]
 class MigrateFieldInstanceTest extends MigrateTestBase {
 
   // phpcs:disable
diff --git a/tests/src/Kernel/Migrate/MigrateFieldInstanceWidgetSettingsTest.php b/tests/src/Kernel/Migrate/MigrateFieldInstanceWidgetSettingsTest.php
index 4d02497..444bb93 100644
--- a/tests/src/Kernel/Migrate/MigrateFieldInstanceWidgetSettingsTest.php
+++ b/tests/src/Kernel/Migrate/MigrateFieldInstanceWidgetSettingsTest.php
@@ -4,6 +4,8 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\inline_entity_form\Kernel\Migrate;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Entity\Display\EntityFormDisplayInterface;
 use Drupal\Core\Entity\Entity\EntityFormDisplay;
 
@@ -12,6 +14,8 @@ use Drupal\Core\Entity\Entity\EntityFormDisplay;
  *
  * @group inline_entity_form
  */
+#[Group('inline_entity_form')]
+#[RunTestsInSeparateProcesses]
 class MigrateFieldInstanceWidgetSettingsTest extends MigrateTestBase {
 
   // phpcs:disable
diff --git a/tests/src/Kernel/Migrate/MigrateFieldTest.php b/tests/src/Kernel/Migrate/MigrateFieldTest.php
index 2f54097..55fdc17 100644
--- a/tests/src/Kernel/Migrate/MigrateFieldTest.php
+++ b/tests/src/Kernel/Migrate/MigrateFieldTest.php
@@ -4,6 +4,8 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\inline_entity_form\Kernel\Migrate;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\field\FieldStorageConfigInterface;
 
@@ -12,6 +14,8 @@ use Drupal\field\FieldStorageConfigInterface;
  *
  * @group inline_entity_form
  */
+#[Group('inline_entity_form')]
+#[RunTestsInSeparateProcesses]
 class MigrateFieldTest extends MigrateTestBase {
 
   // phpcs:disable
diff --git a/tests/src/Kernel/Plugin/Field/FieldWidget/InlineEntityFormComplexSubmitTest.php b/tests/src/Kernel/Plugin/Field/FieldWidget/InlineEntityFormComplexSubmitTest.php
index 2895b61..d50913d 100644
--- a/tests/src/Kernel/Plugin/Field/FieldWidget/InlineEntityFormComplexSubmitTest.php
+++ b/tests/src/Kernel/Plugin/Field/FieldWidget/InlineEntityFormComplexSubmitTest.php
@@ -4,6 +4,9 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\inline_entity_form\Kernel\Plugin\Field\FieldWidget;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormState;
 use Drupal\inline_entity_form\Plugin\Field\FieldWidget\InlineEntityFormComplex;
@@ -14,6 +17,8 @@ use Drupal\KernelTests\KernelTestBase;
  *
  * @group inline_entity_form
  */
+#[Group('inline_entity_form')]
+#[RunTestsInSeparateProcesses]
 class InlineEntityFormComplexSubmitTest extends KernelTestBase {
 
   /**
@@ -30,6 +35,7 @@ class InlineEntityFormComplexSubmitTest extends KernelTestBase {
    *
    * @dataProvider providerSubmitConfirmRemoveDeleteDecisions
    */
+  #[DataProvider('providerSubmitConfirmRemoveDeleteDecisions')]
   public function testSubmitConfirmRemoveDeleteDecisions(string $removed_reference, array $row_form_values, bool $should_queue_delete): void {
     $entity = $this->createMock(EntityInterface::class);
     $entity->expects($this->once())
