diff --git a/ace_editor.install b/ace_editor.install
index 62ec593..f738197 100644
--- a/ace_editor.install
+++ b/ace_editor.install
@@ -1,5 +1,12 @@
 <?php
 
+/**
+ * @file
+ */
+
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\Core\Extension\Requirement\RequirementSeverity;
+
 /**
  * @file
  * Install functions for the Ace Editor module.
@@ -35,11 +42,11 @@ function ace_editor_requirements($phase) {
     $lib_path = ace_editor_lib_path();
     if ($lib_path) {
       $requirements['ace_editor']['value'] = t('Installed at @location', ['@location' => $lib_path]);
-      $requirements['ace_editor']['severity'] = REQUIREMENT_OK;
+      $requirements['ace_editor']['severity'] = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::OK, fn() => REQUIREMENT_OK);
     }
     else {
       $requirements['ace_editor']['value'] = t('Not installed');
-      $requirements['ace_editor']['severity'] = REQUIREMENT_ERROR;
+      $requirements['ace_editor']['severity'] = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => RequirementSeverity::Error, fn() => REQUIREMENT_ERROR);
       $requirements['ace_editor']['description'] = t('Please download the Ace library from <a href="@url">@url</a> to the @location directory for using the Ace Editor module.', [
         '@url' => 'https://github.com/ajaxorg/ace-builds',
         '@location' => '/libraries/',
diff --git a/ace_editor.module b/ace_editor.module
index 9ebbbeb..b3d1232 100644
--- a/ace_editor.module
+++ b/ace_editor.module
@@ -5,27 +5,16 @@
  * This file is used to write hooks that used in the module.
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\ace_editor\Hook\AceEditorHooks;
 use Drupal\Core\Routing\RouteMatchInterface;
 
 /**
  * Implements hook_help().
  */
+#[LegacyHook]
 function ace_editor_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    // Main module help for the ace_editor module.
-    case 'help.page.ace_editor':
-      $output = '';
-      $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('Ace is a code editor written in JavaScript, allowing you to edit HTML, PHP and JavaScript (and more). It provides syntax highlighting, proper indentation, keyboard shortcuts, find and replace (including regular expressions).') . '</p>';
-      $output .= '<p>' . t("This module integrates the Ace editor into Drupal's node/block edit forms, for editing raw HTML, PHP, JS, etc... in a familiar way..") . '</p>';
-      $output .= '<p>' . t('It supports:') . '</p>';
-      $output .= '<ul>' . t('<li>node edit forms, including summary</li>') . '</ul>';
-      $output .= '<ul>' . t('<li>blocks edit forms</li>') . '</ul>';
-      $output .= '<p>' . t('It also provides a display formatter, along with a text filter and an API to embed and show code snippets in your content.') . '</p>';
-      return $output;
-
-    default:
-  }
+  return \Drupal::service(AceEditorHooks::class)->help($route_name, $route_match);
 }
 
 /**
@@ -68,44 +57,15 @@ function ace_editor_lib_path() {
  * Selects all theme and mode files from ace editor external library and add it
  * to drupal library.
  */
+#[LegacyHook]
 function ace_editor_library_info_build() {
-
-  $path = ace_editor_lib_path();
-
-  // Collects all theme and mode files available.
-  $files = \Drupal::service('file_system')->scanDirectory(DRUPAL_ROOT . $path, '/(theme|mode)-(.+)\.js$/', ['recurse' => FALSE]);
-
-  $libraries = [];
-  foreach ($files as $file_info) {
-
-    $asset = explode('-', $file_info->name);
-    $library_name = $asset[0] . '.' . $asset[1];
-    $libraries[$library_name] = $path . $file_info->filename;
-
-  }
-  $libs = [];
-  foreach ($libraries as $key => $value) {
-    $libs[$key] = [
-      'js' => [
-        $value => [],
-      ],
-    ];
-  }
-  return $libs;
+  return \Drupal::service(AceEditorHooks::class)->libraryInfoBuild();
 }
 
 /**
  * Implements hook_library_info_alter().
  */
+#[LegacyHook]
 function ace_editor_library_info_alter(&$libraries, $extension) {
-  if ($extension == 'ace_editor') {
-    $library_path = ace_editor_lib_path();
-    $libraries['primary']['js'][$library_path . 'ace.js'] = ['weight' => -2];
-    $config = \Drupal::config('ace_editor.settings')->get();
-    if (isset($config['auto_complete'])) {
-      $libraries['primary']['js'][$library_path . 'ext-language_tools.js'] = ['weight' => -2];
-    }
-    $libraries['formatter']['js'][$library_path . 'ace.js'] = ['weight' => -2];
-    $libraries['filter']['js'][$library_path . 'ace.js'] = ['weight' => -2];
-  }
+  \Drupal::service(AceEditorHooks::class)->libraryInfoAlter($libraries, $extension);
 }
diff --git a/ace_editor.services.yml b/ace_editor.services.yml
new file mode 100644
index 0000000..5389985
--- /dev/null
+++ b/ace_editor.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\ace_editor\Hook\AceEditorHooks:
+    class: Drupal\ace_editor\Hook\AceEditorHooks
+    autowire: true
diff --git a/src/Hook/AceEditorHooks.php b/src/Hook/AceEditorHooks.php
new file mode 100644
index 0000000..fe29c40
--- /dev/null
+++ b/src/Hook/AceEditorHooks.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace Drupal\ace_editor\Hook;
+
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for ace_editor.
+ */
+class AceEditorHooks {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_help().
+   */
+  #[Hook('help')]
+  public function help($route_name, RouteMatchInterface $route_match) {
+    switch ($route_name) {
+      // Main module help for the ace_editor module.
+      case 'help.page.ace_editor':
+        $output = '';
+        $output .= '<h3>' . $this->t('About') . '</h3>';
+        $output .= '<p>' . $this->t('Ace is a code editor written in JavaScript, allowing you to edit HTML, PHP and JavaScript (and more). It provides syntax highlighting, proper indentation, keyboard shortcuts, find and replace (including regular expressions).') . '</p>';
+        $output .= '<p>' . $this->t("This module integrates the Ace editor into Drupal's node/block edit forms, for editing raw HTML, PHP, JS, etc... in a familiar way..") . '</p>';
+        $output .= '<p>' . $this->t('It supports:') . '</p>';
+        $output .= '<ul>' . $this->t('<li>node edit forms, including summary</li>') . '</ul>';
+        $output .= '<ul>' . $this->t('<li>blocks edit forms</li>') . '</ul>';
+        $output .= '<p>' . $this->t('It also provides a display formatter, along with a text filter and an API to embed and show code snippets in your content.') . '</p>';
+        return $output;
+
+      default:
+    }
+  }
+
+  /**
+   * Implements hook_library_info_build().
+   *
+   * Selects all theme and mode files from ace editor external library and add it
+   * to drupal library.
+   */
+  #[Hook('library_info_build')]
+  public function libraryInfoBuild() {
+    $path = ace_editor_lib_path();
+    // Collects all theme and mode files available.
+    $files = \Drupal::service('file_system')->scanDirectory(DRUPAL_ROOT . $path, '/(theme|mode)-(.+)\.js$/', [
+      'recurse' => FALSE,
+    ]);
+    $libraries = [];
+    foreach ($files as $file_info) {
+      $asset = explode('-', $file_info->name);
+      $library_name = $asset[0] . '.' . $asset[1];
+      $libraries[$library_name] = $path . $file_info->filename;
+    }
+    $libs = [];
+    foreach ($libraries as $key => $value) {
+      $libs[$key] = [
+        'js' => [
+          $value => [],
+        ],
+      ];
+    }
+    return $libs;
+  }
+
+  /**
+   * Implements hook_library_info_alter().
+   */
+  #[Hook('library_info_alter')]
+  public function libraryInfoAlter(&$libraries, $extension) {
+    if ($extension == 'ace_editor') {
+      $library_path = ace_editor_lib_path();
+      $libraries['primary']['js'][$library_path . 'ace.js'] = [
+        'weight' => -2,
+      ];
+      $config = \Drupal::config('ace_editor.settings')->get();
+      if (isset($config['auto_complete'])) {
+        $libraries['primary']['js'][$library_path . 'ext-language_tools.js'] = [
+          'weight' => -2,
+        ];
+      }
+      $libraries['formatter']['js'][$library_path . 'ace.js'] = [
+        'weight' => -2,
+      ];
+      $libraries['filter']['js'][$library_path . 'ace.js'] = [
+        'weight' => -2,
+      ];
+    }
+  }
+
+}
diff --git a/tests/src/Kernel/AcePluginsTest.php b/tests/src/Kernel/AcePluginsTest.php
index 759dd15..24a4cd2 100644
--- a/tests/src/Kernel/AcePluginsTest.php
+++ b/tests/src/Kernel/AcePluginsTest.php
@@ -4,6 +4,8 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\ace_editor\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 
 /**
@@ -16,6 +18,8 @@ use Drupal\KernelTests\KernelTestBase;
  *
  * @group ace_editor
  */
+#[Group('ace_editor')]
+#[RunTestsInSeparateProcesses]
 class AcePluginsTest extends KernelTestBase {
 
   /**
diff --git a/tests/src/Unit/AceFilterTagAttributesTest.php b/tests/src/Unit/AceFilterTagAttributesTest.php
index 0ea64b7..437f070 100644
--- a/tests/src/Unit/AceFilterTagAttributesTest.php
+++ b/tests/src/Unit/AceFilterTagAttributesTest.php
@@ -4,6 +4,7 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\ace_editor\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\ace_editor\Plugin\Filter\AceFilter;
 use Drupal\Tests\UnitTestCase;
 
@@ -18,6 +19,7 @@ use Drupal\Tests\UnitTestCase;
  * @group ace_editor
  * @coversDefaultClass \Drupal\ace_editor\Plugin\Filter\AceFilter
  */
+#[Group('ace_editor')]
 class AceFilterTagAttributesTest extends UnitTestCase {
 
   /**
