diff --git a/jsonlog.install b/jsonlog.install
index 2759859..88353a5 100644
--- a/jsonlog.install
+++ b/jsonlog.install
@@ -9,7 +9,7 @@
  * Implements hook_install().
  */
 function jsonlog_install() {
-  \Drupal::configFactory()->getEditable('jsonlog.settings')->save(true);
+  \Drupal::configFactory()->getEditable('jsonlog.settings')->save();
 }
 
 /**
diff --git a/jsonlog.module b/jsonlog.module
index 228aecf..bcfe00c 100644
--- a/jsonlog.module
+++ b/jsonlog.module
@@ -5,6 +5,8 @@
  * Contains jsonlog.module.
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\jsonlog\Hook\JsonlogHooks;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Form\FormStateInterface;
 
@@ -14,19 +16,9 @@ use Drupal\Core\Form\FormStateInterface;
  * @param string $route_name
  * @param RouteMatchInterface $route_match
  */
+#[LegacyHook]
 function jsonlog_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    // Main module help for the jsonlog module.
-    case 'help.page.jsonlog':
-      $output = '';
-      $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>'
-        . t('Logs all events picked up by Drupal\'s LoggerInterface to a JSON-formatted file.', [], ['context' => 'module:jsonlog'])
-        . '</p>';
-      return $output;
-
-    default:
-  }
+  return \Drupal::service(JsonlogHooks::class)->help($route_name, $route_match);
 }
 
 /**
@@ -38,9 +30,9 @@ function jsonlog_help($route_name, RouteMatchInterface $route_match) {
  * @param array $form
  * @param FormStateInterface $form_state
  */
+#[LegacyHook]
 function jsonlog_form_system_logging_settings_alter(&$form, FormStateInterface $form_state) {
-  \Drupal::moduleHandler()->loadInclude('jsonlog', 'inc');
-  _jsonlog_form_system_logging_settings_alter($form, $form_state);
+  \Drupal::service(JsonlogHooks::class)->formSystemLoggingSettingsAlter($form, $form_state);
 }
 
 /**
@@ -121,8 +113,8 @@ function jsonlog_form_system_logging_settings_submit($form, FormStateInterface $
     ->set('jsonlog_tags', $values['jsonlog_tags'])
     ->save();
 
-  // Write a test-entry via our logger service with data from the example table
-  if($values['test_entry'] === 1) {
+  // Write a test-entry via our logger service with data from the example table.
+  if ($values['test_entry'] === 1) {
     /** @var \Drupal\jsonlog\Logger\JsonLog $jsonlogger */
     $jsonlogger = \Drupal::service('logger.jsonlog');
     $context = [
diff --git a/jsonlog.services.yml b/jsonlog.services.yml
index 6610da1..b0683c7 100644
--- a/jsonlog.services.yml
+++ b/jsonlog.services.yml
@@ -4,3 +4,7 @@ services:
     arguments: ['@config.factory', '@logger.log_message_parser', '@module_handler', '@request_stack']
     tags:
       - { name: logger }
+
+  Drupal\jsonlog\Hook\JsonlogHooks:
+    class: Drupal\jsonlog\Hook\JsonlogHooks
+    autowire: true
diff --git a/src/Hook/JsonlogHooks.php b/src/Hook/JsonlogHooks.php
new file mode 100644
index 0000000..2121422
--- /dev/null
+++ b/src/Hook/JsonlogHooks.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace Drupal\jsonlog\Hook;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for jsonlog.
+ */
+class JsonlogHooks {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_help().
+   *
+   * @param string $route_name
+   * @param RouteMatchInterface $route_match
+   */
+  #[Hook('help')]
+  public function help($route_name, RouteMatchInterface $route_match) {
+    switch ($route_name) {
+      // Main module help for the jsonlog module.
+      case 'help.page.jsonlog':
+        $output = '';
+        $output .= '<h3>' . $this->t('About') . '</h3>';
+        $output .= '<p>' . $this->t('Logs all events picked up by Drupal\'s LoggerInterface to a JSON-formatted file.', [], [
+          'context' => 'module:jsonlog',
+        ]) . '</p>';
+        return $output;
+
+      default:
+    }
+  }
+
+  /**
+   * Adds this module's setting fields to the system logging settings form.
+   * Implements hook_form_FORM_ID_alter().
+   *
+   * @see _jsonlog_form_system_logging_settings_alter()
+   *
+   * @param array $form
+   * @param FormStateInterface $form_state
+   */
+  #[Hook('form_system_logging_settings_alter')]
+  public function formSystemLoggingSettingsAlter(&$form, FormStateInterface $form_state) {
+    \Drupal::moduleHandler()->loadInclude('jsonlog', 'inc');
+    _jsonlog_form_system_logging_settings_alter($form, $form_state);
+  }
+
+}
diff --git a/tests/src/Functional/JsonLogConfigFormTest.php b/tests/src/Functional/JsonLogConfigFormTest.php
index b698316..ac929ce 100644
--- a/tests/src/Functional/JsonLogConfigFormTest.php
+++ b/tests/src/Functional/JsonLogConfigFormTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\jsonlog\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Url;
 use Drupal\Tests\BrowserTestBase;
 
@@ -13,6 +15,9 @@ use Drupal\Tests\BrowserTestBase;
  * Class JsonLogConfigFormTest
  * @package Drupal\Tests\jsonlog\Functional
  */
+#[Group('JsonLog
+Class JsonLogConfigFormTest')]
+#[RunTestsInSeparateProcesses]
 class JsonLogConfigFormTest extends BrowserTestBase {
 
   const JSONLOG_SITEID_FIELD_NAME = 'jsonlog_siteid';
diff --git a/tests/src/Unit/JsonLogDataTest.php b/tests/src/Unit/JsonLogDataTest.php
index ddc5da9..7b1cd9d 100644
--- a/tests/src/Unit/JsonLogDataTest.php
+++ b/tests/src/Unit/JsonLogDataTest.php
@@ -2,19 +2,22 @@
 
 namespace Drupal\Tests\jsonlog\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Tests\UnitTestCase;
 use Drupal\Component\Render\FormattableMarkup;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\jsonlog\Logger\JsonLogData;
 
 /**
- * Unit tests for JsonLogData class
+ * Unit tests for JsonLogData class.
  *
  * @group JsonLog
  *
  * Class JsonLogDataTest
  * @package Drupal\Tests\jsonlog\Unit
  */
+#[Group('JsonLog
+Class JsonLogDataTest')]
 class JsonLogDataTest extends UnitTestCase {
 
   const DEFAULT_THRESHOLD = 4;
@@ -26,10 +29,13 @@ class JsonLogDataTest extends UnitTestCase {
   const DEFAULT_SITE_ID = 'jsonlog_test';
 
   /**
-   * @var JsonLogData $data
+   * @var JsonLogData
    */
   private $data;
 
+  /**
+   *
+   */
   protected function setUp(): void {
     parent::setUp();
     $config_stub['jsonlog.settings'] = [
@@ -44,7 +50,7 @@ class JsonLogDataTest extends UnitTestCase {
   }
 
   /**
-   * Test default initialisation of JsonLogData class
+   * Test default initialisation of JsonLogData class.
    */
   public function testCanConstructDefaultDataClass() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
@@ -61,7 +67,7 @@ class JsonLogDataTest extends UnitTestCase {
     $first_timestamp = $this->data->getData()['@timestamp'];
     $first_message_id = $this->data->getMessageId();
 
-    //microsleep because some fast CI environments might run tests so fast the timestamp does not differ.
+    // Microsleep because some fast CI environments might run tests so fast the timestamp does not differ.
     usleep(250);
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
@@ -69,6 +75,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertFalse($first_message_id == $this->data->getMessageId(), 'Message ID unique.');
   }
 
+  /**
+   *
+   */
   public function testCanGetDefaultDataFromInitialisedDataClass() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
@@ -76,6 +85,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertNotEmpty($this->data->getData(), 'Flat data returned');
   }
 
+  /**
+   *
+   */
   public function testCanSetRegularMessage() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
     $this->assertEmpty($this->data->getMessage(), 'Message empty by default');
@@ -85,6 +97,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEmpty($this->data->getTrunc(), 'Message not truncated');
   }
 
+  /**
+   *
+   */
   public function testCanSetTranslatableMessage() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
     $this->assertEmpty($this->data->getMessage(), 'Message empty by default');
@@ -95,6 +110,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEmpty($this->data->getTrunc(), 'Message not truncated');
   }
 
+  /**
+   *
+   */
   public function testCanSetFormattableMessage() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
     $this->assertEmpty($this->data->getMessage(), 'Message empty by default');
@@ -105,6 +123,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEmpty($this->data->getTrunc(), 'Message not truncated');
   }
 
+  /**
+   *
+   */
   public function testMessageWillBeStrippedifStartingWithHtmlMarker() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
     $this->assertEmpty($this->data->getMessage(), 'Message empty by default');
@@ -114,6 +135,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEmpty($this->data->getTrunc(), 'Message not truncated');
   }
 
+  /**
+   *
+   */
   public function testMessageWillNotContainNullByte() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
     $this->assertEmpty($this->data->getMessage(), 'Message empty by default');
@@ -123,16 +147,23 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEmpty($this->data->getTrunc(), 'Message not truncated');
   }
 
+  /**
+   *
+   */
   public function testCanSetTruncatedMessage() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
     $this->assertEmpty($this->data->getMessage(), 'Message empty by default');
 
     $string = random_bytes(250);
-    $this->data->setMessage($string, 1); // trunc calculated = 224 when passed 1
+    // Trunc calculated = 224 when passed 1.
+    $this->data->setMessage($string, 1);
     $this->assertFalse(strlen($string) == strlen($this->data->getMessage()), 'Message was truncated.');
     $this->assertNotEmpty($this->data->getTrunc(), 'Data truncation value set');
   }
 
+  /**
+   *
+   */
   public function testLogLevelIsConvertedToRFCLogLevel() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
@@ -144,30 +175,39 @@ class JsonLogDataTest extends UnitTestCase {
     );
   }
 
+  /**
+   *
+   */
   public function testChannelWillBeSetAsSubtypeWithMaxLength() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
     $this->data->setSubType(404);
     $this->assertEquals('404', $this->data->getSubtype(), 'Subtype set.');
 
-    // Try bigger
+    // Try bigger.
     $string = random_bytes(1024);
     $this->data->setSubType($string);
     $this->assertFalse(strlen($string) == strlen($this->data->getSubtype()), 'Subtype was truncated.');
   }
 
+  /**
+   *
+   */
   public function testClientIpWillBeSetWithMaxLength() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
     $this->data->setClient_ip('127.0.0.1');
     $this->assertEquals('127.0.0.1', $this->data->getClientIp(), 'Client IP set.');
 
-    // Try bigger
+    // Try bigger.
     $string = random_bytes(1024);
     $this->data->setClient_ip($string);
     $this->assertFalse(strlen($string) == strlen($this->data->getClientIp()), 'Client IP was truncated.');
   }
 
+  /**
+   *
+   */
   public function testCanSetUsernameAndUidBasedOnAccount() {
     $accountMock = $this->createMock('Drupal\Core\Session\AccountProxyInterface');
     $accountMock->expects($this->exactly(1))
@@ -181,6 +221,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEquals(1234, $this->data->getUid(), 'UID set.');
   }
 
+  /**
+   *
+   */
   public function testLinkAndCodeWillAlwaysBeSetAccordinglyWithAlphanumericString() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
@@ -189,6 +232,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEquals(0, $this->data->getCode(), 'Code set.');
   }
 
+  /**
+   *
+   */
   public function testLinkAndCodeWillAlwaysBeSetAccordinglyWithGeneratedLink() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
@@ -202,6 +248,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEquals(0, $this->data->getCode(), 'Code set.');
   }
 
+  /**
+   *
+   */
   public function testLinkAndCodeWillAlwaysBeSetAccordinglyWithNumericString() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
@@ -210,6 +259,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEquals(1234, $this->data->getCode(), 'Code set.');
   }
 
+  /**
+   *
+   */
   public function testLinkAndCodeWillAlwaysBeSetAccordinglyWithInteger() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
@@ -218,6 +270,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEquals(1234, $this->data->getCode(), 'Code set.');
   }
 
+  /**
+   *
+   */
   public function testLinkAndCodeWillAlwaysBeSetAccordinglyWithZero() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
@@ -226,6 +281,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEquals(0, $this->data->getCode(), 'Code not set.');
   }
 
+  /**
+   *
+   */
   public function testLinkAndCodeWillAlwaysBeSetAccordinglyWithBoolFalse() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
@@ -234,6 +292,9 @@ class JsonLogDataTest extends UnitTestCase {
     $this->assertEquals(0, $this->data->getCode(), 'Code not set.');
   }
 
+  /**
+   *
+   */
   public function testServerAndSiteTagsAreCombined() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
     $server_tags = 'a,b';
@@ -248,6 +309,9 @@ class JsonLogDataTest extends UnitTestCase {
     ], $this->data->getTags(), 'All tags present.');
   }
 
+  /**
+   *
+   */
   public function testServerTagsCanBeSetAlone() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
     $server_tags = 'a,b';
@@ -259,6 +323,9 @@ class JsonLogDataTest extends UnitTestCase {
     ], $this->data->getTags(), 'All server tags present.');
   }
 
+  /**
+   *
+   */
   public function testSiteTagsCanBeSetAlone() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
     $site_tags = 'x,y';
@@ -270,6 +337,9 @@ class JsonLogDataTest extends UnitTestCase {
     ], $this->data->getTags(), 'All site tags present.');
   }
 
+  /**
+   *
+   */
   public function testSiteTagsCanBeEmpty() {
     $this->data = new JsonLogData('test_site_id', 'test_canonical');
 
diff --git a/tests/src/Unit/JsonLogTest.php b/tests/src/Unit/JsonLogTest.php
index 94abae4..a1493ca 100644
--- a/tests/src/Unit/JsonLogTest.php
+++ b/tests/src/Unit/JsonLogTest.php
@@ -2,19 +2,23 @@
 
 namespace Drupal\Tests\jsonlog\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\jsonlog\Logger\JsonLog;
 use Drupal\jsonlog\Logger\JsonLogData;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
- * Unit tests for JsonLog class
+ * Unit tests for JsonLog class.
  *
  * @group JsonLog
  *
  * Class JsonLogTest
  * @package Drupal\Tests\jsonlog\Unit
  */
+#[Group('JsonLog
+Class JsonLogTest')]
 class JsonLogTest extends UnitTestCase {
 
   const DEFAULT_THRESHOLD = 4;
@@ -56,6 +60,9 @@ class JsonLogTest extends UnitTestCase {
    */
   private $jsonLogger;
 
+  /**
+   *
+   */
   protected function setUp(): void {
     parent::setUp();
 
@@ -89,7 +96,7 @@ class JsonLogTest extends UnitTestCase {
   }
 
   /**
-   * test to see if a log file is well prepared
+   * Test to see if a log file is well prepared.
    */
   public function testCanPrepareLogFile() {
     $request_mock = $this->createMock('Symfony\Component\HttpFoundation\Request');
@@ -123,7 +130,7 @@ class JsonLogTest extends UnitTestCase {
   }
 
   /**
-   * test to see if a log file is not prepared when the log-level is too high
+   * Test to see if a log file is not prepared when the log-level is too high.
    */
   public function testCannotPrepareLogFileIfThresholdExceeded() {
     $level = self::DEFAULT_THRESHOLD + 1;
@@ -133,7 +140,7 @@ class JsonLogTest extends UnitTestCase {
   }
 
   /**
-   * test correct filename can be constructed
+   * Test correct filename can be constructed.
    */
   public function testGetCorrectFilename() {
     $time = date(self::DEFAULT_TIME_FORMAT);
@@ -141,7 +148,7 @@ class JsonLogTest extends UnitTestCase {
 
     $this->assertEquals(
       self::DEFAULT_LOG_DIR . '/' . self::DEFAULT_SITE_ID . '.' . $time . '.json.log',
-      $filename,'Correct filename constructed.');
+      $filename, 'Correct filename constructed.');
   }
 
   /**
@@ -149,6 +156,7 @@ class JsonLogTest extends UnitTestCase {
    *
    * @dataProvider logChannelFilterProvider
    */
+  #[DataProvider('logChannelFilterProvider')]
   public function testLogChannelFilter($whitelisted_channels, $log_channel, $expected) {
     $this->setUpMocks(['jsonlog_channels' => $whitelisted_channels]);
 
