diff --git a/formassembly.module b/formassembly.module
index 82aec77..4fe4079 100644
--- a/formassembly.module
+++ b/formassembly.module
@@ -15,7 +15,8 @@
  * http://www.gnu.org/licenses/gpl.html
  */
 
-use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\formassembly\Hook\FormassemblyHooks;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
@@ -24,66 +25,25 @@ use Drupal\Core\Session\AccountInterface;
 /**
  * Implements hook_help().
  */
+#[LegacyHook]
 function formassembly_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    // Main module help for the formassembly module.
-    case 'help.page.formassembly':
-      $output = '';
-      $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t(
-          'Integrates a Drupal site with the FormAssembly service'
-        ) . '</p>';
-      return $output;
-
-    default:
-      return [];
-  }
+  return \Drupal::service(FormassemblyHooks::class)->help($route_name, $route_match);
 }
 
 /**
  * Implements hook_theme().
  */
+#[LegacyHook]
 function formassembly_theme($existing, $type, $theme, $path) {
-  return [
-    'fa_form__fa_form' => [
-      'template' => 'fa_form__fa_form__markup',
-      'base hook' => 'entity',
-    ],
-    'fa_form__external_js' => [
-      'variables' => [
-        'src' => NULL,
-      ],
-    ],
-    'fa_form__inline_js' => [
-      'variables' => [
-        'value' => NULL,
-      ],
-    ],
-    'fa_form__external_css' => [
-      'variables' => [
-        'value' => NULL,
-        'rel' => NULL,
-        'href' => NULL,
-      ],
-    ],
-  ];
+  return \Drupal::service(FormassemblyHooks::class)->theme($existing, $type, $theme, $path);
 }
 
 /**
  * Implements hook_entity_field_access().
  */
-function formassembly_entity_field_access(
-  $operation,
-  FieldDefinitionInterface $field_definition,
-  AccountInterface $account,
-  ?FieldItemListInterface $items = NULL,
-) {
-  if ($operation == 'edit'
-    && $field_definition->getType() == 'entityreference'
-    && $field_definition->getSetting('target_type') == 'fa_form') {
-    return AccessResult::allowedIfHasPermission($account, 'reference formassembly');
-  }
-  return AccessResult::neutral();
+#[LegacyHook]
+function formassembly_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, ?FieldItemListInterface $items = NULL) {
+  return \Drupal::service(FormassemblyHooks::class)->entityFieldAccess($operation, $field_definition, $account, $items);
 }
 
 /**
diff --git a/formassembly.services.yml b/formassembly.services.yml
index f501c99..8e8d61a 100644
--- a/formassembly.services.yml
+++ b/formassembly.services.yml
@@ -38,3 +38,7 @@ services:
     arguments: ['@config.factory']
     calls:
       - [setKeyRepository, ['@?key.repository']]
+
+  Drupal\formassembly\Hook\FormassemblyHooks:
+    class: Drupal\formassembly\Hook\FormassemblyHooks
+    autowire: true
diff --git a/src/Hook/FormassemblyHooks.php b/src/Hook/FormassemblyHooks.php
new file mode 100644
index 0000000..37d2e6f
--- /dev/null
+++ b/src/Hook/FormassemblyHooks.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Drupal\formassembly\Hook;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for formassembly.
+ */
+class FormassemblyHooks {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_help().
+   */
+  #[Hook('help')]
+  public function help($route_name, RouteMatchInterface $route_match) {
+    switch ($route_name) {
+      // Main module help for the formassembly module.
+      case 'help.page.formassembly':
+        $output = '';
+        $output .= '<h3>' . $this->t('About') . '</h3>';
+        $output .= '<p>' . $this->t('Integrates a Drupal site with the FormAssembly service') . '</p>';
+        return $output;
+
+      default:
+        return [];
+    }
+  }
+
+  /**
+   * Implements hook_theme().
+   */
+  #[Hook('theme')]
+  public static function theme($existing, $type, $theme, $path) {
+    return [
+      'fa_form__fa_form' => [
+        'template' => 'fa_form__fa_form__markup',
+        'base hook' => 'entity',
+      ],
+      'fa_form__external_js' => [
+        'variables' => [
+          'src' => NULL,
+        ],
+      ],
+      'fa_form__inline_js' => [
+        'variables' => [
+          'value' => NULL,
+        ],
+      ],
+      'fa_form__external_css' => [
+        'variables' => [
+          'value' => NULL,
+          'rel' => NULL,
+          'href' => NULL,
+        ],
+      ],
+    ];
+  }
+
+  /**
+   * Implements hook_entity_field_access().
+   */
+  #[Hook('entity_field_access')]
+  public static function entityFieldAccess($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, ?FieldItemListInterface $items = NULL) {
+    if ($operation == 'edit' && $field_definition->getType() == 'entityreference' && $field_definition->getSetting('target_type') == 'fa_form') {
+      return AccessResult::allowedIfHasPermission($account, 'reference formassembly');
+    }
+    return AccessResult::neutral();
+  }
+
+}
