diff --git a/src/Form/WorkbenchAccessByUserForm.php b/src/Form/WorkbenchAccessByUserForm.php
index 9f205c2..3980382 100644
--- a/src/Form/WorkbenchAccessByUserForm.php
+++ b/src/Form/WorkbenchAccessByUserForm.php
@@ -264,7 +264,7 @@ class WorkbenchAccessByUserForm extends FormBase {
             }
           }
           elseif (strlen($uid_or_username) > 1) {
-            $user = user_load_by_name(trim($uid_or_username));
+            $user = array_values(\Drupal::entityTypeManager()->getStorage('user')->loadByProperties(['name' => trim($uid_or_username)]))[0] ?? FALSE;
             if ($user instanceof AccountInterface) {
               if (!isset($existing_editors[$user->id()])) {
                 $uids_added[] = $user->id();
diff --git a/src/Hook/WorkbenchAccessHooks.php b/src/Hook/WorkbenchAccessHooks.php
new file mode 100644
index 0000000..11d1439
--- /dev/null
+++ b/src/Hook/WorkbenchAccessHooks.php
@@ -0,0 +1,235 @@
+<?php
+
+namespace Drupal\workbench_access\Hook;
+
+use Drupal\views\Plugin\views\cache\CachePluginBase;
+use Drupal\views\ViewExecutable;
+use Drupal\Core\Render\BubbleableMetadata;
+use Drupal\workbench_access\Entity\AccessSchemeInterface;
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\workbench_access\FormAlterHelper;
+use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityForm;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for workbench_access.
+ */
+class WorkbenchAccessHooks {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_help().
+   */
+  #[Hook('help')]
+  public function help($route_name, RouteMatchInterface $route_match) {
+    switch ($route_name) {
+      // Main module help for the workbench_access module.
+      case 'help.page.workbench_access':
+        $output = '';
+        $output .= '<h3>' . $this->t('About') . '</h3>';
+        $output .= '<p>' . $this->t('Hierarchical access control module.') . '</p>';
+        return $output;
+
+      default:
+    }
+  }
+
+  /**
+   * Implements hook_form_alter().
+   *
+   * Restricts selection options for the node form.
+   */
+  #[Hook('form_alter')]
+  public function formAlter(&$form, FormStateInterface $form_state) {
+    $form_object = $form_state->getFormObject();
+    if (!$form_object instanceof EntityForm) {
+      return;
+    }
+    $entity = $form_object->getEntity();
+    if (!$entity instanceof ContentEntityInterface) {
+      return;
+    }
+    \Drupal::classResolver()->getInstanceFromDefinition(FormAlterHelper::class)->alterForm($form, $form, $form_state, $entity);
+  }
+
+  /**
+   * Implements hook_entity_access().
+   */
+  #[Hook('entity_access')]
+  public function entityAccess(EntityInterface $entity, $op, AccountInterface $account) {
+    // Return net result of all enabled access schemes. If one scheme allows
+    // access, then it is granted.
+    // We don't care about the View operation right now.
+    if ($op === 'view' || $op === 'view label' || $account->hasPermission('bypass workbench access')) {
+      // Return early.
+      return AccessResult::neutral();
+    }
+    return array_reduce(\Drupal::entityTypeManager()->getStorage('access_scheme')->loadMultiple(), function (AccessResult $carry, AccessSchemeInterface $scheme) use ($entity, $op, $account) {
+        $carry->addCacheableDependency($scheme)->cachePerUser()->addCacheableDependency($entity);
+        return $carry->orIf($scheme->getAccessScheme()->checkEntityAccess($scheme, $entity, $op, $account));
+    }, AccessResult::neutral());
+  }
+
+  /**
+   * Implements hook_entity_delete().
+   */
+  #[Hook('entity_delete')]
+  public function entityDelete(EntityInterface $entity) {
+    foreach (\Drupal::entityTypeManager()->getStorage('access_scheme')->loadMultiple() as $scheme) {
+      $entity_type = $scheme->getAccessScheme()->entityType();
+      if ($entity_type === $entity->getEntityTypeId()) {
+        // Delete all associated storage.
+        $section_storage = \Drupal::entityTypeManager()->getStorage('section_association');
+        $sections = $section_storage->loadByProperties([
+          'access_scheme' => $scheme->id(),
+          'section_id' => $entity->id(),
+        ]);
+        $section_storage->delete($sections);
+        \Drupal::service('workbench_access.user_section_storage')->resetCache($scheme);
+      }
+    }
+  }
+
+  /**
+   * Implements hook_views_data_alter().
+   */
+  #[Hook('views_data_alter')]
+  public function viewsDataAlter(array &$data) {
+    $scheme_storage = \Drupal::entityTypeManager()->getStorage('access_scheme');
+    if ($schemes = $scheme_storage->loadMultiple()) {
+      /** @var \Drupal\workbench_access\Entity\AccessSchemeInterface $scheme */
+      foreach ($schemes as $scheme) {
+        $scheme->getAccessScheme()->viewsData($data, $scheme);
+        $data['users']['workbench_access_section__' . $scheme->id()] = [
+          'title' => $this->t('Workbench Section: @name', [
+            '@name' => $scheme->label(),
+          ]),
+          'help' => $this->t('The sections to which this user belongs for the @name scheme.', [
+            '@name' => $scheme->label(),
+          ]),
+          'field' => [
+            'id' => 'workbench_access_user_section',
+            'scheme' => $scheme->id(),
+          ],
+          'filter' => [
+            'field' => 'uid',
+            'scheme' => $scheme->id(),
+            'id' => 'workbench_access_section',
+          ],
+        ];
+      }
+    }
+    // Legacy support.
+    // @todo Remove in 8.x-2.x.
+    if ($default = \Drupal::state()->get('workbench_access_upgraded_scheme_id')) {
+      if ($scheme = $scheme_storage->load($default)) {
+        $data['users']['workbench_access_section'] = [
+          'title' => $this->t('Workbench Section: @name (legacy)', [
+            '@name' => $scheme->label(),
+          ]),
+          'help' => $this->t('The sections to which this user belongs for the @name scheme.', [
+            '@name' => $scheme->label(),
+          ]),
+          'field' => [
+            'id' => 'workbench_access_user_section',
+            'scheme' => $scheme->id(),
+          ],
+          'filter' => [
+            'field' => 'uid',
+            'scheme' => $scheme->id(),
+            'id' => 'workbench_access_section',
+          ],
+        ];
+      }
+      if (isset($data['node']['workbench_access_section__default'])) {
+        $data['node']['workbench_access_section'] = $data['node']['workbench_access_section__default'];
+        $data['node']['workbench_access_section']['title'] = $this->t('Workbench Section: @name (legacy)', [
+          '@name' => $scheme->label(),
+        ]);
+      }
+    }
+  }
+
+  /**
+   * Implements hook_element_info_alter().
+   */
+  #[Hook('element_info_alter')]
+  public function elementInfoAlter(array &$info) {
+    if (isset($info['inline_entity_form'])) {
+      $info['inline_entity_form']['#process'][] = 'workbench_access_process_inline_entity_form';
+    }
+  }
+
+  /**
+   * Implements hook_ENTITY_TYPE_delete().
+   */
+  #[Hook('user_delete')]
+  public function userDelete($account) {
+    $uid = $account->id();
+    $storage_handler = \Drupal::entityTypeManager()->getStorage('section_association');
+    // Retrieve all the section associations referencing this user.
+    $section_user_associations = $storage_handler->loadByProperties([
+      'user_id' => $uid,
+    ]);
+    foreach ($section_user_associations as $section_association) {
+      // For each retrieved association, remove this user.
+      if ($user_ids = $section_association->getCurrentUserIds()) {
+        $remaining_user_ids = array_diff($user_ids, [
+          $uid,
+        ]);
+        $section_association->set('user_id', $remaining_user_ids);
+        $section_association->save();
+      }
+    }
+  }
+
+  /**
+   * Implements hook_ENTITY_TYPE_delete().
+   */
+  #[Hook('user_role_delete')]
+  public function userRoleDelete($role) {
+    $role_section_storage = \Drupal::service('workbench_access.role_section_storage');
+    $scheme_storage = \Drupal::entityTypeManager()->getStorage('access_scheme');
+    foreach ($scheme_storage->loadMultiple() as $scheme) {
+      $role_section_storage->deleteRoleSections($scheme, $role->id());
+    }
+  }
+
+  /**
+   * Implements hook_token_info().
+   */
+  #[Hook('token_info')]
+  public function tokenInfo() {
+    return \Drupal::service('workbench_access.tokens')->getTokenInfo();
+  }
+
+  /**
+   * Implements hook_tokens().
+   */
+  #[Hook('tokens')]
+  public function tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
+    return \Drupal::service('workbench_access.tokens')->getTokens($type, $tokens, $data, $options, $bubbleable_metadata);
+  }
+
+  /**
+   * Implements hook_views_post_render().
+   *
+   * Cache workbench_access views per-user automatically.
+   */
+  #[Hook('views_post_render')]
+  public function viewsPostRender(ViewExecutable $view, &$output, CachePluginBase $cache) {
+    // Add user cache tags to views if required.
+    if (workbench_access_view_check($view)) {
+      // Add the user cache context.
+      $view->addCacheContext('user');
+      $output['#cache']['tags'][] = 'workbench_access_view';
+    }
+  }
+
+}
diff --git a/src/Plugin/AccessControlHierarchy/Menu.php b/src/Plugin/AccessControlHierarchy/Menu.php
index 44009ad..a7f8282 100644
--- a/src/Plugin/AccessControlHierarchy/Menu.php
+++ b/src/Plugin/AccessControlHierarchy/Menu.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\workbench_access\Plugin\AccessControlHierarchy;
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Core\Config\Entity\ConfigEntityInterface;
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityInterface;
@@ -188,7 +189,7 @@ class Menu extends AccessControlHierarchyBase {
    */
   public function getEntityValues(EntityInterface $entity) {
     $values = [];
-    $defaults = menu_ui_get_menu_link_defaults($entity);
+    $defaults = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\menu_ui\MenuUiUtility')->getMenuLinkDefaults($entity), fn() => menu_ui_get_menu_link_defaults($entity));
     if (!empty($defaults['id'])) {
       $values = [$defaults['id']];
     }
diff --git a/src/Plugin/views/filter/Section.php b/src/Plugin/views/filter/Section.php
index 97e82e2..ff7545f 100644
--- a/src/Plugin/views/filter/Section.php
+++ b/src/Plugin/views/filter/Section.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\workbench_access\Plugin\views\filter;
 
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\views\ManyToOneHelper;
 use Drupal\views\Plugin\views\filter\ManyToOne;
@@ -271,7 +272,7 @@ class Section extends ManyToOne {
         if (isset($configuration['left_query'])) {
           $type = 'subquery';
         }
-        $join = Views::pluginManager('join')->createInstance($type, $configuration);
+        $join = DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('plugin.manager.views.join'), fn() => Views::pluginManager('join'))->createInstance($type, $configuration);
         $this->tableAlias = $helper->addTable($join, $configuration['table_alias']);
         $this->realField = $configuration['real_field'];
       }
diff --git a/tests/modules/workbench_access_hooks/src/Hook/WorkbenchAccessHooksHooks.php b/tests/modules/workbench_access_hooks/src/Hook/WorkbenchAccessHooksHooks.php
new file mode 100644
index 0000000..b1ee9bd
--- /dev/null
+++ b/tests/modules/workbench_access_hooks/src/Hook/WorkbenchAccessHooksHooks.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\workbench_access_hooks\Hook;
+
+use Drupal\Core\Config\Config;
+use Drupal\Core\Hook\Attribute\Hook;
+
+/**
+ * Hook implementations for workbench_access_hooks.
+ */
+class WorkbenchAccessHooksHooks {
+
+  /**
+   * Implements hook_workbench_access_scheme_update_alter().
+   */
+  #[Hook('workbench_access_scheme_update_alter')]
+  public function workbenchAccessSchemeUpdateAlter(array &$settings, Config $config) {
+    if ($config->get('scheme')) {
+      $settings = [
+        'test' => 'test',
+      ];
+    }
+  }
+
+}
diff --git a/tests/modules/workbench_access_hooks/workbench_access_hooks.module b/tests/modules/workbench_access_hooks/workbench_access_hooks.module
index 5fe7def..d1bd066 100644
--- a/tests/modules/workbench_access_hooks/workbench_access_hooks.module
+++ b/tests/modules/workbench_access_hooks/workbench_access_hooks.module
@@ -5,15 +5,14 @@
  * Test module file.
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\workbench_access_hooks\Hook\WorkbenchAccessHooksHooks;
 use Drupal\Core\Config\Config;
 
 /**
  * Implements hook_workbench_access_scheme_update_alter().
  */
+#[LegacyHook]
 function workbench_access_hooks_workbench_access_scheme_update_alter(array &$settings, Config $config) {
-  if ($config->get('scheme')) {
-    $settings = [
-      'test' => 'test',
-    ];
-  }
+  \Drupal::service(WorkbenchAccessHooksHooks::class)->workbenchAccessSchemeUpdateAlter($settings, $config);
 }
diff --git a/tests/modules/workbench_access_hooks/workbench_access_hooks.services.yml b/tests/modules/workbench_access_hooks/workbench_access_hooks.services.yml
new file mode 100644
index 0000000..9835f92
--- /dev/null
+++ b/tests/modules/workbench_access_hooks/workbench_access_hooks.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\workbench_access_hooks\Hook\WorkbenchAccessHooksHooks:
+    class: Drupal\workbench_access_hooks\Hook\WorkbenchAccessHooksHooks
+    autowire: true
diff --git a/tests/src/Functional/AccessByRoleFormTest.php b/tests/src/Functional/AccessByRoleFormTest.php
index 25bcdbc..c39f733 100644
--- a/tests/src/Functional/AccessByRoleFormTest.php
+++ b/tests/src/Functional/AccessByRoleFormTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Url;
 use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\taxonomy\Entity\Term;
@@ -14,6 +16,8 @@ use Drupal\workbench_access\Entity\AccessSchemeInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class AccessByRoleFormTest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/AccessByUserFormTest.php b/tests/src/Functional/AccessByUserFormTest.php
index 8fc12a7..51c7045 100644
--- a/tests/src/Functional/AccessByUserFormTest.php
+++ b/tests/src/Functional/AccessByUserFormTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Url;
 use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\taxonomy\Entity\Term;
@@ -14,6 +16,8 @@ use Drupal\workbench_access\Entity\AccessSchemeInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class AccessByUserFormTest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/AccessCacheTest.php b/tests/src/Functional/AccessCacheTest.php
index 763a493..6439203 100644
--- a/tests/src/Functional/AccessCacheTest.php
+++ b/tests/src/Functional/AccessCacheTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\Tests\BrowserTestBase;
 use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
@@ -15,6 +17,8 @@ use Drupal\workbench_access\WorkbenchAccessManagerInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class AccessCacheTest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/AddSchemeFormTest.php b/tests/src/Functional/AddSchemeFormTest.php
index d49a3f7..a734d1a 100644
--- a/tests/src/Functional/AddSchemeFormTest.php
+++ b/tests/src/Functional/AddSchemeFormTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Tests\BrowserTestBase;
 use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
 
@@ -10,6 +12,8 @@ use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class AddSchemeFormTest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/AssignUserFormTest.php b/tests/src/Functional/AssignUserFormTest.php
index e7d9ccc..93e575d 100644
--- a/tests/src/Functional/AssignUserFormTest.php
+++ b/tests/src/Functional/AssignUserFormTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Url;
 use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\taxonomy\Entity\Term;
@@ -13,6 +15,8 @@ use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class AssignUserFormTest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/DeleteRoleTest.php b/tests/src/Functional/DeleteRoleTest.php
index 56b83e7..d89860b 100644
--- a/tests/src/Functional/DeleteRoleTest.php
+++ b/tests/src/Functional/DeleteRoleTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\Tests\BrowserTestBase;
 use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
@@ -12,6 +14,8 @@ use Drupal\workbench_access\Entity\AccessSchemeInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class DeleteRoleTest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/DeleteUserTest.php b/tests/src/Functional/DeleteUserTest.php
index fe3b015..f5d79e8 100644
--- a/tests/src/Functional/DeleteUserTest.php
+++ b/tests/src/Functional/DeleteUserTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\Tests\BrowserTestBase;
 use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
@@ -11,6 +13,8 @@ use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class DeleteUserTest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/MenuSchemeUITest.php b/tests/src/Functional/MenuSchemeUITest.php
index 9237108..ac68111 100644
--- a/tests/src/Functional/MenuSchemeUITest.php
+++ b/tests/src/Functional/MenuSchemeUITest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Url;
 use Drupal\Tests\BrowserTestBase;
 use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
@@ -12,6 +14,8 @@ use Drupal\workbench_access\Entity\AccessSchemeInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class MenuSchemeUITest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/NodeFormMenuTest.php b/tests/src/Functional/NodeFormMenuTest.php
index deec0ca..e813396 100644
--- a/tests/src/Functional/NodeFormMenuTest.php
+++ b/tests/src/Functional/NodeFormMenuTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\Tests\BrowserTestBase;
 use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
@@ -11,6 +13,8 @@ use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class NodeFormMenuTest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/NodeFormMultipleTest.php b/tests/src/Functional/NodeFormMultipleTest.php
index fc650d8..7247529 100644
--- a/tests/src/Functional/NodeFormMultipleTest.php
+++ b/tests/src/Functional/NodeFormMultipleTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\Tests\BrowserTestBase;
 use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
@@ -12,6 +14,8 @@ use Drupal\workbench_access\WorkbenchAccessManagerInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class NodeFormMultipleTest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/NodeFormTest.php b/tests/src/Functional/NodeFormTest.php
index 384ea54..56f49c6 100644
--- a/tests/src/Functional/NodeFormTest.php
+++ b/tests/src/Functional/NodeFormTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\Tests\BrowserTestBase;
 use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
@@ -12,6 +14,8 @@ use Drupal\workbench_access\WorkbenchAccessManagerInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class NodeFormTest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/TaxonomySchemeUITest.php b/tests/src/Functional/TaxonomySchemeUITest.php
index fe0693f..526afcb 100644
--- a/tests/src/Functional/TaxonomySchemeUITest.php
+++ b/tests/src/Functional/TaxonomySchemeUITest.php
@@ -2,6 +2,10 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\entity_test\EntityTestHelper;
 use Drupal\taxonomy\Entity\Vocabulary;
 use Drupal\Tests\BrowserTestBase;
 use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
@@ -12,6 +16,8 @@ use Drupal\workbench_access\Entity\AccessSchemeInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class TaxonomySchemeUITest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
@@ -67,8 +73,8 @@ class TaxonomySchemeUITest extends BrowserTestBase {
     ]);
     $vocab->save();
     $this->setUpTaxonomyFieldForEntityType('taxonomy_term', $vocab->id(), $this->vocabulary->id(), 'non_recursive', 'Allowed Field');
-    entity_test_create_bundle('access_controlled');
-    entity_test_create_bundle('notaccess_controlled');
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => EntityTestHelper::createBundle('access_controlled'), fn() => entity_test_create_bundle('access_controlled'));
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => EntityTestHelper::createBundle('notaccess_controlled'), fn() => entity_test_create_bundle('notaccess_controlled'));
     $this->setUpTaxonomyFieldForEntityType('entity_test', 'access_controlled', $this->vocabulary->id());
     $this->admin = $this->setUpAdminUser(['administer workbench access']);
     $this->placeBlock('local_actions_block');
diff --git a/tests/src/Functional/UserAutocompleteTest.php b/tests/src/Functional/UserAutocompleteTest.php
index ef0bb60..c50924e 100644
--- a/tests/src/Functional/UserAutocompleteTest.php
+++ b/tests/src/Functional/UserAutocompleteTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Component\Serialization\Json;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\Tests\BrowserTestBase;
@@ -12,6 +14,8 @@ use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class UserAutocompleteTest extends BrowserTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Functional/ViewsCacheTest.php b/tests/src/Functional/ViewsCacheTest.php
index c3b0861..d8d460b 100644
--- a/tests/src/Functional/ViewsCacheTest.php
+++ b/tests/src/Functional/ViewsCacheTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\node\Entity\Node;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\taxonomy\TermInterface;
@@ -15,6 +17,8 @@ use Drupal\workbench_access\Entity\AccessScheme;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class ViewsCacheTest extends BrowserTestBase {
 
   use AssertPageCacheContextsAndTagsTrait;
diff --git a/tests/src/Functional/ViewsFieldMenuTest.php b/tests/src/Functional/ViewsFieldMenuTest.php
index e1709d9..e69213f 100644
--- a/tests/src/Functional/ViewsFieldMenuTest.php
+++ b/tests/src/Functional/ViewsFieldMenuTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\menu_link_content\MenuLinkContentInterface;
 use Drupal\node\Entity\Node;
@@ -12,6 +15,8 @@ use Drupal\Tests\BrowserTestBase;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class ViewsFieldMenuTest extends BrowserTestBase {
 
   /**
@@ -91,12 +96,17 @@ class ViewsFieldMenuTest extends BrowserTestBase {
           'status' => 1,
         ]);
         $this->nodes[$title]->save();
-        _menu_ui_node_save($this->nodes[$title], [
+        DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\menu_ui\MenuUiUtility')->menuUiNodeSave($this->nodes[$title], [
           'title' => $title,
           'menu_name' => 'main',
           'description' => 'view bar',
           'parent' => $this->links[$section]->getPluginId(),
-        ]);
+        ]), fn() => _menu_ui_node_save($this->nodes[$title], [
+          'title' => $title,
+          'menu_name' => 'main',
+          'description' => 'view bar',
+          'parent' => $this->links[$section]->getPluginId(),
+        ]));
       }
     }
 
diff --git a/tests/src/Functional/ViewsFieldTest.php b/tests/src/Functional/ViewsFieldTest.php
index c4fbc1c..6856f24 100644
--- a/tests/src/Functional/ViewsFieldTest.php
+++ b/tests/src/Functional/ViewsFieldTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\node\Entity\Node;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\taxonomy\TermInterface;
@@ -13,6 +15,8 @@ use Drupal\workbench_access\Entity\AccessScheme;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class ViewsFieldTest extends BrowserTestBase {
 
   /**
diff --git a/tests/src/Functional/ViewsOutputTest.php b/tests/src/Functional/ViewsOutputTest.php
index e1a44a4..6ceffed 100644
--- a/tests/src/Functional/ViewsOutputTest.php
+++ b/tests/src/Functional/ViewsOutputTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\node\Entity\Node;
 use Drupal\taxonomy\Entity\Term;
@@ -12,6 +15,8 @@ use Drupal\Tests\BrowserTestBase;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class ViewsOutputTest extends BrowserTestBase {
 
   /**
@@ -103,12 +108,17 @@ class ViewsOutputTest extends BrowserTestBase {
           'field_workbench_access' => $this->terms[$section],
         ]);
         $this->nodes[$title]->save();
-        _menu_ui_node_save($this->nodes[$title], [
+        DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\menu_ui\MenuUiUtility')->menuUiNodeSave($this->nodes[$title], [
           'title' => $title . '-menu',
           'menu_name' => 'main',
           'description' => 'view bar',
           'parent' => $this->links[$section]->getPluginId(),
-        ]);
+        ]), fn() => _menu_ui_node_save($this->nodes[$title], [
+          'title' => $title . '-menu',
+          'menu_name' => 'main',
+          'description' => 'view bar',
+          'parent' => $this->links[$section]->getPluginId(),
+        ]));
       }
     }
 
diff --git a/tests/src/Functional/ViewsUserOutputTest.php b/tests/src/Functional/ViewsUserOutputTest.php
index 38554f8..1ede9a2 100644
--- a/tests/src/Functional/ViewsUserOutputTest.php
+++ b/tests/src/Functional/ViewsUserOutputTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Functional;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\node\Entity\Node;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\taxonomy\TermInterface;
@@ -13,6 +15,8 @@ use Drupal\workbench_access\Entity\AccessScheme;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class ViewsUserOutputTest extends BrowserTestBase {
 
   /**
diff --git a/tests/src/FunctionalJavascript/WorkbenchAccessByUserFormTest.php b/tests/src/FunctionalJavascript/WorkbenchAccessByUserFormTest.php
index a48c4ed..b87817c 100644
--- a/tests/src/FunctionalJavascript/WorkbenchAccessByUserFormTest.php
+++ b/tests/src/FunctionalJavascript/WorkbenchAccessByUserFormTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\FunctionalJavascript;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
@@ -13,6 +15,8 @@ use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class WorkbenchAccessByUserFormTest extends WebDriverTestBase {
 
   use WorkbenchAccessTestTrait;
diff --git a/tests/src/Kernel/CircularDependencyTest.php b/tests/src/Kernel/CircularDependencyTest.php
index 3a69065..68a14a3 100644
--- a/tests/src/Kernel/CircularDependencyTest.php
+++ b/tests/src/Kernel/CircularDependencyTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\KernelTests\KernelTestBase;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class CircularDependencyTest extends KernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/ConfigDependenciesTest.php b/tests/src/Kernel/ConfigDependenciesTest.php
index d5dc076..5370fb6 100644
--- a/tests/src/Kernel/ConfigDependenciesTest.php
+++ b/tests/src/Kernel/ConfigDependenciesTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\node\Entity\NodeType;
@@ -16,6 +18,8 @@ use Drupal\workbench_access\Plugin\views\field\Section;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class ConfigDependenciesTest extends KernelTestBase {
 
   use ContentTypeCreationTrait;
@@ -68,7 +72,6 @@ class ConfigDependenciesTest extends KernelTestBase {
     $this->installConfig(['filter', 'node', 'workbench_access', 'system']);
     $this->installEntitySchema('user');
     $this->installEntitySchema('taxonomy_term');
-    $this->installSchema('system', ['sequences']);
     $node_type = $this->createContentType(['type' => 'page']);
     $node_type2 = $this->createContentType(['type' => 'article']);
     $this->vocabulary = $this->setUpVocabulary();
diff --git a/tests/src/Kernel/EntityTestAccessTest.php b/tests/src/Kernel/EntityTestAccessTest.php
index 7fa7ff2..79030c1 100644
--- a/tests/src/Kernel/EntityTestAccessTest.php
+++ b/tests/src/Kernel/EntityTestAccessTest.php
@@ -2,6 +2,10 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\entity_test\EntityTestHelper;
 use Drupal\entity_test\Entity\EntityTest;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\taxonomy\Entity\Term;
@@ -17,6 +21,8 @@ use Drupal\workbench_access\WorkbenchAccessManagerInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class EntityTestAccessTest extends KernelTestBase {
 
   use ContentTypeCreationTrait;
@@ -73,8 +79,8 @@ class EntityTestAccessTest extends KernelTestBase {
   protected function setUp(): void {
     parent::setUp();
     $this->installEntitySchema('entity_test');
-    entity_test_create_bundle('access_controlled');
-    entity_test_create_bundle('not_access_controlled');
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => EntityTestHelper::createBundle('access_controlled'), fn() => entity_test_create_bundle('access_controlled'));
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => EntityTestHelper::createBundle('not_access_controlled'), fn() => entity_test_create_bundle('not_access_controlled'));
     $this->installConfig(['filter', 'entity_test', 'workbench_access']);
     $this->installEntitySchema('access_scheme');
     $this->scheme = AccessScheme::create([
@@ -97,7 +103,6 @@ class EntityTestAccessTest extends KernelTestBase {
     $this->installEntitySchema('user');
     $this->installEntitySchema('taxonomy_term');
     $this->installEntitySchema('section_association');
-    $this->installSchema('system', ['sequences']);
     $this->vocabulary = $this->setUpVocabulary();
     $this->accessHandler = $this->container->get('entity_type.manager')
       ->getAccessControlHandler('entity_test');
diff --git a/tests/src/Kernel/FilterAccessTest.php b/tests/src/Kernel/FilterAccessTest.php
index e3b9644..3ab2968 100644
--- a/tests/src/Kernel/FilterAccessTest.php
+++ b/tests/src/Kernel/FilterAccessTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\filter\Entity\FilterFormat;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
@@ -15,6 +17,8 @@ use Drupal\workbench_access\Entity\AccessScheme;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class FilterAccessTest extends KernelTestBase {
 
   use ContentTypeCreationTrait;
@@ -83,7 +87,6 @@ class FilterAccessTest extends KernelTestBase {
     $this->scheme->save();
     $this->installEntitySchema('user');
     $this->installEntitySchema('section_association');
-    $this->installSchema('system', ['sequences']);
     $this->accessHandler = $this->container->get('entity_type.manager')->getAccessControlHandler('filter_format');
 
     $this->filterFormat1 = FilterFormat::create([
diff --git a/tests/src/Kernel/FlushTest.php b/tests/src/Kernel/FlushTest.php
index 9ce25ef..9292de5 100644
--- a/tests/src/Kernel/FlushTest.php
+++ b/tests/src/Kernel/FlushTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
@@ -15,6 +17,8 @@ use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class FlushTest extends KernelTestBase {
 
   use ContentTypeCreationTrait;
@@ -62,7 +66,6 @@ class FlushTest extends KernelTestBase {
     $this->installEntitySchema('user');
     $this->installEntitySchema('taxonomy_term');
     $this->installEntitySchema('section_association');
-    $this->installSchema('system', ['sequences']);
     $node_type = $this->createContentType(['type' => 'page']);
     $this->createContentType(['type' => 'article']);
     $this->vocabulary = $this->setUpVocabulary();
diff --git a/tests/src/Kernel/InlineEntityFormTest.php b/tests/src/Kernel/InlineEntityFormTest.php
index afcf7bd..fa580d6 100644
--- a/tests/src/Kernel/InlineEntityFormTest.php
+++ b/tests/src/Kernel/InlineEntityFormTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\Core\Form\FormInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
@@ -22,6 +24,8 @@ use Symfony\Component\DomCrawler\Crawler;
  *
  * @requires module inline_entity_form
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class InlineEntityFormTest extends KernelTestBase implements FormInterface {
 
   use ContentTypeCreationTrait;
@@ -81,7 +85,6 @@ class InlineEntityFormTest extends KernelTestBase implements FormInterface {
     $this->installEntitySchema('user');
     $this->installEntitySchema('taxonomy_term');
     $this->installEntitySchema('section_association');
-    $this->installSchema('system', ['sequences']);
     $node_type = $this->createContentType(['type' => 'page']);
     $this->createContentType(['type' => 'article']);
     $this->vocabulary = $this->setUpVocabulary();
@@ -180,7 +183,6 @@ class InlineEntityFormTest extends KernelTestBase implements FormInterface {
     $user_section = $this->container->get('workbench_access.user_section_storage');
     $reflection = new \ReflectionClass($user_section);
     $property = $reflection->getProperty('userSectionCache');
-    $property->setAccessible(TRUE);
     $property->setValue($user_section, []);
     $markup = $this->getRenderedFormAsCrawler();
     $this->assertContains($staff_term->getName(), $markup->filter('option')->extract(['_text']));
diff --git a/tests/src/Kernel/NodeAccessTest.php b/tests/src/Kernel/NodeAccessTest.php
index 90783d9..5497948 100644
--- a/tests/src/Kernel/NodeAccessTest.php
+++ b/tests/src/Kernel/NodeAccessTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
@@ -16,6 +18,8 @@ use Drupal\workbench_access\WorkbenchAccessManagerInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class NodeAccessTest extends KernelTestBase {
 
   use ContentTypeCreationTrait;
@@ -77,7 +81,6 @@ class NodeAccessTest extends KernelTestBase {
     $this->installEntitySchema('user');
     $this->installEntitySchema('taxonomy_term');
     $this->installEntitySchema('section_association');
-    $this->installSchema('system', ['sequences']);
     $node_type = $this->createContentType(['type' => 'page']);
     $this->createContentType(['type' => 'article']);
     $this->vocabulary = $this->setUpVocabulary();
diff --git a/tests/src/Kernel/NodeMenuTest.php b/tests/src/Kernel/NodeMenuTest.php
index 2e9657e..6589726 100644
--- a/tests/src/Kernel/NodeMenuTest.php
+++ b/tests/src/Kernel/NodeMenuTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\system\Entity\Menu;
@@ -16,6 +19,8 @@ use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class NodeMenuTest extends KernelTestBase {
 
   use ContentTypeCreationTrait;
@@ -80,7 +85,6 @@ class NodeMenuTest extends KernelTestBase {
     $this->installEntitySchema('user');
     $this->installEntitySchema('menu_link_content');
     $this->installEntitySchema('section_association');
-    $this->installSchema('system', ['sequences']);
     $node_type = $this->createContentType(['type' => 'page']);
     $this->createContentType(['type' => 'article']);
     // This is created by system module.
@@ -176,12 +180,17 @@ class NodeMenuTest extends KernelTestBase {
 
     // Create a node that is a child of the section.
     $node2 = $this->createNode(['type' => 'page', 'title' => 'bar']);
-    _menu_ui_node_save($node2, [
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\menu_ui\MenuUiUtility')->menuUiNodeSave($node2, [
       'title' => 'bar',
       'menu_name' => 'main',
       'description' => 'view bar',
       'parent' => $link->getPluginId(),
-    ]);
+    ]), fn() => _menu_ui_node_save($node2, [
+      'title' => 'bar',
+      'menu_name' => 'main',
+      'description' => 'view bar',
+      'parent' => $link->getPluginId(),
+    ]));
     $this->assertTrue($this->accessHandler->access($node2, 'update', $allowed_editor));
     $this->assertFalse($this->accessHandler->access($node2, 'update', $editor_with_no_access));
     $this->assertTrue($this->accessHandler->access($node2, 'delete', $allowed_editor));
diff --git a/tests/src/Kernel/SectionCacheTest.php b/tests/src/Kernel/SectionCacheTest.php
index 1994068..e17a432 100644
--- a/tests/src/Kernel/SectionCacheTest.php
+++ b/tests/src/Kernel/SectionCacheTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
@@ -15,6 +17,8 @@ use Drupal\workbench_access\Entity\AccessScheme;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class SectionCacheTest extends KernelTestBase {
 
   use ContentTypeCreationTrait;
@@ -72,7 +76,6 @@ class SectionCacheTest extends KernelTestBase {
     $this->installEntitySchema('user');
     $this->installEntitySchema('taxonomy_term');
     $this->installEntitySchema('section_association');
-    $this->installSchema('system', ['sequences']);
     $this->vocabulary = $this->setUpVocabulary();
     // The user section storage service.
     $this->userSectionStorage = \Drupal::getContainer()->get('workbench_access.user_section_storage');
diff --git a/tests/src/Kernel/SectionTokenTest.php b/tests/src/Kernel/SectionTokenTest.php
index 1a395f4..4ab957d 100644
--- a/tests/src/Kernel/SectionTokenTest.php
+++ b/tests/src/Kernel/SectionTokenTest.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
+use Drupal\Component\Utility\DeprecationHelper;
 use Drupal\Core\Render\BubbleableMetadata;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\menu_link_content\Entity\MenuLinkContent;
@@ -19,6 +22,8 @@ use Drupal\workbench_access\WorkbenchAccessManagerInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class SectionTokenTest extends KernelTestBase {
 
   use ContentTypeCreationTrait;
@@ -91,7 +96,6 @@ class SectionTokenTest extends KernelTestBase {
     $this->installEntitySchema('user');
     $this->installEntitySchema('menu_link_content');
     $this->installEntitySchema('section_association');
-    $this->installSchema('system', ['sequences']);
     $this->vocabulary = $this->setUpVocabulary();
     $node_type = $this->setUpContentType();
     // Set a field on the node type.
@@ -214,12 +218,17 @@ class SectionTokenTest extends KernelTestBase {
 
     // Create a node that is in a menu section.
     $node4 = $this->createNode(['type' => 'page', 'title' => 'bar']);
-    _menu_ui_node_save($node4, [
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\menu_ui\MenuUiUtility')->menuUiNodeSave($node4, [
       'title' => 'Menu test',
       'menu_name' => 'main',
       'description' => 'view bar',
       'parent' => $link->getPluginId(),
-    ]);
+    ]), fn() => _menu_ui_node_save($node4, [
+      'title' => 'Menu test',
+      'menu_name' => 'main',
+      'description' => 'view bar',
+      'parent' => $link->getPluginId(),
+    ]));
 
     $tokens = [
       'workbench-access-sections' => 'Menu test',
@@ -235,12 +244,17 @@ class SectionTokenTest extends KernelTestBase {
       'field_workbench_access' => $term->id(),
     ]
     );
-    _menu_ui_node_save($node5, [
+    DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\menu_ui\MenuUiUtility')->menuUiNodeSave($node5, [
       'title' => 'Test another menu link',
       'menu_name' => 'main',
       'description' => 'view bar',
       'parent' => $link->getPluginId(),
-    ]);
+    ]), fn() => _menu_ui_node_save($node5, [
+      'title' => 'Test another menu link',
+      'menu_name' => 'main',
+      'description' => 'view bar',
+      'parent' => $link->getPluginId(),
+    ]));
     $tokens = [
       'workbench-access-sections' => 'Test term, Test another menu link',
     ];
diff --git a/tests/src/Kernel/TaxonomyAccessTest.php b/tests/src/Kernel/TaxonomyAccessTest.php
index 7549f91..6154030 100644
--- a/tests/src/Kernel/TaxonomyAccessTest.php
+++ b/tests/src/Kernel/TaxonomyAccessTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\taxonomy\Entity\Vocabulary;
@@ -17,6 +19,8 @@ use Drupal\workbench_access\WorkbenchAccessManagerInterface;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class TaxonomyAccessTest extends KernelTestBase {
 
   use ContentTypeCreationTrait;
@@ -116,7 +120,6 @@ class TaxonomyAccessTest extends KernelTestBase {
     $this->scheme->save();
     $this->installEntitySchema('user');
     $this->installEntitySchema('section_association');
-    $this->installSchema('system', ['sequences']);
     $this->vocabulary = $this->setUpVocabulary();
     $this->accessHandler = $this->container->get('entity_type.manager')
       ->getAccessControlHandler('taxonomy_term');
diff --git a/tests/src/Kernel/WorkbenchAccessDerivativeDiscoveryTest.php b/tests/src/Kernel/WorkbenchAccessDerivativeDiscoveryTest.php
index d1e0b79..64cd22c 100644
--- a/tests/src/Kernel/WorkbenchAccessDerivativeDiscoveryTest.php
+++ b/tests/src/Kernel/WorkbenchAccessDerivativeDiscoveryTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\workbench_access\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\KernelTests\KernelTestBase;
 
 /**
@@ -9,6 +11,8 @@ use Drupal\KernelTests\KernelTestBase;
  *
  * @group workbench_access
  */
+#[Group('workbench_access')]
+#[RunTestsInSeparateProcesses]
 class WorkbenchAccessDerivativeDiscoveryTest extends KernelTestBase {
 
   /**
diff --git a/tests/src/Unit/UserSectionStorageUnitTest.php b/tests/src/Unit/UserSectionStorageUnitTest.php
index dc4f9dd..4289a9d 100644
--- a/tests/src/Unit/UserSectionStorageUnitTest.php
+++ b/tests/src/Unit/UserSectionStorageUnitTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\workbench_access\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Entity\Query\QueryAggregateInterface;
@@ -19,6 +20,7 @@ use Prophecy\PhpUnit\ProphecyTrait;
  *
  * @coversDefaultClass \Drupal\workbench_access\UserSectionStorage
  */
+#[Group('workbench_access')]
 class UserSectionStorageUnitTest extends UnitTestCase {
 
   use ProphecyTrait;
diff --git a/workbench_access.module b/workbench_access.module
index 75a3181..728184e 100644
--- a/workbench_access.module
+++ b/workbench_access.module
@@ -5,9 +5,10 @@
  * Contains workbench_access.module.
  */
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\workbench_access\Hook\WorkbenchAccessHooks;
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Entity\ContentEntityInterface;
-use Drupal\Core\Entity\EntityForm;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\BubbleableMetadata;
@@ -21,17 +22,9 @@ use Drupal\workbench_access\FormAlterHelper;
 /**
  * Implements hook_help().
  */
+#[LegacyHook]
 function workbench_access_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    // Main module help for the workbench_access module.
-    case 'help.page.workbench_access':
-      $output = '';
-      $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('Hierarchical access control module.') . '</p>';
-      return $output;
-
-    default:
-  }
+  return \Drupal::service(WorkbenchAccessHooks::class)->help($route_name, $route_match);
 }
 
 /**
@@ -39,52 +32,25 @@ function workbench_access_help($route_name, RouteMatchInterface $route_match) {
  *
  * Restricts selection options for the node form.
  */
+#[LegacyHook]
 function workbench_access_form_alter(&$form, FormStateInterface $form_state) {
-  $form_object = $form_state->getFormObject();
-  if (!$form_object instanceof EntityForm) {
-    return;
-  }
-  $entity = $form_object->getEntity();
-  if (!$entity instanceof ContentEntityInterface) {
-    return;
-  }
-  \Drupal::classResolver()->getInstanceFromDefinition(FormAlterHelper::class)->alterForm($form, $form, $form_state, $entity);
+  \Drupal::service(WorkbenchAccessHooks::class)->formAlter($form, $form_state);
 }
 
 /**
  * Implements hook_entity_access().
  */
+#[LegacyHook]
 function workbench_access_entity_access(EntityInterface $entity, $op, AccountInterface $account) {
-  // Return net result of all enabled access schemes. If one scheme allows
-  // access, then it is granted.
-  // We don't care about the View operation right now.
-  if ($op === 'view' || $op === 'view label' || $account->hasPermission('bypass workbench access')) {
-    // Return early.
-    return AccessResult::neutral();
-  }
-  return array_reduce(\Drupal::entityTypeManager()->getStorage('access_scheme')->loadMultiple(), function (AccessResult $carry, AccessSchemeInterface $scheme) use ($entity, $op, $account) {
-    $carry->addCacheableDependency($scheme)->cachePerUser()->addCacheableDependency($entity);
-    return $carry->orIf($scheme->getAccessScheme()->checkEntityAccess($scheme, $entity, $op, $account));
-  }, AccessResult::neutral());
+  return \Drupal::service(WorkbenchAccessHooks::class)->entityAccess($entity, $op, $account);
 }
 
 /**
  * Implements hook_entity_delete().
  */
+#[LegacyHook]
 function workbench_access_entity_delete(EntityInterface $entity) {
-  foreach (\Drupal::entityTypeManager()->getStorage('access_scheme')->loadMultiple() as $scheme) {
-    $entity_type = $scheme->getAccessScheme()->entityType();
-    if ($entity_type === $entity->getEntityTypeId()) {
-      // Delete all associated storage.
-      $section_storage = \Drupal::entityTypeManager()->getStorage('section_association');
-      $sections = $section_storage->loadByProperties([
-        'access_scheme' => $scheme->id(),
-        'section_id' => $entity->id(),
-      ]);
-      $section_storage->delete($sections);
-      \Drupal::service('workbench_access.user_section_storage')->resetCache($scheme);
-    }
-  }
+  \Drupal::service(WorkbenchAccessHooks::class)->entityDelete($entity);
 }
 
 /**
@@ -130,69 +96,17 @@ function workbench_access_entity_create_access(AccountInterface $account, $conte
 /**
  * Implements hook_views_data_alter().
  */
+#[LegacyHook]
 function workbench_access_views_data_alter(array &$data) {
-  $scheme_storage = \Drupal::entityTypeManager()->getStorage('access_scheme');
-  if ($schemes = $scheme_storage->loadMultiple()) {
-    /** @var \Drupal\workbench_access\Entity\AccessSchemeInterface $scheme */
-    foreach ($schemes as $scheme) {
-      $scheme->getAccessScheme()->viewsData($data, $scheme);
-      $data['users']['workbench_access_section__' . $scheme->id()] = [
-        'title' => t('Workbench Section: @name', [
-          '@name' => $scheme->label(),
-        ]),
-        'help' => t('The sections to which this user belongs for the @name scheme.', [
-          '@name' => $scheme->label(),
-        ]),
-        'field' => [
-          'id' => 'workbench_access_user_section',
-          'scheme' => $scheme->id(),
-        ],
-        'filter' => [
-          'field' => 'uid',
-          'scheme' => $scheme->id(),
-          'id' => 'workbench_access_section',
-        ],
-      ];
-    }
-  }
-  // Legacy support.
-  // @todo Remove in 8.x-2.x.
-  if ($default = \Drupal::state()->get('workbench_access_upgraded_scheme_id')) {
-    if ($scheme = $scheme_storage->load($default)) {
-      $data['users']['workbench_access_section'] = [
-        'title' => t('Workbench Section: @name (legacy)', [
-          '@name' => $scheme->label(),
-        ]),
-        'help' => t('The sections to which this user belongs for the @name scheme.', [
-          '@name' => $scheme->label(),
-        ]),
-        'field' => [
-          'id' => 'workbench_access_user_section',
-          'scheme' => $scheme->id(),
-        ],
-        'filter' => [
-          'field' => 'uid',
-          'scheme' => $scheme->id(),
-          'id' => 'workbench_access_section',
-        ],
-      ];
-    }
-    if (isset($data['node']['workbench_access_section__default'])) {
-      $data['node']['workbench_access_section'] = $data['node']['workbench_access_section__default'];
-      $data['node']['workbench_access_section']['title'] = t('Workbench Section: @name (legacy)', [
-        '@name' => $scheme->label(),
-      ]);
-    }
-  }
+  \Drupal::service(WorkbenchAccessHooks::class)->viewsDataAlter($data);
 }
 
 /**
  * Implements hook_element_info_alter().
  */
+#[LegacyHook]
 function workbench_access_element_info_alter(array &$info) {
-  if (isset($info['inline_entity_form'])) {
-    $info['inline_entity_form']['#process'][] = 'workbench_access_process_inline_entity_form';
-  }
+  \Drupal::service(WorkbenchAccessHooks::class)->elementInfoAlter($info);
 }
 
 /**
@@ -209,44 +123,33 @@ function workbench_access_process_inline_entity_form(array &$element, FormStateI
 /**
  * Implements hook_ENTITY_TYPE_delete().
  */
+#[LegacyHook]
 function workbench_access_user_delete($account) {
-  $uid = $account->id();
-  $storage_handler = \Drupal::entityTypeManager()->getStorage('section_association');
-  // Retrieve all the section associations referencing this user.
-  $section_user_associations = $storage_handler->loadByProperties(['user_id' => $uid]);
-  foreach ($section_user_associations as $section_association) {
-    // For each retrieved association, remove this user.
-    if ($user_ids = $section_association->getCurrentUserIds()) {
-      $remaining_user_ids = array_diff($user_ids, [$uid]);
-      $section_association->set('user_id', $remaining_user_ids);
-      $section_association->save();
-    }
-  }
+  \Drupal::service(WorkbenchAccessHooks::class)->userDelete($account);
 }
 
 /**
  * Implements hook_ENTITY_TYPE_delete().
  */
+#[LegacyHook]
 function workbench_access_user_role_delete($role) {
-  $role_section_storage = \Drupal::service('workbench_access.role_section_storage');
-  $scheme_storage = \Drupal::entityTypeManager()->getStorage('access_scheme');
-  foreach ($scheme_storage->loadMultiple() as $scheme) {
-    $role_section_storage->deleteRoleSections($scheme, $role->id());
-  }
+  \Drupal::service(WorkbenchAccessHooks::class)->userRoleDelete($role);
 }
 
 /**
  * Implements hook_token_info().
  */
+#[LegacyHook]
 function workbench_access_token_info() {
-  return \Drupal::service('workbench_access.tokens')->getTokenInfo();
+  return \Drupal::service(WorkbenchAccessHooks::class)->tokenInfo();
 }
 
 /**
  * Implements hook_tokens().
  */
+#[LegacyHook]
 function workbench_access_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
-  return \Drupal::service('workbench_access.tokens')->getTokens($type, $tokens, $data, $options, $bubbleable_metadata);
+  return \Drupal::service(WorkbenchAccessHooks::class)->tokens($type, $tokens, $data, $options, $bubbleable_metadata);
 }
 
 /**
@@ -284,11 +187,7 @@ function workbench_access_view_check(ViewExecutable $view) {
  *
  * Cache workbench_access views per-user automatically.
  */
+#[LegacyHook]
 function workbench_access_views_post_render(ViewExecutable $view, &$output, CachePluginBase $cache) {
-  // Add user cache tags to views if required.
-  if (workbench_access_view_check($view)) {
-    // Add the user cache context.
-    $view->addCacheContext('user');
-    $output['#cache']['tags'][] = 'workbench_access_view';
-  }
+  \Drupal::service(WorkbenchAccessHooks::class)->viewsPostRender($view, $output, $cache);
 }
diff --git a/workbench_access.services.yml b/workbench_access.services.yml
index f4af2c8..9ac4dfb 100644
--- a/workbench_access.services.yml
+++ b/workbench_access.services.yml
@@ -11,3 +11,7 @@ services:
   workbench_access.tokens:
     class: Drupal\workbench_access\WorkbenchAccessTokens
     arguments: ['@token', '@entity_type.manager', '@module_handler', '@workbench_access.user_section_storage']
+
+  Drupal\workbench_access\Hook\WorkbenchAccessHooks:
+    class: Drupal\workbench_access\Hook\WorkbenchAccessHooks
+    autowire: true
