diff --git a/src/Hook/SyncloudHooks.php b/src/Hook/SyncloudHooks.php
new file mode 100644
index 0000000..5f4c42e
--- /dev/null
+++ b/src/Hook/SyncloudHooks.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace Drupal\syncloud\Hook;
+
+use Drupal\Core\Config\ConfigBase;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for syncloud.
+ */
+class SyncloudHooks {
+
+  /**
+   * Implements hook_page_attachments().
+   *
+   * @param array<string, mixed> $page
+   *   The page render array.
+   */
+  #[Hook('page_attachments')]
+  public function pageAttachments(array &$page): void {
+    PageAttachments::hook($page);
+  }
+
+  /**
+   * Implements hook_theme().
+   *
+   * @return array<string, array<string, string>>
+   *   Theme hook definitions.
+   */
+  #[Hook('theme')]
+  public function theme(): array {
+    return [
+      'syn' => [
+        'render element' => 'elements',
+      ],
+    ];
+  }
+
+  /**
+   * Implements hook_ENTITY_TYPE_insert().
+   */
+  #[Hook('webform_submission_insert')]
+  public function webformSubmissionInsert(EntityInterface $entity): void {
+    WebformSubmissionInsert::hook($entity, TRUE);
+  }
+
+  /**
+   * Implements hook_ENTITY_TYPE_presave().
+   */
+  #[Hook('webform_submission_presave')]
+  public function webformSubmissionPresave(EntityInterface $entity): void {
+    WebformSubmissionPresave::hook($entity, TRUE);
+  }
+
+  /**
+   * Implements hook_contact_mail_alter_message_alter().
+   *
+   * @param array<string, mixed> $message
+   *   The message being altered.
+   * @param \Drupal\Core\Config\ConfigBase $config
+   *   The contact mail configuration.
+   */
+  #[Hook('contact_mail_alter_message_alter')]
+  public function contactMailAlterMessageAlter(array &$message, ConfigBase $config): void {
+    MailAlter::hook($message, $config);
+  }
+
+}
diff --git a/syncloud.module b/syncloud.module
index c2e40cc..677c833 100644
--- a/syncloud.module
+++ b/syncloud.module
@@ -4,16 +4,13 @@
  * @file
  * Module syncloud.module.
  */
-
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\syncloud\Hook\SyncloudHooks;
 use Drupal\Core\Config\ConfigBase;
 use Drupal\Core\Render\Element;
 use Drupal\syncloud\Hook\ContactMessageInsert;
-use Drupal\syncloud\Hook\MailAlter;
-use Drupal\syncloud\Hook\WebformSubmissionInsert;
-use Drupal\syncloud\Hook\WebformSubmissionPresave;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\syncloud\Hook\Cron;
-use Drupal\syncloud\Hook\PageAttachments;
 
 /**
  * Implements hook_page_attachments().
@@ -21,8 +18,9 @@ use Drupal\syncloud\Hook\PageAttachments;
  * @param array<string, mixed> $page
  *   The page render array.
  */
+#[LegacyHook]
 function syncloud_page_attachments(array &$page): void {
-  PageAttachments::hook($page);
+  \Drupal::service(SyncloudHooks::class)->pageAttachments($page);
 }
 
 /**
@@ -31,12 +29,9 @@ function syncloud_page_attachments(array &$page): void {
  * @return array<string, array<string, string>>
  *   Theme hook definitions.
  */
+#[LegacyHook]
 function syncloud_theme(): array {
-  return [
-    'syn' => [
-      'render element' => 'elements',
-    ],
-  ];
+  return \Drupal::service(SyncloudHooks::class)->theme();
 }
 
 /**
@@ -72,15 +67,17 @@ function syncloud_contact_message_insert(EntityInterface $entity): void {
 /**
  * Implements hook_ENTITY_TYPE_insert().
  */
+#[LegacyHook]
 function syncloud_webform_submission_insert(EntityInterface $entity): void {
-  WebformSubmissionInsert::hook($entity, TRUE);
+  \Drupal::service(SyncloudHooks::class)->webformSubmissionInsert($entity);
 }
 
 /**
  * Implements hook_ENTITY_TYPE_presave().
  */
+#[LegacyHook]
 function syncloud_webform_submission_presave(EntityInterface $entity): void {
-  WebformSubmissionPresave::hook($entity, TRUE);
+  \Drupal::service(SyncloudHooks::class)->webformSubmissionPresave($entity);
 }
 
 /**
@@ -91,8 +88,9 @@ function syncloud_webform_submission_presave(EntityInterface $entity): void {
  * @param \Drupal\Core\Config\ConfigBase $config
  *   The contact mail configuration.
  */
+#[LegacyHook]
 function syncloud_contact_mail_alter_message_alter(array &$message, ConfigBase $config): void {
-  MailAlter::hook($message, $config);
+  \Drupal::service(SyncloudHooks::class)->contactMailAlterMessageAlter($message, $config);
 }
 
 /**
diff --git a/syncloud.services.yml b/syncloud.services.yml
index 8d7f06c..c7c782d 100644
--- a/syncloud.services.yml
+++ b/syncloud.services.yml
@@ -12,3 +12,7 @@ services:
     arguments: ["@entity_type.manager", "@request_stack", "@path.current", "@path_alias.manager", "@syncloud.queue"]
     tags:
       - { name: event_subscriber }
+
+  Drupal\syncloud\Hook\SyncloudHooks:
+    class: Drupal\syncloud\Hook\SyncloudHooks
+    autowire: true
