diff --git a/forms_steps.module b/forms_steps.module
index 727bca0..8773a08 100644
--- a/forms_steps.module
+++ b/forms_steps.module
@@ -4,7 +4,8 @@
  * @file
  * Hook implementations for the forms_steps module.
  */
-
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\forms_steps\Hook\FormsStepsHooks;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Url;
 use Drupal\Core\Form\FormStateInterface;
@@ -17,15 +18,9 @@ use Drupal\forms_steps\Entity\Workflow;
 /**
  * Implements hook_help().
  */
+#[LegacyHook]
 function forms_steps_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    case 'forms_steps.collection':
-      // @todo Documentation and helps todo.
-      $output = t('Forms Steps listed below are enabled.... See <a href=":url">the online documentation</a> for an introduction on how to use Forms Steps.', [
-        ':url' => Url::fromRoute('forms_steps.collection')->toString(),
-      ]);
-      return $output;
-  }
+  return \Drupal::service(FormsStepsHooks::class)->help($route_name, $route_match);
 }
 
 /**
@@ -34,53 +29,34 @@ function forms_steps_help($route_name, RouteMatchInterface $route_match) {
  * If this is a form managed by forms_steps we set the submit next route to the
  * form.
  */
-function forms_steps_form_alter(&$form, FormStateInterface $form_state, $form_id) {
-  $formStateStorage = $form_state->getStorage();
-  $currentRoute = \Drupal::routeMatch()->getRouteName();
-  if (
-    is_string($currentRoute)
-    && preg_match('/^forms_steps\./', $currentRoute)
-    && isset($formStateStorage['form_steps'])
-  ) {
-    $form['actions']['submit']['#submit'][] = 'Drupal\forms_steps\Form\FormsStepsAlter::setNextRoute';
-
-    // Handle the forms steps.
-    FormsStepsAlter::handle($form, $form_state);
-  }
+#[LegacyHook]
+function forms_steps_form_alter(&$form, FormStateInterface $form_state, $form_id)
+{
+    \Drupal::service(FormsStepsHooks::class)->formAlter($form, $form_state, $form_id);
 }
 
 /**
  * Implements hook_entity_insert().
  */
+#[LegacyHook]
 function forms_steps_entity_insert(EntityInterface $entity) {
-  \Drupal::service('forms_steps.workflow.manager')->entityInsert($entity);
+  \Drupal::service(FormsStepsHooks::class)->entityInsert($entity);
 }
 
 /**
  * Implements hook_entity_presave().
  */
+#[LegacyHook]
 function forms_steps_entity_presave(EntityInterface $entity) {
-  \Drupal::service('forms_steps.workflow.manager')->entityPreSave($entity);
+  \Drupal::service(FormsStepsHooks::class)->entityPresave($entity);
 }
 
 /**
  * Implements hook_entity_base_field_info().
  */
+#[LegacyHook]
 function forms_steps_entity_base_field_info(EntityTypeInterface $entity_type) {
-  if ($entity_type->id() === 'node') {
-    // If we have moved to new workflow management. We no longer need this
-    // field.
-    if (\Drupal::service('update.update_hook_registry')->getInstalledVersion('forms_steps') === '8100') {
-      $fields['field_forms_steps_id'] = BaseFieldDefinition::create(
-        'string'
-      )
-        ->setLabel(t('Forms Steps ID'))
-        ->setDisplayConfigurable('form', FALSE)
-        ->setDisplayConfigurable('view', FALSE);
-
-      return $fields;
-    }
-  }
+  return \Drupal::service(FormsStepsHooks::class)->entityBaseFieldInfo($entity_type);
 }
 
 /**
@@ -137,21 +113,9 @@ function forms_steps_entity_type_alter(array &$entity_types) {
  *
  * Overrides the core html theme to use a custom template for form steps.
  */
+#[LegacyHook]
 function forms_steps_theme() {
-  return [
-    'item_list__forms_steps' => [
-      'variables' => [
-        'items' => [],
-        'title' => '',
-        'list_type' => '',
-        'wrapper_attributes' => [],
-        'attributes' => [],
-        'empty' => '',
-        'context' => [],
-      ],
-      'preprocess functions' => ['template_preprocess_item_list'],
-    ],
-  ];
+  return \Drupal::service(FormsStepsHooks::class)->theme();
 }
 
 /**
@@ -159,21 +123,7 @@ function forms_steps_theme() {
  *
  * Delete workflow entities when original entity is deleted.
  */
+#[LegacyHook]
 function forms_steps_entity_predelete($entity) {
-  if ($entity->getEntityTypeId() !== 'forms_steps_workflow') {
-    // Get entity id.
-    $entity_id = $entity->id();
-
-    // EntityQuery on Workflow entities.
-    $query = \Drupal::entityQuery(Workflow::ENTITY_TYPE);
-    $query->condition('entity_id', $entity_id);
-    $workflow_entity_ids = $query->accessCheck()->execute();
-    if ($workflow_entity_ids) {
-      // Loop through results so we can load the result as an entity to delete.
-      foreach ($workflow_entity_ids as $workflow_entity_id) {
-        $workflow_entity = Workflow::load($workflow_entity_id);
-        $workflow_entity->delete();
-      }
-    }
-  }
+  \Drupal::service(FormsStepsHooks::class)->entityPredelete($entity);
 }
diff --git a/forms_steps.services.yml b/forms_steps.services.yml
index 264c537..4f4e0c8 100644
--- a/forms_steps.services.yml
+++ b/forms_steps.services.yml
@@ -34,3 +34,7 @@ services:
   forms_steps.workflow.repository:
     class: Drupal\forms_steps\Repository\WorkflowRepository
     arguments: ['@database', '@string_translation']
+
+  Drupal\forms_steps\Hook\FormsStepsHooks:
+    class: Drupal\forms_steps\Hook\FormsStepsHooks
+    autowire: true
diff --git a/src/Controller/FormsStepsController.php b/src/Controller/FormsStepsController.php
index b486b2a..9e4f9f5 100644
--- a/src/Controller/FormsStepsController.php
+++ b/src/Controller/FormsStepsController.php
@@ -76,7 +76,7 @@ class FormsStepsController extends ControllerBase {
    * @throws \Drupal\forms_steps\Exception\AccessDeniedException
    * @throws \Drupal\forms_steps\Exception\FormsStepsNotFoundException
    */
-  public function step(string $forms_steps, $step, string $instance_id = NULL): array {
+  public function step(string $forms_steps, $step, ?string $instance_id = NULL): array {
     return $this->getForm($forms_steps, $step, $instance_id);
   }
 
diff --git a/src/Entity/FormsSteps.php b/src/Entity/FormsSteps.php
index 4ca1eb2..2a10240 100644
--- a/src/Entity/FormsSteps.php
+++ b/src/Entity/FormsSteps.php
@@ -349,7 +349,7 @@ class FormsSteps extends ConfigEntityBase implements FormsStepsInterface {
   /**
    * {@inheritdoc}
    */
-  public function getSteps(array $step_ids = NULL): array {
+  public function getSteps(?array $step_ids = NULL): array {
     if ($step_ids === NULL) {
       $step_ids = array_keys($this->steps);
     }
@@ -362,7 +362,7 @@ class FormsSteps extends ConfigEntityBase implements FormsStepsInterface {
   /**
    * {@inheritdoc}
    */
-  public function getProgressSteps(array $progress_step_ids = NULL): array {
+  public function getProgressSteps(?array $progress_step_ids = NULL): array {
     if ($progress_step_ids === NULL) {
       $progress_step_ids = array_keys($this->progress_steps);
     }
@@ -402,7 +402,7 @@ class FormsSteps extends ConfigEntityBase implements FormsStepsInterface {
   /**
    * {@inheritdoc}
    */
-  public function getFirstStep(string $steps = NULL): StepInterface {
+  public function getFirstStep(?string $steps = NULL): StepInterface {
     if ($steps === NULL) {
       $steps = $this->getSteps();
     }
@@ -413,7 +413,7 @@ class FormsSteps extends ConfigEntityBase implements FormsStepsInterface {
   /**
    * {@inheritdoc}
    */
-  public function getLastStep(string $steps = NULL): StepInterface {
+  public function getLastStep(?string $steps = NULL): StepInterface {
     if ($steps === NULL) {
       $steps = $this->getSteps();
     }
diff --git a/src/Form/FormsStepsProgressStepDeleteForm.php b/src/Form/FormsStepsProgressStepDeleteForm.php
index 8e4335d..471e8ac 100644
--- a/src/Form/FormsStepsProgressStepDeleteForm.php
+++ b/src/Form/FormsStepsProgressStepDeleteForm.php
@@ -79,7 +79,7 @@ class FormsStepsProgressStepDeleteForm extends ConfirmFormBase {
    * @return array
    *   The form structure.
    */
-  public function buildForm(array $form, FormStateInterface $form_state, FormsStepsInterface $forms_steps = NULL, string $forms_steps_progress_step = NULL): array {
+  public function buildForm(array $form, FormStateInterface $form_state, ?FormsStepsInterface $forms_steps = NULL, ?string $forms_steps_progress_step = NULL): array {
     if (!$forms_steps->hasProgressStep($forms_steps_progress_step)) {
       throw new NotFoundHttpException();
     }
diff --git a/src/Form/FormsStepsStepDeleteForm.php b/src/Form/FormsStepsStepDeleteForm.php
index 10a011e..d159a5a 100644
--- a/src/Form/FormsStepsStepDeleteForm.php
+++ b/src/Form/FormsStepsStepDeleteForm.php
@@ -79,7 +79,7 @@ class FormsStepsStepDeleteForm extends ConfirmFormBase {
    * @return array
    *   The form structure.
    */
-  public function buildForm(array $form, FormStateInterface $form_state, FormsStepsInterface $forms_steps = NULL, string $forms_steps_step = NULL): array {
+  public function buildForm(array $form, FormStateInterface $form_state, ?FormsStepsInterface $forms_steps = NULL, ?string $forms_steps_step = NULL): array {
     if (!$forms_steps->hasStep($forms_steps_step)) {
       throw new NotFoundHttpException();
     }
diff --git a/src/Form/FormsStepsStepFormBase.php b/src/Form/FormsStepsStepFormBase.php
index a9ce1ad..a9b2285 100644
--- a/src/Form/FormsStepsStepFormBase.php
+++ b/src/Form/FormsStepsStepFormBase.php
@@ -4,6 +4,7 @@ declare(strict_types=1);
 
 namespace Drupal\forms_steps\Form;
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
 use Drupal\Core\Entity\EntityForm;
 use Drupal\Core\Entity\EntityInterface;
@@ -124,7 +125,7 @@ class FormsStepsStepFormBase extends EntityForm {
 
     foreach ($entitiesDefinition as $entityDefinition) {
       // EntityDisplay entities can only handle fieldable entity types.
-      if (in_array($fieldableInterface, class_implements($entityDefinition->getOriginalClass()))) {
+      if (in_array($fieldableInterface, class_implements(DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $entityDefinition->getDecoratedClasses()[0], fn() => $entityDefinition->getOriginalClass())))) {
         $entitiesSelectList[$entityDefinition->id()] = $entityDefinition->getLabel();
       }
     }
diff --git a/src/FormsStepsInterface.php b/src/FormsStepsInterface.php
index cb35fa0..4527ac8 100644
--- a/src/FormsStepsInterface.php
+++ b/src/FormsStepsInterface.php
@@ -110,7 +110,7 @@ interface FormsStepsInterface extends ConfigEntityInterface {
    * @throws \InvalidArgumentException
    *   Thrown if $step_ids contains a step ID that does not exist.
    */
-  public function getSteps(array $step_ids = NULL): array;
+  public function getSteps(?array $step_ids = NULL): array;
 
   /**
    * Gets progress step objects for the provided progress step IDs.
@@ -126,7 +126,7 @@ interface FormsStepsInterface extends ConfigEntityInterface {
    *   Thrown if $progress_step_ids contains a progress step ID that does not
    *   exist.
    */
-  public function getProgressSteps(array $progress_step_ids = NULL): array;
+  public function getProgressSteps(?array $progress_step_ids = NULL): array;
 
   /**
    * Retrieve the last step defined on a forms steps entity.
@@ -137,7 +137,7 @@ interface FormsStepsInterface extends ConfigEntityInterface {
    * @return \Drupal\forms_steps\StepInterface
    *   The forms_steps step.
    */
-  public function getLastStep(string $steps = NULL): StepInterface;
+  public function getLastStep(?string $steps = NULL): StepInterface;
 
   /**
    * Retrieve the first step defined on a forms steps entity.
@@ -148,7 +148,7 @@ interface FormsStepsInterface extends ConfigEntityInterface {
    * @return \Drupal\forms_steps\StepInterface
    *   The forms_steps step.
    */
-  public function getFirstStep(string $steps = NULL): StepInterface;
+  public function getFirstStep(?string $steps = NULL): StepInterface;
 
   /**
    * Gets a forms_steps step.
diff --git a/src/Hook/FormsStepsHooks.php b/src/Hook/FormsStepsHooks.php
new file mode 100644
index 0000000..517009b
--- /dev/null
+++ b/src/Hook/FormsStepsHooks.php
@@ -0,0 +1,137 @@
+<?php
+
+namespace Drupal\forms_steps\Hook;
+
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Url;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\forms_steps\Form\FormsStepsAlter;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\forms_steps\Entity\Workflow;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+/**
+ * Hook implementations for forms_steps.
+ */
+class FormsStepsHooks
+{
+    use StringTranslationTrait;
+    /**
+     * Implements hook_help().
+     */
+    #[Hook('help')]
+    public function help($route_name, \Drupal\Core\Routing\RouteMatchInterface $route_match)
+    {
+        switch ($route_name) {
+            case 'forms_steps.collection':
+                // @todo Documentation and helps todo.
+                $output = $this->t('Forms Steps listed below are enabled.... See <a href=":url">the online documentation</a> for an introduction on how to use Forms Steps.', [
+                    ':url' => \Drupal\Core\Url::fromRoute('forms_steps.collection')->toString(),
+                ]);
+                return $output;
+        }
+    }
+    /**
+     * Implements hook_form_alter().
+     *
+     * If this is a form managed by forms_steps we set the submit next route to the
+     * form.
+     */
+    #[Hook('form_alter')]
+    public static function formAlter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id)
+    {
+        $formStateStorage = $form_state->getStorage();
+        $currentRoute = \Drupal::routeMatch()->getRouteName();
+        if (is_string($currentRoute) && preg_match('/^forms_steps\./', $currentRoute) && isset($formStateStorage['form_steps'])) {
+            $form['actions']['submit']['#submit'][] = 'Drupal\forms_steps\Form\FormsStepsAlter::setNextRoute';
+            // Handle the forms steps.
+            \Drupal\forms_steps\Form\FormsStepsAlter::handle($form, $form_state);
+        }
+    }
+    /**
+     * Implements hook_entity_insert().
+     */
+    #[Hook('entity_insert')]
+    public static function entityInsert(\Drupal\Core\Entity\EntityInterface $entity)
+    {
+        \Drupal::service('forms_steps.workflow.manager')->entityInsert($entity);
+    }
+    /**
+     * Implements hook_entity_presave().
+     */
+    #[Hook('entity_presave')]
+    public static function entityPresave(\Drupal\Core\Entity\EntityInterface $entity)
+    {
+        \Drupal::service('forms_steps.workflow.manager')->entityPreSave($entity);
+    }
+    /**
+     * Implements hook_entity_base_field_info().
+     */
+    #[Hook('entity_base_field_info')]
+    public function entityBaseFieldInfo(\Drupal\Core\Entity\EntityTypeInterface $entity_type)
+    {
+        if ($entity_type->id() === 'node') {
+            // If we have moved to new workflow management. We no longer need this
+            // field.
+            if (\Drupal::service('update.update_hook_registry')->getInstalledVersion('forms_steps') === '8100') {
+                $fields['field_forms_steps_id'] = \Drupal\Core\Field\BaseFieldDefinition::create('string')->setLabel($this->t('Forms Steps ID'))->setDisplayConfigurable('form', FALSE)->setDisplayConfigurable('view', FALSE);
+                return $fields;
+            }
+        }
+    }
+    /**
+     * Implements hook_theme().
+     *
+     * Overrides the core html theme to use a custom template for form steps.
+     */
+    #[Hook('theme')]
+    public static function theme()
+    {
+        return [
+            'item_list__forms_steps' => [
+                'variables' => [
+                    'items' => [
+                    ],
+                    'title' => '',
+                    'list_type' => '',
+                    'wrapper_attributes' => [
+                    ],
+                    'attributes' => [
+                    ],
+                    'empty' => '',
+                    'context' => [
+                    ],
+                ],
+                'preprocess functions' => [
+                    'template_preprocess_item_list',
+                ],
+            ],
+        ];
+    }
+    /**
+     * Implements hook_entity_predelete().
+     *
+     * Delete workflow entities when original entity is deleted.
+     */
+    #[Hook('entity_predelete')]
+    public static function entityPredelete($entity)
+    {
+        if ($entity->getEntityTypeId() !== 'forms_steps_workflow') {
+            // Get entity id.
+            $entity_id = $entity->id();
+            // EntityQuery on Workflow entities.
+            $query = \Drupal::entityQuery(\Drupal\forms_steps\Entity\Workflow::ENTITY_TYPE);
+            $query->condition('entity_id', $entity_id);
+            $workflow_entity_ids = $query->accessCheck()->execute();
+            if ($workflow_entity_ids) {
+                // Loop through results so we can load the result as an entity to delete.
+                foreach ($workflow_entity_ids as $workflow_entity_id) {
+                    $workflow_entity = \Drupal\forms_steps\Entity\Workflow::load($workflow_entity_id);
+                    $workflow_entity->delete();
+                }
+            }
+        }
+    }
+}
diff --git a/src/Plugin/Block/FormsStepsProgressBarBlock.php b/src/Plugin/Block/FormsStepsProgressBarBlock.php
index 63534ab..3445254 100644
--- a/src/Plugin/Block/FormsStepsProgressBarBlock.php
+++ b/src/Plugin/Block/FormsStepsProgressBarBlock.php
@@ -4,6 +4,7 @@ declare(strict_types=1);
 
 namespace Drupal\forms_steps\Plugin\Block;
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Core\Routing\CurrentRouteMatch;
 use Drupal\Core\Url;
 use Drupal\Core\Link;
@@ -166,7 +167,7 @@ class FormsStepsProgressBarBlock extends BlockBase implements ContainerFactoryPl
             $url = Url::fromRoute($forms_steps->getStepRoute($link_step), $options);
             $link = Link::fromTextAndUrl($this->t($progress_step->label()), $url);
             $toRenderable = $link->toRenderable();
-            $markup = \Drupal::service('renderer')->renderPlain($toRenderable);
+            $markup = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.3.0', fn() => \Drupal::service('renderer')->renderInIsolation($toRenderable), fn() => \Drupal::service('renderer')->renderPlain($toRenderable));
 
             $item['#markup'] = $markup->__toString();
           }
