diff --git a/glossify.info.yml b/glossify.info.yml
index a229fc6..9927d5a 100644
--- a/glossify.info.yml
+++ b/glossify.info.yml
@@ -3,6 +3,6 @@ description: 'API module to automatically create links or tooltips based on exis
 type: module
 package: "Input filters"
 configure: 'filter.admin_overview'
-core_version_requirement: ^10.3 || ^11
+core_version_requirement: ^10.3 || ^11 || ^12
 dependencies:
   - drupal:filter
diff --git a/glossify.module b/glossify.module
index ecf7d0c..c2f9362 100644
--- a/glossify.module
+++ b/glossify.module
@@ -1,5 +1,12 @@
 <?php
 
+/**
+ * @file
+ */
+
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\glossify\Hook\GlossifyHooks;
+
 /**
  * @file
  * Glossify module.
@@ -8,23 +15,7 @@
 /**
  * Implements hook_theme().
  */
+#[LegacyHook]
 function glossify_theme() {
-  return [
-    'glossify_tooltip' => [
-      'variables' => [
-        'word' => NULL,
-        'tip' => NULL,
-        'tip_raw' => NULL,
-        'langcode' => NULL,
-      ],
-    ],
-    'glossify_link' => [
-      'variables' => [
-        'word' => NULL,
-        'tip' => NULL,
-        'tip_raw' => NULL,
-        'tipurl' => NULL,
-      ],
-    ],
-  ];
+  return \Drupal::service(GlossifyHooks::class)->theme();
 }
diff --git a/glossify.services.yml b/glossify.services.yml
new file mode 100644
index 0000000..dc08ba5
--- /dev/null
+++ b/glossify.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\glossify\Hook\GlossifyHooks:
+    class: Drupal\glossify\Hook\GlossifyHooks
+    autowire: true
diff --git a/modules/glossify_commerce/glossify_commerce.info.yml b/modules/glossify_commerce/glossify_commerce.info.yml
index 1b335eb..facd53f 100644
--- a/modules/glossify_commerce/glossify_commerce.info.yml
+++ b/modules/glossify_commerce/glossify_commerce.info.yml
@@ -3,7 +3,7 @@ description: Filter to create links or tooltips based on commerce products.
 type: module
 package: 'Input filters'
 configure: 'filter.admin_overview'
-core_version_requirement: ^10.3 || ^11
+core_version_requirement: ^10.3 || ^11 || ^12
 dependencies:
   - glossify:glossify
   - commerce:commerce_product
diff --git a/modules/glossify_commerce/tests/src/Functional/GlossifyCommerceGenericTest.php b/modules/glossify_commerce/tests/src/Functional/GlossifyCommerceGenericTest.php
index 826964e..a575dd4 100644
--- a/modules/glossify_commerce/tests/src/Functional/GlossifyCommerceGenericTest.php
+++ b/modules/glossify_commerce/tests/src/Functional/GlossifyCommerceGenericTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\glossify_commerce\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\system\Functional\Module\GenericModuleTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\system\Functional\Module\GenericModuleTestBase;
  *
  * @group glossify_commerce
  */
+#[Group('glossify_commerce')]
+#[RunTestsInSeparateProcesses]
 class GlossifyCommerceGenericTest extends GenericModuleTestBase {
 
   /**
diff --git a/modules/glossify_node/glossify_node.info.yml b/modules/glossify_node/glossify_node.info.yml
index a22fad1..ac06a69 100644
--- a/modules/glossify_node/glossify_node.info.yml
+++ b/modules/glossify_node/glossify_node.info.yml
@@ -3,6 +3,6 @@ description: Filter to create links or tooltips based on node data.
 type: module
 package: "Input filters"
 configure: 'filter.admin_overview'
-core_version_requirement: ^10.3 || ^11
+core_version_requirement: ^10.3 || ^11 || ^12
 dependencies:
   - glossify:glossify
diff --git a/modules/glossify_node/tests/src/Functional/GlossifyNodeGenericTest.php b/modules/glossify_node/tests/src/Functional/GlossifyNodeGenericTest.php
index 058b7df..46a224a 100644
--- a/modules/glossify_node/tests/src/Functional/GlossifyNodeGenericTest.php
+++ b/modules/glossify_node/tests/src/Functional/GlossifyNodeGenericTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\glossify_node\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\system\Functional\Module\GenericModuleTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\system\Functional\Module\GenericModuleTestBase;
  *
  * @group glossify_node
  */
+#[Group('glossify_node')]
+#[RunTestsInSeparateProcesses]
 class GlossifyNodeGenericTest extends GenericModuleTestBase {
 
   /**
diff --git a/modules/glossify_taxonomy/glossify_taxonomy.info.yml b/modules/glossify_taxonomy/glossify_taxonomy.info.yml
index 37f7703..17bc2f8 100644
--- a/modules/glossify_taxonomy/glossify_taxonomy.info.yml
+++ b/modules/glossify_taxonomy/glossify_taxonomy.info.yml
@@ -3,7 +3,7 @@ description: Filter to create links based on taxonomy terms, or tooltips based o
 type: module
 package: "Input filters"
 configure: 'filter.admin_overview'
-core_version_requirement: ^10.3 || ^11
+core_version_requirement: ^10.3 || ^11 || ^12
 dependencies:
   - glossify:glossify
   - drupal:taxonomy
diff --git a/modules/glossify_taxonomy/glossify_taxonomy.module b/modules/glossify_taxonomy/glossify_taxonomy.module
index 0faecb2..7864f7e 100644
--- a/modules/glossify_taxonomy/glossify_taxonomy.module
+++ b/modules/glossify_taxonomy/glossify_taxonomy.module
@@ -5,60 +5,14 @@
  * Taxonomy tooltip module.
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\glossify_taxonomy\Hook\GlossifyTaxonomyHooks;
 use Drupal\Core\Routing\RouteMatchInterface;
-use Drupal\Core\Url;
 
 /**
  * Implements hook_help().
  */
+#[LegacyHook]
 function glossify_taxonomy_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    case 'help.page.glossify_taxonomies':
-
-      $output = '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Taxonomy tooltip module provides filters that scan and parse content and replace terms in the text with links to their pages. It consists of 2 filters:') . '</p>';
-
-      $list_settings = [
-        '#theme' => 'item_list',
-        '#list_type' => 'ul',
-      ];
-
-      // Tooltips with taxonomy section.
-      $items = [];
-      $items[] = [
-        '#title' => t('Taxonomy tooltips'),
-        '#items' => [
-          t('links taxonomy terms appearing in content to their taxonomy term page.'),
-          t('select which taxonomy vocabularies to use as the source for the terms.'),
-          t('indicate whether or not the match is case sensitive.'),
-          t('indicate whether or not every match should be linked or just the first occurrence.'),
-          t('display the term definition as a tooltip while hovering the glossified link.'),
-        ],
-      ];
-
-      foreach ($items as $item) {
-        $list = array_merge($list_settings, $item);
-        $output .= \Drupal::service('renderer')->render($list);
-      }
-
-      // Configuration/Usage section.
-      $items = [
-        '#title' => t('Configuration/Usage'),
-        '#items' => [
-          t('Navigate to the <a href="!url">Text formats</a> configuration page. Click "configure" next to the text format you upon which you want to enable the Taxonomy tooltip filter.', ['!url' => Url::fromRoute('filter.admin_overview')->toString()]),
-          t('Check the box for "Tooltips with taxonomy" under the list of filters in the "Enabled filters" section.'),
-          t('Check the boxes for the desired taxonomy vocabularies and/or content types you wish to use the source of terms to link.'),
-          t('Set any other options as desired.'),
-        ],
-      ];
-
-      $list_settings['#list_type'] = 'ol';
-      $list = array_merge($list_settings, $items);
-      $output .= \Drupal::service('renderer')->render($list);
-
-      $output .= '<h3>' . t('Theming') . '</h3>';
-      $output .= '<p>' . t('The module provides a theme function (theme_taxonomy_tooltip_links) to format the links. Override and customize as desired. See <a href="!url">Beginners guide to overriding themable output</a> for more detailed instructions.', ['!url' => 'https://drupal.org/node/457740']) . '</p>';
-
-      return $output;
-  }
+  return \Drupal::service(GlossifyTaxonomyHooks::class)->help($route_name, $route_match);
 }
diff --git a/modules/glossify_taxonomy/glossify_taxonomy.services.yml b/modules/glossify_taxonomy/glossify_taxonomy.services.yml
new file mode 100644
index 0000000..2c5d0a1
--- /dev/null
+++ b/modules/glossify_taxonomy/glossify_taxonomy.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\glossify_taxonomy\Hook\GlossifyTaxonomyHooks:
+    class: Drupal\glossify_taxonomy\Hook\GlossifyTaxonomyHooks
+    autowire: true
diff --git a/modules/glossify_taxonomy/src/Hook/GlossifyTaxonomyHooks.php b/modules/glossify_taxonomy/src/Hook/GlossifyTaxonomyHooks.php
new file mode 100644
index 0000000..d5f49c2
--- /dev/null
+++ b/modules/glossify_taxonomy/src/Hook/GlossifyTaxonomyHooks.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Drupal\glossify_taxonomy\Hook;
+
+use Drupal\Core\Url;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for glossify_taxonomy.
+ */
+class GlossifyTaxonomyHooks {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_help().
+   */
+  #[Hook('help')]
+  public function help($route_name, RouteMatchInterface $route_match) {
+    switch ($route_name) {
+      case 'help.page.glossify_taxonomies':
+        $output = '<h3>' . $this->t('About') . '</h3>';
+        $output .= '<p>' . $this->t('The Taxonomy tooltip module provides filters that scan and parse content and replace terms in the text with links to their pages. It consists of 2 filters:') . '</p>';
+        $list_settings = [
+          '#theme' => 'item_list',
+          '#list_type' => 'ul',
+        ];
+        // Tooltips with taxonomy section.
+        $items = [];
+        $items[] = [
+          '#title' => $this->t('Taxonomy tooltips'),
+          '#items' => [
+            $this->t('links taxonomy terms appearing in content to their taxonomy term page.'),
+            $this->t('select which taxonomy vocabularies to use as the source for the terms.'),
+            $this->t('indicate whether or not the match is case sensitive.'),
+            $this->t('indicate whether or not every match should be linked or just the first occurrence.'),
+            $this->t('display the term definition as a tooltip while hovering the glossified link.'),
+          ],
+        ];
+        foreach ($items as $item) {
+          $list = array_merge($list_settings, $item);
+          $output .= \Drupal::service('renderer')->render($list);
+        }
+        // Configuration/Usage section.
+        $items = [
+          '#title' => $this->t('Configuration/Usage'),
+          '#items' => [
+            $this->t('Navigate to the <a href="!url">Text formats</a> configuration page. Click "configure" next to the text format you upon which you want to enable the Taxonomy tooltip filter.', [
+              '!url' => Url::fromRoute('filter.admin_overview')->toString(),
+            ]),
+            $this->t('Check the box for "Tooltips with taxonomy" under the list of filters in the "Enabled filters" section.'),
+            $this->t('Check the boxes for the desired taxonomy vocabularies and/or content types you wish to use the source of terms to link.'),
+            $this->t('Set any other options as desired.'),
+          ],
+        ];
+        $list_settings['#list_type'] = 'ol';
+        $list = array_merge($list_settings, $items);
+        $output .= \Drupal::service('renderer')->render($list);
+        $output .= '<h3>' . $this->t('Theming') . '</h3>';
+        $output .= '<p>' . $this->t('The module provides a theme function (theme_taxonomy_tooltip_links) to format the links. Override and customize as desired. See <a href="!url">Beginners guide to overriding themable output</a> for more detailed instructions.', [
+          '!url' => 'https://drupal.org/node/457740',
+        ]) . '</p>';
+        return $output;
+    }
+  }
+
+}
diff --git a/modules/glossify_taxonomy/tests/src/Functional/GlossifyTaxonomyGenericTest.php b/modules/glossify_taxonomy/tests/src/Functional/GlossifyTaxonomyGenericTest.php
index 8af0ff4..b02bef1 100644
--- a/modules/glossify_taxonomy/tests/src/Functional/GlossifyTaxonomyGenericTest.php
+++ b/modules/glossify_taxonomy/tests/src/Functional/GlossifyTaxonomyGenericTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\glossify_taxonomy\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\system\Functional\Module\GenericModuleTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\system\Functional\Module\GenericModuleTestBase;
  *
  * @group glossify_taxonomy
  */
+#[Group('glossify_taxonomy')]
+#[RunTestsInSeparateProcesses]
 class GlossifyTaxonomyGenericTest extends GenericModuleTestBase {
 
   /**
diff --git a/src/Hook/GlossifyHooks.php b/src/Hook/GlossifyHooks.php
new file mode 100644
index 0000000..b58ad23
--- /dev/null
+++ b/src/Hook/GlossifyHooks.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Drupal\glossify\Hook;
+
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for glossify.
+ */
+class GlossifyHooks {
+  /**
+   * @file
+   * Glossify module.
+   */
+
+  /**
+   * Implements hook_theme().
+   */
+  #[Hook('theme')]
+  public function theme() {
+    return [
+      'glossify_tooltip' => [
+        'variables' => [
+          'word' => NULL,
+          'tip' => NULL,
+          'tip_raw' => NULL,
+          'langcode' => NULL,
+        ],
+      ],
+      'glossify_link' => [
+        'variables' => [
+          'word' => NULL,
+          'tip' => NULL,
+          'tip_raw' => NULL,
+          'tipurl' => NULL,
+        ],
+      ],
+    ];
+  }
+
+}
diff --git a/tests/src/Functional/GlossifyGenericTest.php b/tests/src/Functional/GlossifyGenericTest.php
index 65ce972..1b0e00c 100644
--- a/tests/src/Functional/GlossifyGenericTest.php
+++ b/tests/src/Functional/GlossifyGenericTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\glossify\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\system\Functional\Module\GenericModuleTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\Tests\system\Functional\Module\GenericModuleTestBase;
  *
  * @group glossify
  */
+#[Group('glossify')]
+#[RunTestsInSeparateProcesses]
 class GlossifyGenericTest extends GenericModuleTestBase {
 
   /**
diff --git a/tests/src/Unit/GlossifyBaseTest.php b/tests/src/Unit/GlossifyBaseTest.php
index b207cc3..86b7160 100644
--- a/tests/src/Unit/GlossifyBaseTest.php
+++ b/tests/src/Unit/GlossifyBaseTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\glossify\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Component\Utility\Unicode;
 use Drupal\Tests\UnitTestCase;
 use Drupal\glossify\GlossifyBase;
@@ -14,6 +15,7 @@ use PHPUnit\Framework\Attributes\DataProvider;
  * @group glossify
  */
 #[CoversClass(GlossifyBase::class)]
+#[Group('glossify')]
 class GlossifyBaseTest extends UnitTestCase {
 
   /**
