diff --git a/src/Command/ProcessStatus.php b/src/Command/ProcessStatus.php
index b0beaba..9f7d1c6 100644
--- a/src/Command/ProcessStatus.php
+++ b/src/Command/ProcessStatus.php
@@ -4,7 +4,7 @@ declare(strict_types=1);
 
 namespace Drupal\supervisor\Command;
 
-use Drupal\supervisor\Formatter;
+use Drupal\supervisor\Formatter\ProcessInfo;
 use Supervisor\ProcessStates;
 use Supervisor\SupervisorInterface;
 use Symfony\Component\Console\Attribute\AsCommand;
@@ -27,7 +27,7 @@ final class ProcessStatus extends Command {
    */
   public function __construct(
     private readonly SupervisorInterface $supervisor,
-    private readonly Formatter\ProcessInfo $formatter,
+    private readonly ProcessInfo $formatter,
   ) {
     parent::__construct();
   }
diff --git a/src/Controller/Process/Canonical.php b/src/Controller/Process/Canonical.php
index b63b104..770b8e4 100644
--- a/src/Controller/Process/Canonical.php
+++ b/src/Controller/Process/Canonical.php
@@ -4,11 +4,11 @@ declare(strict_types=1);
 
 namespace Drupal\supervisor\Controller\Process;
 
+use Drupal\supervisor\Formatter\ProcessInfo;
 use Drupal\Component\Render\FormattableMarkup as FM;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\StringTranslation\TranslatableMarkup as TM;
 use Drupal\Core\Url;
-use Drupal\supervisor\Formatter;
 use Supervisor\Exception\Fault\BadNameException;
 use Supervisor\SupervisorInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -24,7 +24,7 @@ final readonly class Canonical implements ContainerInjectionInterface {
    */
   public function __construct(
     private SupervisorInterface $supervisor,
-    private Formatter\ProcessInfo $formatter,
+    private ProcessInfo $formatter,
   ) {}
 
   /**
diff --git a/src/Controller/Process/CanonicalRefresh.php b/src/Controller/Process/CanonicalRefresh.php
index 9a17eb9..7ef0253 100644
--- a/src/Controller/Process/CanonicalRefresh.php
+++ b/src/Controller/Process/CanonicalRefresh.php
@@ -4,8 +4,8 @@ declare(strict_types=1);
 
 namespace Drupal\supervisor\Controller\Process;
 
+use Drupal\supervisor\Formatter\ProcessInfo;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
-use Drupal\supervisor\Formatter;
 use Supervisor\Exception\Fault\BadNameException;
 use Supervisor\SupervisorInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -24,7 +24,7 @@ final readonly class CanonicalRefresh implements ContainerInjectionInterface {
    */
   public function __construct(
     private SupervisorInterface $supervisor,
-    private Formatter\ProcessInfo $formatter,
+    private ProcessInfo $formatter,
   ) {}
 
   /**
diff --git a/src/Controller/Process/Collection.php b/src/Controller/Process/Collection.php
index a6a307b..dab32c6 100644
--- a/src/Controller/Process/Collection.php
+++ b/src/Controller/Process/Collection.php
@@ -4,12 +4,12 @@ declare(strict_types=1);
 
 namespace Drupal\supervisor\Controller\Process;
 
+use Drupal\supervisor\Formatter\ProcessInfo;
 use Drupal\Component\Render\FormattableMarkup as FM;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Link;
 use Drupal\Core\StringTranslation\TranslatableMarkup as TM;
 use Drupal\Core\Url;
-use Drupal\supervisor\Formatter;
 use Supervisor\SupervisorInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -23,7 +23,7 @@ final readonly class Collection implements ContainerInjectionInterface {
    */
   public function __construct(
     private SupervisorInterface $supervisor,
-    private Formatter\ProcessInfo $formatter,
+    private ProcessInfo $formatter,
   ) {}
 
   /**
diff --git a/src/Controller/Process/CollectionRefresh.php b/src/Controller/Process/CollectionRefresh.php
index 52e8e34..0b67447 100644
--- a/src/Controller/Process/CollectionRefresh.php
+++ b/src/Controller/Process/CollectionRefresh.php
@@ -4,8 +4,8 @@ declare(strict_types=1);
 
 namespace Drupal\supervisor\Controller\Process;
 
+use Drupal\supervisor\Formatter\ProcessInfo;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
-use Drupal\supervisor\Formatter;
 use Supervisor\SupervisorInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\JsonResponse;
@@ -22,7 +22,7 @@ final readonly class CollectionRefresh implements ContainerInjectionInterface {
    */
   public function __construct(
     private SupervisorInterface $supervisor,
-    private Formatter\ProcessInfo $formatter,
+    private ProcessInfo $formatter,
   ) {}
 
   /**
diff --git a/src/Formatter/ProcessInfo.php b/src/Formatter/ProcessInfo.php
index 08fc4d5..2ae44cb 100644
--- a/src/Formatter/ProcessInfo.php
+++ b/src/Formatter/ProcessInfo.php
@@ -6,7 +6,6 @@ namespace Drupal\supervisor\Formatter;
 
 use Drupal\Core\StringTranslation\TranslatableMarkup as TM;
 use Drupal\supervisor\Data;
-use Drupal\supervisor\Formatter;
 use Supervisor\ProcessStates;
 
 /**
@@ -17,7 +16,7 @@ final readonly class ProcessInfo {
   /**
    * {@selfdoc}
    */
-  public function __construct(private Formatter\Date $dateFormatter) {}
+  public function __construct(private Date $dateFormatter) {}
 
   /**
    * {@selfdoc}
diff --git a/src/Hook/SupervisorHooks.php b/src/Hook/SupervisorHooks.php
new file mode 100644
index 0000000..b6e04f4
--- /dev/null
+++ b/src/Hook/SupervisorHooks.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Drupal\supervisor\Hook;
+
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for supervisor.
+ */
+class SupervisorHooks {
+  /**
+   * @file
+   * Primary module hooks for Supervisor module.
+   */
+
+  /**
+   * Implements hook_theme().
+   */
+  #[Hook('theme')]
+  public static function theme(): array {
+    return [
+      'supervisor_field' => [
+        'variables' => [
+          'label' => NULL,
+          'items' => [],
+          'list' => FALSE,
+          'attributes' => [],
+        ],
+      ],
+    ];
+  }
+
+}
diff --git a/supervisor.module b/supervisor.module
index 84cd754..f8a4c26 100644
--- a/supervisor.module
+++ b/supervisor.module
@@ -2,6 +2,9 @@
 
 declare(strict_types=1);
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\supervisor\Hook\SupervisorHooks;
+
 /**
  * @file
  * Primary module hooks for Supervisor module.
@@ -10,15 +13,7 @@ declare(strict_types=1);
 /**
  * Implements hook_theme().
  */
+#[LegacyHook]
 function supervisor_theme(): array {
-  return [
-    'supervisor_field' => [
-      'variables' => [
-        'label' => NULL,
-        'items' => [],
-        'list' => FALSE,
-        'attributes' => [],
-      ],
-    ],
-  ];
+  return \Drupal::service(SupervisorHooks::class)->theme();
 }
diff --git a/supervisor.services.yml b/supervisor.services.yml
index 8f08d20..590da48 100644
--- a/supervisor.services.yml
+++ b/supervisor.services.yml
@@ -23,3 +23,7 @@ services:
   supervisor.process_info_formatter:
     class: Drupal\supervisor\Formatter\ProcessInfo
     arguments: ['@supervisor.date_formatter']
+
+  Drupal\supervisor\Hook\SupervisorHooks:
+    class: Drupal\supervisor\Hook\SupervisorHooks
+    autowire: true
